Mesa (master): glsl: Avoid variable length arrays.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Fri Jul 12 08:31:11 UTC 2013


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

Author: José Fonseca <jfonseca at vmware.com>
Date:   Fri Jul 12 09:27:22 2013 +0100

glsl: Avoid variable length arrays.

They are a non-standard GCC extension that's not widely supported by
other C/C++ compilers.

Use a dynamic array instead.

Trivial. Should fix the MSVC build.

---

 src/glsl/glsl_symbol_table.cpp |   21 ++++++++++++++-------
 1 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/glsl/glsl_symbol_table.cpp b/src/glsl/glsl_symbol_table.cpp
index 0bea536..4c96620 100644
--- a/src/glsl/glsl_symbol_table.cpp
+++ b/src/glsl/glsl_symbol_table.cpp
@@ -175,13 +175,21 @@ bool glsl_symbol_table::add_type(const char *name, const glsl_type *t)
    return _mesa_symbol_table_add_symbol(table, -1, name, entry) == 0;
 }
 
-bool glsl_symbol_table::add_type_ast(const char *name, const class ast_type_specifier *a)
+static char *make_ast_name(const char *name)
 {
-   symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(a);
-   char ast_name[strlen("#ast.") + strlen(name) + 1];
+   char *ast_name = new char[strlen("#ast.") + strlen(name) + 1];
    strcpy(ast_name, "#ast.");
    strcat(ast_name + strlen("#ast."), name);
-   return _mesa_symbol_table_add_symbol(table, -1, ast_name, entry) == 0;
+   return ast_name;
+}
+
+bool glsl_symbol_table::add_type_ast(const char *name, const class ast_type_specifier *a)
+{
+   symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(a);
+   char *ast_name = make_ast_name(name);
+   bool ret = _mesa_symbol_table_add_symbol(table, -1, ast_name, entry) == 0;
+   delete [] ast_name;
+   return ret;
 }
 
 bool glsl_symbol_table::add_interface(const char *name, const glsl_type *i,
@@ -237,10 +245,9 @@ const glsl_type *glsl_symbol_table::get_type(const char *name)
 
 const class ast_type_specifier *glsl_symbol_table::get_type_ast(const char *name)
 {
-   char ast_name[strlen("#ast.") + strlen(name) + 1];
-   strcpy(ast_name, "#ast.");
-   strcat(ast_name + strlen("#ast."), name);
+   char *ast_name = make_ast_name(name);
    symbol_table_entry *entry = get_entry(ast_name);
+   delete [] ast_name;
    return entry != NULL ? entry->a : NULL;
 }
 




More information about the mesa-commit mailing list