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
Björn Lindqvist 2015-05-18 18:43:20 +02:00 committed by Doug Coleman
parent 528e9f61f3
commit 016614747d
6 changed files with 19 additions and 21 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(); }

View File

@ -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);

View File

@ -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();