From 50822c1a8aa6e0cf57f0b6fefadb9041ab22e60b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Fri, 14 Aug 2015 23:20:21 +0200 Subject: [PATCH] vm: add def for the segment struct, it's useful for testing --- basis/vm/vm-tests.factor | 18 ++++++++++++++ basis/vm/vm.factor | 51 +++++++++++++++++++++++----------------- 2 files changed, 48 insertions(+), 21 deletions(-) create mode 100644 basis/vm/vm-tests.factor diff --git a/basis/vm/vm-tests.factor b/basis/vm/vm-tests.factor new file mode 100644 index 0000000000..185b041590 --- /dev/null +++ b/basis/vm/vm-tests.factor @@ -0,0 +1,18 @@ +USING: accessors classes.struct kernel math math.order threads.private +tools.test ; +QUALIFIED: vm +IN: vm.tests + +: get-ctx ( -- ctx ) + context vm:context memory>struct ; + +{ t } [ + get-ctx [ callstack-bottom>> ] [ callstack-top>> ] bi - 0 > +] unit-test + +{ t } [ + ! Callstack is in the callstack segment + get-ctx [ callstack-top>> ] [ + callstack-seg>> [ start>> ] [ end>> ] bi + ] bi between? +] unit-test diff --git a/basis/vm/vm.factor b/basis/vm/vm.factor index f3f2292355..0d2540b7e0 100644 --- a/basis/vm/vm.factor +++ b/basis/vm/vm.factor @@ -5,34 +5,43 @@ IN: vm TYPEDEF: uintptr_t cell_t +STRUCT: segment + { start cell_t } + { size cell_t } + { end cell_t } ; + STRUCT: context -{ callstack-top void* } -{ callstack-bottom void* } -{ datastack cell_t } -{ retainstack cell_t } -{ callstack-save cell_t } -{ datastack-region void* } -{ retainstack-region void* } -{ callstack-region void* } -{ context-objects cell_t[context-object-count] } ; + { callstack-top cell_t } + { callstack-bottom cell_t } + { datastack cell_t } + { retainstack cell_t } + { callstack-save cell_t } + { datastack-seg segment* } + { retainstack-seg segment* } + { callstack-seg segment* } + { context-objects cell_t[context-object-count] } ; : context-field-offset ( field -- offset ) context offset-of ; inline STRUCT: zone -{ here cell_t } -{ start cell_t } -{ end cell_t } -{ size cell_t } ; + { here cell_t } + { start cell_t } + { end cell_t } + { size cell_t } ; STRUCT: vm -{ ctx context* } -{ spare-ctx context* } -{ nursery zone } -{ cards-offset cell_t } -{ decks-offset cell_t } -{ signal-handler-addr cell_t } -{ faulting? cell_t } -{ special-objects cell_t[special-object-count] } ; + { ctx context* } + { spare-ctx context* } + { nursery zone } + { cards-offset cell_t } + { decks-offset cell_t } + { signal-handler-addr cell_t } + { faulting? cell_t } + { special-objects cell_t[special-object-count] } + { thread void* } + { datastack-size cell_t } + { retainstack-size cell_t } + { callstack-size cell_t } ; : vm-field-offset ( field -- offset ) vm offset-of ; inline