Cleanup code.
authorMichal Krol <mjkrol@gmail.org>
Tue, 16 May 2006 09:53:42 +0000 (09:53 +0000)
committerMichal Krol <mjkrol@gmail.org>
Tue, 16 May 2006 09:53:42 +0000 (09:53 +0000)
src/mesa/shader/slang/slang_compile.c
src/mesa/shader/slang/slang_compile.h

index d25f75d..28c4120 100644 (file)
@@ -52,120 +52,65 @@ static GLuint slang_var_pool_alloc (slang_var_pool *pool, unsigned int size)
        return addr;
 }
 
-/* slang_translation_unit */
+/*
+ * slang_code_unit
+ */
 
-int slang_translation_unit_construct (slang_translation_unit *unit)
+GLvoid
+_slang_code_unit_ctr (slang_code_unit *self, struct slang_code_object_ *object)
 {
-       unit->assembly = (slang_assembly_file *) slang_alloc_malloc (sizeof (slang_assembly_file));
-       if (unit->assembly == NULL)
-               return 0;
-       if (!slang_assembly_file_construct (unit->assembly))
-       {
-               slang_alloc_free (unit->assembly);
-               return 0;
-       }
-       unit->global_pool = (slang_var_pool *) slang_alloc_malloc (sizeof (slang_var_pool));
-       if (unit->global_pool == NULL)
-       {
-               slang_assembly_file_destruct (unit->assembly);
-               slang_alloc_free (unit->assembly);
-               return 0;
-       }
-       unit->global_pool->next_addr = 0;
-       unit->machine = (slang_machine *) slang_alloc_malloc (sizeof (slang_machine));
-       if (unit->machine == NULL)
-       {
-               slang_alloc_free (unit->global_pool);
-               slang_assembly_file_destruct (unit->assembly);
-               slang_alloc_free (unit->assembly);
-               return 0;
-       }
-       slang_machine_ctr (unit->machine);
-       unit->atom_pool = (slang_atom_pool *) slang_alloc_malloc (sizeof (slang_atom_pool));
-       if (unit->atom_pool == NULL)
-       {
-               slang_alloc_free (unit->machine);
-               slang_alloc_free (unit->global_pool);
-               slang_assembly_file_destruct (unit->assembly);
-               slang_alloc_free (unit->assembly);
-               return 0;
-       }
-       slang_atom_pool_construct (unit->atom_pool);
-       if (!slang_translation_unit_construct2 (unit, unit->assembly, unit->global_pool, unit->machine,
-                       unit->atom_pool))
-       {
-               slang_alloc_free (unit->atom_pool);
-               slang_alloc_free (unit->machine);
-               slang_alloc_free (unit->global_pool);
-               slang_assembly_file_destruct (unit->assembly);
-               slang_alloc_free (unit->assembly);
-               return 0;
-       }
-       unit->free_assembly = 1;
-       unit->free_global_pool = 1;
-       unit->free_machine = 1;
-       unit->free_atom_pool = 1;
-       return 1;
+   _slang_variable_scope_ctr (&self->vars);
+   _slang_function_scope_ctr (&self->funs);
+   _slang_struct_scope_ctr (&self->structs);
+   self->object = object;
 }
 
-int slang_translation_unit_construct2 (slang_translation_unit *unit, slang_assembly_file *file,
-       slang_var_pool *pool, struct slang_machine_ *mach, slang_atom_pool *atoms)
+GLvoid
+_slang_code_unit_dtr (slang_code_unit *self)
 {
-       if (!slang_variable_scope_construct (&unit->globals))
-               return 0;
-       if (!slang_function_scope_construct (&unit->functions))
-       {
-               slang_variable_scope_destruct (&unit->globals);
-               return 0;
-       }
-       if (!slang_struct_scope_construct (&unit->structs))
-       {
-               slang_variable_scope_destruct (&unit->globals);
-               slang_function_scope_destruct (&unit->functions);
-               return 0;
-       }
-       unit->assembly = file;
-       unit->free_assembly = 0;
-       unit->global_pool = pool;
-       unit->free_global_pool = 0;
-       unit->machine = mach;
-       unit->free_machine = 0;
-       unit->atom_pool = atoms;
-       unit->free_atom_pool = 0;
-       slang_export_data_table_ctr (&unit->exp_data);
-       slang_export_code_table_ctr (&unit->exp_code);
-       return 1;
+   slang_variable_scope_destruct (&self->vars);
+   slang_function_scope_destruct (&self->funs);
+   slang_struct_scope_destruct (&self->structs);
 }
 
