-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1
On 08/02/2011 05:38 PM, Paul Berry wrote:
This patch extends ir_validate.cpp to check the following
characteristics of each ir_call:
- The number of actual parameters must match the number of formal
parameters in the signature.
- The type of each actual parameter must match the type of the
corresponding formal parameter in the signature.
- Each out or inout actual parameter must be an lvalue.
---
src/glsl/ir_validate.cpp | 35 +++
1 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp
index f3fceb2..72e4faf 100644
--- a/src/glsl/ir_validate.cpp
+++ b/src/glsl/ir_validate.cpp
@@ -541,7 +541,42 @@ ir_validate::visit_enter(ir_call *ir)
abort();
}
+ exec_list_iterator formal_param_iter = callee-parameters.iterator();
+ exec_list_iterator actual_param_iter = ir-actual_parameters.iterator();
We stopped making new uses of the iterators a long time ago. As
implemented, they're a giant pile of fail. For what you're trying to do
here, just use node-next and node-is_tail_sentinel(). Note that
is_tail_sentinel tells you if you're at the first node *past* the end
of the list.
+ while (true) {
+ if (formal_param_iter.has_next() != actual_param_iter.has_next()) {
+ printf(ir_call has the wrong number of parameters:\n);
+ goto dump_ir;
+ }
+ if (!formal_param_iter.has_next()) {
+ break;
+ }
+ const ir_variable *formal_param
+ = (const ir_variable *) formal_param_iter.get();
+ const ir_rvalue *actual_param
+ = (const ir_rvalue *) actual_param_iter.get();
+ if (formal_param-type != actual_param-type) {
+ printf(ir_call parameter type mismatch:\n);
+ goto dump_ir;
+ }
+ if (formal_param-mode == ir_var_out
+ || formal_param-mode == ir_var_inout) {
+ if (!actual_param-is_lvalue()) {
+printf(ir_call out/inout parameters must be lvalues:\n);
+goto dump_ir;
+ }
+ }
+ formal_param_iter.next();
+ actual_param_iter.next();
+ }
+
return visit_continue;
+
+dump_ir:
+ ir-print();
+ printf(callee:\n);
+ callee-print();
+ abort();
}
void
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/
iEYEARECAAYFAk44oUwACgkQX1gOwKyEAw/o0gCggVpcUJ69HnlMKo2XScpNNd7Z
IHcAn0aA476Sras2dJYHBq08mLc+H/ql
=voyu
-END PGP SIGNATURE-
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev