summaryrefslogtreecommitdiff
path: root/ir_clone.cpp
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-06-23 16:42:37 -0700
committerEric Anholt <eric@anholt.net>2010-06-24 13:32:35 -0700
commit5f384088336c23c4fe332d2735450bf455c88200 (patch)
treea9526e18f7c45243b8c68a7116fb21dc49c747d2 /ir_clone.cpp
parentae805922b7e3cdaf3aee26c3b799fe3608669bba (diff)
Move ir_constant cloning alongside the other cloning functions.
Diffstat (limited to 'ir_clone.cpp')
-rw-r--r--ir_clone.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/ir_clone.cpp b/ir_clone.cpp
index cb4b02b7de..fe66510bfd 100644
--- a/ir_clone.cpp
+++ b/ir_clone.cpp
@@ -238,3 +238,34 @@ ir_function_signature::clone(struct hash_table *ht) const
/* FINISHME */
abort();
}
+
+ir_instruction *
+ir_constant::clone(struct hash_table *ht) const
+{
+ 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(NULL));
+ }
+
+ return c;
+ }
+
+ default:
+ assert(!"Should not get here."); break;
+ return NULL;
+ }
+}