diff options
author | Eric Anholt <eric@anholt.net> | 2010-06-23 16:42:37 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-06-24 13:32:35 -0700 |
commit | 5f384088336c23c4fe332d2735450bf455c88200 (patch) | |
tree | a9526e18f7c45243b8c68a7116fb21dc49c747d2 /ir_clone.cpp | |
parent | ae805922b7e3cdaf3aee26c3b799fe3608669bba (diff) |
Move ir_constant cloning alongside the other cloning functions.
Diffstat (limited to 'ir_clone.cpp')
-rw-r--r-- | ir_clone.cpp | 31 |
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; + } +} |