Mesa (glsl2): glsl2: Implement ir_function::clone and ir_function_signature ::clone
Ian Romanick
idr at kemper.freedesktop.org
Mon Jul 12 22:23:37 UTC 2010
Module: Mesa
Branch: glsl2
Commit: b50098122696c00e7f9e57089197e25e5fe0e0cf
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b50098122696c00e7f9e57089197e25e5fe0e0cf
Author: Ian Romanick <ian.d.romanick at intel.com>
Date: Wed Jul 7 11:02:19 2010 -0700
glsl2: Implement ir_function::clone and ir_function_signature::clone
---
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 f1d2851..2bde585 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 *
More information about the mesa-commit
mailing list