static void _syx_memory_write (SyxOop *oops, syx_bool mark_type, syx_varsize n, FILE *image) { syx_int32 i, idx; SyxOop oop; for (i=0; i < n; i++) { oop = oops[i]; if (SYX_IS_OBJECT (oop)) { idx = SYX_MEMORY_INDEX_OF(oop); if (mark_type) fputc (1, image); idx = SYX_COMPAT_SWAP_32 (idx); fwrite (&idx, sizeof (syx_int32), 1, image); } else { if (mark_type) fputc (0, image); idx = (syx_int32)oop; idx = SYX_COMPAT_SWAP_32 (idx); fwrite (&idx, sizeof (syx_int32), 1, image); } } }
/*! Create a new SyxParser to parse the code later. \param method a CompiledMethod or CompiledBlock \param instance_names list of instance variable names */ SyxParser * syx_parser_new (SyxLexer *lexer, SyxOop method, SyxOop klass) { SyxParser *self; if (!lexer || !SYX_IS_OBJECT (method)) return NULL; self = (SyxParser *) syx_malloc (sizeof (SyxParser)); self->lexer = lexer; self->method = method; self->klass = klass; self->_in_block = FALSE; self->bytecode = syx_bytecode_new (); self->_temporary_names_top = 0; self->_argument_names_top = 0; self->instance_names = syx_class_get_all_instance_variable_names (klass); self->_duplicate_indexes_top = 0; self->_argument_scopes.top = 0; self->_temporary_scopes.top = 0; return self; }
INLINE void _syx_memory_gc_mark (SyxOop object) { syx_varsize i; if (!SYX_IS_OBJECT (object) || SYX_OBJECT_IS_MARKED(object) || SYX_IS_NIL(syx_object_get_class (object))) return; SYX_OBJECT_IS_MARKED(object) = TRUE; _syx_memory_gc_mark (SYX_OBJECT(object)->klass); /* Only the used stack part of the process must be marked */ if (SYX_OOP_EQ (syx_object_get_class (object), syx_process_class)) { SyxOop stack = SYX_PROCESS_STACK (object); SyxInterpFrame *frame = SYX_OOP_CAST_POINTER (SYX_PROCESS_FRAME_POINTER (object)); syx_int32 offset = SYX_POINTERS_OFFSET (frame->stack, SYX_OBJECT_DATA (stack)); SYX_OBJECT_IS_MARKED(stack) = TRUE; /* First mark variables except the process stack */ for (i=0; i < SYX_VARS_PROCESS_STACK; i++) _syx_memory_gc_mark (SYX_OBJECT_VARS(object)[i]); /* Mark detached frames */ while (frame) { _syx_memory_gc_mark (frame->detached_frame); frame = frame->parent_frame; } /* Now mark the stack */ for (i=0; i < offset; i++) _syx_memory_gc_mark (SYX_OBJECT_DATA(stack)[i]); /* Mark variables after the process stack */ for (i=SYX_VARS_PROCESS_STACK+1; i < syx_object_vars_size (object); i++) _syx_memory_gc_mark (SYX_OBJECT_VARS(object)[i]); /* Process has no data */ return; } else { for (i=0; i < syx_object_vars_size (object); i++) _syx_memory_gc_mark (SYX_OBJECT_VARS(object)[i]); } if (SYX_OBJECT_HAS_REFS (object)) { for (i=0; i < SYX_OBJECT_DATA_SIZE (object); i++) _syx_memory_gc_mark (SYX_OBJECT_DATA(object)[i]); } }
INLINE void _syx_memory_gc_mark (SyxOop object) { syx_varsize i; if (!SYX_IS_OBJECT (object) || SYX_OBJECT_IS_MARKED(object) || SYX_IS_NIL(syx_object_get_class (object))) return; SYX_OBJECT_IS_MARKED(object) = TRUE; _syx_memory_gc_mark (SYX_OBJECT(object)->klass); for (i=0; i < syx_object_vars_size (object); i++) _syx_memory_gc_mark (SYX_OBJECT_VARS(object)[i]); if (SYX_OBJECT_HAS_REFS (object)) { for (i=0; i < SYX_OBJECT_DATA_SIZE (object); i++) _syx_memory_gc_mark (SYX_OBJECT_DATA(object)[i]); } }
static void _syx_memory_write (SyxOop *oops, syx_bool mark_type, syx_varsize n, FILE *image) { syx_int32 i, idx; SyxOop oop; for (i=0; i < n; i++) { oop = oops[i]; if (SYX_IS_OBJECT (oop)) { if (mark_type) fputc (SYX_MEMORY_TYPE_OBJECT, image); idx = SYX_MEMORY_INDEX_OF (oop); idx = SYX_COMPAT_SWAP_32 (idx); fwrite (&idx, sizeof (syx_int32), 1, image); } else if (SYX_IS_CPOINTER (oop)) { /* Write nil for C pointers, they must not be available when starting again the interpreter */ if (mark_type) fputc (SYX_MEMORY_TYPE_IMMEDIATE, image); idx = SYX_COMPAT_SWAP_32 (0); fwrite (&idx, sizeof (syx_int32), 1, image); } else { if (mark_type) fputc (SYX_MEMORY_TYPE_IMMEDIATE, image); idx = (syx_int32)oop; idx = SYX_COMPAT_SWAP_32 (idx); fwrite (&idx, sizeof (syx_int32), 1, image); } } }