move fix-up code into new slang_fixup_save() function
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 18 Nov 2006 17:45:01 +0000 (17:45 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 18 Nov 2006 17:45:01 +0000 (17:45 +0000)
src/mesa/shader/slang/slang_assemble.c
src/mesa/shader/slang/slang_compile_function.c
src/mesa/shader/slang/slang_compile_function.h

index 09b1df7cb0e1de193e2c2161442ae6c258b05f12..0cba5d5d007f6ecb70a85af2dfddcc78da560c79 100644 (file)
@@ -289,24 +289,18 @@ _slang_assemble_function(slang_assemble_ctx * A, slang_function * fun)
    fun->address = A->file->count;
 
    if (fun->body == NULL) {
-      /* jump to the actual function body - we do not know it, so add the instruction
-       * to fixup table */
-      fun->fixups.table = (GLuint *)
-         slang_alloc_realloc(fun->fixups.table,
-                             fun->fixups.count * sizeof(GLuint),
-                             (fun->fixups.count + 1) * sizeof(GLuint));
-      if (fun->fixups.table == NULL)
-         return GL_FALSE;
-      fun->fixups.table[fun->fixups.count] = fun->address;
-      fun->fixups.count++;
+      /* jump to the actual function body - we do not know it, so add
+       * the instruction to fixup table
+       */
+      if (!slang_fixup_save(&fun->fixups, fun->address))
+         return GL_FALSE;
       if (!PUSH(A->file, slang_asm_jump))
          return GL_FALSE;
       return GL_TRUE;
    }
    else {
-      GLuint i;
-
       /* resolve all fixup table entries and delete it */
+      GLuint i;
       for (i = 0; i < fun->fixups.count; i++)
          A->file->code[fun->fixups.table[i]].param[0] = fun->address;
       slang_fixup_table_free(&fun->fixups);
index b0e2b62d423bb03a5ef731e18dcfca24fb04fbad..e6e0d89ddb66055ba9c5c049c799d2039e9b575b 100644 (file)
@@ -47,6 +47,25 @@ slang_fixup_table_free(slang_fixup_table * fix)
    slang_fixup_table_init(fix);
 }
 
+/**
+ * Add a new fixup address to the table.
+ */
+GLboolean
+slang_fixup_save(slang_fixup_table *fixups, GLuint address)
+{
+   fixups->table = (GLuint *)
+      slang_alloc_realloc(fixups->table,
+                          fixups->count * sizeof(GLuint),
+                          (fixups->count + 1) * sizeof(GLuint));
+   if (fixups->table == NULL)
+      return GL_FALSE;
+   fixups->table[fixups->count] = address;
+   fixups->count++;
+   return GL_TRUE;
+}
+
+
+
 /* slang_function */
 
 int
index 6d3b85399cd2842ba6ab40910b3cce1fda36ad4e..8835544bf381566a62686c58e46cf3cf649ea14e 100644 (file)
@@ -41,14 +41,20 @@ typedef enum slang_function_kind_
    slang_func_operator
 } slang_function_kind;
 
+
+/**
+ * When we need to fill in addresses which we won't know until the future,
+ * we keep track of them with a fix-up table.
+ */
 typedef struct slang_fixup_table_
 {
-   GLuint *table;
+   GLuint *table;     /**< array[count] of addresses */
    GLuint count;
 } slang_fixup_table;
 
 extern void slang_fixup_table_init(slang_fixup_table *);
 extern void slang_fixup_table_free(slang_fixup_table *);
+extern GLboolean slang_fixup_save(slang_fixup_table *fixups, GLuint address);
 
 
 /**