[Mesa-dev] [PATCH 07/15] glcpp: use the linear allocator for most objects
Nicolai Hähnle
nhaehnle at gmail.com
Wed Oct 12 13:11:27 UTC 2016
On 08.10.2016 12:58, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
> src/compiler/glsl/glcpp/glcpp-lex.l | 2 +-
> src/compiler/glsl/glcpp/glcpp-parse.y | 203 +++++++++++++++-------------------
> src/compiler/glsl/glcpp/glcpp.h | 1 +
> 3 files changed, 94 insertions(+), 112 deletions(-)
>
> diff --git a/src/compiler/glsl/glcpp/glcpp-lex.l b/src/compiler/glsl/glcpp/glcpp-lex.l
> index d09441a..f4a6876 100644
> --- a/src/compiler/glsl/glcpp/glcpp-lex.l
> +++ b/src/compiler/glsl/glcpp/glcpp-lex.l
[snip]
> @@ -1002,51 +994,50 @@ _token_list_append_list(token_list_t *list, token_list_t *tail)
> list->head = tail->head;
> } else {
> list->tail->next = tail->head;
> }
>
> list->tail = tail->tail;
> list->non_space_tail = tail->non_space_tail;
> }
>
> static token_list_t *
> -_token_list_copy(void *ctx, token_list_t *other)
> +_token_list_copy(glcpp_parser_t *parser, token_list_t *other)
> {
> token_list_t *copy;
> token_node_t *node;
>
> if (other == NULL)
> return NULL;
>
> - copy = _token_list_create (ctx);
> + copy = _token_list_create (parser);
> for (node = other->head; node; node = node->next) {
> - token_t *new_token = ralloc (copy, token_t);
> + token_t *new_token = linear_alloc_child(parser->linalloc, sizeof(token_t));
> *new_token = *node->token;
> - _token_list_append (copy, new_token);
> + _token_list_append (parser, copy, new_token);
> }
>
> return copy;
> }
>
> static void
> _token_list_trim_trailing_space(token_list_t *list)
> {
> token_node_t *tail, *next;
>
> if (list->non_space_tail) {
> tail = list->non_space_tail->next;
> list->non_space_tail->next = NULL;
> list->tail = list->non_space_tail;
>
> while (tail) {
> next = tail->next;
> - ralloc_free (tail);
> tail = next;
> }
This whole loop can be dropped now.
> }
> }
>
> static int
> _token_list_is_empty_ignoring_space(token_list_t *l)
> {
> token_node_t *n;
>
> @@ -1177,69 +1168,70 @@ _token_print(char **out, size_t *len, token_t *token)
> case PLACEHOLDER:
> /* Nothing to print. */
> break;
> default:
> assert(!"Error: Don't know how to print token.");
>
> break;
> }
> }
>
> -/* Return a new token (ralloc()ed off of 'token') formed by pasting
> - * 'token' and 'other'. Note that this function may return 'token' or
> - * 'other' directly rather than allocating anything new.
> +/* Return a new token formed by pasting 'token' and 'other'. Note that this
> + * function may return 'token' or 'other' directly rather than allocating
> + * anything new.
> *
> * Caution: Only very cursory error-checking is performed to see if
> * the final result is a valid single token. */
> static token_t *
> -_token_paste(glcpp_parser_t *parser, token_t *token, token_t *other)
> +_token_paste(glcpp_parser_t *parser, token_list_t *list, token_t *token,
> + token_t *other)
I seem to be blind... where is list used?
Nicolai
> {
> token_t *combined = NULL;
>
> /* Pasting a placeholder onto anything makes no change. */
> if (other->type == PLACEHOLDER)
> return token;
>
> /* When 'token' is a placeholder, just return 'other'. */
> if (token->type == PLACEHOLDER)
> return other;
>
> /* A very few single-character punctuators can be combined
> * with another to form a multi-character punctuator. */
> switch (token->type) {
> case '<':
> if (other->type == '<')
> - combined = _token_create_ival (token, LEFT_SHIFT, LEFT_SHIFT);
> + combined = _token_create_ival (parser, LEFT_SHIFT, LEFT_SHIFT);
> else if (other->type == '=')
> - combined = _token_create_ival (token, LESS_OR_EQUAL, LESS_OR_EQUAL);
> + combined = _token_create_ival (parser, LESS_OR_EQUAL, LESS_OR_EQUAL);
> break;
> case '>':
> if (other->type == '>')
> - combined = _token_create_ival (token, RIGHT_SHIFT, RIGHT_SHIFT);
> + combined = _token_create_ival (parser, RIGHT_SHIFT, RIGHT_SHIFT);
> else if (other->type == '=')
> - combined = _token_create_ival (token, GREATER_OR_EQUAL, GREATER_OR_EQUAL);
> + combined = _token_create_ival (parser, GREATER_OR_EQUAL, GREATER_OR_EQUAL);
> break;
> case '=':
> if (other->type == '=')
> - combined = _token_create_ival (token, EQUAL, EQUAL);
> + combined = _token_create_ival (parser, EQUAL, EQUAL);
> break;
> case '!':
> if (other->type == '=')
> - combined = _token_create_ival (token, NOT_EQUAL, NOT_EQUAL);
> + combined = _token_create_ival (parser, NOT_EQUAL, NOT_EQUAL);
> break;
> case '&':
> if (other->type == '&')
> - combined = _token_create_ival (token, AND, AND);
> + combined = _token_create_ival (parser, AND, AND);
> break;
> case '|':
> if (other->type == '|')
> - combined = _token_create_ival (token, OR, OR);
> + combined = _token_create_ival (parser, OR, OR);
> break;
> }
>
> if (combined != NULL) {
> /* Inherit the location from the first token */
> combined->location = token->location;
> return combined;
> }
>
> /* Two string-valued (or integer) tokens can usually just be
> @@ -1269,37 +1261,37 @@ _token_paste(glcpp_parser_t *parser, token_t *token, token_t *other)
> case INTEGER:
> if (other->value.ival < 0)
> goto FAIL;
> break;
> default:
> goto FAIL;
> }
> }
>
> if (token->type == INTEGER)
> - str = ralloc_asprintf (token, "%" PRIiMAX, token->value.ival);
> + str = linear_asprintf(parser->linalloc, "%" PRIiMAX, token->value.ival);
> else
> - str = ralloc_strdup (token, token->value.str);
> + str = linear_strdup(parser->linalloc, token->value.str);
>
> if (other->type == INTEGER)
> - ralloc_asprintf_append (&str, "%" PRIiMAX, other->value.ival);
> + linear_asprintf_append(parser->linalloc, &str, "%" PRIiMAX, other->value.ival);
> else
> - ralloc_strcat (&str, other->value.str);
> + linear_strcat(parser->linalloc, &str, other->value.str);
>
> /* New token is same type as original token, unless we
> * started with an integer, in which case we will be
> * creating an integer-string. */
> combined_type = token->type;
> if (combined_type == INTEGER)
> combined_type = INTEGER_STRING;
>
> - combined = _token_create_str (token, combined_type, str);
> + combined = _token_create_str (parser, combined_type, str);
> combined->location = token->location;
> return combined;
> }
>
> FAIL:
> glcpp_error (&token->location, parser, "");
> ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "Pasting \"");
> _token_print (&parser->info_log, &parser->info_log_length, token);
> ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "\" and \"");
> _token_print (&parser->info_log, &parser->info_log_length, other);
> @@ -1328,34 +1320,35 @@ yyerror(YYLTYPE *locp, glcpp_parser_t *parser, const char *error)
More information about the mesa-dev
mailing list