Commit 3c635dec authored by Robert Bradshaw's avatar Robert Bradshaw

disallow names as keys in struct dict literals

parent d4dd8baa
......@@ -1880,7 +1880,7 @@ class CallNode(ExprNode):
args, kwds = self.explicit_args_kwds()
items = []
for arg, member in zip(args, type.scope.var_entries):
items.append(DictItemNode(pos=arg.pos, key=NameNode(pos=arg.pos, name=member.name), value=arg))
items.append(DictItemNode(pos=arg.pos, key=IdentifierStringNode(pos=arg.pos, value=member.name), value=arg))
if kwds:
items += kwds.key_value_pairs
self.key_value_pairs = items
......@@ -2947,15 +2947,13 @@ class DictNode(ExprNode):
for item in self.key_value_pairs:
if isinstance(item.key, CoerceToPyTypeNode):
item.key = item.key.arg
if isinstance(item.key, (StringNode, IdentifierStringNode)):
item.key = NameNode(pos=item.key.pos, name=item.key.value)
if not isinstance(item.key, NameNode):
print item.key
error(item.key.pos, "Struct field must be a name")
if not isinstance(item.key, (StringNode, IdentifierStringNode)):
error(item.key.pos, "Invalid struct field identifier")
item.key = IdentifierStringNode(item.key.pos, value="<error>")
else:
member = dst_type.scope.lookup_here(item.key.name)
member = dst_type.scope.lookup_here(item.key.value)
if not member:
error(item.key.pos, "struct '%s' has no field '%s'" % (dst_type, item.key.name))
error(item.key.pos, "struct '%s' has no field '%s'" % (dst_type, item.key.value))
else:
value = item.value
if isinstance(value, CoerceToPyTypeNode):
......@@ -3003,7 +3001,7 @@ class DictNode(ExprNode):
else:
code.putln("%s.%s = %s;" % (
self.result(),
item.key.name,
item.key.value,
item.value.result()))
item.generate_disposal_code(code)
......
......@@ -40,7 +40,7 @@ def test_constructor_kwds(x, y, color):
return p
def test_dict_construction(x, y, color):
cdef Point p = {color: color, x: x, y: y}
cdef Point p = {'color': color, 'x': x, 'y': y}
return p
cdef union int_or_float:
......@@ -53,8 +53,8 @@ cdef struct with_pointers:
void* ptr
def test_pointers(int n, double x):
cdef with_pointers a = [True, {n: n}, NULL]
cdef with_pointers b = with_pointers(False, {x: x}, NULL)
cdef with_pointers a = [True, {'n': n}, NULL]
cdef with_pointers b = with_pointers(False, {'x': x}, NULL)
print a.data.n
print b.data.x
print a.ptr == b.ptr == NULL
\ No newline at end of file
print a.ptr == b.ptr == NULL
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment