[Mesa-dev] [PATCH 22/23] glsl: Convert glcpp-parse to the util hash table
Timothy Arceri
timothy.arceri at collabora.com
Wed Aug 17 00:36:22 UTC 2016
On Tue, 2016-08-16 at 22:10 +0200, Thomas Helland wrote:
> And change the include in glcpp.h accordingly.
>
> Signed-off-by: Thomas Helland <thomashelland90 at gmail.com>
> ---
> src/compiler/glsl/glcpp/glcpp-parse.y | 54 ++++++++++++++++++++++---
> ----------
> src/compiler/glsl/glcpp/glcpp.h | 2 +-
> 2 files changed, 35 insertions(+), 21 deletions(-)
>
> diff --git a/src/compiler/glsl/glcpp/glcpp-parse.y
> b/src/compiler/glsl/glcpp/glcpp-parse.y
> index eff53be..04ca126 100644
> --- a/src/compiler/glsl/glcpp/glcpp-parse.y
> +++ b/src/compiler/glsl/glcpp/glcpp-parse.y
> @@ -278,6 +278,7 @@ control_line_success:
> HASH_TOKEN DEFINE_TOKEN define
> | HASH_TOKEN UNDEF IDENTIFIER NEWLINE {
> macro_t *macro;
> + struct hash_entry *entry;
>
> /* Section 3.4 (Preprocessor) of the GLSL ES 3.00
> spec says:
> *
> @@ -309,9 +310,10 @@ control_line_success:
> glcpp_error(& @1, parser, "Built-in (pre-
> defined)"
> " macro names cannot be
> undefined.");
>
> - macro = hash_table_find (parser->defines, $3);
> - if (macro) {
> - hash_table_remove (parser->defines, $3);
> + entry = _mesa_hash_table_search (parser->defines,
> $3);
> + if (entry) {
> + macro = entry->data;
> + _mesa_hash_table_remove (parser->defines,
> entry);
> ralloc_free (macro);
> }
> ralloc_free ($3);
> @@ -348,13 +350,16 @@ control_line_success:
> _glcpp_parser_skip_stack_push_if (parser, & @1, 0);
> }
> | HASH_TOKEN IFDEF IDENTIFIER junk NEWLINE {
> - macro_t *macro = hash_table_find (parser->defines,
> $3);
> + struct hash_entry *entry =
> + _mesa_hash_table_search(parser-
> >defines, $3);
> + macro_t *macro = entry ? entry->data : NULL;
> ralloc_free ($3);
> _glcpp_parser_skip_stack_push_if (parser, & @1,
> macro != NULL);
> }
> | HASH_TOKEN IFNDEF IDENTIFIER junk NEWLINE {
> - macro_t *macro = hash_table_find (parser->defines,
> $3);
> - ralloc_free ($3);
> + struct hash_entry *entry =
> + _mesa_hash_table_search(parser-
> >defines, $3);
> + macro_t *macro = entry ? entry->data : NULL;
> _glcpp_parser_skip_stack_push_if (parser, & @3,
> macro == NULL);
> }
> | HASH_TOKEN ELIF pp_tokens NEWLINE {
> @@ -1342,8 +1347,8 @@ glcpp_parser_create(glcpp_extension_iterator
> extensions, void *state, gl_api api
> parser = ralloc (NULL, glcpp_parser_t);
>
> glcpp_lex_init_extra (parser, &parser->scanner);
> - parser->defines = hash_table_ctor(32, hash_table_string_hash,
> - hash_table_string_compare);
> + parser->defines = _mesa_hash_table_create(NULL,
> _mesa_key_hash_string,
> +
> _mesa_key_string_equal);
Git is reporting:
.git/rebase-apply/patch:59: space before tab in indent.
_mesa_key_string_equal);
warning: 1 line adds whitespace errors.
Ideally we should remove the tabs from this file but I'm not sure its
worth it.
> parser->active = NULL;
> parser->lexing_directive = 0;
> parser->space_tokens = 1;
> @@ -1384,7 +1389,7 @@ void
> glcpp_parser_destroy(glcpp_parser_t *parser)
> {
> glcpp_lex_destroy (parser->scanner);
> - hash_table_dtor (parser->defines);
> + _mesa_hash_table_destroy(parser->defines, NULL);
> ralloc_free (parser);
> }
>
> @@ -1563,8 +1568,8 @@ _glcpp_parser_evaluate_defined(glcpp_parser_t
> *parser, token_node_t *node,
>
> *last = node;
>
> - return hash_table_find(parser->defines,
> - argument->token->value.str) ? 1 : 0;
> + return _mesa_hash_table_search(parser->defines,
> + argument->token->value.str) ? 1 :
> 0;
>
> FAIL:
> glcpp_error (&defined->token->location, parser,
> @@ -1705,6 +1710,7 @@ static token_list_t *
> _glcpp_parser_expand_function(glcpp_parser_t *parser, token_node_t
> *node,
> token_node_t **last, expansion_mode_t
> mode)
> {
> + struct hash_entry *entry;
> macro_t *macro;
> const char *identifier;
> argument_list_t *arguments;
> @@ -1714,7 +1720,8 @@ _glcpp_parser_expand_function(glcpp_parser_t
> *parser, token_node_t *node,
>
> identifier = node->token->value.str;
>
> - macro = hash_table_find(parser->defines, identifier);
> + entry = _mesa_hash_table_search(parser->defines, identifier);
> + macro = entry ? entry->data : NULL;
>
> assert(macro->is_function);
>
> @@ -1811,6 +1818,7 @@ _glcpp_parser_expand_node(glcpp_parser_t
> *parser, token_node_t *node,
> {
> token_t *token = node->token;
> const char *identifier;
> + struct hash_entry *entry;
> macro_t *macro;
>
> /* We only expand identifiers */
> @@ -1830,7 +1838,8 @@ _glcpp_parser_expand_node(glcpp_parser_t
> *parser, token_node_t *node,
> return _token_list_create_with_one_integer(parser, node-
> >token->location.source);
>
> /* Look up this identifier in the hash table. */
> - macro = hash_table_find(parser->defines, identifier);
> + entry = _mesa_hash_table_search(parser->defines, identifier);
> + macro = entry ? entry->data : NULL;
>
> /* Not a macro, so no expansion needed. */
> if (macro == NULL)
> @@ -2080,6 +2089,7 @@ _define_object_macro(glcpp_parser_t *parser,
> YYLTYPE *loc,
> const char *identifier, token_list_t
> *replacements)
> {
> macro_t *macro, *previous;
> + struct hash_entry *entry;
>
> /* We define pre-defined macros before we've started parsing the
> actual
> * file. So if there's no location defined yet, that's what were
> doing and
> @@ -2095,7 +2105,8 @@ _define_object_macro(glcpp_parser_t *parser,
> YYLTYPE *loc,
> macro->replacements = replacements;
> ralloc_steal (macro, replacements);
>
> - previous = hash_table_find (parser->defines, identifier);
> + entry = _mesa_hash_table_search(parser->defines, identifier);
> + previous = entry ? entry->data : NULL;
> if (previous) {
> if (_macro_equal (macro, previous)) {
> ralloc_free (macro);
> @@ -2104,7 +2115,7 @@ _define_object_macro(glcpp_parser_t *parser,
> YYLTYPE *loc,
> glcpp_error (loc, parser, "Redefinition of macro
> %s\n", identifier);
> }
>
> - hash_table_insert (parser->defines, macro, identifier);
> + _mesa_hash_table_insert (parser->defines, identifier, macro);
> }
>
> void
> @@ -2113,6 +2124,7 @@ _define_function_macro(glcpp_parser_t *parser,
> YYLTYPE *loc,
> token_list_t *replacements)
> {
> macro_t *macro, *previous;
> + struct hash_entry *entry;
> const char *dup;
>
> _check_for_reserved_macro_name(parser, loc, identifier);
> @@ -2130,7 +2142,9 @@ _define_function_macro(glcpp_parser_t *parser,
> YYLTYPE *loc,
> macro->parameters = parameters;
> macro->identifier = ralloc_strdup (macro, identifier);
> macro->replacements = replacements;
> - previous = hash_table_find (parser->defines, identifier);
> +
> + entry = _mesa_hash_table_search(parser->defines, identifier);
> + previous = entry ? entry->data : NULL;
> if (previous) {
> if (_macro_equal (macro, previous)) {
> ralloc_free (macro);
> @@ -2139,7 +2153,7 @@ _define_function_macro(glcpp_parser_t *parser,
> YYLTYPE *loc,
> glcpp_error (loc, parser, "Redefinition of macro %s\n",
> identifier);
> }
>
> - hash_table_insert(parser->defines, macro, identifier);
> + _mesa_hash_table_insert(parser->defines, identifier, macro);
> }
>
> static int
> @@ -2185,9 +2199,9 @@ glcpp_parser_lex(YYSTYPE *yylval, YYLTYPE
> *yylloc, glcpp_parser_t *parser)
> ret == ENDIF || ret == HASH_TOKEN) {
> parser->in_control_line = 1;
> } else if (ret == IDENTIFIER) {
> - macro_t *macro;
> - macro = hash_table_find (parser->defines,
> - yylval->str);
> + struct hash_entry *entry = _mesa_hash_table_search(parser-
> >defines,
> + yylval-
> >str);
> + macro_t *macro = entry ? entry->data : NULL;
> if (macro && macro->is_function) {
> parser->newline_as_space = 1;
> parser->paren_count = 0;
> diff --git a/src/compiler/glsl/glcpp/glcpp.h
> b/src/compiler/glsl/glcpp/glcpp.h
> index 9f35b05..cab4374 100644
> --- a/src/compiler/glsl/glcpp/glcpp.h
> +++ b/src/compiler/glsl/glcpp/glcpp.h
> @@ -31,7 +31,7 @@
>
> #include "util/ralloc.h"
>
> -#include "program/hash_table.h"
> +#include "util/hash_table.h"
>
> #define yyscan_t void*
>
More information about the mesa-dev
mailing list