VM: the delete_context() and reset_context() api functions can be
simplified a bit The functions always operates on parent->ctx, so passing a context* parameter is redundant. This enables shorter assembly code for the (start-context-and-delete) and (set-context-and-delete) primitives.db4
parent
528e9f61f3
commit
016614747d
|
@ -820,7 +820,6 @@ IN: bootstrap.ppc
|
||||||
: jit-delete-current-context ( -- )
|
: jit-delete-current-context ( -- )
|
||||||
jit-load-context
|
jit-load-context
|
||||||
3 vm-reg MR
|
3 vm-reg MR
|
||||||
4 ctx-reg MR
|
|
||||||
"delete_context" jit-call ;
|
"delete_context" jit-call ;
|
||||||
|
|
||||||
[
|
[
|
||||||
|
@ -831,7 +830,6 @@ IN: bootstrap.ppc
|
||||||
: jit-start-context-and-delete ( -- )
|
: jit-start-context-and-delete ( -- )
|
||||||
jit-load-context
|
jit-load-context
|
||||||
3 vm-reg MR
|
3 vm-reg MR
|
||||||
4 ctx-reg MR
|
|
||||||
"reset_context" jit-call
|
"reset_context" jit-call
|
||||||
jit-pop-quot-and-param
|
jit-pop-quot-and-param
|
||||||
ctx-reg jit-switch-context
|
ctx-reg jit-switch-context
|
||||||
|
|
|
@ -344,7 +344,7 @@ IN: bootstrap.x86
|
||||||
: jit-delete-current-context ( -- )
|
: jit-delete-current-context ( -- )
|
||||||
jit-load-vm
|
jit-load-vm
|
||||||
jit-load-context
|
jit-load-context
|
||||||
vm-reg ctx-reg "delete_context" jit-call-2arg ;
|
vm-reg "delete_context" jit-call-1arg ;
|
||||||
|
|
||||||
[
|
[
|
||||||
jit-delete-current-context
|
jit-delete-current-context
|
||||||
|
@ -354,7 +354,7 @@ IN: bootstrap.x86
|
||||||
: jit-start-context-and-delete ( -- )
|
: jit-start-context-and-delete ( -- )
|
||||||
jit-load-vm
|
jit-load-vm
|
||||||
jit-load-context
|
jit-load-context
|
||||||
vm-reg ctx-reg "reset_context" jit-call-2arg
|
vm-reg "reset_context" jit-call-1arg
|
||||||
|
|
||||||
jit-save-quot-and-param
|
jit-save-quot-and-param
|
||||||
ctx-reg jit-switch-context
|
ctx-reg jit-switch-context
|
||||||
|
|
|
@ -62,6 +62,7 @@ IN: bootstrap.x86
|
||||||
ctx-reg context-datastack-offset [+] ds-reg MOV
|
ctx-reg context-datastack-offset [+] ds-reg MOV
|
||||||
ctx-reg context-retainstack-offset [+] rs-reg MOV ;
|
ctx-reg context-retainstack-offset [+] rs-reg MOV ;
|
||||||
|
|
||||||
|
! ctx-reg must already have been loaded
|
||||||
: jit-restore-context ( -- )
|
: jit-restore-context ( -- )
|
||||||
ds-reg ctx-reg context-datastack-offset [+] MOV
|
ds-reg ctx-reg context-datastack-offset [+] MOV
|
||||||
rs-reg ctx-reg context-retainstack-offset [+] MOV ;
|
rs-reg ctx-reg context-retainstack-offset [+] MOV ;
|
||||||
|
@ -298,8 +299,7 @@ IN: bootstrap.x86
|
||||||
[ jit-start-context ] \ (start-context) define-sub-primitive
|
[ jit-start-context ] \ (start-context) define-sub-primitive
|
||||||
|
|
||||||
: jit-delete-current-context ( -- )
|
: jit-delete-current-context ( -- )
|
||||||
jit-load-context
|
vm-reg "delete_context" jit-call-1arg ;
|
||||||
vm-reg ctx-reg "delete_context" jit-call-2arg ;
|
|
||||||
|
|
||||||
[
|
[
|
||||||
jit-delete-current-context
|
jit-delete-current-context
|
||||||
|
@ -307,9 +307,9 @@ IN: bootstrap.x86
|
||||||
] \ (set-context-and-delete) define-sub-primitive
|
] \ (set-context-and-delete) define-sub-primitive
|
||||||
|
|
||||||
: jit-start-context-and-delete ( -- )
|
: jit-start-context-and-delete ( -- )
|
||||||
jit-load-context
|
|
||||||
vm-reg ctx-reg "reset_context" jit-call-2arg
|
|
||||||
|
|
||||||
|
jit-load-context
|
||||||
|
vm-reg "reset_context" jit-call-1arg
|
||||||
jit-pop-quot-and-param
|
jit-pop-quot-and-param
|
||||||
ctx-reg jit-switch-context
|
ctx-reg jit-switch-context
|
||||||
jit-push-param
|
jit-push-param
|
||||||
|
|
|
@ -100,15 +100,15 @@ void factor_vm::init_context(context* ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocates memory (init_context(), but not parent->new_context() */
|
/* Allocates memory (init_context(), but not parent->new_context() */
|
||||||
context* new_context(factor_vm* parent) {
|
VM_C_API context* new_context(factor_vm* parent) {
|
||||||
context* new_context = parent->new_context();
|
context* new_context = parent->new_context();
|
||||||
parent->init_context(new_context);
|
parent->init_context(new_context);
|
||||||
return new_context;
|
return new_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
void factor_vm::delete_context(context* old_context) {
|
void factor_vm::delete_context() {
|
||||||
unused_contexts.push_back(old_context);
|
unused_contexts.push_back(ctx);
|
||||||
active_contexts.erase(old_context);
|
active_contexts.erase(ctx);
|
||||||
|
|
||||||
while (unused_contexts.size() > 10) {
|
while (unused_contexts.size() > 10) {
|
||||||
context* stale_context = unused_contexts.front();
|
context* stale_context = unused_contexts.front();
|
||||||
|
@ -117,14 +117,14 @@ void factor_vm::delete_context(context* old_context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_C_API void delete_context(factor_vm* parent, context* old_context) {
|
VM_C_API void delete_context(factor_vm* parent) {
|
||||||
parent->delete_context(old_context);
|
parent->delete_context();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocates memory (init_context()) */
|
/* Allocates memory (init_context()) */
|
||||||
VM_C_API void reset_context(factor_vm* parent, context* ctx) {
|
VM_C_API void reset_context(factor_vm* parent) {
|
||||||
ctx->reset();
|
parent->ctx->reset();
|
||||||
parent->init_context(ctx);
|
parent->init_context(parent->ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocates memory */
|
/* Allocates memory */
|
||||||
|
@ -147,7 +147,7 @@ cell begin_callback(factor_vm* parent, cell quot) {
|
||||||
|
|
||||||
void factor_vm::end_callback() {
|
void factor_vm::end_callback() {
|
||||||
callback_ids.pop_back();
|
callback_ids.pop_back();
|
||||||
delete_context(ctx);
|
delete_context();
|
||||||
}
|
}
|
||||||
|
|
||||||
void end_callback(factor_vm* parent) { parent->end_callback(); }
|
void end_callback(factor_vm* parent) { parent->end_callback(); }
|
||||||
|
|
|
@ -66,8 +66,8 @@ struct context {
|
||||||
};
|
};
|
||||||
|
|
||||||
VM_C_API context* new_context(factor_vm* parent);
|
VM_C_API context* new_context(factor_vm* parent);
|
||||||
VM_C_API void delete_context(factor_vm* parent, context* old_context);
|
VM_C_API void delete_context(factor_vm* parent);
|
||||||
VM_C_API void reset_context(factor_vm* parent, context* ctx);
|
VM_C_API void reset_context(factor_vm* parent);
|
||||||
VM_C_API cell begin_callback(factor_vm* parent, cell quot);
|
VM_C_API cell begin_callback(factor_vm* parent, cell quot);
|
||||||
VM_C_API void end_callback(factor_vm* parent);
|
VM_C_API void end_callback(factor_vm* parent);
|
||||||
|
|
||||||
|
|
|
@ -154,7 +154,7 @@ struct factor_vm {
|
||||||
// contexts
|
// contexts
|
||||||
context* new_context();
|
context* new_context();
|
||||||
void init_context(context* ctx);
|
void init_context(context* ctx);
|
||||||
void delete_context(context* old_context);
|
void delete_context();
|
||||||
void init_contexts(cell datastack_size_, cell retainstack_size_,
|
void init_contexts(cell datastack_size_, cell retainstack_size_,
|
||||||
cell callstack_size_);
|
cell callstack_size_);
|
||||||
void delete_contexts();
|
void delete_contexts();
|
||||||
|
|
Loading…
Reference in New Issue