From 366ce2896fb33fad5f52c39ef88041c08ef5bd8e Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 19 Apr 2010 20:08:15 -0500 Subject: [PATCH] Add callstack-bounds primitive to vm/ for use with javascriptcore library --- basis/stack-checker/known-words/known-words.factor | 1 + core/bootstrap/primitives.factor | 1 + vm/callstack.cpp | 6 ++++++ vm/primitives.hpp | 1 + vm/vm.hpp | 1 + 5 files changed, 10 insertions(+) diff --git a/basis/stack-checker/known-words/known-words.factor b/basis/stack-checker/known-words/known-words.factor index 1fa9a94677..c0d4b6c543 100644 --- a/basis/stack-checker/known-words/known-words.factor +++ b/basis/stack-checker/known-words/known-words.factor @@ -349,6 +349,7 @@ M: bad-executable summary \ both-fixnums? { object object } { object } define-primitive \ byte-array>bignum { byte-array } { bignum } define-primitive \ byte-array>bignum make-foldable \ callstack { } { callstack } define-primitive \ callstack make-flushable +\ callstack-bounds { } { alien alien } define-primitive \ callstack-bounds make-flushable \ callstack-for { c-ptr } { callstack } define-primitive \ callstack make-flushable \ callstack>array { callstack } { array } define-primitive \ callstack>array make-flushable \ check-datastack { array integer integer } { object } define-primitive \ check-datastack make-flushable diff --git a/core/bootstrap/primitives.factor b/core/bootstrap/primitives.factor index c466b0c1f8..27699725f1 100644 --- a/core/bootstrap/primitives.factor +++ b/core/bootstrap/primitives.factor @@ -451,6 +451,7 @@ tuple { "retainstack" "kernel" "primitive_retainstack" (( -- array )) } { "(identity-hashcode)" "kernel.private" "primitive_identity_hashcode" (( obj -- code )) } { "become" "kernel.private" "primitive_become" (( old new -- )) } + { "callstack-bounds" "kernel.private" "primitive_callstack_bounds" (( -- start end )) } { "check-datastack" "kernel.private" "primitive_check_datastack" (( array in# out# -- ? )) } { "compute-identity-hashcode" "kernel.private" "primitive_compute_identity_hashcode" (( obj -- )) } { "context-object" "kernel.private" "primitive_context_object" (( n -- obj )) } diff --git a/vm/callstack.cpp b/vm/callstack.cpp index eae976219f..bb716cbc6d 100755 --- a/vm/callstack.cpp +++ b/vm/callstack.cpp @@ -214,4 +214,10 @@ void factor_vm::primitive_set_innermost_stack_frame_quot() FRAME_RETURN_ADDRESS(inner,this) = (char *)quot->entry_point + offset; } +void factor_vm::primitive_callstack_bounds() +{ + ctx->push(allot_alien((void*)ctx->callstack_seg->start)); + ctx->push(allot_alien((void*)ctx->callstack_seg->end)); +} + } diff --git a/vm/primitives.hpp b/vm/primitives.hpp index e98cf508b6..a2bf912749 100644 --- a/vm/primitives.hpp +++ b/vm/primitives.hpp @@ -35,6 +35,7 @@ namespace factor _(byte_array_to_bignum) \ _(callback) \ _(callstack) \ + _(callstack_bounds) \ _(callstack_for) \ _(callstack_to_array) \ _(check_datastack) \ diff --git a/vm/vm.hpp b/vm/vm.hpp index dd1d48cf03..d9bd17fa51 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -606,6 +606,7 @@ struct factor_vm void primitive_innermost_stack_frame_executing(); void primitive_innermost_stack_frame_scan(); void primitive_set_innermost_stack_frame_quot(); + void primitive_callstack_bounds(); template void iterate_callstack(context *ctx, Iterator &iterator); // alien