-void slang_translation_unit_destruct (slang_translation_unit *unit)
+/*
+ * slang_code_object
+ */
+
+GLvoid
+_slang_code_object_ctr (slang_code_object *self)
 {
-       slang_variable_scope_destruct (&unit->globals);
-       slang_function_scope_destruct (&unit->functions);
-       slang_struct_scope_destruct (&unit->structs);
-       if (unit->free_assembly)
-       {
-               slang_assembly_file_destruct (unit->assembly);
-               slang_alloc_free (unit->assembly);
-       }
-       if (unit->free_global_pool)
-               slang_alloc_free (unit->global_pool);
-       if (unit->free_machine)
-       {
-               slang_machine_dtr (unit->machine);
-               slang_alloc_free (unit->machine);
-       }
-       if (unit->free_atom_pool)
-       {
-               slang_atom_pool_destruct (unit->atom_pool);
-               slang_alloc_free (unit->atom_pool);
-       }
-       slang_export_data_table_dtr (&unit->exp_data);
-       slang_export_code_table_ctr (&unit->exp_code);
+   _slang_code_unit_ctr (&self->builtin[0], self);
+   _slang_code_unit_ctr (&self->builtin[1], self);
+   _slang_code_unit_ctr (&self->builtin[2], self);
+   _slang_code_unit_ctr (&self->unit, self);
+   _slang_assembly_file_ctr (&self->assembly);
+   slang_machine_ctr (&self->machine);
+   self->varpool.next_addr = 0;
+   slang_atom_pool_construct (&self->atompool);
+   slang_export_data_table_ctr (&self->expdata);
+   self->expdata.atoms = &self->atompool;
+   slang_export_code_table_ctr (&self->expcode);
+   self->expcode.atoms = &self->atompool;
+}
+
+GLvoid
+_slang_code_object_dtr (slang_code_object *self)
+{
+   _slang_code_unit_dtr (&self->builtin[0]);
+   _slang_code_unit_dtr (&self->builtin[1]);
+   _slang_code_unit_dtr (&self->builtin[2]);
+   _slang_code_unit_dtr (&self->unit);
+   slang_assembly_file_destruct (&self->assembly);
+   slang_machine_dtr (&self->machine);
+   slang_atom_pool_destruct (&self->atompool);
+   slang_export_data_table_dtr (&self->expdata);
+   slang_export_code_table_ctr (&self->expcode);
 }
 
 /* slang_info_log */
 
