From 710919fd7cb7ac6cb640afa362f5c409e5a5ec91 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Wed, 9 Jun 2010 17:18:04 -0700 Subject: [PATCH] ir_constant: Support constant structures in clone --- ir.cpp | 36 ++++++++++++++++++++++++++++++++++++ ir.h | 11 +++++++---- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/ir.cpp b/ir.cpp index b60d1b468aa..bb1c4589a57 100644 --- a/ir.cpp +++ b/ir.cpp @@ -184,6 +184,11 @@ ir_expression::get_operator(const char *str) return (ir_expression_operation) -1; } +ir_constant::ir_constant() +{ + /* empty */ +} + ir_constant::ir_constant(const struct glsl_type *type, const void *data) { unsigned size = 0; @@ -301,6 +306,37 @@ ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list) } } +ir_constant * +ir_constant::clone() +{ + switch (this->type->base_type) { + case GLSL_TYPE_UINT: + case GLSL_TYPE_INT: + case GLSL_TYPE_FLOAT: + case GLSL_TYPE_BOOL: + return new ir_constant(this->type, &this->value); + + case GLSL_TYPE_STRUCT: { + ir_constant *c = new ir_constant; + + c->type = this->type; + for (exec_node *node = this->components.head + ; !node->is_tail_sentinal() + ; node = node->next) { + ir_constant *const orig = (ir_constant *) node; + + c->components.push_tail(orig->clone()); + } + + return c; + } + + default: + assert(!"Should not get here."); break; + return NULL; + } +} + bool ir_constant::get_bool_component(unsigned i) const { diff --git a/ir.h b/ir.h index 8fd823db09c..86beb2d7ce6 100644 --- a/ir.h +++ b/ir.h @@ -1055,10 +1055,7 @@ public: virtual ir_visitor_status accept(ir_hierarchical_visitor *); - ir_constant *clone() - { - return new ir_constant(this->type, &this->value); - } + ir_constant *clone(); /** * Get a particular component of a constant as a specific type @@ -1089,6 +1086,12 @@ public: } value; exec_list components; + +private: + /** + * Parameterless constructor only used by the clone method + */ + ir_constant(void); }; void -- 2.30.2