summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-06-09 17:18:04 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-06-11 13:51:42 -0700
commit710919fd7cb7ac6cb640afa362f5c409e5a5ec91 (patch)
treed8dd21dda49155d24169cbd06793f89211c2f9c7
parent7f1ab834d7aa901ce0e12f40db23d7d9891eae59 (diff)
ir_constant: Support constant structures in clone
-rw-r--r--ir.cpp36
-rw-r--r--ir.h11
2 files changed, 43 insertions, 4 deletions
diff --git a/ir.cpp b/ir.cpp
index b60d1b4..bb1c458 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 8fd823d..86beb2d 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