Mesa (master): glsl: Refactor out cloning of function prototypes.

Kenneth Graunke kwg at kemper.freedesktop.org
Tue Nov 30 21:50:38 UTC 2010


Module: Mesa
Branch: master
Commit: 01a25bb64ecae156729794320f9a39733ff8eeaa
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=01a25bb64ecae156729794320f9a39733ff8eeaa

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Thu Nov 11 12:21:27 2010 -0800

glsl: Refactor out cloning of function prototypes.

This allows us to reuse some code and will be useful later.

---

 src/glsl/ir.h                     |    2 ++
 src/glsl/ir_clone.cpp             |   32 +++++++++++++++++++++-----------
 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 625397a..102a68b 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 325f606..1522af6 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 2bdc8d9..4e0b30a 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);
 




More information about the mesa-commit mailing list