From 016614747dda69e5b9a33800989470942a156e67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Mon, 18 May 2015 18:43:20 +0200 Subject: [PATCH] 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. --- basis/bootstrap/assembler/ppc.factor | 2 -- basis/bootstrap/assembler/x86.32.factor | 4 ++-- basis/bootstrap/assembler/x86.64.factor | 8 ++++---- vm/contexts.cpp | 20 ++++++++++---------- vm/contexts.hpp | 4 ++-- vm/vm.hpp | 2 +- 6 files changed, 19 insertions(+), 21 deletions(-) diff --git a/basis/bootstrap/assembler/ppc.factor b/basis/bootstrap/assembler/ppc.factor index c0f565e383..469bd0e9e8 100644 --- a/basis/bootstrap/assembler/ppc.factor +++ b/basis/bootstrap/assembler/ppc.factor @@ -820,7 +820,6 @@ IN: bootstrap.ppc : jit-delete-current-context ( -- ) jit-load-context 3 vm-reg MR - 4 ctx-reg MR "delete_context" jit-call ; [ @@ -831,7 +830,6 @@ IN: bootstrap.ppc : jit-start-context-and-delete ( -- ) jit-load-context 3 vm-reg MR - 4 ctx-reg MR "reset_context" jit-call jit-pop-quot-and-param ctx-reg jit-switch-context diff --git a/basis/bootstrap/assembler/x86.32.factor b/basis/bootstrap/assembler/x86.32.factor index e1ddc11dcd..b25aeb92a9 100644 --- a/basis/bootstrap/assembler/x86.32.factor +++ b/basis/bootstrap/assembler/x86.32.factor @@ -344,7 +344,7 @@ IN: bootstrap.x86 : jit-delete-current-context ( -- ) jit-load-vm jit-load-context - vm-reg ctx-reg "delete_context" jit-call-2arg ; + vm-reg "delete_context" jit-call-1arg ; [ jit-delete-current-context @@ -354,7 +354,7 @@ IN: bootstrap.x86 : jit-start-context-and-delete ( -- ) jit-load-vm jit-load-context - vm-reg ctx-reg "reset_context" jit-call-2arg + vm-reg "reset_context" jit-call-1arg jit-save-quot-and-param ctx-reg jit-switch-context diff --git a/basis/bootstrap/assembler/x86.64.factor b/basis/bootstrap/assembler/x86.64.factor index eeecdc4e30..29df84847d 100644 --- a/basis/bootstrap/assembler/x86.64.factor +++ b/basis/bootstrap/assembler/x86.64.factor @@ -62,6 +62,7 @@ IN: bootstrap.x86 ctx-reg context-datastack-offset [+] ds-reg MOV ctx-reg context-retainstack-offset [+] rs-reg MOV ; +! ctx-reg must already have been loaded : jit-restore-context ( -- ) ds-reg ctx-reg context-datastack-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-delete-current-context ( -- ) - jit-load-context - vm-reg ctx-reg "delete_context" jit-call-2arg ; + vm-reg "delete_context" jit-call-1arg ; [ jit-delete-current-context @@ -307,9 +307,9 @@ IN: bootstrap.x86 ] \ (set-context-and-delete) define-sub-primitive : 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 ctx-reg jit-switch-context jit-push-param diff --git a/vm/contexts.cpp b/vm/contexts.cpp index 0f6c455156..e9ba655411 100644 --- a/vm/contexts.cpp +++ b/vm/contexts.cpp @@ -100,15 +100,15 @@ void factor_vm::init_context(context* ctx) { } /* 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(); parent->init_context(new_context); return new_context; } -void factor_vm::delete_context(context* old_context) { - unused_contexts.push_back(old_context); - active_contexts.erase(old_context); +void factor_vm::delete_context() { + unused_contexts.push_back(ctx); + active_contexts.erase(ctx); while (unused_contexts.size() > 10) { 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) { - parent->delete_context(old_context); +VM_C_API void delete_context(factor_vm* parent) { + parent->delete_context(); } /* Allocates memory (init_context()) */ -VM_C_API void reset_context(factor_vm* parent, context* ctx) { - ctx->reset(); - parent->init_context(ctx); +VM_C_API void reset_context(factor_vm* parent) { + parent->ctx->reset(); + parent->init_context(parent->ctx); } /* Allocates memory */ @@ -147,7 +147,7 @@ cell begin_callback(factor_vm* parent, cell quot) { void factor_vm::end_callback() { callback_ids.pop_back(); - delete_context(ctx); + delete_context(); } void end_callback(factor_vm* parent) { parent->end_callback(); } diff --git a/vm/contexts.hpp b/vm/contexts.hpp index eeb0bf5e06..b898d78c0b 100644 --- a/vm/contexts.hpp +++ b/vm/contexts.hpp @@ -66,8 +66,8 @@ struct context { }; 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 reset_context(factor_vm* parent, context* ctx); +VM_C_API void delete_context(factor_vm* parent); +VM_C_API void reset_context(factor_vm* parent); VM_C_API cell begin_callback(factor_vm* parent, cell quot); VM_C_API void end_callback(factor_vm* parent); diff --git a/vm/vm.hpp b/vm/vm.hpp index 53044bc5c4..315d7bd4cb 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -154,7 +154,7 @@ struct factor_vm { // contexts context* new_context(); void init_context(context* ctx); - void delete_context(context* old_context); + void delete_context(); void init_contexts(cell datastack_size_, cell retainstack_size_, cell callstack_size_); void delete_contexts();