Example #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);
        }
    }
}
Example #2
0
/*!
  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;
}
Example #3
0
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]);
    }
}
Example #4
0
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]);
    }
}
Example #5
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);
        }
    }
}