Author: bryanduxbury
Date: Sun Sep 12 14:38:36 2010
New Revision: 996320

URL: http://svn.apache.org/viewvc?rev=996320&view=rev
Log:
THRIFT-897. compiler: Don't allow unqualified constant access to enum values

This patch makes it illegal to refer to enum values by just their names in the 
IDL. Now, you must also provide the enum type's name as well.


Modified:
    incubator/thrift/trunk/compiler/cpp/src/main.cc
    incubator/thrift/trunk/compiler/cpp/src/thrifty.yy
    incubator/thrift/trunk/test/ThriftTest.thrift

Modified: incubator/thrift/trunk/compiler/cpp/src/main.cc
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/compiler/cpp/src/main.cc?rev=996320&r1=996319&r2=996320&view=diff
==============================================================================
--- incubator/thrift/trunk/compiler/cpp/src/main.cc (original)
+++ incubator/thrift/trunk/compiler/cpp/src/main.cc Sun Sep 12 14:38:36 2010
@@ -720,7 +720,13 @@ void validate_const_rec(std::string name
     vector<t_enum_value*>::const_iterator c_iter;
     bool found = false;
     for (c_iter = enum_values.begin(); c_iter != enum_values.end(); ++c_iter) {
-      if ((*c_iter)->get_name() == value->get_identifier()) {
+      size_t sub_index = value->get_identifier().find('.');
+      if (sub_index == string::npos) {
+        throw "error: identifier " + value->get_identifier() + " is 
unqualified!";
+      }
+      std::string name_portion = value->get_identifier().substr(sub_index+1);
+
+      if ((*c_iter)->get_name() == name_portion) {
         found = true;
         break;
       }

Modified: incubator/thrift/trunk/compiler/cpp/src/thrifty.yy
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/compiler/cpp/src/thrifty.yy?rev=996320&r1=996319&r2=996320&view=diff
==============================================================================
--- incubator/thrift/trunk/compiler/cpp/src/thrifty.yy (original)
+++ incubator/thrift/trunk/compiler/cpp/src/thrifty.yy Sun Sep 12 14:38:36 2010
@@ -511,6 +511,20 @@ Enum:
       $$ = $4;
       $$->set_name($2);
       $$->resolve_values();
+      // make constants for all the enum values
+      if (g_parse_mode == PROGRAM) {
+        const std::vector<t_enum_value*>& enum_values = $$->get_constants();
+        std::vector<t_enum_value*>::const_iterator c_iter;
+        for (c_iter = enum_values.begin(); c_iter != enum_values.end(); 
++c_iter) {
+          std::string const_name = $$->get_name() + "." + 
(*c_iter)->get_name();
+          t_const_value* const_val = new t_const_value((*c_iter)->get_value());
+          const_val->set_enum($$);
+          g_scope->add_constant(const_name, new t_const(g_type_i32, 
(*c_iter)->get_name(), const_val));
+          if (g_parent_scope != NULL) {
+            g_parent_scope->add_constant(g_parent_prefix + const_name, new 
t_const(g_type_i32, (*c_iter)->get_name(), const_val));
+          }
+        }
+      }
     }
 
 EnumDefList:
@@ -540,12 +554,6 @@ EnumDef:
       if ($1 != NULL) {
         $$->set_doc($1);
       }
-      if (g_parse_mode == PROGRAM) {
-        g_scope->add_constant($2, new t_const(g_type_i32, $2, new 
t_const_value($4)));
-        if (g_parent_scope != NULL) {
-          g_parent_scope->add_constant(g_parent_prefix + $2, new 
t_const(g_type_i32, $2, new t_const_value($4)));
-        }
-      }
     }
 |
   CaptureDocText tok_identifier CommaOrSemicolonOptional

Modified: incubator/thrift/trunk/test/ThriftTest.thrift
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/test/ThriftTest.thrift?rev=996320&r1=996319&r2=996320&view=diff
==============================================================================
--- incubator/thrift/trunk/test/ThriftTest.thrift (original)
+++ incubator/thrift/trunk/test/ThriftTest.thrift Sun Sep 12 14:38:36 2010
@@ -43,6 +43,10 @@ enum Numberz
   EIGHT = 8
 }
 
+const Numberz myNumberz = Numberz.ONE;
+// the following is expected to fail:
+// const Numberz urNumberz = ONE;
+
 typedef i64 UserId
 
 struct Bonk


Reply via email to