diff options
-rw-r--r-- | ir.cpp | 36 | ||||
-rw-r--r-- | ir.h | 11 |
2 files changed, 43 insertions, 4 deletions
@@ -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 { @@ -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 |