-----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