-static char *out_of_memory = "error: out of memory\n";
+static char *out_of_memory = "Error: Out of memory.\n";
 
 void slang_info_log_construct (slang_info_log *log)
 {
@@ -181,32 +126,44 @@ void slang_info_log_destruct (slang_info_log *log)
 
 static int slang_info_log_message (slang_info_log *log, const char *prefix, const char *msg)
 {
-       unsigned int new_size;
+   GLuint size;
 
        if (log->dont_free_text)
                return 0;
-       new_size = slang_string_length (prefix) + 3 + slang_string_length (msg);
-       if (log->text != NULL)
-       {
-               unsigned int text_len = slang_string_length (log->text);
-
-               log->text = (char *) slang_alloc_realloc (log->text, text_len + 1, new_size + text_len + 1);
-       }
-       else
-       {
-               log->text = (char *) slang_alloc_malloc (new_size + 1);
-               if (log->text != NULL)
-                       log->text[0] = '\0';
-       }
+   size = slang_string_length (msg) + 2;
+   if (prefix != NULL)
+      size += slang_string_length (prefix) + 2;
+   if (log->text != NULL) {
+      GLuint old_len = slang_string_length (log->text);
+      log->text = (char *) (slang_alloc_realloc (log->text, old_len + 1, old_len + size));
+   }
+   else {
+      log->text = (char *) (slang_alloc_malloc (size));
+      if (log->text != NULL)
+         log->text[0] = '\0';
+   }
        if (log->text == NULL)
                return 0;
-       slang_string_concat (log->text, prefix);
-       slang_string_concat (log->text, ": ");
+   if (prefix != NULL) {
+      slang_string_concat (log->text, prefix);
+      slang_string_concat (log->text, ": ");
+   }
        slang_string_concat (log->text, msg);
        slang_string_concat (log->text, "\n");
        return 1;
 }
 
+int slang_info_log_print (slang_info_log *log, const char *msg, ...)
+{
+   va_list va;
+   char buf[1024];
+
+   va_start (va, msg);
+   _mesa_vsprintf (buf, msg, va);
+   va_end (va);
+   return slang_info_log_message (log, NULL, buf);
+}
+
 int slang_info_log_error (slang_info_log *log, const char *msg, ...)
 {
        va_list va;
@@ -214,10 +171,10 @@ int slang_info_log_error (slang_info_log *log, const char *msg, ...)
 
        va_start (va, msg);
        _mesa_vsprintf (buf, msg, va);
-       if (slang_info_log_message (log, "error", buf))
+   va_end (va);
+       if (slang_info_log_message (log, "Error", buf))
                return 1;
        slang_info_log_memory (log);
-       va_end (va);
        return 0;
 }
 
@@ -228,16 +185,16 @@ int slang_info_log_warning (slang_info_log *log, const char *msg, ...)
 
        va_start (va, msg);
        _mesa_vsprintf (buf, msg, va);
-       if (slang_info_log_message (log, "warning", buf))
+   va_end (va);
+       if (slang_info_log_message (log, "Warning", buf))
                return 1;
        slang_info_log_memory (log);
-       va_end (va);
        return 0;
 }
 
 void slang_info_log_memory (slang_info_log *log)
 {
-       if (!slang_info_log_message (log, "error", "out of memory"))
+       if (!slang_info_log_message (log, "Error", "Out of memory."))
        {
                log->dont_free_text = 1;
                log->text = out_of_memory;
@@ -302,7 +259,7 @@ static int parse_number (slang_parse_ctx *C, int *number)
        }
        C->I++;
        if (*number > 65535)
-               slang_info_log_warning (C->L, "%d: literal integer overflow", *number);
+      slang_info_log_warning (C->L, "%d: literal integer overflow.", *number);
        return 1;
 }
 
