Exemple #1
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;
}
Exemple #2
0
/*!
  Parse a declaration file.

  \return TRUE if no error has occurred
*/
syx_bool
syx_cold_file_in (syx_symbol filename)
{
  SyxLexer *lexer;
  syx_string buffer;
  syx_int32 fd, count;
  syx_size size;
#ifdef HAVE_FSTAT
  struct stat statbuf;
#endif

  if ((fd = open (filename, O_RDONLY)) < 0)
     {
        syx_error ("can't open %s\n", filename);
        return FALSE;
     }
#ifdef HAVE_FSTAT
  if ((fstat (fd, &statbuf)) < 0)
     {
        syx_error ("can't obtain size of %s\n", filename);
        return FALSE;
     }
  size = statbuf.st_size;
#else
  size = 1000000;
#endif

  buffer = (syx_string) syx_malloc (size + 1);
  count = read (fd, buffer, size);
  buffer[count - 1] = '\0';
   
  close (fd);
   
  lexer = syx_lexer_new (buffer);
  if (!lexer)
    {
      syx_free (buffer);
      return FALSE;
    }

  if (!syx_cold_parse (lexer))
    {
      syx_lexer_free (lexer, TRUE);
      return FALSE;
    }

  syx_lexer_free (lexer, TRUE);
  return TRUE;
}