glsl: Change loop_analysis to not look like a resource leak
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 10 Jul 2012 23:26:33 +0000 (16:26 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 8 Feb 2013 05:18:42 +0000 (21:18 -0800)
Previously the loop_state was allocated in the loop_analysis
constructor, but not freed in the (nonexistent) destructor.  Moving
the allocation of the loop_state makes this code appear less sketchy.

Either way, there is no actual leak.  The loop_state is freed by the
single caller of analyze_loop_variables.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Cc: Dave Airlie <airlied@freedesktop.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=57753

src/glsl/loop_analysis.cpp
src/glsl/loop_analysis.h

index 6a0e4da51004cd1c67547f631f3e770c7204bbc5..191e92de7c48f7689837f5c769a2784702bf16f2 100644 (file)
@@ -105,7 +105,7 @@ loop_variable_state::insert(ir_if *if_stmt)
 
 class loop_analysis : public ir_hierarchical_visitor {
 public:
-   loop_analysis();
+   loop_analysis(loop_state *loops);
 
    virtual ir_visitor_status visit(ir_loop_jump *);
    virtual ir_visitor_status visit(ir_dereference_variable *);
@@ -129,12 +129,10 @@ public:
 };
 
 
-loop_analysis::loop_analysis()
+loop_analysis::loop_analysis(loop_state *loops)
+   : loops(loops), if_statement_depth(0), current_assignment(NULL)
 {
-   this->loops = new loop_state;
-
-   this->if_statement_depth = 0;
-   this->current_assignment = NULL;
+   /* empty */
 }
 
 
@@ -521,7 +519,8 @@ is_loop_terminator(ir_if *ir)
 loop_state *
 analyze_loop_variables(exec_list *instructions)
 {
-   loop_analysis v;
+   loop_state *loops = new loop_state;
+   loop_analysis v(loops);
 
    v.run(instructions);
    return v.loops;
index 05c982fc164e6e11061bc671fcd22821f8543b6a..769d626614bc388b2ad7a7bf4a92b15bc6fa603c 100644 (file)
@@ -249,7 +249,7 @@ private:
 
    void *mem_ctx;
 
-   friend class loop_analysis;
+   friend loop_state *analyze_loop_variables(exec_list *instructions);
 };
 
 #endif /* LOOP_ANALYSIS_H */