diff options
author | Kenneth Graunke <[email protected]> | 2010-11-11 12:21:27 -0800 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2010-11-30 13:48:28 -0800 |
commit | 01a25bb64ecae156729794320f9a39733ff8eeaa (patch) | |
tree | f8e30a2c03f2d63b48c50f52969c4a7cbbf440ba | |
parent | 4ce084c7072931732fba7ae1d73a4e4e20269f9d (diff) |
glsl: Refactor out cloning of function prototypes.
This allows us to reuse some code and will be useful later.
-rw-r--r-- | src/glsl/ir.h | 2 | ||||
-rw-r--r-- | src/glsl/ir_clone.cpp | 32 | ||||
-rw-r--r-- | src/glsl/ir_import_prototypes.cpp | 17 |
3 files changed, 24 insertions, 27 deletions
diff --git a/src/glsl/ir.h b/src/glsl/ir.h index 625397a5995..102a68b6551 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -376,6 +376,8 @@ public: virtual ir_function_signature *clone(void *mem_ctx, struct hash_table *ht) const; + ir_function_signature *clone_prototype(void *mem_ctx, + struct hash_table *ht) const; virtual void accept(ir_visitor *v) { diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp index 325f6066154..1522af682bb 100644 --- a/src/glsl/ir_clone.cpp +++ b/src/glsl/ir_clone.cpp @@ -276,13 +276,32 @@ ir_function::clone(void *mem_ctx, struct hash_table *ht) const ir_function_signature * ir_function_signature::clone(void *mem_ctx, struct hash_table *ht) const { + ir_function_signature *copy = this->clone_prototype(mem_ctx, ht); + + copy->is_defined = this->is_defined; + + /* 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(mem_ctx, ht); + copy->body.push_tail(inst_copy); + } + + return copy; +} + +ir_function_signature * +ir_function_signature::clone_prototype(void *mem_ctx, struct hash_table *ht) const +{ ir_function_signature *copy = new(mem_ctx) ir_function_signature(this->return_type); - copy->is_defined = this->is_defined; + copy->is_defined = false; copy->is_builtin = this->is_builtin; - /* Clone the parameter list. + /* Clone the parameter list, but NOT the body. */ foreach_list_const(node, &this->parameters) { const ir_variable *const param = (const ir_variable *) node; @@ -293,15 +312,6 @@ ir_function_signature::clone(void *mem_ctx, struct hash_table *ht) const 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(mem_ctx, ht); - copy->body.push_tail(inst_copy); - } - return copy; } diff --git a/src/glsl/ir_import_prototypes.cpp b/src/glsl/ir_import_prototypes.cpp index 2bdc8d9fd7d..4e0b30aa90e 100644 --- a/src/glsl/ir_import_prototypes.cpp +++ b/src/glsl/ir_import_prototypes.cpp @@ -82,22 +82,7 @@ public: { assert(this->function != NULL); - ir_function_signature *copy = - new(mem_ctx) ir_function_signature(ir->return_type); - - copy->is_defined = false; - copy->is_builtin = ir->is_builtin; - - /* Clone the parameter list, but NOT the body. - */ - foreach_list_const(node, &ir->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(mem_ctx, NULL); - copy->parameters.push_tail(param_copy); - } + ir_function_signature *copy = ir->clone_prototype(mem_ctx, NULL); this->function->add_signature(copy); |