diff options
author | Francisco Jerez <currojerez@riseup.net> | 2013-09-11 20:07:53 -0700 |
---|---|---|
committer | Francisco Jerez <currojerez@riseup.net> | 2013-10-01 17:30:51 -0700 |
commit | 43bf36b080192f7ad5727ed96e86f0a49390d9dc (patch) | |
tree | e0edb9f48c2c437f1343864c9349b25d4d4012d1 | |
parent | 0e72db9f9729b8fe62213452751fed1cd337a7bc (diff) | |
download | external_mesa3d-43bf36b080192f7ad5727ed96e86f0a49390d9dc.zip external_mesa3d-43bf36b080192f7ad5727ed96e86f0a49390d9dc.tar.gz external_mesa3d-43bf36b080192f7ad5727ed96e86f0a49390d9dc.tar.bz2 |
glsl: Initialize all member variables of _mesa_glsl_parse_state on construction.
The _mesa_glsl_parse_state object relies on the memory allocator
zeroing out its contents before it's initialized, which is quite an
unusual practice in the C++ world because it ties objects to some
specific allocation scheme, and gives unpredictable results when an
object is created with a different allocator -- Stack allocation,
array allocation, or aggregation inside a different object are some of
the useful possibilities that come to my mind. Initialize all fields
from the constructor and stop using the zeroing allocator.
Reviewed-by: Paul Berry <stereotype441@gmail.com>
Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
-rw-r--r-- | src/glsl/glsl_parser_extras.cpp | 16 | ||||
-rw-r--r-- | src/glsl/glsl_parser_extras.h | 2 |
2 files changed, 15 insertions, 3 deletions
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index e9922fc..3bc8d48 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -55,7 +55,7 @@ static unsigned known_desktop_glsl_versions[] = _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, GLenum target, void *mem_ctx) - : ctx(_ctx) + : ctx(_ctx), switch_state() { switch (target) { case GL_VERTEX_SHADER: this->target = vertex_shader; break; @@ -66,10 +66,14 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, this->scanner = NULL; this->translation_unit.make_empty(); this->symbols = new(mem_ctx) glsl_symbol_table; + + this->num_uniform_blocks = 0; + this->uniform_block_array_size = 0; + this->uniform_blocks = NULL; + this->info_log = ralloc_strdup(mem_ctx, ""); this->error = false; this->loop_nesting_ast = NULL; - this->switch_state.switch_nesting_ast = NULL; this->struct_specifier_depth = 0; this->num_builtins_to_link = 0; @@ -105,6 +109,13 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers; + this->current_function = NULL; + this->toplevel_ir = NULL; + this->found_return = false; + this->all_invariant = false; + this->user_structures = NULL; + this->num_user_structures = 0; + /* Populate the list of supported GLSL versions */ /* FINISHME: Once the OpenGL 3.0 'forward compatible' context or * the OpenGL 3.2 Core context is supported, this logic will need @@ -163,6 +174,7 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, this->gs_input_prim_type_specified = false; this->gs_input_prim_type = GL_POINTS; + this->gs_input_size = 0; this->out_qualifier = new(this) ast_type_qualifier(); } diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h index cef4436..d557f8b 100644 --- a/src/glsl/glsl_parser_extras.h +++ b/src/glsl/glsl_parser_extras.h @@ -73,7 +73,7 @@ struct _mesa_glsl_parse_state { _mesa_glsl_parse_state(struct gl_context *_ctx, GLenum target, void *mem_ctx); - DECLARE_RZALLOC_CXX_OPERATORS(_mesa_glsl_parse_state); + DECLARE_RALLOC_CXX_OPERATORS(_mesa_glsl_parse_state); /** * Generate a string representing the GLSL version currently being compiled |