VM: possible fix for #1319.

Fix for reset_context() so that the top two stack items are never
removed from the stack so if the parent->init_context(ctx) call triggers
a GC, those items are never collected.
db4
Björn Lindqvist 2015-05-22 15:29:38 +02:00 committed by Doug Coleman
parent 8d697fcc34
commit 183ec83a6d
3 changed files with 40 additions and 10 deletions

View File

@ -353,14 +353,22 @@ IN: bootstrap.x86
: jit-start-context-and-delete ( -- )
jit-load-vm
jit-load-context
! Updates the context to match the values in the data and retain
! stack registers. reset_context can GC.
jit-save-context
! Resets the context. The top two ds item are preserved.
vm-reg "reset_context" jit-call-1arg
jit-save-quot-and-param
! Switches to the same context I think, uses ctx-reg
ctx-reg jit-switch-context
jit-push-param
EAX EDX [] MOV
! Pops the quotation from the stack and puts it in EAX.
EAX ds-reg [] MOV
ds-reg 4 SUB
! Jump to the quotation in EAX.
jit-jump-quot ;
[

View File

@ -78,7 +78,8 @@ IN: bootstrap.x86
jit-restore-context
] jit-primitive jit-define
: jit-jump-quot ( -- ) arg1 quot-entry-point-offset [+] JMP ;
: jit-jump-quot ( -- )
arg1 quot-entry-point-offset [+] JMP ;
: jit-call-quot ( -- ) arg1 quot-entry-point-offset [+] CALL ;
@ -306,13 +307,24 @@ IN: bootstrap.x86
jit-set-context
] \ (set-context-and-delete) define-sub-primitive
! Resets the active context and instead the passed in quotation
! becomes the new code that it executes.
: jit-start-context-and-delete ( -- )
! Updates the context to match the values in the data and retain
! stack registers. reset_context can GC.
jit-save-context
jit-load-context
! Resets the context. The top two ds items are preserved.
vm-reg "reset_context" jit-call-1arg
jit-pop-quot-and-param
! Switches to the same context I think.
ctx-reg jit-switch-context
jit-push-param
! Pops the quotation from the stack and puts it in arg1.
arg1 ds-reg [] MOV
ds-reg 8 SUB
! Jump to quotation arg1
jit-jump-quot ;
[

View File

@ -123,8 +123,18 @@ VM_C_API void delete_context(factor_vm* parent) {
/* Allocates memory (init_context()) */
VM_C_API void reset_context(factor_vm* parent) {
parent->ctx->reset();
parent->init_context(parent->ctx);
// The function is used by (start-context-and-delete) which expects
// the top two datastack items to be preserved after the context has
// been resetted.
context* ctx = parent->ctx;
cell arg1 = ctx->pop();
cell arg2 = ctx->pop();
ctx->reset();
ctx->push(arg2);
ctx->push(arg1);
parent->init_context(ctx);
}
/* Allocates memory */