On 03/29/2012 02:59 PM, Matt Turner wrote:
On Thu, Mar 29, 2012 at 5:37 PM, Eric Anholt<e...@anholt.net>  wrote:
We have lexer recognition of a bunch of our types based on the
handling.  This code was mapping those recognized tokens to an enum
and then to a string of their name.  Just drop the enums and provide
the string directly in the parser.
---
  src/glsl/ast.h          |   66 +----------------------------
  src/glsl/ast_to_hir.cpp |    4 +-
  src/glsl/ast_type.cpp   |   68 +-----------------------------
  src/glsl/glsl_parser.yy |  106 +++++++++++++++++++++++------------------------
  4 files changed, 58 insertions(+), 186 deletions(-)

diff --git a/src/glsl/ast.h b/src/glsl/ast.h
index 1f78af8..e6707ac 100644
--- a/src/glsl/ast.h
+++ b/src/glsl/ast.h
@@ -418,72 +418,12 @@ public:
  };


-enum ast_types {
-   ast_void,
-   ast_float,
-   ast_int,
-   ast_uint,
-   ast_bool,
-   ast_vec2,
-   ast_vec3,
-   ast_vec4,
-   ast_bvec2,
-   ast_bvec3,
-   ast_bvec4,
-   ast_ivec2,
-   ast_ivec3,
-   ast_ivec4,
-   ast_uvec2,
-   ast_uvec3,
-   ast_uvec4,
-   ast_mat2,
-   ast_mat2x3,
-   ast_mat2x4,
-   ast_mat3x2,
-   ast_mat3,
-   ast_mat3x4,
-   ast_mat4x2,
-   ast_mat4x3,
-   ast_mat4,
-   ast_sampler1d,
-   ast_sampler2d,
-   ast_sampler2drect,
-   ast_sampler3d,
-   ast_samplercube,
-   ast_samplerexternaloes,
-   ast_sampler1dshadow,
-   ast_sampler2dshadow,
-   ast_sampler2drectshadow,
-   ast_samplercubeshadow,
-   ast_sampler1darray,
-   ast_sampler2darray,
-   ast_sampler1darrayshadow,
-   ast_sampler2darrayshadow,
-   ast_isampler1d,
-   ast_isampler2d,
-   ast_isampler3d,
-   ast_isamplercube,
-   ast_isampler1darray,
-   ast_isampler2darray,
-   ast_usampler1d,
-   ast_usampler2d,
-   ast_usampler3d,
-   ast_usamplercube,
-   ast_usampler1darray,
-   ast_usampler2darray,
-
-   ast_struct,
-   ast_type_name
-};
-

  class ast_type_specifier : public ast_node {
  public:
-   ast_type_specifier(int specifier);
-
    /** Construct a type specifier from a type name */
    ast_type_specifier(const char *name)
-      : type_specifier(ast_type_name), type_name(name), structure(NULL),
+      : type_name(name), structure(NULL),
        is_array(false), array_size(NULL), precision(ast_precision_none),
        is_precision_statement(false)
    {
@@ -492,7 +432,7 @@ public:

    /** Construct a type specifier from a structure definition */
    ast_type_specifier(ast_struct_specifier *s)
-      : type_specifier(ast_struct), type_name(s->name), structure(s),
+      : type_name(s->name), structure(s),
        is_array(false), array_size(NULL), precision(ast_precision_none),
        is_precision_statement(false)
    {
@@ -507,8 +447,6 @@ public:

    ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);

-   enum ast_types type_specifier;
-
    const char *type_name;
    ast_struct_specifier *structure;

diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index ff56e33..dd02301 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -3904,8 +3904,8 @@ ast_type_specifier::hir(exec_list *instructions,
                           "arrays");
          return NULL;
       }
-      if (this->type_specifier != ast_float
-&&  this->type_specifier != ast_int) {
+      if (strcmp(this->type_name, "float") != 0&&
+         strcmp(this->type_name, "int") != 0) {
          _mesa_glsl_error(&loc, state,
                           "default precision statements apply only to types "
                           "float and int");
diff --git a/src/glsl/ast_type.cpp b/src/glsl/ast_type.cpp
index 79c43ee..6c44f8c 100644
--- a/src/glsl/ast_type.cpp
+++ b/src/glsl/ast_type.cpp
@@ -29,7 +29,7 @@ extern "C" {
  void
  ast_type_specifier::print(void) const
  {
-   if (type_specifier == ast_struct) {
+   if (structure) {
       structure->print();
    } else {
       printf("%s ", type_name);
@@ -46,72 +46,6 @@ ast_type_specifier::print(void) const
    }
  }

-ast_type_specifier::ast_type_specifier(int specifier)
-      : type_specifier(ast_types(specifier)), type_name(NULL), structure(NULL),
-       is_array(false), array_size(NULL), precision(ast_precision_none),
-       is_precision_statement(false)
-{
-   static const char *const names[] = {
-      "void",
-      "float",
-      "int",
-      "uint",
-      "bool",
-      "vec2",
-      "vec3",
-      "vec4",
-      "bvec2",
-      "bvec3",
-      "bvec4",
-      "ivec2",
-      "ivec3",
-      "ivec4",
-      "uvec2",
-      "uvec3",
-      "uvec4",
-      "mat2",
-      "mat2x3",
-      "mat2x4",
-      "mat3x2",
-      "mat3",
-      "mat3x4",
-      "mat4x2",
-      "mat4x3",
-      "mat4",
-      "sampler1D",
-      "sampler2D",
-      "sampler2DRect",
-      "sampler3D",
-      "samplerCube",
-      "samplerExternalOES",
-      "sampler1DShadow",
-      "sampler2DShadow",
-      "sampler2DRectShadow",
-      "samplerCubeShadow",
-      "sampler1DArray",
-      "sampler2DArray",
-      "sampler1DArrayShadow",
-      "sampler2DArrayShadow",
-      "isampler1D",
-      "isampler2D",
-      "isampler3D",
-      "isamplerCube",
-      "isampler1DArray",
-      "isampler2DArray",
-      "usampler1D",
-      "usampler2D",
-      "usampler3D",
-      "usamplerCube",
-      "usampler1DArray",
-      "usampler2DArray",
-
-      NULL, /* ast_struct */
-      NULL  /* ast_type_name */
-   };
-
-   type_name = names[specifier];
-}
-
  bool
  ast_fully_specified_type::has_qualifiers() const
  {
diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index 64506b6..5ce69b6 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -156,7 +156,7 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state 
*st, const char *msg)
  %type<type_specifier>  type_specifier
  %type<type_specifier>  type_specifier_no_prec
  %type<type_specifier>  type_specifier_nonarray
-%type<n>  basic_type_specifier_nonarray
+%type<identifier>  basic_type_specifier_nonarray
  %type<fully_specified_type>  fully_specified_type
  %type<function>  function_prototype
  %type<function>  function_header
@@ -1365,58 +1365,58 @@ type_specifier_nonarray:
        ;

  basic_type_specifier_nonarray:
-       VOID_TOK                { $$ = ast_void; }
-       | FLOAT_TOK             { $$ = ast_float; }
-       | INT_TOK               { $$ = ast_int; }
-       | UINT_TOK              { $$ = ast_uint; }
-       | BOOL_TOK              { $$ = ast_bool; }
-       | VEC2                  { $$ = ast_vec2; }
-       | VEC3                  { $$ = ast_vec3; }
-       | VEC4                  { $$ = ast_vec4; }
-       | BVEC2                 { $$ = ast_bvec2; }
-       | BVEC3                 { $$ = ast_bvec3; }
-       | BVEC4                 { $$ = ast_bvec4; }
-       | IVEC2                 { $$ = ast_ivec2; }
-       | IVEC3                 { $$ = ast_ivec3; }
-       | IVEC4                 { $$ = ast_ivec4; }
-       | UVEC2                 { $$ = ast_uvec2; }
-       | UVEC3                 { $$ = ast_uvec3; }
-       | UVEC4                 { $$ = ast_uvec4; }
-       | MAT2X2                { $$ = ast_mat2; }
-       | MAT2X3                { $$ = ast_mat2x3; }
-       | MAT2X4                { $$ = ast_mat2x4; }
-       | MAT3X2                { $$ = ast_mat3x2; }
-       | MAT3X3                { $$ = ast_mat3; }
-       | MAT3X4                { $$ = ast_mat3x4; }
-       | MAT4X2                { $$ = ast_mat4x2; }
-       | MAT4X3                { $$ = ast_mat4x3; }
-       | MAT4X4                { $$ = ast_mat4; }
-       | SAMPLER1D             { $$ = ast_sampler1d; }
-       | SAMPLER2D             { $$ = ast_sampler2d; }
-       | SAMPLER2DRECT         { $$ = ast_sampler2drect; }
-       | SAMPLER3D             { $$ = ast_sampler3d; }
-       | SAMPLERCUBE           { $$ = ast_samplercube; }
-       | SAMPLEREXTERNALOES    { $$ = ast_samplerexternaloes; }
-       | SAMPLER1DSHADOW       { $$ = ast_sampler1dshadow; }
-       | SAMPLER2DSHADOW       { $$ = ast_sampler2dshadow; }
-       | SAMPLER2DRECTSHADOW   { $$ = ast_sampler2drectshadow; }
-       | SAMPLERCUBESHADOW     { $$ = ast_samplercubeshadow; }
-       | SAMPLER1DARRAY        { $$ = ast_sampler1darray; }
-       | SAMPLER2DARRAY        { $$ = ast_sampler2darray; }
-       | SAMPLER1DARRAYSHADOW  { $$ = ast_sampler1darrayshadow; }
-       | SAMPLER2DARRAYSHADOW  { $$ = ast_sampler2darrayshadow; }
-       | ISAMPLER1D            { $$ = ast_isampler1d; }
-       | ISAMPLER2D            { $$ = ast_isampler2d; }
-       | ISAMPLER3D            { $$ = ast_isampler3d; }
-       | ISAMPLERCUBE          { $$ = ast_isamplercube; }
-       | ISAMPLER1DARRAY       { $$ = ast_isampler1darray; }
-       | ISAMPLER2DARRAY       { $$ = ast_isampler2darray; }
-       | USAMPLER1D            { $$ = ast_usampler1d; }
-       | USAMPLER2D            { $$ = ast_usampler2d; }
-       | USAMPLER3D            { $$ = ast_usampler3d; }
-       | USAMPLERCUBE          { $$ = ast_usamplercube; }
-       | USAMPLER1DARRAY       { $$ = ast_usampler1darray; }
-       | USAMPLER2DARRAY       { $$ = ast_usampler2darray; }
+       VOID_TOK                { $$ = (char *)"void"; }
+       | FLOAT_TOK             { $$ = (char *)"float"; }
+       | INT_TOK               { $$ = (char *)"int"; }
+       | UINT_TOK              { $$ = (char *)"uint"; }
+       | BOOL_TOK              { $$ = (char *)"bool"; }
+       | VEC2                  { $$ = (char *)"vec2"; }
+       | VEC3                  { $$ = (char *)"vec3"; }
+       | VEC4                  { $$ = (char *)"vec4"; }
+       | BVEC2                 { $$ = (char *)"bvec2"; }
+       | BVEC3                 { $$ = (char *)"bvec3"; }
+       | BVEC4                 { $$ = (char *)"bvec4"; }
+       | IVEC2                 { $$ = (char *)"ivec2"; }
+       | IVEC3                 { $$ = (char *)"ivec3"; }
+       | IVEC4                 { $$ = (char *)"ivec4"; }
+       | UVEC2                 { $$ = (char *)"uvec2"; }
+       | UVEC3                 { $$ = (char *)"uvec3"; }
+       | UVEC4                 { $$ = (char *)"uvec4"; }
+       | MAT2X2                { $$ = (char *)"mat2"; }
+       | MAT2X3                { $$ = (char *)"mat2x3"; }
+       | MAT2X4                { $$ = (char *)"mat2x4"; }
+       | MAT3X2                { $$ = (char *)"mat3x2"; }
+       | MAT3X3                { $$ = (char *)"mat3"; }
+       | MAT3X4                { $$ = (char *)"mat3x4"; }
+       | MAT4X2                { $$ = (char *)"mat4x2"; }
+       | MAT4X3                { $$ = (char *)"mat4x3"; }
+       | MAT4X4                { $$ = (char *)"mat4"; }
+       | SAMPLER1D             { $$ = (char *)"sampler1D"; }
+       | SAMPLER2D             { $$ = (char *)"sampler2D"; }
+       | SAMPLER2DRECT         { $$ = (char *)"sampler2DRect"; }
+       | SAMPLER3D             { $$ = (char *)"sampler3D"; }
+       | SAMPLERCUBE           { $$ = (char *)"samplerCube"; }
+       | SAMPLEREXTERNALOES    { $$ = (char *)"samplerExternalOES"; }
+       | SAMPLER1DSHADOW       { $$ = (char *)"sampler1DShadow"; }
+       | SAMPLER2DSHADOW       { $$ = (char *)"sampler2DShadow"; }
+       | SAMPLER2DRECTSHADOW   { $$ = (char *)"sampler2DRectShadow"; }
+       | SAMPLERCUBESHADOW     { $$ = (char *)"samplerCubeShadow"; }
+       | SAMPLER1DARRAY        { $$ = (char *)"sampler1DArray"; }
+       | SAMPLER2DARRAY        { $$ = (char *)"sampler2DArray"; }
+       | SAMPLER1DARRAYSHADOW  { $$ = (char *)"sampler1DArrayShadow"; }
+       | SAMPLER2DARRAYSHADOW  { $$ = (char *)"sampler2DArrayShadow"; }
+       | ISAMPLER1D            { $$ = (char *)"isampler1D"; }
+       | ISAMPLER2D            { $$ = (char *)"isampler2D"; }
+       | ISAMPLER3D            { $$ = (char *)"isampler3D"; }
+       | ISAMPLERCUBE          { $$ = (char *)"isamplerCube"; }
+       | ISAMPLER1DARRAY       { $$ = (char *)"isampler1DArray"; }
+       | ISAMPLER2DARRAY       { $$ = (char *)"isampler2DArray"; }
+       | USAMPLER1D            { $$ = (char *)"usampler1D"; }
+       | USAMPLER2D            { $$ = (char *)"usampler2D"; }
+       | USAMPLER3D            { $$ = (char *)"usampler3D"; }
+       | USAMPLERCUBE          { $$ = (char *)"usamplerCube"; }
+       | USAMPLER1DARRAY       { $$ = (char *)"usampler1DArray"; }
+       | USAMPLER2DARRAY       { $$ = (char *)"usampler2DArray"; }
        ;

  precision_qualifier:
--
1.7.9.5

I just came across this code in the parser a couple of days ago and
couldn't figure out why we were doing backflips to get the string. I
like this patch, but can't we go one step farther and return the
string directly from the lexer? Looking at the KEYWORD macro, we
already return the string when it's not identified as a keyword or
reserved word. Could we just set yylval->identifier in all cases and
use it directly in the parser?

We could, but we'd need to make sure the string was freed at the right time. Using a static string eliminates the need.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to