summaryrefslogtreecommitdiffstats
path: root/src/glsl/ir.cpp
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2010-07-26 19:26:53 -0700
committerEric Anholt <[email protected]>2010-07-26 19:30:19 -0700
commitfbaca31352678ab7d7bf132f0c9a6aa29ca9fabf (patch)
tree1ee5f43f3795cb28da55555a241a04db72dc3001 /src/glsl/ir.cpp
parenteb2cc4f1b1f5ac657c632aa41da5f23eb1cdbe10 (diff)
glsl2: Also steal the constant components of aggregate-typed ir_constants.
Diffstat (limited to 'src/glsl/ir.cpp')
-rw-r--r--src/glsl/ir.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 2fd654e9bfe..6dccbd806e8 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -909,8 +909,26 @@ static void
steal_memory(ir_instruction *ir, void *new_ctx)
{
ir_variable *var = ir->as_variable();
+ ir_constant *constant = ir->as_constant();
if (var != NULL && var->constant_value != NULL)
talloc_steal(ir, var->constant_value);
+
+ /* The components of aggregate constants are not visited by the normal
+ * visitor, so steal their values by hand.
+ */
+ if (constant != NULL) {
+ if (constant->type->is_record()) {
+ foreach_iter(exec_list_iterator, iter, constant->components) {
+ ir_constant *field = (ir_constant *)iter.get();
+ steal_memory(field, ir);
+ }
+ } else if (constant->type->is_array()) {
+ for (unsigned int i = 0; i < constant->type->length; i++) {
+ steal_memory(constant->array_elements[i], ir);
+ }
+ }
+ }
+
talloc_steal(new_ctx, ir);
}