moved global state from contexts and run into vm

Also renamed template type from T to TYPE to prevent clash with vm::T (true)
db4
Phil Dawes 2009-08-17 21:37:12 +01:00
parent ecfd9a6075
commit 80716a1b6e
10 changed files with 37 additions and 31 deletions

View File

@ -1,10 +1,6 @@
namespace factor namespace factor
{ {
inline static cell tag_boolean(cell untagged)
{
return (untagged ? T : F);
}
VM_C_API void box_boolean(bool value); VM_C_API void box_boolean(bool value);
VM_C_API bool to_boolean(cell value); VM_C_API bool to_boolean(cell value);

View File

@ -5,8 +5,6 @@ factor::context *stack_chain;
namespace factor namespace factor
{ {
cell ds_size, rs_size;
context *unused_contexts;
void factorvm::reset_datastack() void factorvm::reset_datastack()
{ {

View File

@ -36,7 +36,7 @@ struct context {
context *next; context *next;
}; };
extern cell ds_size, rs_size; //extern cell ds_size, rs_size;
#define ds_bot (stack_chain->datastack_region->start) #define ds_bot (stack_chain->datastack_region->start)
#define ds_top (stack_chain->datastack_region->end) #define ds_top (stack_chain->datastack_region->end)

View File

@ -123,22 +123,22 @@ object *resolve_forwarding(object *untagged)
return vm->resolve_forwarding(untagged); return vm->resolve_forwarding(untagged);
} }
template <typename T> T *factorvm::copy_untagged_object(T *untagged) template <typename TYPE> TYPE *factorvm::copy_untagged_object(TYPE *untagged)
{ {
check_data_pointer(untagged); check_data_pointer(untagged);
if(untagged->h.forwarding_pointer_p()) if(untagged->h.forwarding_pointer_p())
untagged = (T *)resolve_forwarding(untagged->h.forwarding_pointer()); untagged = (TYPE *)resolve_forwarding(untagged->h.forwarding_pointer());
else else
{ {
untagged->h.check_header(); untagged->h.check_header();
untagged = (T *)copy_object_impl(untagged); untagged = (TYPE *)copy_object_impl(untagged);
} }
return untagged; return untagged;
} }
template <typename T> T *copy_untagged_object(T *untagged) template <typename TYPE> TYPE *copy_untagged_object(TYPE *untagged)
{ {
return vm->copy_untagged_object(untagged); return vm->copy_untagged_object(untagged);
} }

View File

@ -453,7 +453,7 @@ PRIMITIVE(end_scan)
PRIMITIVE_GETVM()->vmprim_end_scan(); PRIMITIVE_GETVM()->vmprim_end_scan();
} }
template<typename T> void factorvm::each_object(T &functor) template<typename TYPE> void factorvm::each_object(TYPE &functor)
{ {
begin_scan(); begin_scan();
cell obj; cell obj;
@ -462,7 +462,7 @@ template<typename T> void factorvm::each_object(T &functor)
end_scan(); end_scan();
} }
template<typename T> void each_object(T &functor) template<typename TYPE> void each_object(TYPE &functor)
{ {
return vm->each_object(functor); return vm->each_object(functor);
} }

View File

@ -202,14 +202,14 @@ void data_fixup(cell *cell)
return vm->data_fixup(cell); return vm->data_fixup(cell);
} }
template <typename T> void factorvm::code_fixup(T **handle) template <typename TYPE> void factorvm::code_fixup(TYPE **handle)
{ {
T *ptr = *handle; TYPE *ptr = *handle;
T *new_ptr = (T *)(((cell)ptr) + (code.seg->start - code_relocation_base)); TYPE *new_ptr = (TYPE *)(((cell)ptr) + (code.seg->start - code_relocation_base));
*handle = new_ptr; *handle = new_ptr;
} }
template <typename T> void code_fixup(T **handle) template <typename TYPE> void code_fixup(TYPE **handle)
{ {
return vm->code_fixup(handle); return vm->code_fixup(handle);
} }

View File

