Index: runtime/vm/parser.cc |
=================================================================== |
--- runtime/vm/parser.cc (revision 23933) |
+++ runtime/vm/parser.cc (working copy) |
@@ -6891,8 +6891,8 @@ |
arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle())); |
} else { |
const int total_num_parameters = function.NumParameters(); |
- Array& array = Array::ZoneHandle(Array::New(total_num_parameters)); |
- array ^= array.Canonicalize(); |
+ Array& array = |
+ Array::ZoneHandle(Array::New(total_num_parameters, Heap::kOld)); |
// Skip receiver. |
for (int i = 0; i < total_num_parameters; i++) { |
array.SetAt(i, String::Handle(function.ParameterNameAt(i))); |
@@ -8147,11 +8147,24 @@ |
} |
+RawInstance* Parser::TryCanonicalize(const Instance& instance, |
+ intptr_t token_pos) { |
+ if (instance.IsNull()) { |
+ return instance.raw(); |
+ } |
+ const char* error_str = NULL; |
+ Instance& result = |
+ Instance::Handle(instance.CheckAndCanonicalize(&error_str)); |
+ if (result.IsNull()) { |
+ ErrorMsg(token_pos, "Invalid const object %s", error_str); |
+ } |
+ return result.raw(); |
+} |
-// If the field is constant, initialize the field if necessary and return |
-// no ast (NULL). |
-// Otherwise return NULL if no implicit getter exists (either never created |
-// because trivial, or not needed or field not readable). |
+ |
+// If the field is already initialized, return no ast (NULL). |
+// Otherwise, if the field is constant, initialize the field and return no ast. |
+// If the field is not initialized and not const, return the ast for the getter. |
AstNode* Parser::RunStaticFieldInitializer(const Field& field) { |
ASSERT(field.is_static()); |
const Class& field_owner = Class::ZoneHandle(field.owner()); |
@@ -8209,9 +8222,7 @@ |
ASSERT(const_value.IsNull() || const_value.IsInstance()); |
Instance& instance = Instance::Handle(); |
instance ^= const_value.raw(); |
- if (!instance.IsNull()) { |
- instance ^= instance.Canonicalize(); |
- } |
+ instance = TryCanonicalize(instance, TokenPos()); |
field.set_value(instance); |
return NULL; // Constant |
} else { |
@@ -8276,10 +8287,7 @@ |
return Object::null(); |
} |
} else { |
- if (!instance.IsNull()) { |
- instance ^= instance.Canonicalize(); |
- } |
- return instance.raw(); |
+ return TryCanonicalize(instance, TokenPos()); |
} |
} |
@@ -8919,7 +8927,7 @@ |
} |
const_list.SetAt(i, elem->AsLiteralNode()->literal()); |
} |
- const_list ^= const_list.Canonicalize(); |
+ const_list ^= TryCanonicalize(const_list, literal_pos); |
const_list.MakeImmutable(); |
return new LiteralNode(literal_pos, const_list); |
} else { |
@@ -9116,7 +9124,7 @@ |
} |
key_value_array.SetAt(i, arg->AsLiteralNode()->literal()); |
} |
- key_value_array ^= key_value_array.Canonicalize(); |
+ key_value_array ^= TryCanonicalize(key_value_array, TokenPos()); |
key_value_array.MakeImmutable(); |
// Construct the map object. |
@@ -9790,9 +9798,7 @@ |
ASSERT(result.IsInstance()); |
Instance& value = Instance::ZoneHandle(); |
value ^= result.raw(); |
- if (!value.IsNull()) { |
- value ^= value.Canonicalize(); |
- } |
+ value = TryCanonicalize(value, TokenPos()); |
return value; |
} |
} |