moved local roots state to vm, shuffled includes around
parent
8fea98ad7a
commit
386dafe747
|
@ -14,7 +14,7 @@ struct heap {
|
|||
heap_free_list free;
|
||||
};
|
||||
|
||||
typedef void (*heap_iterator)(heap_block *compiled);
|
||||
//typedef void (*heap_iterator)(heap_block *compiled);
|
||||
|
||||
void new_heap(heap *h, cell size);
|
||||
void build_free_list(heap *h, cell size);
|
||||
|
|
|
@ -10,7 +10,7 @@ bool in_code_heap_p(cell ptr);
|
|||
|
||||
void jit_compile_word(cell word, cell def, bool relocate);
|
||||
|
||||
typedef void (*code_heap_iterator)(code_block *compiled);
|
||||
//typedef void (*code_heap_iterator)(code_block *compiled);
|
||||
|
||||
void iterate_code_heap(code_heap_iterator iter);
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ struct jit {
|
|||
bool computing_offset_p;
|
||||
fixnum position;
|
||||
cell offset;
|
||||
//factorvm *vm;
|
||||
|
||||
jit(cell jit_type, cell owner);
|
||||
void compute_position(cell offset);
|
||||
|
|
|
@ -2,9 +2,4 @@
|
|||
|
||||
namespace factor
|
||||
{
|
||||
|
||||
std::vector<cell> gc_locals;
|
||||
|
||||
std::vector<cell> gc_bignums;
|
||||
|
||||
}
|
||||
|
|
|
@ -1,16 +1,14 @@
|
|||
namespace factor
|
||||
{
|
||||
|
||||
/* If a runtime function needs to call another function which potentially
|
||||
allocates memory, it must wrap any local variable references to Factor
|
||||
objects in gc_root instances */
|
||||
extern std::vector<cell> gc_locals;
|
||||
struct factorvm;
|
||||
|
||||
template <typename T>
|
||||
struct gc_root : public tagged<T>
|
||||
{
|
||||
void push() { check_tagged_pointer(tagged<T>::value()); gc_locals.push_back((cell)this); }
|
||||
void push() { check_tagged_pointer(tagged<T>::value()); vm->gc_locals.push_back((cell)this); }
|
||||
|
||||
//explicit gc_root(cell value_, factorvm *vm) : myvm(vm),tagged<T>(value_) { push(); }
|
||||
explicit gc_root(cell value_) : tagged<T>(value_) { push(); }
|
||||
explicit gc_root(T *value_) : tagged<T>(value_) { push(); }
|
||||
|
||||
|
@ -19,30 +17,29 @@ struct gc_root : public tagged<T>
|
|||
|
||||
~gc_root() {
|
||||
#ifdef FACTOR_DEBUG
|
||||
assert(gc_locals.back() == (cell)this);
|
||||
assert(vm->gc_locals.back() == (cell)this);
|
||||
#endif
|
||||
gc_locals.pop_back();
|
||||
vm->gc_locals.pop_back();
|
||||
}
|
||||
};
|
||||
|
||||
/* A similar hack for the bignum implementation */
|
||||
extern std::vector<cell> gc_bignums;
|
||||
|
||||
struct gc_bignum
|
||||
{
|
||||
bignum **addr;
|
||||
|
||||
gc_bignum(bignum **addr_) : addr(addr_) {
|
||||
factorvm *myvm;
|
||||
//gc_bignum(bignum **addr_, factorvm *vm) : addr(addr_), myvm(vm) {
|
||||
gc_bignum(bignum **addr_) : addr(addr_), myvm(vm) {
|
||||
if(*addr_)
|
||||
check_data_pointer(*addr_);
|
||||
gc_bignums.push_back((cell)addr);
|
||||
vm->gc_bignums.push_back((cell)addr);
|
||||
}
|
||||
|
||||
~gc_bignum() {
|
||||
#ifdef FACTOR_DEBUG
|
||||
assert(gc_bignums.back() == (cell)addr);
|
||||
assert(vm->gc_bignums.back() == (cell)addr);
|
||||
#endif
|
||||
gc_bignums.pop_back();
|
||||
vm->gc_bignums.pop_back();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -46,6 +46,8 @@
|
|||
#include "errors.hpp"
|
||||
#include "bignumint.hpp"
|
||||
#include "bignum.hpp"
|
||||
#include "code_block.hpp"
|
||||
#include "vm.hpp"
|
||||
#include "data_heap.hpp"
|
||||
#include "write_barrier.hpp"
|
||||
#include "data_gc.hpp"
|
||||
|
@ -62,7 +64,6 @@
|
|||
#include "float_bits.hpp"
|
||||
#include "io.hpp"
|
||||
#include "code_gc.hpp"
|
||||
#include "code_block.hpp"
|
||||
#include "code_heap.hpp"
|
||||
#include "image.hpp"
|
||||
#include "callstack.hpp"
|
||||
|
@ -74,6 +75,6 @@
|
|||
#include "factor.hpp"
|
||||
#include "utilities.hpp"
|
||||
|
||||
#include "vm.hpp"
|
||||
|
||||
|
||||
#endif /* __FACTOR_MASTER_H__ */
|
||||
|
|
|
@ -2,15 +2,15 @@ namespace factor
|
|||
{
|
||||
|
||||
#define DEFPUSHPOP(prefix,ptr) \
|
||||
inline static cell prefix##peek() { return *(cell *)ptr; } \
|
||||
inline static void prefix##repl(cell tagged) { *(cell *)ptr = tagged; } \
|
||||
inline static cell prefix##pop() \
|
||||
inline cell prefix##peek() { return *(cell *)ptr; } \
|
||||
inline void prefix##repl(cell tagged) { *(cell *)ptr = tagged; } \
|
||||
inline cell prefix##pop() \
|
||||
{ \
|
||||
cell value = prefix##peek(); \
|
||||
ptr -= sizeof(cell); \
|
||||
return value; \
|
||||
} \
|
||||
inline static void prefix##push(cell tagged) \
|
||||
inline void prefix##push(cell tagged) \
|
||||
{ \
|
||||
ptr += sizeof(cell); \
|
||||
prefix##repl(tagged); \
|
||||
|
|
17
vm/vm.hpp
17
vm/vm.hpp
|
@ -1,6 +1,19 @@
|
|||
namespace factor
|
||||
{
|
||||
|
||||
struct heap;
|
||||
struct data_heap;
|
||||
struct data;
|
||||
struct zone;
|
||||
struct vm_parameters;
|
||||
struct image_header;
|
||||
|
||||
typedef u8 card;
|
||||
typedef u8 card_deck;
|
||||
|
||||
typedef void (*heap_iterator)(heap_block *compiled);
|
||||
typedef void (*code_heap_iterator)(code_block *compiled);
|
||||
|
||||
struct factorvm {
|
||||
|
||||
// contexts
|
||||
|
@ -174,6 +187,10 @@ struct factorvm {
|
|||
inline void vmprim_become();
|
||||
void inline_gc(cell *gc_roots_base, cell gc_roots_size);
|
||||
|
||||
// local roots
|
||||
std::vector<cell> gc_locals;
|
||||
std::vector<cell> gc_bignums;
|
||||
|
||||
//debug
|
||||
void print_chars(string* str);
|
||||
void print_word(word* word, cell nesting);
|
||||
|
|
Loading…
Reference in New Issue