@ -42,7 +42,7 @@ struct jit {
void emit_subprimitive(cell word_) { void emit_subprimitive(cell word_) {
gc_root<word> word(word_,myvm); gc_root<word> word(word_,myvm);
gc_root<array> code_template(word->subprimitive,myvm); gc_root<array> code_template(word->subprimitive,myvm);
if(array_capacity(code_template.untagged()) > 1) literal(T); if(array_capacity(code_template.untagged()) > 1) literal(myvm->T);
emit(code_template.value()); emit(code_template.value());
} }

View File

@ -5,7 +5,6 @@ factor::cell userenv[USER_ENV];
namespace factor namespace factor
{ {
cell T;
inline void factorvm::vmprim_getenv() inline void factorvm::vmprim_getenv()
{ {

3
vm/run.hpp Normal file → Executable file
View File

@ -98,9 +98,6 @@ inline static bool save_env_p(cell i)
return (i >= FIRST_SAVE_ENV && i <= LAST_SAVE_ENV) || i == STACK_TRACES_ENV; return (i >= FIRST_SAVE_ENV && i <= LAST_SAVE_ENV) || i == STACK_TRACES_ENV;
} }
/* Canonical T object. It's just a word */
extern cell T;
PRIMITIVE(getenv); PRIMITIVE(getenv);
PRIMITIVE(setenv); PRIMITIVE(setenv);
PRIMITIVE(exit); PRIMITIVE(exit);

View File

@ -15,6 +15,8 @@ typedef u8 card_deck;
struct factorvm { struct factorvm {
// contexts // contexts
cell ds_size, rs_size;
context *unused_contexts;
void reset_datastack(); void reset_datastack();
void reset_retainstack(); void reset_retainstack();
void fix_stacks(); void fix_stacks();
@ -33,6 +35,7 @@ struct factorvm {
inline void vmprim_check_datastack(); inline void vmprim_check_datastack();
// run // run
cell T; /* Canonical T object. It's just a word */
inline void vmprim_getenv(); inline void vmprim_getenv();
inline void vmprim_setenv(); inline void vmprim_setenv();
inline void vmprim_exit(); inline void vmprim_exit();
@ -264,6 +267,7 @@ struct factorvm {
//booleans //booleans
void box_boolean(bool value); void box_boolean(bool value);
bool to_boolean(cell value); bool to_boolean(cell value);
inline cell tag_boolean(cell untagged);
//byte arrays //byte arrays
byte_array *allot_byte_array(cell size); byte_array *allot_byte_array(cell size);
@ -853,26 +857,26 @@ struct gc_bignum
#define GC_BIGNUM(x,vm) gc_bignum x##__gc_root(&x,vm) #define GC_BIGNUM(x,vm) gc_bignum x##__gc_root(&x,vm)
//generic_arrays.hpp //generic_arrays.hpp
template <typename T> T *factorvm::allot_array_internal(cell capacity) template <typename TYPE> TYPE *factorvm::allot_array_internal(cell capacity)
{ {
T *array = allot<T>(array_size<T>(capacity)); TYPE *array = allot<TYPE>(array_size<TYPE>(capacity));
array->capacity = tag_fixnum(capacity); array->capacity = tag_fixnum(capacity);
return array; return array;
} }
template <typename T> T *allot_array_internal(cell capacity) template <typename TYPE> TYPE *allot_array_internal(cell capacity)
{ {
return vm->allot_array_internal<T>(capacity); return vm->allot_array_internal<TYPE>(capacity);
} }
template <typename T> bool factorvm::reallot_array_in_place_p(T *array, cell capacity) template <typename TYPE> bool factorvm::reallot_array_in_place_p(TYPE *array, cell capacity)
{ {
return in_zone(&nursery,array) && capacity <= array_capacity(array); return in_zone(&nursery,array) && capacity <= array_capacity(array);
} }
template <typename T> bool reallot_array_in_place_p(T *array, cell capacity) template <typename TYPE> bool reallot_array_in_place_p(TYPE *array, cell capacity)
{ {
return vm->reallot_array_in_place_p<T>(array,capacity); return vm->reallot_array_in_place_p<TYPE>(array,capacity);
} }
template <typename TYPE> TYPE *factorvm::reallot_array(TYPE *array_, cell capacity) template <typename TYPE> TYPE *factorvm::reallot_array(TYPE *array_, cell capacity)
@ -1002,7 +1006,7 @@ inline double bignum_to_float(cell tagged)
//callstack.hpp //callstack.hpp
/* This is a little tricky. The iterator may allocate memory, so we /* This is a little tricky. The iterator may allocate memory, so we
keep the callstack in a GC root and use relative offsets */ keep the callstack in a GC root and use relative offsets */
template<typename T> void factorvm::iterate_callstack_object(callstack *stack_, T &iterator) template<typename TYPE> void factorvm::iterate_callstack_object(callstack *stack_, TYPE &iterator)
{ {
gc_root<callstack> stack(stack_,vm); gc_root<callstack> stack(stack_,vm);
fixnum frame_offset = untag_fixnum(stack->length) - sizeof(stack_frame); fixnum frame_offset = untag_fixnum(stack->length) - sizeof(stack_frame);
@ -1015,11 +1019,23 @@ template<typename T> void factorvm::iterate_callstack_object(callstack *stack_,
} }
} }
template<typename T> void iterate_callstack_object(callstack *stack_, T &iterator) template<typename TYPE> void iterate_callstack_object(callstack *stack_, TYPE &iterator)
{ {
return vm->iterate_callstack_object(stack_,iterator); return vm->iterate_callstack_object(stack_,iterator);
} }
//booleans.hpp
inline cell factorvm::tag_boolean(cell untagged)
{
return (untagged ? T : F);
}
inline cell tag_boolean(cell untagged)
{
return vm->tag_boolean(untagged);
}
// next method here: // next method here: