summaryrefslogtreecommitdiff
path: root/src/mesa/shader/slang/slang_typeinfo.c
diff options
context:
space:
mode:
authorBrian <brian@yutani.localnet.net>2007-02-02 16:10:02 -0700
committerBrian <brian@yutani.localnet.net>2007-02-02 16:10:02 -0700
commit1f9def3163e26310b688336ef6dd513b99506151 (patch)
tree8cdb2f31eae88f9ed7df50042dbd3e3795faa2a1 /src/mesa/shader/slang/slang_typeinfo.c
parent9cfee527f6ff5ff3e4de43b46ef098cb86211d2d (diff)
move _slang_locate_function()
Diffstat (limited to 'src/mesa/shader/slang/slang_typeinfo.c')
-rw-r--r--src/mesa/shader/slang/slang_typeinfo.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/mesa/shader/slang/slang_typeinfo.c b/src/mesa/shader/slang/slang_typeinfo.c
index cfed54276d..8bedb40435 100644
--- a/src/mesa/shader/slang/slang_typeinfo.c
+++ b/src/mesa/shader/slang/slang_typeinfo.c
@@ -604,6 +604,58 @@ _slang_typeof_operation_(const slang_operation * op,
+slang_function *
+_slang_locate_function(const slang_function_scope * funcs, slang_atom a_name,
+ const slang_operation * args, GLuint num_args,
+ const slang_name_space * space,
+ slang_atom_pool * atoms)
+{
+ GLuint i;
+
+ for (i = 0; i < funcs->num_functions; i++) {
+ slang_function *f = &funcs->functions[i];
+ const GLuint haveRetValue = _slang_function_has_return_value(f);
+ GLuint j;
+
+ if (a_name != f->header.a_name)
+ continue;
+ if (f->param_count - haveRetValue != num_args)
+ continue;
+
+ /* compare parameter / argument types */
+ for (j = 0; j < num_args; j++) {
+ slang_typeinfo ti;
+
+ if (!slang_typeinfo_construct(&ti))
+ return NULL;
+ if (!_slang_typeof_operation_(&args[j], space, &ti, atoms)) {
+ slang_typeinfo_destruct(&ti);
+ return NULL;
+ }
+ if (!slang_type_specifier_equal(&ti.spec,
+ &f->parameters->variables[j/* + haveRetValue*/]->type.specifier)) {
+ slang_typeinfo_destruct(&ti);
+ break;
+ }
+ slang_typeinfo_destruct(&ti);
+
+ /* "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))
+ break;
+ }
+ if (j == num_args)
+ return f;
+ }
+ if (funcs->outer_scope != NULL)
+ return _slang_locate_function(funcs->outer_scope, a_name, args,
+ num_args, space, atoms);
+ return NULL;
+}
+
+
+
/**
* Determine the return type of a function.
* \param a_name the function name