[Mesa-dev] [PATCH 09/14] glsl: Separate code into process_record_constructor().

Ian Romanick idr at freedesktop.org
Wed Jul 3 18:38:12 PDT 2013


On 06/29/2013 07:43 PM, Matt Turner wrote:
> ---
>   src/glsl/ast_function.cpp | 108 +++++++++++++++++++++++++---------------------
>   1 file changed, 60 insertions(+), 48 deletions(-)
>
> diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp
> index bbc607a..53bf2b1 100644
> --- a/src/glsl/ast_function.cpp
> +++ b/src/glsl/ast_function.cpp
> @@ -1260,6 +1260,63 @@ emit_inline_record_constructor(const glsl_type *type,
>   }
>
>
> +static ir_rvalue *
> +process_record_constructor(exec_list *instructions,
> +                           const glsl_type *constructor_type,
> +                           YYLTYPE *loc, exec_list *parameters,
> +                           struct _mesa_glsl_parse_state *state)
> +{
> +   void *ctx = state;

We used to call this ctx, but it got confusing with the gl_context *ctx. 
  As a result, we switched to mem_ctx.  I think it's okay to move code 
and rename a single variable in one patch, but someone may disagree with me.

> +   exec_list actual_parameters;
> +
> +   process_parameters(instructions, &actual_parameters,
> +                      parameters, state);
> +
> +   exec_node *node = actual_parameters.head;
> +   for (unsigned i = 0; i < constructor_type->length; i++) {
> +      ir_rvalue *ir = (ir_rvalue *) node;
> +
> +      if (node->is_tail_sentinel()) {
> +         _mesa_glsl_error(loc, state,
> +                          "insufficient parameters to constructor for `%s'",
> +                          constructor_type->name);
> +         return ir_rvalue::error_value(ctx);
> +      }
> +
> +      if (apply_implicit_conversion(constructor_type->fields.structure[i].type,
> +                                 ir, state)) {
> +         node->replace_with(ir);
> +      } else {
> +         _mesa_glsl_error(loc, state,
> +                          "parameter type mismatch in constructor for `%s.%s' "
> +                          "(%s vs %s)",
> +                          constructor_type->name,
> +                          constructor_type->fields.structure[i].name,
> +                          ir->type->name,
> +                          constructor_type->fields.structure[i].type->name);
> +         return ir_rvalue::error_value(ctx);;
> +      }
> +
> +      node = node->next;
> +   }
> +
> +   if (!node->is_tail_sentinel()) {
> +      _mesa_glsl_error(loc, state, "too many parameters in constructor "
> +                                    "for `%s'", constructor_type->name);
> +      return ir_rvalue::error_value(ctx);
> +   }
> +
> +   ir_rvalue *const constant =
> +      constant_record_constructor(constructor_type, &actual_parameters,
> +                                  state);
> +
> +   return (constant != NULL)
> +            ? constant
> +            : emit_inline_record_constructor(constructor_type, instructions,
> +                                             &actual_parameters, state);
> +}
> +
> +
>   ir_rvalue *
>   ast_function_expression::hir(exec_list *instructions,
>   			     struct _mesa_glsl_parse_state *state)
> @@ -1326,54 +1383,9 @@ ast_function_expression::hir(exec_list *instructions,
>          * correct order.
>          */
>         if (constructor_type->is_record()) {
> -	 exec_list actual_parameters;
> -
> -	 process_parameters(instructions, &actual_parameters,
> -			    &this->expressions, state);
> -
> -	 exec_node *node = actual_parameters.head;
> -	 for (unsigned i = 0; i < constructor_type->length; i++) {
> -	    ir_rvalue *ir = (ir_rvalue *) node;
> -
> -	    if (node->is_tail_sentinel()) {
> -	       _mesa_glsl_error(&loc, state,
> -				"insufficient parameters to constructor "
> -				"for `%s'",
> -				constructor_type->name);
> -	       return ir_rvalue::error_value(ctx);
> -	    }
> -
> -	    if (apply_implicit_conversion(constructor_type->fields.structure[i].type,
> -					  ir, state)) {
> -	       node->replace_with(ir);
> -	    } else {
> -	       _mesa_glsl_error(&loc, state,
> -				"parameter type mismatch in constructor "
> -				"for `%s.%s' (%s vs %s)",
> -				constructor_type->name,
> -				constructor_type->fields.structure[i].name,
> -				ir->type->name,
> -				constructor_type->fields.structure[i].type->name);
> -	       return ir_rvalue::error_value(ctx);;
> -	    }
> -
> -	    node = node->next;
> -	 }
> -
> -	 if (!node->is_tail_sentinel()) {
> -	    _mesa_glsl_error(&loc, state, "too many parameters in constructor "
> -			     "for `%s'", constructor_type->name);
> -	    return ir_rvalue::error_value(ctx);
> -	 }
> -
> -	 ir_rvalue *const constant =
> -	    constant_record_constructor(constructor_type, &actual_parameters,
> -					state);
> -
> -	 return (constant != NULL)
> -	    ? constant
> -	    : emit_inline_record_constructor(constructor_type, instructions,
> -					     &actual_parameters, state);
> +         return process_record_constructor(instructions, constructor_type,
> +                                           &loc, &this->expressions,
> +                                           state);
>         }
>
>         if (!constructor_type->is_numeric() && !constructor_type->is_boolean())
>



More information about the mesa-dev mailing list