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