slang_variable_scope now stores array of pointers to slang_variables.

This commit is contained in:
Brian 2007-01-13 14:47:48 -07:00
parent 97c7937c65
commit 5daa99d2a4
6 changed files with 63 additions and 39 deletions

View file

@ -218,7 +218,7 @@ sizeof_variables(slang_assemble_ctx * A, slang_variable_scope * vars,
GLuint i;
for (i = start; i < stop; i++)
if (!sizeof_variable2(A, &vars->variables[i], size))
if (!sizeof_variable2(A, vars->variables[i], size))
return GL_FALSE;
return GL_TRUE;
}
@ -270,7 +270,7 @@ _slang_locate_function(const slang_function_scope * funcs, slang_atom a_name,
return NULL;
}
if (!slang_type_specifier_equal(&ti.spec,
&f->parameters->variables[j/* + haveRetValue*/].type.specifier)) {
&f->parameters->variables[j/* + haveRetValue*/]->type.specifier)) {
slang_assembly_typeinfo_destruct(&ti);
break;
}
@ -278,8 +278,8 @@ _slang_locate_function(const slang_function_scope * funcs, slang_atom a_name,
/* "out" and "inout" formal parameter requires the actual parameter to be l-value */
if (!ti.can_be_referenced &&
(f->parameters->variables[j/* + haveRetValue*/].type.qualifier == slang_qual_out ||
f->parameters->variables[j/* + haveRetValue*/].type.qualifier == slang_qual_inout))
(f->parameters->variables[j/* + haveRetValue*/]->type.qualifier == slang_qual_out ||
f->parameters->variables[j/* + haveRetValue*/]->type.qualifier == slang_qual_inout))
break;
}
if (j == num_args)
@ -599,8 +599,8 @@ _slang_assemble_function_call(slang_assemble_ctx * A, slang_function * fun,
/* push the actual parameters on the stack */
for (i = 0; i < param_count; i++) {
if (fun->parameters->variables[i /*+ haveRetValue*/].type.qualifier == slang_qual_inout ||
fun->parameters->variables[i /*+ haveRetValue*/].type.qualifier == slang_qual_out) {
if (fun->parameters->variables[i /*+ haveRetValue*/]->type.qualifier == slang_qual_inout ||
fun->parameters->variables[i /*+ haveRetValue*/]->type.qualifier == slang_qual_out) {
if (!PLAB2(A->file, slang_asm_local_addr, A->local.addr_tmp, 4))
return GL_FALSE;
/* TODO: optimize the "out" parameter case */
@ -644,8 +644,8 @@ _slang_assemble_function_call(slang_assemble_ctx * A, slang_function * fun,
A->swz = p_swz[j];
A->ref = p_ref[j];
if (fun->parameters->variables[j /*+ haveRetValue*/].type.qualifier == slang_qual_inout ||
fun->parameters->variables[j/* + haveRetValue*/].type.qualifier == slang_qual_out) {
if (fun->parameters->variables[j /*+ haveRetValue*/]->type.qualifier == slang_qual_inout ||
fun->parameters->variables[j/* + haveRetValue*/]->type.qualifier == slang_qual_out) {
/* for output parameter copy the contents of the formal parameter
* back to the original actual parameter
*/
@ -1088,7 +1088,7 @@ handle_field(slang_assemble_ctx * A, slang_assembly_typeinfo * tia,
slang_storage_aggregate agg;
GLuint size;
field = &tib->spec._struct->fields->variables[i];
field = tib->spec._struct->fields->variables[i];
if (!slang_storage_aggregate_construct(&agg))
RETURN_NIL();
if (!_slang_aggregate_variable(&agg, &field->type.specifier,

View file

@ -28,6 +28,7 @@
#include "imports.h"
#include "mtypes.h"
#include "slang_utility.h"
#include "slang_vartable.h"
#if defined __cplusplus
extern "C" {
@ -243,12 +244,6 @@ typedef struct slang_assembly_name_space_
} slang_assembly_name_space;
typedef struct {
GLboolean TempUsed[MAX_PROGRAM_TEMPS];
GLuint NumSamplers;
} slang_gen_context;
typedef struct slang_assemble_ctx_
{
slang_assembly_file *file;
@ -260,7 +255,7 @@ typedef struct slang_assemble_ctx_
slang_ref_type ref;
slang_swizzle swz;
struct gl_program *program;
slang_gen_context *codegen;
slang_var_table *vartable;
} slang_assemble_ctx;
extern struct slang_function_ *

View file

@ -196,8 +196,8 @@ slang_function_scope_find(slang_function_scope * funcs, slang_function * fun,
continue;
for (j = haveRetValue; j < fun->param_count; j++) {
if (!slang_type_specifier_equal
(&fun->parameters->variables[j].type.specifier,
&f->parameters->variables[j].type.specifier))
(&fun->parameters->variables[j]->type.specifier,
&f->parameters->variables[j]->type.specifier))
break;
}
if (j == fun->param_count) {

View file

@ -153,8 +153,8 @@ int slang_struct_equal (const slang_struct *x, const slang_struct *y)
return 0;
for (i = 0; i < x->fields->num_variables; i++)
{
slang_variable *varx = &x->fields->variables[i];
slang_variable *vary = &y->fields->variables[i];
slang_variable *varx = x->fields->variables[i];
slang_variable *vary = y->fields->variables[i];
if (varx->a_name != vary->a_name)
return 0;

View file

@ -123,6 +123,29 @@ slang_fully_specified_type_copy(slang_fully_specified_type * x,
return 1;
}
static slang_variable *
slang_variable_new(void)
{
slang_variable *v = (slang_variable *) malloc(sizeof(slang_variable));
if (v) {
if (!slang_variable_construct(v)) {
free(v);
v = NULL;
}
}
return v;
}
static void
slang_variable_delete(slang_variable * var)
{
slang_variable_destruct(var);
free(var);
}
/*
* slang_variable_scope
*/
@ -152,8 +175,10 @@ slang_variable_scope_destruct(slang_variable_scope * scope)
if (!scope)
return;
for (i = 0; i < scope->num_variables; i++)
slang_variable_destruct(scope->variables + i);
for (i = 0; i < scope->num_variables; i++) {
if (scope->variables[i])
slang_variable_delete(scope->variables[i]);
}
slang_alloc_free(scope->variables);
/* do not free scope->outer_scope */
}
@ -166,21 +191,22 @@ slang_variable_scope_copy(slang_variable_scope * x,
unsigned int i;
_slang_variable_scope_ctr(&z);
z.variables = (slang_variable *)
slang_alloc_malloc(y->num_variables * sizeof(slang_variable));
z.variables = (slang_variable **)
_mesa_calloc(y->num_variables * sizeof(slang_variable *));
if (z.variables == NULL) {
slang_variable_scope_destruct(&z);
return 0;
}
for (z.num_variables = 0; z.num_variables < y->num_variables;
z.num_variables++) {
if (!slang_variable_construct(&z.variables[z.num_variables])) {
z.variables[z.num_variables] = slang_variable_new();
if (!z.variables[z.num_variables]) {
slang_variable_scope_destruct(&z);
return 0;
}
}
for (i = 0; i < z.num_variables; i++) {
if (!slang_variable_copy(&z.variables[i], &y->variables[i])) {
if (!slang_variable_copy(z.variables[i], y->variables[i])) {
slang_variable_scope_destruct(&z);
return 0;
}
@ -200,19 +226,20 @@ slang_variable *
slang_variable_scope_grow(slang_variable_scope *scope)
{
const int n = scope->num_variables;
scope->variables = (slang_variable *)
scope->variables = (slang_variable **)
slang_alloc_realloc(scope->variables,
n * sizeof(slang_variable),
(n + 1) * sizeof(slang_variable));
n * sizeof(slang_variable *),
(n + 1) * sizeof(slang_variable *));
if (!scope->variables)
return NULL;
scope->num_variables++;
if (!slang_variable_construct(scope->variables + n))
scope->variables[n] = slang_variable_new();
if (!scope->variables[n])
return NULL;
return scope->variables + n;
return scope->variables[n];
}
@ -230,12 +257,13 @@ slang_variable_construct(slang_variable * var)
var->address = ~0;
var->size = 0;
var->global = GL_FALSE;
var->declared = GL_FALSE;
var->isTemp = GL_FALSE;
var->used = GL_FALSE;
var->aux = NULL;
return 1;
}
void
slang_variable_destruct(slang_variable * var)
{
@ -246,6 +274,7 @@ slang_variable_destruct(slang_variable * var)
}
}
int
slang_variable_copy(slang_variable * x, const slang_variable * y)
{
@ -291,8 +320,8 @@ _slang_locate_variable(const slang_variable_scope * scope,
GLuint i;
for (i = 0; i < scope->num_variables; i++)
if (a_name == scope->variables[i].a_name)
return &scope->variables[i];
if (a_name == scope->variables[i]->a_name)
return scope->variables[i];
if (all && scope->outer_scope != NULL)
return _slang_locate_variable(scope->outer_scope, a_name, 1);
return NULL;
@ -384,7 +413,7 @@ build_quant(slang_export_data_quant * q, const slang_variable * var)
slang_export_data_quant_ctr(&q->structure[i]);
for (i = 0; i < q->u.field_count; i++) {
if (!build_quant(&q->structure[i],
&spec->_struct->fields->variables[i]))
spec->_struct->fields->variables[i]))
return GL_FALSE;
}
}
@ -400,7 +429,7 @@ _slang_build_export_data_table(slang_export_data_table * tbl,
GLuint i;
for (i = 0; i < vars->num_variables; i++) {
const slang_variable *var = &vars->variables[i];
const slang_variable *var = vars->variables[i];
slang_export_data_entry *e;
e = slang_export_data_table_add(tbl);

View file

@ -81,7 +81,7 @@ typedef struct slang_variable_
GLuint size; /**< Variable's size in bytes */
GLboolean global; /**< A global var? */
GLboolean used; /**< Ever referenced by code? */
GLboolean declared; /**< Declared by slang_variable_decl? */
GLboolean isTemp; /**< a named temporary (__resultTmp) */
void *aux; /**< Used during code gen */
} slang_variable;
@ -91,7 +91,7 @@ typedef struct slang_variable_
*/
typedef struct slang_variable_scope_
{
slang_variable *variables; /**< Array [num_variables] */
slang_variable **variables; /**< Array [num_variables] of ptrs to vars */
GLuint num_variables;
struct slang_variable_scope_ *outer_scope;
} slang_variable_scope;
@ -110,7 +110,7 @@ extern int
slang_variable_scope_copy(slang_variable_scope *,
const slang_variable_scope *);
slang_variable *
extern slang_variable *
slang_variable_scope_grow(slang_variable_scope *);
extern int