Exemple #1
0
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);
        }
    }
}
Exemple #2
0
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);
        }
    }
}
Exemple #3
0
/*! 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;
    }
}