@@ -344,7 +301,7 @@ static int check_revision (slang_parse_ctx *C)
 {
        if (*C->I != REVISION)
        {
-               slang_info_log_error (C->L, "internal compiler error");
+      slang_info_log_error (C->L, "Internal compiler error.");
                return 0;
        }
        C->I++;
@@ -486,7 +443,7 @@ static int parse_struct (slang_parse_ctx *C, slang_output_ctx *O, slang_struct *
        name = slang_atom_pool_id (C->atoms, a_name);
        if (name[0] != '\0' && slang_struct_scope_find (O->structs, a_name, 0) != NULL)
        {
-               slang_info_log_error (C->L, "%s: duplicate type name", name);
+      slang_info_log_error (C->L, "%s: duplicate type name.", name);
                return 0;
        }
 
@@ -700,7 +657,7 @@ static int parse_type_specifier (slang_parse_ctx *C, slang_output_ctx *O, slang_
                        stru = slang_struct_scope_find (O->structs, a_name, 1);
                        if (stru == NULL)
                        {
-                               slang_info_log_error (C->L, "%s: undeclared type name",
+            slang_info_log_error (C->L, "%s: undeclared type name.",
                                        slang_atom_pool_id (C->atoms, a_name));
                                return 0;
                        }
@@ -1220,7 +1177,7 @@ static int parse_expression (slang_parse_ctx *C, slang_output_ctx *O, slang_oper
                                id = slang_atom_pool_id (C->atoms, op->a_id);
                                if (!is_constructor_name (id, op->a_id, O->structs))
                                {
-                                       slang_info_log_error (C->L, "%s: undeclared function name", id);
+               slang_info_log_error (C->L, "%s: undeclared function name.", id);
                                        return 0;
                                }
                        }
@@ -1275,7 +1232,7 @@ static int parse_parameter_declaration (slang_parse_ctx *C, slang_output_ctx *O,
        case PARAM_QUALIFIER_IN:
                if (param->type.qualifier != slang_qual_const && param->type.qualifier != slang_qual_none)
                {
-                       slang_info_log_error (C->L, "invalid type qualifier");
+         slang_info_log_error (C->L, "Invalid type qualifier.");
                        return 0;
                }
                break;
@@ -1284,7 +1241,7 @@ static int parse_parameter_declaration (slang_parse_ctx *C, slang_output_ctx *O,
                        param->type.qualifier = slang_qual_out;
                else
                {
-                       slang_info_log_error (C->L, "invalid type qualifier");
+         slang_info_log_error (C->L, "Invalid type qualifier.");
                        return 0;
                }
                break;
@@ -1293,7 +1250,7 @@ static int parse_parameter_declaration (slang_parse_ctx *C, slang_output_ctx *O,
                        param->type.qualifier = slang_qual_inout;
                else
                {
-                       slang_info_log_error (C->L, "invalid type qualifier");
+         slang_info_log_error (C->L, "Invalid type qualifier.");
                        return 0;
                }
                break;
@@ -1815,7 +1772,7 @@ static int parse_function (slang_parse_ctx *C, slang_output_ctx *O, int definiti
                {
                        if (found_func->body != NULL)
                        {
-                               slang_info_log_error (C->L, "%s: function already has a body",
+            slang_info_log_error (C->L, "%s: function already has a body.",
                                        slang_atom_pool_id (C->atoms, parsed_func.header.a_name));
                                slang_function_destruct (&parsed_func);
                                return 0;
@@ -1885,17 +1842,18 @@ static int parse_declaration (slang_parse_ctx *C, slang_output_ctx *O)
 #define EXTERNAL_FUNCTION_DEFINITION 1
 #define EXTERNAL_DECLARATION 2
 
-static int parse_translation_unit (slang_parse_ctx *C, slang_translation_unit *unit)
+static GLboolean
+parse_code_unit (slang_parse_ctx *C, slang_code_unit *unit)
 {
        slang_output_ctx o;
 
-       /* setup output context */
-       o.funs = &unit->functions;
-       o.structs = &unit->structs;
-       o.vars = &unit->globals;
-       o.assembly = unit->assembly;
-       o.global_pool = unit->global_pool;
-       o.machine = unit->machine;
+   /* setup output context */
+   o.funs = &unit->funs;
+   o.structs = &unit->structs;
+   o.vars = &unit->vars;
+   o.assembly = &unit->object->assembly;
+   o.global_pool = &unit->object->varpool;
+   o.machine = &unit->object->machine;
 
        /* parse individual functions and declarations */
        while (*C->I != EXTERNAL_NULL)
@@ -1927,60 +1885,44 @@ static int parse_translation_unit (slang_parse_ctx *C, slang_translation_unit *u
 #define BUILTIN_TARGET 2
 #define BUILTIN_TOTAL 3
 
-static int compile_binary (const byte *prod, slang_translation_unit *unit, slang_unit_type type,
-       slang_info_log *log, slang_translation_unit *builtins, slang_assembly_file *file,
-       slang_var_pool *pool, slang_machine *mach, slang_translation_unit *downlink,
-       slang_atom_pool *atoms)
+static GLboolean
+compile_binary (const byte *prod, slang_code_unit *unit, slang_unit_type type,
+                slang_info_log *infolog, slang_code_unit *builtin, slang_code_unit *downlink)
 {
-       slang_parse_ctx C;
+   slang_parse_ctx C;
 
-       /* create translation unit object */
-       if (file != NULL)
-       {
-               if (!slang_translation_unit_construct2 (unit, file, pool, mach, atoms))
-                       return 0;
-               unit->type = type;
-       }
+   unit->type = type;
 
-       /* set-up parse context */
-       C.I = prod;
-       C.L = log;
-       C.parsing_builtin = builtins == NULL;
-       C.global_scope = 1;
-       C.atoms = unit->atom_pool;
-
-       if (!check_revision (&C))
-       {
-               slang_translation_unit_destruct (unit);
-               return 0;
-       }
+   /* setup parse context */
+   C.I = prod;
+   C.L = infolog;
+   C.parsing_builtin = (builtin == NULL);
+   C.global_scope = GL_TRUE;
+   C.atoms = &unit->object->atompool;
 
-       if (downlink != NULL)
-       {
-               unit->functions.outer_scope = &downlink->functions;
-               unit->globals.outer_scope = &downlink->globals;
-               unit->structs.outer_scope = &downlink->structs;
-       }
+   if (!check_revision (&C))
+      return GL_FALSE;
 
-       /* parse translation unit */
-       if (!parse_translation_unit (&C, unit))
-       {
-               slang_translation_unit_destruct (unit);
-               return 0;
-       }
+   if (downlink != NULL) {
+      unit->vars.outer_scope = &downlink->vars;
+      unit->funs.outer_scope = &downlink->funs;
+      unit->structs.outer_scope = &downlink->structs;
+   }
 
-       return 1;
+   /* parse translation unit */
+   return parse_code_unit (&C, unit);
 }
 
-static int compile_with_grammar (grammar id, const char *source, slang_translation_unit *unit,
-       slang_unit_type type, slang_info_log *log, slang_translation_unit *builtins)
+static GLboolean
+compile_with_grammar (grammar id, const char *source, slang_code_unit *unit, slang_unit_type type,
+                      slang_info_log *infolog, slang_code_unit *builtin)
 {
        byte *prod;
-       unsigned int size, start, version;
+   GLuint size, start, version;
 
        /* retrieve version */
-       if (!_slang_preprocess_version (source, &version, &start, log))
-               return 0;
+   if (!_slang_preprocess_version (source, &version, &start, infolog))
+      return GL_FALSE;
 
        /* check the syntax and generate its binary representation */
        if (!grammar_fast_check (id, (const byte *) source + start, &prod, &size, 65536))
@@ -1988,20 +1930,18 @@ static int compile_with_grammar (grammar id, const char *source, slang_translati
                char buf[1024];
                unsigned int pos;
                grammar_get_last_error ( (unsigned char*) buf, 1024, (int*) &pos);
-               slang_info_log_error (log, buf);
-               return 0;
+      slang_info_log_error (infolog, buf);
+      return GL_FALSE;
        }
 
        /* syntax is okay - translate it to internal representation */
-       if (!compile_binary (prod, unit, type, log, builtins, NULL, NULL, NULL,
-                       &builtins[BUILTIN_TARGET], NULL))
-       {
-               grammar_alloc_free (prod);
-               return 0;
-       }
+   if (!compile_binary (prod, unit, type, infolog, builtin, &builtin[BUILTIN_TARGET])) {
+      grammar_alloc_free (prod);
+      return GL_FALSE;
+   }
 
-       grammar_alloc_free (prod);
-       return 1;
+   grammar_alloc_free (prod);
+   return GL_TRUE;
 }
 
 static const char *slang_shader_syn =
@@ -2024,12 +1964,13 @@ static const byte slang_vertex_builtin_gc[] = {
 #include "library/slang_vertex_builtin_gc.h"
 };
 
-static int compile (grammar *id, slang_translation_unit *builtin_units, int *compiled,
-       const char *source, slang_translation_unit *unit, slang_unit_type type, slang_info_log *log)
+static GLboolean
+compile_object (grammar *id, const char *source, slang_code_object *object, slang_unit_type type,
+                slang_info_log *infolog)
 {
-       slang_translation_unit *builtins = NULL;
+   slang_code_unit *builtins = NULL;
 
-       /* load slang grammar */
+   /* load GLSL grammar */
        *id = grammar_load_from_text ((const byte *) (slang_shader_syn));
        if (*id == 0)
        {
@@ -2037,8 +1978,8 @@ static int compile (grammar *id, slang_translation_unit *builtin_units, int *com
                int pos;
 
                grammar_get_last_error (buf, 1024, &pos);
-               slang_info_log_error (log, (const char *) (buf));
-               return 0;
+      slang_info_log_error (infolog, (const char *) (buf));
+      return GL_FALSE;
        }
 
        /* set shader type - the syntax is slightly different for different shaders */
@@ -2054,95 +1995,68 @@ static int compile (grammar *id, slang_translation_unit *builtin_units, int *com
        if (type == slang_unit_fragment_shader || type == slang_unit_vertex_shader)
        {
                /* compile core functionality first */
-               if (!compile_binary (slang_core_gc, &builtin_units[BUILTIN_CORE],
-                               slang_unit_fragment_builtin, log, NULL, unit->assembly, unit->global_pool,
-                               unit->machine, NULL, unit->atom_pool))
-                       return 0;
-               compiled[BUILTIN_CORE] = 1;
+      if (!compile_binary (slang_core_gc, &object->builtin[BUILTIN_CORE],
+                           slang_unit_fragment_builtin, infolog, NULL, NULL))
+         return GL_FALSE;
 
                /* compile common functions and variables, link to core */
-               if (!compile_binary (slang_common_builtin_gc, &builtin_units[BUILTIN_COMMON],
-                               slang_unit_fragment_builtin, log, NULL, unit->assembly, unit->global_pool,
-                               unit->machine, &builtin_units[BUILTIN_CORE], unit->atom_pool))
-                       return 0;
-               compiled[BUILTIN_COMMON] = 1;
+      if (!compile_binary (slang_common_builtin_gc, &object->builtin[BUILTIN_COMMON],
+                           slang_unit_fragment_builtin, infolog, NULL,
+                           &object->builtin[BUILTIN_CORE]))
+         return GL_FALSE;
 
                /* compile target-specific functions and variables, link to common */
                if (type == slang_unit_fragment_shader)
                {
-                       if (!compile_binary (slang_fragment_builtin_gc, &builtin_units[BUILTIN_TARGET],
-                                       slang_unit_fragment_builtin, log, NULL, unit->assembly, unit->global_pool,
-                                       unit->machine, &builtin_units[BUILTIN_COMMON], unit->atom_pool))
-                               return 0;
+         if (!compile_binary (slang_fragment_builtin_gc, &object->builtin[BUILTIN_TARGET],
+                              slang_unit_fragment_builtin, infolog, NULL,
+                              &object->builtin[BUILTIN_COMMON]))
+            return GL_FALSE;
                }
                else if (type == slang_unit_vertex_shader)
                {
-                       if (!compile_binary (slang_vertex_builtin_gc, &builtin_units[BUILTIN_TARGET],
-                                       slang_unit_vertex_builtin, log, NULL, unit->assembly, unit->global_pool,
-                                       unit->machine, &builtin_units[BUILTIN_COMMON], unit->atom_pool))
-                               return 0;
+         if (!compile_binary (slang_vertex_builtin_gc, &object->builtin[BUILTIN_TARGET],
+                              slang_unit_vertex_builtin, infolog, NULL,
+                              &object->builtin[BUILTIN_COMMON]))
+            return GL_FALSE;
                }
-               compiled[BUILTIN_TARGET] = 1;
 
                /* disable language extensions */
                grammar_set_reg8 (*id, (const byte *) "parsing_builtin", 0);
-               builtins = builtin_units;
+      builtins = object->builtin;
        }
 
        /* compile the actual shader - pass-in built-in library for external shader */
-       if (!compile_with_grammar (*id, source, unit, type, log, builtins))
-               return 0;
-
-       return 1;
+   return compile_with_grammar (*id, source, &object->unit, type, infolog, builtins);
 }
 
-int _slang_compile (const char *source, slang_translation_unit *unit, slang_unit_type type,
-       slang_info_log *log)
+GLboolean
+_slang_compile (const char *source, slang_code_object *object, slang_unit_type type,
+                slang_info_log *infolog)
 {
-       int success;
-       grammar id = 0;
-/*     slang_translation_unit builtin_units[BUILTIN_TOTAL];*/
-       slang_translation_unit *builtin_units;
-       int compiled[BUILTIN_TOTAL] = { 0 };
-
-       /* create the main unit first */
-       if (!slang_translation_unit_construct (unit))
-               return 0;
-       unit->type = type;
-
-       builtin_units = (slang_translation_unit *) slang_alloc_malloc (BUILTIN_TOTAL * sizeof (slang_translation_unit));
-       success = compile (&id, builtin_units, compiled, source, unit, type, log);
-
-       /* destroy built-in library */
-       /* XXX: free with the unit */
-       /*if (type == slang_unit_fragment_shader || type == slang_unit_vertex_shader)
-       {
-               int i;
-
-               for (i = 0; i < BUILTIN_TOTAL; i++)
-                       if (compiled[i] != 0)
-                               slang_translation_unit_destruct (&builtin_units[i]);
-       }*/
-       if (id != 0)
-               grammar_destroy (id);
+   GLboolean success;
+   grammar id = 0;
 
-       if (!success)
-               return 0;
+   _slang_code_object_dtr (object);
+   _slang_code_object_ctr (object);
 
-       unit->exp_data.atoms = unit->atom_pool;
-       if (!_slang_build_export_data_table (&unit->exp_data, &unit->globals))
-               return 0;
+   success = compile_object (&id, source, object, type, infolog);
+   if (id != 0)
+      grammar_destroy (id);
+   if (!success)
+      return GL_FALSE;
 
-       unit->exp_code.atoms = unit->atom_pool;
-       if (!_slang_build_export_code_table (&unit->exp_code, &unit->functions, unit))
-               return 0;
+   if (!_slang_build_export_data_table (&object->expdata, &object->unit.vars))
+      return GL_FALSE;
+   if (!_slang_build_export_code_table (&object->expcode, &object->unit.funs, &object->unit))
+      return GL_FALSE;
 
 #if defined(USE_X86_ASM) || defined(SLANG_X86)
-       /* XXX: lookup the @main label */
-       if (!_slang_x86_codegen (unit->machine, unit->assembly, unit->exp_code.entries[0].address))
-               return 0;
+   /* XXX: lookup the @main label */
+   if (!_slang_x86_codegen (&object->machine, &object->assembly, object->expcode.entries[0].address))
+      return GL_FALSE;
 #endif
 
-       return 1;
+   return GL_TRUE;
 }
 
index a1957bc..89c3dcf 100644 (file)
@@ -49,28 +49,38 @@ typedef struct slang_var_pool_
        GLuint next_addr;
 } slang_var_pool;
 
-typedef struct slang_translation_unit_
+typedef struct slang_code_unit_
 {
-       slang_variable_scope globals;
-       slang_function_scope functions;
-       slang_struct_scope structs;
-       slang_unit_type type;
-       slang_assembly_file *assembly;
-       int free_assembly;
-       slang_var_pool *global_pool;
-       int free_global_pool;
-       slang_machine *machine;
-       int free_machine;
-       slang_atom_pool *atom_pool;
-       int free_atom_pool;
-       slang_export_data_table exp_data;
-       slang_export_code_table exp_code;
-} slang_translation_unit;
-
-int slang_translation_unit_construct (slang_translation_unit *);
-int slang_translation_unit_construct2 (slang_translation_unit *, slang_assembly_file *,
-       slang_var_pool *, slang_machine *, slang_atom_pool *);
-void slang_translation_unit_destruct (slang_translation_unit *);
+   slang_variable_scope vars;
+   slang_function_scope funs;
+   slang_struct_scope structs;
+   slang_unit_type type;
+   struct slang_code_object_ *object;
+} slang_code_unit;
+
+extern GLvoid
+_slang_code_unit_ctr (slang_code_unit *, struct slang_code_object_ *);
+
+extern GLvoid
+_slang_code_unit_dtr (slang_code_unit *);
+
+typedef struct slang_code_object_
+{
+   slang_code_unit builtin[3];
+   slang_code_unit unit;
+   slang_assembly_file assembly;
+   slang_machine machine;
+   slang_var_pool varpool;
+   slang_atom_pool atompool;
+   slang_export_data_table expdata;
+   slang_export_code_table expcode;
+} slang_code_object;
+
+extern GLvoid
+_slang_code_object_ctr (slang_code_object *);
+
+extern GLvoid
+_slang_code_object_dtr (slang_code_object *);
 
 typedef struct slang_info_log_
 {
@@ -80,11 +90,13 @@ typedef struct slang_info_log_
 
 void slang_info_log_construct (slang_info_log *);
 void slang_info_log_destruct (slang_info_log *);
+int slang_info_log_print (slang_info_log *, const char *, ...);
 int slang_info_log_error (slang_info_log *, const char *, ...);
 int slang_info_log_warning (slang_info_log *, const char *, ...);
 void slang_info_log_memory (slang_info_log *);
 
-int _slang_compile (const char *, slang_translation_unit *, slang_unit_type type, slang_info_log *);
+extern GLboolean
+_slang_compile (const char *, slang_code_object *, slang_unit_type, slang_info_log *);
 
 #ifdef __cplusplus
 }