summaryrefslogtreecommitdiff
path: root/src/glsl/ir_clone.cpp
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-07-07 11:02:19 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-07-12 15:19:29 -0700
commitb50098122696c00e7f9e57089197e25e5fe0e0cf (patch)
tree792dc3ab9ee2953de7decf155b86ac1f9c2ae3b3 /src/glsl/ir_clone.cpp
parent81d664f099a5fd5fac777480532fb4307d591451 (diff)
glsl2: Implement ir_function::clone and ir_function_signature::clone
Diffstat (limited to 'src/glsl/ir_clone.cpp')
-rw-r--r--src/glsl/ir_clone.cpp49
1 files changed, 43 insertions, 6 deletions
diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
index f1d2851793..2bde585914 100644
--- a/src/glsl/ir_clone.cpp
+++ b/src/glsl/ir_clone.cpp
@@ -261,17 +261,54 @@ ir_assignment::clone(struct hash_table *ht) const
ir_function *
ir_function::clone(struct hash_table *ht) const
{
- (void)ht;
- /* FINISHME */
- abort();
+ void *mem_ctx = talloc_parent(this);
+ ir_function *copy = new(mem_ctx) ir_function(this->name);
+
+ foreach_list_const(node, &this->signatures) {
+ const ir_function_signature *const sig =
+ (const ir_function_signature *const) node;
+
+ ir_function_signature *sig_copy = sig->clone(ht);
+ copy->add_signature(sig_copy);
+
+ if (ht != NULL)
+ hash_table_insert(ht, sig_copy,
+ (void *)const_cast<ir_function_signature *>(sig));
+ }
+
+ return copy;
}
ir_function_signature *
ir_function_signature::clone(struct hash_table *ht) const
{
- (void)ht;
- /* FINISHME */
- abort();
+ void *mem_ctx = talloc_parent(this);
+ ir_function_signature *copy =
+ new(mem_ctx) ir_function_signature(this->return_type);
+
+ copy->is_defined = this->is_defined;
+
+ /* Clone the parameter list.
+ */
+ foreach_list_const(node, &this->parameters) {
+ const ir_variable *const param = (const ir_variable *) node;
+
+ assert(const_cast<ir_variable *>(param)->as_variable() != NULL);
+
+ ir_variable *const param_copy = param->clone(ht);
+ copy->parameters.push_tail(param_copy);
+ }
+
+ /* Clone the instruction list.
+ */
+ foreach_list_const(node, &this->body) {
+ const ir_instruction *const inst = (const ir_instruction *) node;
+
+ ir_instruction *const inst_copy = inst->clone(ht);
+ copy->body.push_tail(inst_copy);
+ }
+
+ return copy;
}
ir_constant *