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); } } }
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); } } }
/*! Print to stdout the current execution state of the interpreter and the Process traceback */ void syx_show_traceback (void) { SyxInterpState *es; SyxInterpFrame *frame, *homeframe; syx_symbol traceformat; SyxOop classname; syx_symbol extraclass; SyxOop receiver; if (!syx_memory) { puts ("Can't print the memory state"); return; } es = &_syx_interp_state; frame = es->frame; puts ("Memory state:"); printf("Memory size: %d\n", _syx_memory_size); printf("Freed memory top: %d\n", _syx_freed_memory_top); if (!_syx_memory_gc_trans_running) puts ("No GC transaction"); else printf("GC transaction top: %d\n", _syx_memory_gc_trans_top); if (!es) { puts ("Can't print the execution state"); return; } puts ("\nExecution state:"); printf("Process: %p (memory index: %ld)\n", SYX_OOP_CAST_POINTER (syx_processor_active_process), SYX_MEMORY_INDEX_OF (syx_processor_active_process)); printf("Frame: %p\n", (syx_pointer) frame); if (!frame) return; printf("Receiver: %p (memory index: %ld)\n", SYX_OOP_CAST_POINTER (frame->receiver), SYX_MEMORY_INDEX_OF (frame->receiver)); printf("Arguments: %p\n", (syx_pointer) es->arguments); printf("Temporaries: %p\n", (syx_pointer) es->temporaries); printf("Stack: %p\n", (syx_pointer) frame->stack); printf("Literals: %p\n", (syx_pointer) es->method_literals); printf("Bytecodes: %p (size: %d)\n", (syx_pointer) es->method_bytecodes, es->method_bytecodes_count); printf("Byteslice: %d\n", es->byteslice); printf("Instruction pointer: %p\n", (syx_pointer) frame->next_instruction); printf("Stack pointer: %p\n", (syx_pointer) frame->stack); printf("Message receiver: %p (memory index: %ld)\n", SYX_OOP_CAST_POINTER (es->message_receiver), SYX_MEMORY_INDEX_OF (es->message_receiver)); printf("Message arguments: %p (size: %d)\n", (syx_pointer) es->message_arguments, es->message_arguments_count); if (SYX_IS_NIL (frame->detached_frame)) printf("Process offset: %d\n", SYX_POINTERS_OFFSET (frame, SYX_OBJECT_DATA (SYX_PROCESS_STACK (_syx_interp_state.process)))); puts ("\nTraceback:"); while (frame) { if (frame->outer_frame) { homeframe = frame->outer_frame; while (homeframe->outer_frame) homeframe = homeframe->outer_frame; traceformat = "%s%s>>%s[]\n"; } else { homeframe = frame; traceformat = "%s%s>>%s\n"; } receiver = frame->receiver; classname = SYX_CLASS_NAME(syx_object_get_class(receiver)); if (SYX_IS_NIL (classname)) { classname = SYX_CLASS_NAME(SYX_METACLASS_INSTANCE_CLASS(syx_object_get_class(receiver))); extraclass = " class"; } else extraclass = ""; printf (traceformat, SYX_OBJECT_SYMBOL(classname), extraclass, SYX_OBJECT_SYMBOL(SYX_METHOD_SELECTOR(homeframe->method))); frame = frame->parent_frame; } }