#ifndef GLSL_SYMBOL_TABLE
#define GLSL_SYMBOL_TABLE
+#include <new>
+
#include "symbol_table.h"
#include "ir.h"
#include "glsl_types.h"
glsl_function_name_space = 2
};
+ static int
+ _glsl_symbol_table_destructor (glsl_symbol_table *table)
+ {
+ table->~glsl_symbol_table();
+
+ return 0;
+ }
+
public:
+ /* Callers of this talloc-based new need not call delete. It's
+ * easier to just talloc_free 'ctx' (or any of its ancestors). */
+ static void* operator new(size_t size, void *ctx)
+ {
+ void *table;
+
+ table = talloc_size(ctx, size);
+ assert(table != NULL);
+
+ talloc_set_destructor(table, (int (*)(void*)) _glsl_symbol_table_destructor);
+
+ return table;
+ }
+
+ /* If the user *does* call delete, that's OK, we will just
+ * talloc_free in that case. Here, C++ will have already called the
+ * destructor so tell talloc not to do that again. */
+ static void operator delete(void *table)
+ {
+ talloc_set_destructor(table, NULL);
+ talloc_free(table);
+ }
+
glsl_symbol_table()
{
table = _mesa_symbol_table_ctor();
#include <fcntl.h>
#include <unistd.h>
-extern "C" {
-#include <talloc.h>
-}
-
#include "ast.h"
#include "glsl_parser_extras.h"
#include "glsl_parser.h"
state->scanner = NULL;
state->translation_unit.make_empty();
- state->symbols = new glsl_symbol_table;
+ state->symbols = new(shader) glsl_symbol_table;
state->info_log = talloc_strdup(shader, "");
state->error = false;
state->temp_index = 0;