diff options
author | Ian Romanick <[email protected]> | 2010-07-07 11:02:19 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2010-07-12 15:19:29 -0700 |
commit | b50098122696c00e7f9e57089197e25e5fe0e0cf (patch) | |
tree | 792dc3ab9ee2953de7decf155b86ac1f9c2ae3b3 | |
parent | 81d664f099a5fd5fac777480532fb4307d591451 (diff) |
glsl2: Implement ir_function::clone and ir_function_signature::clone
-rw-r--r-- | src/glsl/ir_clone.cpp | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp index f1d2851793f..2bde585914a 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 * |