Chromium Code Reviews| Index: runtime/vm/parser.cc |
| =================================================================== |
| --- runtime/vm/parser.cc (revision 36643) |
| +++ runtime/vm/parser.cc (working copy) |
| @@ -305,7 +305,7 @@ |
| literal_token_(LiteralToken::Handle(isolate_)), |
| current_class_(Class::Handle(isolate_, |
| parsed_function->function().Owner())), |
| - library_(Library::Handle(Class::Handle( |
| + library_(Library::Handle(isolate_, Class::Handle( |
|
Cutch
2014/05/27 10:00:02
Should this use isolate() instead of isolate_?
Ivan Posva
2014/05/27 10:15:53
This is in the constructor, so I use isolate_ like
|
| isolate_, |
| parsed_function->function().origin()).library())), |
| try_blocks_list_(NULL), |
| @@ -334,7 +334,8 @@ |
| void Parser::SetScript(const Script& script, intptr_t token_pos) { |
| script_ = script.raw(); |
| - tokens_iterator_.SetStream(TokenStream::Handle(script.tokens()), token_pos); |
| + tokens_iterator_.SetStream( |
| + TokenStream::Handle(isolate(), script.tokens()), token_pos); |
| token_kind_ = Token::kILLEGAL; |
| } |
| @@ -425,7 +426,7 @@ |
| ASSERT(literal_token_.kind() == Token::kINTEGER); |
| RawInteger* ri = Integer::RawCast(literal_token_.value()); |
| if (FLAG_throw_on_javascript_int_overflow) { |
| - const Integer& i = Integer::Handle(ri); |
| + const Integer& i = Integer::Handle(isolate(), ri); |
| if (i.CheckJavascriptIntegerOverflow()) { |
| ErrorMsg(TokenPos(), |
| "Integer literal does not fit in a Javascript integer: %s.", |
| @@ -882,8 +883,8 @@ |
| StackZone zone(isolate); |
| LongJumpScope jump; |
| if (setjmp(*jump.Set()) == 0) { |
| - const Script& script = Script::Handle(cls.script()); |
| - const Library& lib = Library::Handle(cls.library()); |
| + const Script& script = Script::Handle(isolate, cls.script()); |
|
Cutch
2014/05/27 10:00:02
You can use: isolate() right?
Ivan Posva
2014/05/27 10:15:53
No, as this is a static method.
|
| + const Library& lib = Library::Handle(isolate, cls.library()); |
| Parser parser(script, lib, token_pos); |
| parser.set_current_class(cls); |
| parser.set_parsing_metadata(true); |
| @@ -891,7 +892,7 @@ |
| RawObject* metadata = parser.EvaluateMetadata(); |
| return metadata; |
| } else { |
| - Error& error = Error::Handle(); |
| + Error& error = Error::Handle(isolate); |
| error = isolate->object_store()->sticky_error(); |
| isolate->object_store()->clear_sticky_error(); |
| return error.raw(); |
| @@ -904,7 +905,7 @@ |
| RawArray* Parser::EvaluateMetadata() { |
| CheckToken(Token::kAT, "Metadata character '@' expected"); |
| GrowableObjectArray& meta_values = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| + GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New()); |
| while (CurrentToken() == Token::kAT) { |
| ConsumeToken(); |
| intptr_t expr_pos = TokenPos(); |
| @@ -912,7 +913,8 @@ |
| ExpectIdentifier("identifier expected"); |
| } |
| // Reject expressions with deferred library prefix eagerly. |
| - Object& obj = Object::Handle(library_.LookupLocalObject(*CurrentLiteral())); |
| + Object& obj = Object::Handle(isolate(), |
| + library_.LookupLocalObject(*CurrentLiteral())); |
| if (!obj.IsNull() && obj.IsLibraryPrefix()) { |
| if (LibraryPrefix::Cast(obj).is_deferred_load()) { |
| ErrorMsg("Metadata must be compile-time constant"); |
| @@ -929,7 +931,7 @@ |
| } else { |
| // Can be x, C.x, or L.C.x. |
| expr = ParsePrimary(); // Consumes x, C or L.C. |
| - Class& cls = Class::Handle(); |
| + Class& cls = Class::Handle(isolate()); |
| if (expr->IsPrimaryNode()) { |
| PrimaryNode* primary_node = expr->AsPrimaryNode(); |
| if (primary_node->primary().IsClass()) { |
| @@ -950,7 +952,8 @@ |
| ConsumeToken(); |
| const intptr_t ident_pos = TokenPos(); |
| String* ident = ExpectIdentifier("identifier expected"); |
| - const Field& field = Field::Handle(cls.LookupStaticField(*ident)); |
| + const Field& field = Field::Handle(isolate(), |
| + cls.LookupStaticField(*ident)); |
| if (field.IsNull()) { |
| ErrorMsg(ident_pos, |
| "Class '%s' has no field '%s'", |
| @@ -981,7 +984,7 @@ |
| ParamList params; |
| ASSERT(func.num_fixed_parameters() == 0); // static. |
| ASSERT(!func.HasOptionalParameters()); |
| - ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); |
| + ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved()); |
| // Build local scope for function and populate with the formal parameters. |
| OpenFunctionBlock(func); |
| @@ -989,7 +992,7 @@ |
| intptr_t ident_pos = TokenPos(); |
| const String& field_name = *ExpectIdentifier("field name expected"); |
| - const Class& field_class = Class::Handle(func.Owner()); |
| + const Class& field_class = Class::Handle(isolate(), func.Owner()); |
| const Field& field = |
| Field::ZoneHandle(field_class.LookupStaticField(field_name)); |
| @@ -1061,9 +1064,9 @@ |
| ident_pos, |
| field, |
| new LiteralNode(ident_pos, Object::transition_sentinel()))); |
| - const String& init_name = String::Handle( |
| - Symbols::New(String::Handle(String::Concat( |
| - Symbols::InitPrefix(), String::Handle(field.name()))))); |
| + const String& init_name = String::Handle(isolate(), Symbols::New( |
| + String::Handle(isolate(), String::Concat( |
| + Symbols::InitPrefix(), String::Handle(isolate(), field.name()))))); |
| const Function& init_function = Function::ZoneHandle( |
| field_class.LookupStaticFunction(init_name)); |
| ASSERT(!init_function.IsNull()); |
| @@ -1091,7 +1094,7 @@ |
| ParamList params; |
| ASSERT(func.num_fixed_parameters() == 0); // static. |
| ASSERT(!func.HasOptionalParameters()); |
| - ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); |
| + ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved()); |
| // Build local scope for function and populate with the formal parameters. |
| OpenFunctionBlock(func); |
| @@ -1198,7 +1201,7 @@ |
| params.AddReceiver(ReceiverType(current_class()), ident_pos); |
| ASSERT(func.num_fixed_parameters() == 1); // receiver. |
| ASSERT(!func.HasOptionalParameters()); |
| - ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); |
| + ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved()); |
| // Build local scope for function and populate with the formal parameters. |
| OpenFunctionBlock(func); |
| @@ -1209,7 +1212,7 @@ |
| LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver); |
| ASSERT(IsIdentifier()); |
| const String& field_name = *CurrentLiteral(); |
| - const Class& field_class = Class::Handle(func.Owner()); |
| + const Class& field_class = Class::Handle(isolate(), func.Owner()); |
| const Field& field = |
| Field::ZoneHandle(field_class.LookupInstanceField(field_name)); |
| @@ -1246,7 +1249,7 @@ |
| &field_type); |
| ASSERT(func.num_fixed_parameters() == 2); // receiver, value. |
| ASSERT(!func.HasOptionalParameters()); |
| - ASSERT(AbstractType::Handle(func.result_type()).IsVoidType()); |
| + ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsVoidType()); |
| // Build local scope for function and populate with the formal parameters. |
| OpenFunctionBlock(func); |
| @@ -1346,7 +1349,7 @@ |
| ASSERT(func.token_pos() == 0); |
| ASSERT(current_class().raw() == func.Owner()); |
| - ArgumentsDescriptor desc(Array::Handle(func.saved_args_desc())); |
| + ArgumentsDescriptor desc(Array::Handle(isolate(), func.saved_args_desc())); |
| ASSERT(desc.Count() > 0); |
| // Set up scope for this function. |
| @@ -1362,7 +1365,7 @@ |
| if (desc.NamedCount() > 0) { |
| const Array& arg_names = Array::ZoneHandle(Array::New(desc.NamedCount())); |
| for (intptr_t i = 0; i < arg_names.Length(); ++i) { |
| - arg_names.SetAt(i, String::Handle(desc.NameAt(i))); |
| + arg_names.SetAt(i, String::Handle(isolate(), desc.NameAt(i))); |
| } |
| func_args->set_names(arg_names); |
| } |
| @@ -1371,8 +1374,8 @@ |
| ArgumentListNode* arguments = BuildNoSuchMethodArguments( |
| token_pos, func_name, *func_args, NULL, false); |
| const Function& no_such_method = Function::ZoneHandle( |
| - Resolver::ResolveDynamicAnyArgs(Class::Handle(func.Owner()), |
| - Symbols::NoSuchMethod())); |
| + Resolver::ResolveDynamicAnyArgs(Class::Handle( |
| + isolate(), func.Owner()), Symbols::NoSuchMethod())); |
| StaticCallNode* call = |
| new StaticCallNode(token_pos, no_such_method, arguments); |
| @@ -1391,7 +1394,7 @@ |
| ASSERT(func.token_pos() == 0); |
| ASSERT(current_class().raw() == func.Owner()); |
| - const Array& args_desc = Array::Handle(func.saved_args_desc()); |
| + const Array& args_desc = Array::Handle(isolate(), func.saved_args_desc()); |
| ArgumentsDescriptor desc(args_desc); |
| ASSERT(desc.Count() > 0); |
| @@ -1403,17 +1406,16 @@ |
| ArgumentListNode* no_args = new ArgumentListNode(token_pos); |
| LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0)); |
| - const String& name = String::Handle(func.name()); |
| - const String& getter_name = |
| - String::ZoneHandle(Symbols::New(String::Handle(Field::GetterName(name)))); |
| - InstanceCallNode* getter_call = new InstanceCallNode(token_pos, |
| - receiver, |
| - getter_name, |
| - no_args); |
| + const String& name = String::Handle(isolate(), func.name()); |
| + const String& getter_name = String::ZoneHandle( |
|
srdjan
2014/05/27 10:00:53
pass isolate to ZoneHandle as well
Ivan Posva
2014/05/27 10:15:53
This change only dealt with Handle, even though th
|
| + Symbols::New(String::Handle(isolate(), Field::GetterName(name)))); |
| + InstanceCallNode* getter_call = new(isolate()) InstanceCallNode( |
| + token_pos, receiver, getter_name, no_args); |
| // Pass arguments 1..n to the closure call. |
| ArgumentListNode* args = new ArgumentListNode(token_pos); |
| - const Array& names = Array::Handle(Array::New(desc.NamedCount(), Heap::kOld)); |
| + const Array& names = Array::Handle( |
| + isolate(), Array::New(desc.NamedCount(), Heap::kOld)); |
| // Positional parameters. |
| intptr_t i = 1; |
| for (; i < desc.PositionalCount(); ++i) { |
| @@ -1423,11 +1425,11 @@ |
| for (; i < desc.Count(); i++) { |
| args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i))); |
| intptr_t index = i - desc.PositionalCount(); |
| - names.SetAt(index, String::Handle(desc.NameAt(index))); |
| + names.SetAt(index, String::Handle(isolate(), desc.NameAt(index))); |
| } |
| args->set_names(names); |
| - const Class& owner = Class::Handle(func.Owner()); |
| + const Class& owner = Class::Handle(isolate(), func.Owner()); |
| ASSERT(!owner.IsNull()); |
| AstNode* result = NULL; |
| if (owner.IsSignatureClass() && name.Equals(Symbols::Call())) { |
| @@ -1602,7 +1604,7 @@ |
| if (!var_seen && !parameter.is_final) { |
| // The parsed parameter type is actually the function result type. |
| const AbstractType& result_type = |
| - AbstractType::Handle(parameter.type->raw()); |
| + AbstractType::Handle(isolate(), parameter.type->raw()); |
| // Finish parsing the function type parameter. |
| ParamList func_params; |
| @@ -1617,7 +1619,7 @@ |
| ParseFormalParameterList(no_explicit_default_values, false, &func_params); |
| // The field 'is_static' has no meaning for signature functions. |
| - const Function& signature_function = Function::Handle( |
| + const Function& signature_function = Function::Handle(isolate(), |
| Function::New(*parameter.name, |
| RawFunction::kSignatureFunction, |
| /* is_static = */ false, |
| @@ -1629,7 +1631,8 @@ |
| parameter.name_pos)); |
| signature_function.set_result_type(result_type); |
| AddFormalParamsToFunction(&func_params, signature_function); |
| - const String& signature = String::Handle(signature_function.Signature()); |
| + const String& signature = String::Handle(isolate(), |
| + signature_function.Signature()); |
| // Lookup the signature class, i.e. the class whose name is the signature. |
| // We only lookup in the current library, but not in its imports, and only |
| // create a new canonical signature class if it does not exist yet. |
| @@ -1789,12 +1792,13 @@ |
| ArgumentListNode* arguments, |
| bool resolve_getter, |
| bool* is_no_such_method) { |
| - const Class& super_class = Class::Handle(current_class().SuperClass()); |
| + const Class& super_class = Class::Handle( |
| + isolate(), current_class().SuperClass()); |
| if (super_class.IsNull()) { |
| ErrorMsg(token_pos, "class '%s' does not have a superclass", |
| - String::Handle(current_class().Name()).ToCString()); |
| + String::Handle(isolate(), current_class().Name()).ToCString()); |
| } |
| - Function& super_func = Function::Handle( |
| + Function& super_func = Function::Handle(isolate(), |
| Resolver::ResolveDynamicAnyArgs(super_class, name)); |
| if (!super_func.IsNull() && |
| !super_func.AreValidArguments(arguments->length(), |
| @@ -2036,7 +2040,7 @@ |
| // parameterized class, make sure that the receiver is captured as |
| // instantiator. |
| if (current_block_->scope->function_level() > 0) { |
| - const Class& signature_class = Class::Handle( |
| + const Class& signature_class = Class::Handle(isolate(), |
| implicit_closure_function.signature_class()); |
| if (signature_class.NumTypeParameters() > 0) { |
| CaptureInstantiator(); |
| @@ -2053,7 +2057,7 @@ |
| const Class& super_class = Class::ZoneHandle(current_class().SuperClass()); |
| if (super_class.IsNull()) { |
| ErrorMsg("class '%s' does not have a superclass", |
| - String::Handle(current_class().Name()).ToCString()); |
| + String::Handle(isolate(), current_class().Name()).ToCString()); |
| } |
| AstNode* implicit_argument = LoadReceiver(field_pos); |
| @@ -2093,16 +2097,16 @@ |
| intptr_t supercall_pos, |
| LocalVariable* receiver, |
| ArgumentListNode* forwarding_args) { |
| - const Class& super_class = Class::Handle(cls.SuperClass()); |
| + const Class& super_class = Class::Handle(isolate(), cls.SuperClass()); |
| // Omit the implicit super() if there is no super class (i.e. |
| // we're not compiling class Object), or if the super class is an |
| // artificially generated "wrapper class" that has no constructor. |
| if (super_class.IsNull() || |
| (super_class.num_native_fields() > 0 && |
| - Class::Handle(super_class.SuperClass()).IsObjectClass())) { |
| + Class::Handle(isolate(), super_class.SuperClass()).IsObjectClass())) { |
| return; |
| } |
| - String& super_ctor_name = String::Handle(super_class.Name()); |
| + String& super_ctor_name = String::Handle(isolate(), super_class.Name()); |
| super_ctor_name = String::Concat(super_ctor_name, Symbols::Dot()); |
| ArgumentListNode* arguments = new ArgumentListNode(supercall_pos); |
| @@ -2122,8 +2126,8 @@ |
| for (int i = 0; i < forwarding_args->length(); i++) { |
| arguments->Add(forwarding_args->NodeAt(i)); |
| } |
| - String& ctor_name = String::Handle(current_function().name()); |
| - String& class_name = String::Handle(cls.Name()); |
| + String& ctor_name = String::Handle(isolate(), current_function().name()); |
| + String& class_name = String::Handle(isolate(), cls.Name()); |
| if (ctor_name.Length() > class_name.Length() + 1) { |
| // Generating a forwarding call to a named constructor 'C.n'. |
| // Add the constructor name 'n' to the super constructor. |
| @@ -2138,19 +2142,19 @@ |
| if (super_ctor.IsNull()) { |
| ErrorMsg(supercall_pos, |
| "unresolved implicit call to super constructor '%s()'", |
| - String::Handle(super_class.Name()).ToCString()); |
| + String::Handle(isolate(), super_class.Name()).ToCString()); |
| } |
| if (current_function().is_const() && !super_ctor.is_const()) { |
| ErrorMsg(supercall_pos, "implicit call to non-const super constructor"); |
| } |
| - String& error_message = String::Handle(); |
| + String& error_message = String::Handle(isolate()); |
| if (!super_ctor.AreValidArguments(arguments->length(), |
| arguments->names(), |
| &error_message)) { |
| ErrorMsg(supercall_pos, |
| "invalid arguments passed to super constructor '%s()': %s", |
| - String::Handle(super_class.Name()).ToCString(), |
| + String::Handle(isolate(), super_class.Name()).ToCString(), |
| error_message.ToCString()); |
| } |
| current_block_->statements->Add( |
| @@ -2164,9 +2168,9 @@ |
| ASSERT(CurrentToken() == Token::kSUPER); |
| const intptr_t supercall_pos = TokenPos(); |
| ConsumeToken(); |
| - const Class& super_class = Class::Handle(cls.SuperClass()); |
| + const Class& super_class = Class::Handle(isolate(), cls.SuperClass()); |
| ASSERT(!super_class.IsNull()); |
| - String& ctor_name = String::Handle(super_class.Name()); |
| + String& ctor_name = String::Handle(isolate(), super_class.Name()); |
| ctor_name = String::Concat(ctor_name, Symbols::Dot()); |
| if (CurrentToken() == Token::kPERIOD) { |
| ConsumeToken(); |
| @@ -2203,7 +2207,7 @@ |
| if (current_function().is_const() && !super_ctor.is_const()) { |
| ErrorMsg(supercall_pos, "super constructor must be const"); |
| } |
| - String& error_message = String::Handle(); |
| + String& error_message = String::Handle(isolate()); |
| if (!super_ctor.AreValidArguments(arguments->length(), |
| arguments->names(), |
| &error_message)) { |
| @@ -2254,8 +2258,8 @@ |
| void Parser::CheckFieldsInitialized(const Class& cls) { |
| - const Array& fields = Array::Handle(cls.fields()); |
| - Field& field = Field::Handle(); |
| + const Array& fields = Array::Handle(isolate(), cls.fields()); |
| + Field& field = Field::Handle(isolate()); |
| SequenceNode* initializers = current_block_->statements; |
| for (int field_num = 0; field_num < fields.Length(); field_num++) { |
| field ^= fields.At(field_num); |
| @@ -2278,7 +2282,7 @@ |
| if (found) continue; |
| - field.UpdateGuardedCidAndLength(Object::Handle()); |
| + field.UpdateGuardedCidAndLength(Object::Handle(isolate())); |
| } |
| } |
| @@ -2288,14 +2292,15 @@ |
| // from a different class. We need to save and restore current |
| // class, library, and token stream (script). |
| ASSERT(current_class().raw() != field.origin()); |
| - const Class& saved_class = Class::Handle(current_class().raw()); |
| - const Library& saved_library = Library::Handle(library().raw()); |
| - const Script& saved_script = Script::Handle(script().raw()); |
| + const Class& saved_class = Class::Handle(isolate(), current_class().raw()); |
| + const Library& saved_library = Library::Handle(isolate(), library().raw()); |
| + const Script& saved_script = Script::Handle(isolate(), script().raw()); |
| const intptr_t saved_token_pos = TokenPos(); |
| - set_current_class(Class::Handle(field.origin())); |
| - set_library(Library::Handle(current_class().library())); |
| - SetScript(Script::Handle(current_class().script()), field.token_pos()); |
| + set_current_class(Class::Handle(isolate(), field.origin())); |
| + set_library(Library::Handle(isolate(), current_class().library())); |
| + SetScript(Script::Handle(isolate(), current_class().script()), |
| + field.token_pos()); |
| ASSERT(IsIdentifier()); |
| ConsumeToken(); |
| @@ -2323,8 +2328,8 @@ |
| LocalVariable* receiver, |
| GrowableArray<Field*>* initialized_fields) { |
| TRACE_PARSER("ParseInitializedInstanceFields"); |
| - const Array& fields = Array::Handle(cls.fields()); |
| - Field& f = Field::Handle(); |
| + const Array& fields = Array::Handle(isolate(), cls.fields()); |
| + Field& f = Field::Handle(isolate()); |
| const intptr_t saved_pos = TokenPos(); |
| for (int i = 0; i < fields.Length(); i++) { |
| f ^= fields.At(i); |
| @@ -2380,7 +2385,7 @@ |
| if (initialized_field->raw() == field->raw()) { |
| ErrorMsg(init_pos, |
| "duplicate initialization for field %s", |
| - String::Handle(field->name()).ToCString()); |
| + String::Handle(isolate(), field->name()).ToCString()); |
| } |
| } |
| initialized_fields->Add(field); |
| @@ -2424,7 +2429,7 @@ |
| ASSERT(CurrentToken() == Token::kTHIS); |
| const intptr_t call_pos = TokenPos(); |
| ConsumeToken(); |
| - String& ctor_name = String::Handle(cls.Name()); |
| + String& ctor_name = String::Handle(isolate(), cls.Name()); |
| ctor_name = String::Concat(ctor_name, Symbols::Dot()); |
| if (CurrentToken() == Token::kPERIOD) { |
| @@ -2452,7 +2457,7 @@ |
| if (redirect_ctor.IsNull()) { |
| ErrorMsg(call_pos, "constructor '%s' not found", ctor_name.ToCString()); |
| } |
| - String& error_message = String::Handle(); |
| + String& error_message = String::Handle(isolate()); |
| if (!redirect_ctor.AreValidArguments(arguments->length(), |
| arguments->names(), |
| &error_message)) { |
| @@ -2541,12 +2546,12 @@ |
| void Parser::CheckRecursiveInvocation() { |
| const GrowableObjectArray& pending_functions = |
| - GrowableObjectArray::Handle( |
| + GrowableObjectArray::Handle(isolate(), |
| isolate()->object_store()->pending_functions()); |
| for (int i = 0; i < pending_functions.Length(); i++) { |
| if (pending_functions.At(i) == current_function().raw()) { |
| const String& fname = |
| - String::Handle(current_function().UserVisibleName()); |
| + String::Handle(isolate(), current_function().UserVisibleName()); |
| ErrorMsg("circular dependency for function %s", fname.ToCString()); |
| } |
| } |
| @@ -2565,7 +2570,7 @@ |
| ASSERT(!func.IsFactory()); |
| ASSERT(!func.is_static()); |
| ASSERT(!func.IsLocalFunction()); |
| - const Class& cls = Class::Handle(func.Owner()); |
| + const Class& cls = Class::Handle(isolate(), func.Owner()); |
| ASSERT(!cls.IsNull()); |
| CheckRecursiveInvocation(); |
| @@ -2602,7 +2607,7 @@ |
| ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); |
| SetupDefaultsForOptionalParams(¶ms, default_parameter_values); |
| - ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); |
| + ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved()); |
| ASSERT(func.NumParameters() == params.parameters->length()); |
| // Now populate function scope with the formal parameters. |
| @@ -2854,7 +2859,7 @@ |
| Array* default_parameter_values) { |
| TRACE_PARSER("ParseFunc"); |
| Function& saved_innermost_function = |
| - Function::Handle(innermost_function().raw()); |
| + Function::Handle(isolate(), innermost_function().raw()); |
| innermost_function_ = func.raw(); |
| // Save current try index. Try index starts at zero for each function. |
| @@ -2910,7 +2915,7 @@ |
| AddFormalParamsToFunction(¶ms, func); |
| } |
| SetupDefaultsForOptionalParams(¶ms, default_parameter_values); |
| - ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); |
| + ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved()); |
| ASSERT(func.NumParameters() == params.parameters->length()); |
| // Check whether the function has any field initializer formal parameters, |
| @@ -2945,8 +2950,9 @@ |
| intptr_t end_token_pos = 0; |
| if (CurrentToken() == Token::kLBRACE) { |
| ConsumeToken(); |
| - if (String::Handle(func.name()).Equals(Symbols::EqualOperator())) { |
| - const Class& owner = Class::Handle(func.Owner()); |
| + if (String::Handle(isolate(), func.name()).Equals( |
| + Symbols::EqualOperator())) { |
| + const Class& owner = Class::Handle(isolate(), func.Owner()); |
| if (!owner.IsObjectClass()) { |
| AddEqualityNullCheck(); |
| } |
| @@ -2956,8 +2962,9 @@ |
| ExpectToken(Token::kRBRACE); |
| } else if (CurrentToken() == Token::kARROW) { |
| ConsumeToken(); |
| - if (String::Handle(func.name()).Equals(Symbols::EqualOperator())) { |
| - const Class& owner = Class::Handle(func.Owner()); |
| + if (String::Handle(isolate(), func.name()).Equals( |
| + Symbols::EqualOperator())) { |
| + const Class& owner = Class::Handle(isolate(), func.Owner()); |
| if (!owner.IsObjectClass()) { |
| AddEqualityNullCheck(); |
| } |
| @@ -2968,8 +2975,9 @@ |
| current_block_->statements->Add(new ReturnNode(expr_pos, expr)); |
| end_token_pos = TokenPos(); |
| } else if (IsLiteral("native")) { |
| - if (String::Handle(func.name()).Equals(Symbols::EqualOperator())) { |
| - const Class& owner = Class::Handle(func.Owner()); |
| + if (String::Handle(isolate(), func.name()).Equals( |
| + Symbols::EqualOperator())) { |
| + const Class& owner = Class::Handle(isolate(), func.Owner()); |
| if (!owner.IsObjectClass()) { |
| AddEqualityNullCheck(); |
| } |
| @@ -3101,7 +3109,8 @@ |
| } else { |
| // TODO(hausner): Should we resolve the prefix via the library scope |
| // rather than via the class? |
| - Class& cls = Class::Handle(parsed_function()->function().origin()); |
| + Class& cls = Class::Handle(isolate(), |
| + parsed_function()->function().origin()); |
| lib_prefix = cls.LookupLibraryPrefix(*(qual_ident->ident)); |
| } |
| if (!lib_prefix.IsNull()) { |
| @@ -3218,8 +3227,8 @@ |
| } |
| // Parse redirecting factory constructor. |
| - Type& redirection_type = Type::Handle(); |
| - String& redirection_identifier = String::Handle(); |
| + Type& redirection_type = Type::Handle(isolate()); |
| + String& redirection_identifier = String::Handle(isolate()); |
| bool is_redirecting = false; |
| if (method->IsFactory() && (CurrentToken() == Token::kASSIGN)) { |
| // Default parameter values are disallowed in redirecting factories. |
| @@ -3231,17 +3240,17 @@ |
| ConsumeToken(); |
| const intptr_t type_pos = TokenPos(); |
| is_redirecting = true; |
| - const AbstractType& type = AbstractType::Handle( |
| + const AbstractType& type = AbstractType::Handle(isolate(), |
| ParseType(ClassFinalizer::kResolveTypeParameters)); |
| if (!type.IsMalformed() && type.IsTypeParameter()) { |
| // Replace the type with a malformed type and compile a throw when called. |
| redirection_type = ClassFinalizer::NewFinalizedMalformedType( |
| - Error::Handle(), // No previous error. |
| + Error::Handle(isolate()), // No previous error. |
| script_, |
| type_pos, |
| "factory '%s' may not redirect to type parameter '%s'", |
| method->name->ToCString(), |
| - String::Handle(type.UserVisibleName()).ToCString()); |
| + String::Handle(isolate(), type.UserVisibleName()).ToCString()); |
| } else { |
| // We handle malformed and malbounded redirection type at run time. |
| redirection_type ^= type.raw(); |
| @@ -3387,7 +3396,7 @@ |
| } else { |
| function_kind = RawFunction::kRegularFunction; |
| } |
| - Function& func = Function::Handle( |
| + Function& func = Function::Handle(isolate(), |
| Function::New(*method->name, |
| function_kind, |
| method->has_static, |
| @@ -3453,10 +3462,10 @@ |
| if (!field->has_static && field->has_const) { |
| ErrorMsg(field->name_pos, "instance field may not be 'const'"); |
| } |
| - Function& getter = Function::Handle(); |
| - Function& setter = Function::Handle(); |
| + Function& getter = Function::Handle(isolate()); |
| + Function& setter = Function::Handle(isolate()); |
| Field& class_field = Field::ZoneHandle(); |
| - Instance& init_value = Instance::Handle(); |
| + Instance& init_value = Instance::Handle(isolate()); |
| while (true) { |
| bool has_initializer = CurrentToken() == Token::kASSIGN; |
| bool has_simple_literal = false; |
| @@ -3510,7 +3519,8 @@ |
| if (field->has_static && has_initializer) { |
| class_field.set_value(init_value); |
| if (!has_simple_literal) { |
| - String& getter_name = String::Handle(Field::GetterSymbol(*field->name)); |
| + String& getter_name = String::Handle(isolate(), |
| + Field::GetterSymbol(*field->name)); |
| getter = Function::New(getter_name, |
| RawFunction::kImplicitStaticFinalGetter, |
| field->has_static, |
| @@ -3534,7 +3544,8 @@ |
| // For instance fields, we create implicit getter and setter methods. |
| if (!field->has_static) { |
| - String& getter_name = String::Handle(Field::GetterSymbol(*field->name)); |
| + String& getter_name = String::Handle(isolate(), |
| + Field::GetterSymbol(*field->name)); |
| getter = Function::New(getter_name, RawFunction::kImplicitGetter, |
| field->has_static, |
| field->has_final, |
| @@ -3551,7 +3562,8 @@ |
| members->AddFunction(getter); |
| if (!field->has_final) { |
| // Build a setter accessor for non-const fields. |
| - String& setter_name = String::Handle(Field::SetterSymbol(*field->name)); |
| + String& setter_name = String::Handle(isolate(), |
| + Field::SetterSymbol(*field->name)); |
| setter = Function::New(setter_name, RawFunction::kImplicitSetter, |
| field->has_static, |
| field->has_final, |
| @@ -3566,7 +3578,7 @@ |
| params.AddFinalParameter(TokenPos(), |
| &Symbols::Value(), |
| field->type); |
| - setter.set_result_type(Type::Handle(Type::VoidType())); |
| + setter.set_result_type(Type::Handle(isolate(), Type::VoidType())); |
| AddFormalParamsToFunction(¶ms, setter); |
| members->AddFunction(setter); |
| } |
| @@ -3730,8 +3742,8 @@ |
| } |
| // Do not bypass class resolution by using current_class() directly, since |
| // it may be a patch class. |
| - const Object& result_type_class = Object::Handle( |
| - UnresolvedClass::New(LibraryPrefix::Handle(), |
| + const Object& result_type_class = Object::Handle(isolate(), |
| + UnresolvedClass::New(LibraryPrefix::Handle(isolate()), |
| *member.name, |
| member.name_pos)); |
| // The type arguments of the result type are the type parameters of the |
| @@ -3739,7 +3751,7 @@ |
| // from the class being patched. |
| member.type = &Type::ZoneHandle(Type::New( |
| result_type_class, |
| - TypeArguments::Handle(current_class().type_parameters()), |
| + TypeArguments::Handle(isolate(), current_class().type_parameters()), |
| member.name_pos)); |
| // We must be dealing with a constructor or named constructor. |
| @@ -3862,9 +3874,10 @@ |
| if (FLAG_trace_parser) { |
| OS::Print("TopLevel parsing class '%s'\n", class_name.ToCString()); |
| } |
| - Class& cls = Class::Handle(); |
| - TypeArguments& orig_type_parameters = TypeArguments::Handle(); |
| - Object& obj = Object::Handle(library_.LookupLocalObject(class_name)); |
| + Class& cls = Class::Handle(isolate()); |
| + TypeArguments& orig_type_parameters = TypeArguments::Handle(isolate()); |
| + Object& obj = Object::Handle(isolate(), |
| + library_.LookupLocalObject(class_name)); |
| if (obj.IsNull()) { |
| if (is_patch) { |
| ErrorMsg(classname_pos, "missing class '%s' cannot be patched", |
| @@ -3908,7 +3921,7 @@ |
| if (is_patch) { |
| // Check that the new type parameters are identical to the original ones. |
| const TypeArguments& new_type_parameters = |
| - TypeArguments::Handle(cls.type_parameters()); |
| + TypeArguments::Handle(isolate(), cls.type_parameters()); |
| const int new_type_params_count = |
| new_type_parameters.IsNull() ? 0 : new_type_parameters.Length(); |
| const int orig_type_params_count = |
| @@ -3918,10 +3931,10 @@ |
| "class '%s' must be patched with identical type parameters", |
| class_name.ToCString()); |
| } |
| - TypeParameter& new_type_param = TypeParameter::Handle(); |
| - TypeParameter& orig_type_param = TypeParameter::Handle(); |
| - String& new_name = String::Handle(); |
| - String& orig_name = String::Handle(); |
| + TypeParameter& new_type_param = TypeParameter::Handle(isolate()); |
| + TypeParameter& orig_type_param = TypeParameter::Handle(isolate()); |
| + String& new_name = String::Handle(isolate()); |
| + String& orig_name = String::Handle(isolate()); |
| for (int i = 0; i < new_type_params_count; i++) { |
| new_type_param ^= new_type_parameters.TypeAt(i); |
| orig_type_param ^= orig_type_parameters.TypeAt(i); |
| @@ -3955,13 +3968,13 @@ |
| class_name.ToCString()); |
| } |
| - AbstractType& super_type = Type::Handle(); |
| + AbstractType& super_type = Type::Handle(isolate()); |
| if ((CurrentToken() == Token::kEXTENDS) || is_mixin_declaration) { |
| ConsumeToken(); // extends or = |
| const intptr_t type_pos = TokenPos(); |
| super_type = ParseType(ClassFinalizer::kResolveTypeParameters); |
| if (super_type.IsMalformedOrMalbounded()) { |
| - ErrorMsg(Error::Handle(super_type.error())); |
| + ErrorMsg(Error::Handle(isolate(), super_type.error())); |
| } |
| if (super_type.IsDynamicType()) { |
| // Unlikely here, since super type is not resolved yet. |
| @@ -3973,7 +3986,8 @@ |
| ErrorMsg(type_pos, |
| "class '%s' may not extend type parameter '%s'", |
| class_name.ToCString(), |
| - String::Handle(super_type.UserVisibleName()).ToCString()); |
| + String::Handle(isolate(), |
| + super_type.UserVisibleName()).ToCString()); |
| } |
| // The class finalizer will check whether the super type is malbounded. |
| if (is_mixin_declaration) { |
| @@ -4025,7 +4039,7 @@ |
| CompilerStats::num_classes_compiled++; |
| set_current_class(cls); |
| is_top_level_ = true; |
| - String& class_name = String::Handle(cls.Name()); |
| + String& class_name = String::Handle(isolate(), cls.Name()); |
| const intptr_t class_pos = TokenPos(); |
| ClassDesc members(cls, class_name, false, class_pos); |
| while (CurrentToken() != Token::kLBRACE) { |
| @@ -4048,7 +4062,8 @@ |
| cls.AddFields(members.fields()); |
| // Creating a new array for functions marks the class as parsed. |
| - const Array& array = Array::Handle(Array::MakeArray(members.functions())); |
| + const Array& array = Array::Handle(isolate(), |
| + Array::MakeArray(members.functions())); |
| cls.SetFunctions(array); |
| // Add an implicit constructor if no explicit constructor is present. |
| @@ -4059,11 +4074,12 @@ |
| if (cls.is_patch()) { |
| // Apply the changes to the patched class looked up above. |
| - Object& obj = Object::Handle(library_.LookupLocalObject(class_name)); |
| + Object& obj = Object::Handle(isolate(), |
| + library_.LookupLocalObject(class_name)); |
| // The patched class must not be finalized yet. |
| const Class& orig_class = Class::Cast(obj); |
| ASSERT(!orig_class.is_finalized()); |
| - Error& error = Error::Handle(); |
| + Error& error = Error::Handle(isolate()); |
| if (!orig_class.ApplyPatch(cls, &error)) { |
| AppendErrorMsg(error, class_pos, "applying patch failed"); |
| } |
| @@ -4080,7 +4096,7 @@ |
| // To indicate that this is an implicit constructor, we set the |
| // token position and end token position of the function |
| // to the token position of the class. |
| - Function& ctor = Function::Handle( |
| + Function& ctor = Function::Handle(isolate(), |
| Function::New(ctor_name, |
| RawFunction::kConstructor, |
| /* is_static = */ false, |
| @@ -4154,13 +4170,14 @@ |
| OS::Print("toplevel parsing mixin application alias class '%s'\n", |
| class_name.ToCString()); |
| } |
| - const Object& obj = Object::Handle(library_.LookupLocalObject(class_name)); |
| + const Object& obj = Object::Handle(isolate(), |
| + library_.LookupLocalObject(class_name)); |
| if (!obj.IsNull()) { |
| ErrorMsg(classname_pos, "'%s' is already defined", |
| class_name.ToCString()); |
| } |
| const Class& mixin_application = |
| - Class::Handle(Class::New(class_name, script_, classname_pos)); |
| + Class::Handle(isolate(), Class::New(class_name, script_, classname_pos)); |
| mixin_application.set_is_mixin_app_alias(); |
| library_.AddClass(mixin_application); |
| set_current_class(mixin_application); |
| @@ -4175,12 +4192,13 @@ |
| const intptr_t type_pos = TokenPos(); |
| AbstractType& type = |
| - AbstractType::Handle(ParseType(ClassFinalizer::kResolveTypeParameters)); |
| + AbstractType::Handle(isolate(), |
| + ParseType(ClassFinalizer::kResolveTypeParameters)); |
| if (type.IsTypeParameter()) { |
| ErrorMsg(type_pos, |
| "class '%s' may not extend type parameter '%s'", |
| class_name.ToCString(), |
| - String::Handle(type.UserVisibleName()).ToCString()); |
| + String::Handle(isolate(), type.UserVisibleName()).ToCString()); |
| } |
| CheckToken(Token::kWITH, "mixin application 'with Type' expected"); |
| @@ -4258,7 +4276,7 @@ |
| } |
| // Parse the result type of the function type. |
| - AbstractType& result_type = Type::Handle(Type::DynamicType()); |
| + AbstractType& result_type = Type::Handle(isolate(), Type::DynamicType()); |
| if (CurrentToken() == Token::kVOID) { |
| ConsumeToken(); |
| result_type = Type::VoidType(); |
| @@ -4274,7 +4292,8 @@ |
| // Lookup alias name and report an error if it is already defined in |
| // the library scope. |
| - const Object& obj = Object::Handle(library_.LookupLocalObject(*alias_name)); |
| + const Object& obj = Object::Handle(isolate(), |
| + library_.LookupLocalObject(*alias_name)); |
| if (!obj.IsNull()) { |
| ErrorMsg(alias_name_pos, |
| "'%s' is already defined", alias_name->ToCString()); |
| @@ -4284,9 +4303,9 @@ |
| // signature function after it has been parsed. The type parameters, in order |
| // to be properly finalized, need to be associated to this signature class as |
| // they are parsed. |
| - const Class& function_type_alias = Class::Handle( |
| + const Class& function_type_alias = Class::Handle(isolate(), |
| Class::NewSignatureClass(*alias_name, |
| - Function::Handle(), |
| + Function::Handle(isolate()), |
| script_, |
| alias_name_pos)); |
| library_.AddClass(function_type_alias); |
| @@ -4314,7 +4333,7 @@ |
| ParseFormalParameterList(no_explicit_default_values, false, &func_params); |
| ExpectSemicolon(); |
| // The field 'is_static' has no meaning for signature functions. |
| - Function& signature_function = Function::Handle( |
| + Function& signature_function = Function::Handle(isolate(), |
| Function::New(*alias_name, |
| RawFunction::kSignatureFunction, |
| /* is_static = */ false, |
| @@ -4330,7 +4349,8 @@ |
| // Patch the signature function in the signature class. |
| function_type_alias.PatchSignatureFunction(signature_function); |
| - const String& signature = String::Handle(signature_function.Signature()); |
| + const String& signature = String::Handle(isolate(), |
| + signature_function.Signature()); |
| if (FLAG_trace_parser) { |
| OS::Print("TopLevel parsing function type alias '%s'\n", |
| signature.ToCString()); |
| @@ -4443,12 +4463,12 @@ |
| TRACE_PARSER("ParseTypeParameters"); |
| if (CurrentToken() == Token::kLT) { |
| const GrowableObjectArray& type_parameters_array = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| + GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New()); |
| intptr_t index = 0; |
| - TypeParameter& type_parameter = TypeParameter::Handle(); |
| - TypeParameter& existing_type_parameter = TypeParameter::Handle(); |
| - String& existing_type_parameter_name = String::Handle(); |
| - AbstractType& type_parameter_bound = Type::Handle(); |
| + TypeParameter& type_parameter = TypeParameter::Handle(isolate()); |
| + TypeParameter& existing_type_parameter = TypeParameter::Handle(isolate()); |
| + String& existing_type_parameter_name = String::Handle(isolate()); |
| + AbstractType& type_parameter_bound = Type::Handle(isolate()); |
| do { |
| ConsumeToken(); |
| const intptr_t metadata_pos = SkipMetadata(); |
| @@ -4492,7 +4512,8 @@ |
| ErrorMsg("right angle bracket expected"); |
| } |
| const TypeArguments& type_parameters = |
| - TypeArguments::Handle(NewTypeArguments(type_parameters_array)); |
| + TypeArguments::Handle(isolate(), |
| + NewTypeArguments(type_parameters_array)); |
| cls.set_type_parameters(type_parameters); |
| // Try to resolve the upper bounds, which will at least resolve the |
| // referenced type parameters. |
| @@ -4514,8 +4535,8 @@ |
| TRACE_PARSER("ParseTypeArguments"); |
| if (CurrentToken() == Token::kLT) { |
| const GrowableObjectArray& types = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| - AbstractType& type = AbstractType::Handle(); |
| + GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New()); |
| + AbstractType& type = AbstractType::Handle(isolate()); |
| do { |
| ConsumeToken(); |
| type = ParseType(finalization); |
| @@ -4544,10 +4565,10 @@ |
| TRACE_PARSER("ParseInterfaceList"); |
| ASSERT(CurrentToken() == Token::kIMPLEMENTS); |
| const GrowableObjectArray& all_interfaces = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| - AbstractType& interface = AbstractType::Handle(); |
| + GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New()); |
| + AbstractType& interface = AbstractType::Handle(isolate()); |
| // First get all the interfaces already implemented by class. |
| - Array& cls_interfaces = Array::Handle(cls.interfaces()); |
| + Array& cls_interfaces = Array::Handle(isolate(), cls.interfaces()); |
| for (intptr_t i = 0; i < cls_interfaces.Length(); i++) { |
| interface ^= cls_interfaces.At(i); |
| all_interfaces.Add(interface); |
| @@ -4560,7 +4581,8 @@ |
| if (interface.IsTypeParameter()) { |
| ErrorMsg(interface_pos, |
| "type parameter '%s' may not be used in interface list", |
| - String::Handle(interface.UserVisibleName()).ToCString()); |
| + String::Handle(isolate(), |
| + interface.UserVisibleName()).ToCString()); |
| } |
| all_interfaces.Add(interface); |
| } while (CurrentToken() == Token::kCOMMA); |
| @@ -4573,8 +4595,8 @@ |
| TRACE_PARSER("ParseMixins"); |
| ASSERT(CurrentToken() == Token::kWITH); |
| const GrowableObjectArray& mixin_types = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| - AbstractType& mixin_type = AbstractType::Handle(); |
| + GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New()); |
| + AbstractType& mixin_type = AbstractType::Handle(isolate()); |
| do { |
| ConsumeToken(); |
| mixin_type = ParseType(ClassFinalizer::kResolveTypeParameters); |
| @@ -4586,12 +4608,13 @@ |
| if (mixin_type.IsTypeParameter()) { |
| ErrorMsg(mixin_type.token_pos(), |
| "mixin type '%s' may not be a type parameter", |
| - String::Handle(mixin_type.UserVisibleName()).ToCString()); |
| + String::Handle(isolate(), |
| + mixin_type.UserVisibleName()).ToCString()); |
| } |
| mixin_types.Add(mixin_type); |
| } while (CurrentToken() == Token::kCOMMA); |
| return MixinAppType::New(super_type, |
| - Array::Handle(Array::MakeArray(mixin_types))); |
| + Array::Handle(isolate(), Array::MakeArray(mixin_types))); |
| } |
| @@ -4604,8 +4627,8 @@ |
| const bool is_static = true; |
| const AbstractType& type = AbstractType::ZoneHandle(ParseConstFinalVarOrType( |
| ClassFinalizer::kResolveTypeParameters)); |
| - Field& field = Field::Handle(); |
| - Function& getter = Function::Handle(); |
| + Field& field = Field::Handle(isolate()); |
| + Function& getter = Function::Handle(isolate()); |
| while (true) { |
| const intptr_t name_pos = TokenPos(); |
| String& var_name = *ExpectIdentifier("variable name expected"); |
| @@ -4618,7 +4641,8 @@ |
| // or final field implies a setter which throws a NoSuchMethodError, |
| // thus we need to check for conflicts with existing setters and |
| // getters. |
| - String& accessor_name = String::Handle(Field::GetterName(var_name)); |
| + String& accessor_name = String::Handle(isolate(), |
| + Field::GetterName(var_name)); |
| if (library_.LookupLocalObject(accessor_name) != Object::null()) { |
| ErrorMsg(name_pos, "getter for '%s' is already defined", |
| var_name.ToCString()); |
| @@ -4632,7 +4656,7 @@ |
| field = Field::New(var_name, is_static, is_final, is_const, |
| current_class(), name_pos); |
| field.set_type(type); |
| - field.set_value(Instance::Handle(Instance::null())); |
| + field.set_value(Instance::Handle(isolate(), Instance::null())); |
| top_level->fields.Add(field); |
| library_.AddObject(field, var_name); |
| if (metadata_pos >= 0) { |
| @@ -4640,7 +4664,8 @@ |
| } |
| if (CurrentToken() == Token::kASSIGN) { |
| ConsumeToken(); |
| - Instance& field_value = Instance::Handle(Object::sentinel().raw()); |
| + Instance& field_value = Instance::Handle(isolate(), |
| + Object::sentinel().raw()); |
| bool has_simple_literal = false; |
| if (LookaheadToken(1) == Token::kSEMICOLON) { |
| has_simple_literal = IsSimpleLiteral(type, &field_value); |
| @@ -4649,7 +4674,8 @@ |
| field.set_value(field_value); |
| if (!has_simple_literal) { |
| // Create a static final getter. |
| - String& getter_name = String::Handle(Field::GetterSymbol(var_name)); |
| + String& getter_name = String::Handle(isolate(), |
| + Field::GetterSymbol(var_name)); |
| getter = Function::New(getter_name, |
| RawFunction::kImplicitStaticFinalGetter, |
| is_static, |
| @@ -4689,7 +4715,7 @@ |
| intptr_t metadata_pos) { |
| TRACE_PARSER("ParseTopLevelFunction"); |
| const intptr_t decl_begin_pos = TokenPos(); |
| - AbstractType& result_type = Type::Handle(Type::DynamicType()); |
| + AbstractType& result_type = Type::Handle(isolate(), Type::DynamicType()); |
| const bool is_static = true; |
| bool is_external = false; |
| bool is_patch = false; |
| @@ -4722,7 +4748,8 @@ |
| } else if (!found && is_patch) { |
| ErrorMsg(name_pos, "missing '%s' cannot be patched", func_name.ToCString()); |
| } |
| - String& accessor_name = String::Handle(Field::GetterName(func_name)); |
| + String& accessor_name = String::Handle(isolate(), |
| + Field::GetterName(func_name)); |
| if (library_.LookupLocalObject(accessor_name) != Object::null()) { |
| ErrorMsg(name_pos, "'%s' is already defined as getter", |
| func_name.ToCString()); |
| @@ -4758,7 +4785,7 @@ |
| } else { |
| ErrorMsg("function block expected"); |
| } |
| - Function& func = Function::Handle( |
| + Function& func = Function::Handle(isolate(), |
| Function::New(func_name, |
| RawFunction::kRegularFunction, |
| is_static, |
| @@ -4793,7 +4820,7 @@ |
| const bool is_static = true; |
| bool is_external = false; |
| bool is_patch = false; |
| - AbstractType& result_type = AbstractType::Handle(); |
| + AbstractType& result_type = AbstractType::Handle(isolate()); |
| if (is_patch_source() && |
| (CurrentToken() == Token::kIDENT) && |
| CurrentLiteral()->Equals("patch")) { |
| @@ -4894,7 +4921,7 @@ |
| } else { |
| ErrorMsg("function block expected"); |
| } |
| - Function& func = Function::Handle( |
| + Function& func = Function::Handle(isolate(), |
| Function::New(accessor_name, |
| is_getter ? RawFunction::kGetterFunction : |
| RawFunction::kSetterFunction, |
| @@ -4948,7 +4975,7 @@ |
| if (Dart_IsError(result)) { |
| // In case of an error we append an explanatory error message to the |
| // error obtained from the library tag handler. |
| - Error& prev_error = Error::Handle(); |
| + Error& prev_error = Error::Handle(isolate()); |
| prev_error ^= Api::UnwrapHandle(result); |
| AppendErrorMsg(prev_error, token_pos, "library handler failed"); |
| } |
| @@ -5014,7 +5041,7 @@ |
| ConsumeToken(); |
| CheckToken(Token::kAS, "'as' expected"); |
| } |
| - String& prefix = String::Handle(); |
| + String& prefix = String::Handle(isolate()); |
| intptr_t prefix_pos = 0; |
| if (is_import && (CurrentToken() == Token::kAS)) { |
| ConsumeToken(); |
| @@ -5022,13 +5049,13 @@ |
| prefix = ExpectIdentifier("prefix identifier expected")->raw(); |
| } |
| - Array& show_names = Array::Handle(); |
| - Array& hide_names = Array::Handle(); |
| + Array& show_names = Array::Handle(isolate()); |
| + Array& hide_names = Array::Handle(isolate()); |
| if (is_deferred_import || IsLiteral("show") || IsLiteral("hide")) { |
| GrowableObjectArray& show_list = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| + GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New()); |
| GrowableObjectArray& hide_list = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| + GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New()); |
| // Libraries imported through deferred import automatically hide |
| // the name 'loadLibrary'. |
| if (is_deferred_import) { |
| @@ -5058,7 +5085,8 @@ |
| const String& canon_url = String::CheckedHandle( |
| CallLibraryTagHandler(Dart_kCanonicalizeUrl, import_pos, url)); |
| // Lookup the library URL. |
| - Library& library = Library::Handle(Library::LookupLibrary(canon_url)); |
| + Library& library = Library::Handle(isolate(), |
| + Library::LookupLibrary(canon_url)); |
| if (library.IsNull()) { |
| // Create an empty library to mark that we have initiated loading of this |
| // library. |
| @@ -5069,8 +5097,8 @@ |
| CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url); |
| } |
| - Namespace& ns = |
| - Namespace::Handle(Namespace::New(library, show_names, hide_names)); |
| + Namespace& ns = Namespace::Handle(isolate(), |
| + Namespace::New(library, show_names, hide_names)); |
| if (metadata_pos >= 0) { |
| ns.AddMetadata(metadata_pos, current_class()); |
| } |
| @@ -5078,7 +5106,7 @@ |
| if (is_import) { |
| // Ensure that private dart:_ libraries are only imported into dart: |
| // libraries. |
| - const String& lib_url = String::Handle(library_.url()); |
| + const String& lib_url = String::Handle(isolate(), library_.url()); |
| if (canon_url.StartsWith(Symbols::DartSchemePrivate()) && |
| !lib_url.StartsWith(Symbols::DartScheme())) { |
| ErrorMsg(import_pos, "private library is not accessible"); |
| @@ -5087,7 +5115,7 @@ |
| ASSERT(!is_deferred_import); |
| library_.AddImport(ns); |
| } else { |
| - LibraryPrefix& library_prefix = LibraryPrefix::Handle(); |
| + LibraryPrefix& library_prefix = LibraryPrefix::Handle(isolate()); |
| library_prefix = library_.LookupLocalLibraryPrefix(prefix); |
| if (!library_prefix.IsNull()) { |
| // Check that prefix names of deferred import clauses are |
| @@ -5165,9 +5193,9 @@ |
| // Core lib has not been explicitly imported, so we implicitly |
| // import it here. |
| if (!library_.ImportsCorelib()) { |
| - Library& core_lib = Library::Handle(Library::CoreLibrary()); |
| + Library& core_lib = Library::Handle(isolate(), Library::CoreLibrary()); |
| ASSERT(!core_lib.IsNull()); |
| - const Namespace& core_ns = Namespace::Handle( |
| + const Namespace& core_ns = Namespace::Handle(isolate(), |
| Namespace::New(core_lib, Object::null_array(), Object::null_array())); |
| library_.AddImport(core_ns); |
| } |
| @@ -5210,7 +5238,7 @@ |
| SetPosition(0); |
| is_top_level_ = true; |
| TopLevel top_level; |
| - Class& toplevel_class = Class::Handle( |
| + Class& toplevel_class = Class::Handle(isolate(), |
| Class::New(Symbols::TopLevel(), script_, TokenPos())); |
| toplevel_class.set_library(library_); |
| @@ -5255,7 +5283,8 @@ |
| if ((top_level.fields.Length() > 0) || (top_level.functions.Length() > 0)) { |
| toplevel_class.AddFields(top_level.fields); |
| - const Array& array = Array::Handle(Array::MakeArray(top_level.functions)); |
| + const Array& array = Array::Handle(isolate(), |
| + Array::MakeArray(top_level.functions)); |
| toplevel_class.SetFunctions(array); |
| library_.AddAnonymousClass(toplevel_class); |
| @@ -5265,9 +5294,10 @@ |
| void Parser::ChainNewBlock(LocalScope* outer_scope) { |
| - Block* block = new Block(current_block_, |
| - outer_scope, |
| - new SequenceNode(TokenPos(), outer_scope)); |
| + Block* block = new(isolate()) Block( |
| + current_block_, |
| + outer_scope, |
| + new(isolate()) SequenceNode(TokenPos(), outer_scope)); |
| current_block_ = block; |
| } |
| @@ -5275,18 +5305,18 @@ |
| void Parser::OpenBlock() { |
| ASSERT(current_block_ != NULL); |
| LocalScope* outer_scope = current_block_->scope; |
| - ChainNewBlock(new LocalScope(outer_scope, |
| - outer_scope->function_level(), |
| - outer_scope->loop_level())); |
| + ChainNewBlock(new(isolate()) LocalScope( |
| + outer_scope, outer_scope->function_level(), outer_scope->loop_level())); |
| } |
| void Parser::OpenLoopBlock() { |
| ASSERT(current_block_ != NULL); |
| LocalScope* outer_scope = current_block_->scope; |
| - ChainNewBlock(new LocalScope(outer_scope, |
| - outer_scope->function_level(), |
| - outer_scope->loop_level() + 1)); |
| + ChainNewBlock(new(isolate()) LocalScope( |
| + outer_scope, |
| + outer_scope->function_level(), |
| + outer_scope->loop_level() + 1)); |
| } |
| @@ -5390,7 +5420,7 @@ |
| ParamDesc& param_desc = (*params->parameters)[i]; |
| ASSERT(!is_top_level_ || param_desc.type->IsResolved()); |
| const String* name = param_desc.name; |
| - LocalVariable* parameter = new LocalVariable( |
| + LocalVariable* parameter = new(isolate()) LocalVariable( |
| param_desc.name_pos, *name, *param_desc.type); |
| if (!scope->InsertParameterAt(i, parameter)) { |
| ErrorMsg(param_desc.name_pos, |
| @@ -5413,8 +5443,8 @@ |
| const Function& func) { |
| ASSERT(func.is_native()); |
| TRACE_PARSER("ParseNativeFunctionBlock"); |
| - const Class& cls = Class::Handle(func.Owner()); |
| - const Library& library = Library::Handle(cls.library()); |
| + const Class& cls = Class::Handle(isolate(), func.Owner()); |
| + const Library& library = Library::Handle(isolate(), cls.library()); |
| ASSERT(func.NumParameters() == params->parameters->length()); |
| // Parse the function name out. |
| @@ -5436,14 +5466,14 @@ |
| // Now add the NativeBodyNode and return statement. |
| Dart_NativeEntryResolver resolver = library.native_entry_resolver(); |
| bool is_bootstrap_native = Bootstrap::IsBootstapResolver(resolver); |
| - current_block_->statements->Add( |
| - new ReturnNode(TokenPos(), |
| - new NativeBodyNode(TokenPos(), |
| - Function::ZoneHandle(func.raw()), |
| - native_name, |
| - native_function, |
| - current_block_->scope, |
| - is_bootstrap_native))); |
| + current_block_->statements->Add(new(isolate()) ReturnNode( |
| + TokenPos(), new(isolate()) NativeBodyNode( |
| + TokenPos(), |
| + Function::ZoneHandle(func.raw()), |
| + native_name, |
| + native_function, |
| + current_block_->scope, |
| + is_bootstrap_native))); |
| } |
| @@ -5489,7 +5519,7 @@ |
| if (receiver == NULL) { |
| ErrorMsg(token_pos, "illegal implicit access to receiver 'this'"); |
| } |
| - return new LoadLocalNode(TokenPos(), receiver); |
| + return new(isolate()) LoadLocalNode(TokenPos(), receiver); |
| } |
| @@ -5501,14 +5531,14 @@ |
| LocalVariable* param = LookupTypeArgumentsParameter(current_block_->scope, |
| kTestOnly); |
| ASSERT(param != NULL); |
| - return new LoadLocalNode(TokenPos(), param); |
| + return new(isolate()) LoadLocalNode(TokenPos(), param); |
| } |
| AstNode* Parser::CallGetter(intptr_t token_pos, |
| AstNode* object, |
| const String& name) { |
| - return new InstanceGetterNode(token_pos, object, name); |
| + return new(isolate()) InstanceGetterNode(token_pos, object, name); |
| } |
| @@ -5520,7 +5550,8 @@ |
| ASSERT(IsIdentifier()); |
| const intptr_t ident_pos = TokenPos(); |
| const String& ident = *CurrentLiteral(); |
| - LocalVariable* variable = new LocalVariable(ident_pos, ident, type); |
| + LocalVariable* variable = new(isolate()) LocalVariable( |
| + ident_pos, ident, type); |
| ConsumeToken(); // Variable identifier. |
| AstNode* initialization = NULL; |
| if (CurrentToken() == Token::kASSIGN) { |
| @@ -5528,7 +5559,8 @@ |
| const intptr_t assign_pos = TokenPos(); |
| ConsumeToken(); |
| AstNode* expr = ParseExpr(is_const, kConsumeCascades); |
| - initialization = new StoreLocalNode(assign_pos, variable, expr); |
| + initialization = new(isolate()) StoreLocalNode( |
| + assign_pos, variable, expr); |
| if (is_const) { |
| ASSERT(expr->IsLiteralNode()); |
| variable->SetConstValue(expr->AsLiteralNode()->literal()); |
| @@ -5538,8 +5570,10 @@ |
| "missing initialization of 'final' or 'const' variable"); |
| } else { |
| // Initialize variable with null. |
| - AstNode* null_expr = new LiteralNode(ident_pos, Instance::ZoneHandle()); |
| - initialization = new StoreLocalNode(ident_pos, variable, null_expr); |
| + AstNode* null_expr = new(isolate()) LiteralNode( |
| + ident_pos, Instance::ZoneHandle()); |
| + initialization = new(isolate()) StoreLocalNode( |
| + ident_pos, variable, null_expr); |
| } |
| ASSERT(current_block_ != NULL); |
| @@ -5658,7 +5692,7 @@ |
| AstNode* Parser::ParseFunctionStatement(bool is_literal) { |
| TRACE_PARSER("ParseFunctionStatement"); |
| - AbstractType& result_type = AbstractType::Handle(); |
| + AbstractType& result_type = AbstractType::Handle(isolate()); |
| const String* variable_name = NULL; |
| const String* function_name = NULL; |
| @@ -5732,15 +5766,15 @@ |
| // function is parsed. Therefore, we set the function type to a new |
| // parameterized type to be patched after the actual type is known. |
| // We temporarily use the class of the Function interface. |
| - const Class& unknown_signature_class = Class::Handle( |
| - Type::Handle(Type::Function()).type_class()); |
| - function_type = Type::New( |
| - unknown_signature_class, TypeArguments::Handle(), function_pos); |
| + const Class& unknown_signature_class = Class::Handle(isolate(), |
| + Type::Handle(isolate(), Type::Function()).type_class()); |
| + function_type = Type::New(unknown_signature_class, |
| + TypeArguments::Handle(isolate()), function_pos); |
| function_type.SetIsFinalized(); // No finalization needed. |
| // Add the function variable to the scope before parsing the function in |
| // order to allow self reference from inside the function. |
| - function_variable = new LocalVariable(function_pos, |
| + function_variable = new(isolate()) LocalVariable(function_pos, |
| *variable_name, |
| function_type); |
| function_variable->set_is_final(); |
| @@ -5763,14 +5797,14 @@ |
| } |
| // Parse the local function. |
| - Array& default_parameter_values = Array::Handle(); |
| + Array& default_parameter_values = Array::Handle(isolate()); |
| SequenceNode* statements = Parser::ParseFunc(function, |
| &default_parameter_values); |
| // Now that the local function has formal parameters, lookup the signature |
| // class in the current library (but not in its imports) and only create a new |
| // canonical signature class if it does not exist yet. |
| - const String& signature = String::Handle(function.Signature()); |
| + const String& signature = String::Handle(isolate(), function.Signature()); |
| Class& signature_class = Class::ZoneHandle(); |
| if (!is_new_closure) { |
| signature_class = function.signature_class(); |
| @@ -5806,9 +5840,10 @@ |
| // Since the signature type is cached by the signature class, it may have |
| // been finalized already. |
| - Type& signature_type = Type::Handle(signature_class.SignatureType()); |
| - TypeArguments& signature_type_arguments = |
| - TypeArguments::Handle(signature_type.arguments()); |
| + Type& signature_type = Type::Handle(isolate(), |
| + signature_class.SignatureType()); |
| + TypeArguments& signature_type_arguments = TypeArguments::Handle(isolate(), |
| + signature_type.arguments()); |
| if (!signature_type.IsFinalized()) { |
| signature_type ^= ClassFinalizer::FinalizeType( |
| @@ -5863,15 +5898,15 @@ |
| // variables are not relevant for the compilation of the enclosing function. |
| // This pruning is done by omitting to hook the local scope in its parent |
| // scope in the constructor of LocalScope. |
| - AstNode* closure = |
| - new ClosureNode(function_pos, function, NULL, statements->scope()); |
| + AstNode* closure = new(isolate()) ClosureNode( |
| + function_pos, function, NULL, statements->scope()); |
| if (function_variable == NULL) { |
| ASSERT(is_literal); |
| return closure; |
| } else { |
| - AstNode* initialization = |
| - new StoreLocalNode(function_pos, function_variable, closure); |
| + AstNode* initialization = new(isolate()) StoreLocalNode( |
| + function_pos, function_variable, closure); |
| return initialization; |
| } |
| } |
| @@ -6256,7 +6291,8 @@ |
| ConsumeToken(); |
| false_branch = ParseNestedStatement(parsing_loop_body, NULL); |
| } |
| - AstNode* if_node = new IfNode(if_pos, cond_expr, true_branch, false_branch); |
| + AstNode* if_node = new(isolate()) IfNode( |
| + if_pos, cond_expr, true_branch, false_branch); |
| if (label != NULL) { |
| current_block_->statements->Add(if_node); |
| SequenceNode* sequence = CloseBlock(); |
| @@ -6323,9 +6359,9 @@ |
| } |
| } |
| if (first_value.IsInteger()) { |
| - return Type::Handle(Type::IntType()).type_class(); |
| + return Type::Handle(isolate(), Type::IntType()).type_class(); |
| } else if (first_value.IsString()) { |
| - return Type::Handle(Type::StringType()).type_class(); |
| + return Type::Handle(isolate(), Type::StringType()).type_class(); |
| } |
| return first_value.clazz(); |
| } |
| @@ -6338,7 +6374,7 @@ |
| bool default_seen = false; |
| const intptr_t case_pos = TokenPos(); |
| // The case expressions node sequence does not own the enclosing scope. |
| - SequenceNode* case_expressions = new SequenceNode(case_pos, NULL); |
| + SequenceNode* case_expressions = new(isolate()) SequenceNode(case_pos, NULL); |
| while (CurrentToken() == Token::kCASE || CurrentToken() == Token::kDEFAULT) { |
| if (CurrentToken() == Token::kCASE) { |
| if (default_seen) { |
| @@ -6350,12 +6386,10 @@ |
| ASSERT(expr->IsLiteralNode()); |
| case_expr_values->Add(expr->AsLiteralNode()); |
| - AstNode* switch_expr_load = new LoadLocalNode(case_pos, |
| - switch_expr_value); |
| - AstNode* case_comparison = new ComparisonNode(expr_pos, |
| - Token::kEQ, |
| - expr, |
| - switch_expr_load); |
| + AstNode* switch_expr_load = new(isolate()) LoadLocalNode( |
| + case_pos, switch_expr_value); |
| + AstNode* case_comparison = new(isolate()) ComparisonNode( |
| + expr_pos, Token::kEQ, expr, switch_expr_load); |
| case_expressions->Add(case_comparison); |
| } else { |
| if (default_seen) { |
| @@ -6388,8 +6422,9 @@ |
| // End of this case clause. If there is a possible fall-through to |
| // the next case clause, throw an implicit FallThroughError. |
| if (!abrupt_completing_seen) { |
| - ArgumentListNode* arguments = new ArgumentListNode(TokenPos()); |
| - arguments->Add(new LiteralNode( |
| + ArgumentListNode* arguments = new(isolate()) ArgumentListNode( |
| + TokenPos()); |
| + arguments->Add(new(isolate()) LiteralNode( |
| TokenPos(), Integer::ZoneHandle(Integer::New(TokenPos())))); |
| current_block_->statements->Add( |
| MakeStaticCall(Symbols::FallThroughError(), |
| @@ -6406,7 +6441,7 @@ |
| } |
| } |
| SequenceNode* statements = CloseBlock(); |
| - return new CaseNode(case_pos, case_label, |
| + return new(isolate()) CaseNode(case_pos, case_label, |
| case_expressions, default_seen, switch_expr_value, statements); |
| } |
| @@ -6431,16 +6466,16 @@ |
| // type of the case clause expressions. Therefore, we have to allocate |
| // a new type representing dynamic and can't reuse the canonical |
| // type object for dynamic. |
| - const Type& temp_var_type = |
| - Type::ZoneHandle(Type::New(Class::Handle(Object::dynamic_class()), |
| - TypeArguments::Handle(), |
| - expr_pos)); |
| + const Type& temp_var_type = Type::ZoneHandle(isolate(), |
| + Type::New(Class::Handle(isolate(), Object::dynamic_class()), |
| + TypeArguments::Handle(isolate()), |
| + expr_pos)); |
| temp_var_type.SetIsFinalized(); |
| - LocalVariable* temp_variable = |
| - new LocalVariable(expr_pos, Symbols::SwitchExpr(), temp_var_type); |
| + LocalVariable* temp_variable = new(isolate()) LocalVariable( |
| + expr_pos, Symbols::SwitchExpr(), temp_var_type); |
| current_block_->scope->AddVariable(temp_variable); |
| - AstNode* save_switch_expr = |
| - new StoreLocalNode(expr_pos, temp_variable, switch_expr); |
| + AstNode* save_switch_expr = new(isolate()) StoreLocalNode( |
| + expr_pos, temp_variable, switch_expr); |
| current_block_->statements->Add(save_switch_expr); |
| // Parse case clauses |
| @@ -6458,8 +6493,8 @@ |
| case_label = current_block_->scope->LocalLookupLabel(*label_name); |
| if (case_label == NULL) { |
| // Label does not exist yet. Add it to scope of switch statement. |
| - case_label = |
| - new SourceLabel(label_pos, *label_name, SourceLabel::kCase); |
| + case_label = new(isolate()) SourceLabel( |
| + label_pos, *label_name, SourceLabel::kCase); |
| current_block_->scope->AddLabel(case_label); |
| } else if (case_label->kind() == SourceLabel::kForward) { |
| // We have seen a 'continue' with this label name. Resolve |
| @@ -6494,7 +6529,7 @@ |
| // variable holding the switch expression to match the type of the |
| // case clause constants. |
| temp_var_type.set_type_class( |
| - Class::Handle(CheckCaseExpressions(case_expr_values))); |
| + Class::Handle(isolate(), CheckCaseExpressions(case_expr_values))); |
| // Check for unresolved label references. |
| SourceLabel* unresolved_label = |
| @@ -6506,7 +6541,7 @@ |
| SequenceNode* switch_body = CloseBlock(); |
| ExpectToken(Token::kRBRACE); |
| - return new SwitchNode(switch_pos, label, switch_body); |
| + return new(isolate()) SwitchNode(switch_pos, label, switch_body); |
| } |
| @@ -6521,7 +6556,7 @@ |
| ExpectToken(Token::kRPAREN); |
| const bool parsing_loop_body = true; |
| SequenceNode* while_body = ParseNestedStatement(parsing_loop_body, label); |
| - return new WhileNode(while_pos, label, cond_expr, while_body); |
| + return new(isolate()) WhileNode(while_pos, label, cond_expr, while_body); |
| } |
| @@ -6538,7 +6573,7 @@ |
| AstNode* cond_expr = ParseExpr(kAllowConst, kConsumeCascades); |
| ExpectToken(Token::kRPAREN); |
| ExpectSemicolon(); |
| - return new DoWhileNode(do_pos, label, cond_expr, dowhile_body); |
| + return new(isolate()) DoWhileNode(do_pos, label, cond_expr, dowhile_body); |
| } |
| @@ -6563,7 +6598,7 @@ |
| ClassFinalizer::kIgnore)); |
| loop_var_pos = TokenPos(); |
| loop_var_name = ExpectIdentifier("variable name expected"); |
| - loop_var = new LocalVariable(loop_var_pos, *loop_var_name, type); |
| + loop_var = new(isolate()) LocalVariable(loop_var_pos, *loop_var_name, type); |
| if (is_final) { |
| loop_var->set_is_final(); |
| } |
| @@ -6582,22 +6617,22 @@ |
| // It is better to leave the iterator untyped and postpone the type error |
| // until the loop variable is assigned to. |
| const AbstractType& iterator_type = Type::ZoneHandle(Type::DynamicType()); |
| - LocalVariable* iterator_var = |
| - new LocalVariable(collection_pos, Symbols::ForInIter(), iterator_type); |
| + LocalVariable* iterator_var = new(isolate()) LocalVariable( |
| + collection_pos, Symbols::ForInIter(), iterator_type); |
| current_block_->scope->AddVariable(iterator_var); |
| // Generate initialization of iterator variable. |
| - ArgumentListNode* no_args = new ArgumentListNode(collection_pos); |
| - AstNode* get_iterator = new InstanceGetterNode( |
| + ArgumentListNode* no_args = new(isolate()) ArgumentListNode(collection_pos); |
| + AstNode* get_iterator = new(isolate()) InstanceGetterNode( |
| collection_pos, collection_expr, Symbols::GetIterator()); |
| AstNode* iterator_init = |
| - new StoreLocalNode(collection_pos, iterator_var, get_iterator); |
| + new(isolate()) StoreLocalNode(collection_pos, iterator_var, get_iterator); |
| current_block_->statements->Add(iterator_init); |
| // Generate while loop condition. |
| - AstNode* iterator_moveNext = new InstanceCallNode( |
| + AstNode* iterator_moveNext = new(isolate()) InstanceCallNode( |
| collection_pos, |
| - new LoadLocalNode(collection_pos, iterator_var), |
| + new(isolate()) LoadLocalNode(collection_pos, iterator_var), |
| Symbols::MoveNext(), |
| no_args); |
| @@ -6608,9 +6643,9 @@ |
| OpenLoopBlock(); |
| current_block_->scope->AddLabel(label); |
| - AstNode* iterator_current = new InstanceGetterNode( |
| + AstNode* iterator_current = new(isolate()) InstanceGetterNode( |
| collection_pos, |
| - new LoadLocalNode(collection_pos, iterator_var), |
| + new(isolate()) LoadLocalNode(collection_pos, iterator_var), |
| Symbols::Current()); |
| // Generate assignment of next iterator value to loop variable. |
| @@ -6619,7 +6654,7 @@ |
| // The for loop declares a new variable. Add it to the loop body scope. |
| current_block_->scope->AddVariable(loop_var); |
| loop_var_assignment = |
| - new StoreLocalNode(loop_var_pos, loop_var, iterator_current); |
| + new(isolate()) StoreLocalNode(loop_var_pos, loop_var, iterator_current); |
| } else { |
| AstNode* loop_var_primary = |
| ResolveIdent(loop_var_pos, *loop_var_name, false); |
| @@ -6644,8 +6679,8 @@ |
| SequenceNode* for_loop_statement = CloseBlock(); |
| - AstNode* while_statement = |
| - new WhileNode(forin_pos, label, iterator_moveNext, for_loop_statement); |
| + AstNode* while_statement = new(isolate()) WhileNode( |
| + forin_pos, label, iterator_moveNext, for_loop_statement); |
| current_block_->statements->Add(while_statement); |
| return CloseBlock(); // Implicit block around while loop. |
| @@ -6696,8 +6731,8 @@ |
| for (int i = 0; i < init_scope->num_variables(); i++) { |
| if (init_scope->VariableAt(i)->is_captured() && |
| (init_scope->VariableAt(i)->owner() == init_scope)) { |
| - SequenceNode* incr_sequence = new SequenceNode(incr_pos, NULL); |
| - incr_sequence->Add(new CloneContextNode(for_pos)); |
| + SequenceNode* incr_sequence = new(isolate()) SequenceNode(incr_pos, NULL); |
| + incr_sequence->Add(new(isolate()) CloneContextNode(for_pos)); |
| if (increment != NULL) { |
| incr_sequence->Add(increment); |
| } |
| @@ -6706,7 +6741,7 @@ |
| } |
| } |
| AstNode* for_node = |
| - new ForNode(for_pos, |
| + new(isolate()) ForNode(for_pos, |
| label, |
| NodeAsSequenceNode(init_pos, initializer, NULL), |
| condition, |
| @@ -6721,7 +6756,8 @@ |
| AstNode* Parser::MakeStaticCall(const String& cls_name, |
| const String& func_name, |
| ArgumentListNode* arguments) { |
| - const Class& cls = Class::Handle(Library::LookupCoreClass(cls_name)); |
| + const Class& cls = Class::Handle(isolate(), |
| + Library::LookupCoreClass(cls_name)); |
| ASSERT(!cls.IsNull()); |
| const Function& func = Function::ZoneHandle( |
| Resolver::ResolveStatic(cls, |
| @@ -6729,15 +6765,15 @@ |
| arguments->length(), |
| arguments->names())); |
| ASSERT(!func.IsNull()); |
| - return new StaticCallNode(arguments->token_pos(), func, arguments); |
| + return new(isolate()) StaticCallNode(arguments->token_pos(), func, arguments); |
| } |
| AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end) { |
| - ArgumentListNode* arguments = new ArgumentListNode(begin); |
| - arguments->Add(new LiteralNode(begin, |
| + ArgumentListNode* arguments = new(isolate()) ArgumentListNode(begin); |
| + arguments->Add(new(isolate()) LiteralNode(begin, |
| Integer::ZoneHandle(Integer::New(begin)))); |
| - arguments->Add(new LiteralNode(end, |
| + arguments->Add(new(isolate()) LiteralNode(end, |
| Integer::ZoneHandle(Integer::New(end)))); |
| return MakeStaticCall(Symbols::AssertionError(), |
| Library::PrivateCoreLibName(Symbols::ThrowNew()), |
| @@ -6751,7 +6787,9 @@ |
| condition->AsStoreLocalNode()->value()->IsClosureNode())) { |
| // Function literal in assert implies a call. |
| const intptr_t pos = condition->token_pos(); |
| - condition = BuildClosureCall(pos, condition, new ArgumentListNode(pos)); |
| + condition = BuildClosureCall(pos, |
| + condition, |
| + new(isolate()) ArgumentListNode(pos)); |
| } else if (condition->IsConditionalExprNode()) { |
| ConditionalExprNode* cond_expr = condition->AsConditionalExprNode(); |
| cond_expr->set_true_expr(InsertClosureCallNodes(cond_expr->true_expr())); |
| @@ -6775,12 +6813,13 @@ |
| const intptr_t condition_end = TokenPos(); |
| ExpectToken(Token::kRPAREN); |
| condition = InsertClosureCallNodes(condition); |
| - condition = new UnaryOpNode(condition_pos, Token::kNOT, condition); |
| + condition = new(isolate()) UnaryOpNode(condition_pos, Token::kNOT, condition); |
| AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end); |
| - return new IfNode(condition_pos, |
| - condition, |
| - NodeAsSequenceNode(condition_pos, assert_throw, NULL), |
| - NULL); |
| + return new(isolate()) IfNode( |
| + condition_pos, |
| + condition, |
| + NodeAsSequenceNode(condition_pos, assert_throw, NULL), |
| + NULL); |
| } |
| @@ -6799,18 +6838,20 @@ |
| CatchParamDesc* stack_trace_param, |
| LocalScope* scope) { |
| if (exception_param->name != NULL) { |
| - LocalVariable* var = new LocalVariable(exception_param->token_pos, |
| - *exception_param->name, |
| - *exception_param->type); |
| + LocalVariable* var = new(isolate()) LocalVariable( |
| + exception_param->token_pos, |
| + *exception_param->name, |
| + *exception_param->type); |
| var->set_is_final(); |
| bool added_to_scope = scope->AddVariable(var); |
| ASSERT(added_to_scope); |
| exception_param->var = var; |
| } |
| if (stack_trace_param->name != NULL) { |
| - LocalVariable* var = new LocalVariable(stack_trace_param->token_pos, |
| - *stack_trace_param->name, |
| - *stack_trace_param->type); |
| + LocalVariable* var = new(isolate()) LocalVariable( |
| + stack_trace_param->token_pos, |
| + *stack_trace_param->name, |
| + *stack_trace_param->type); |
| var->set_is_final(); |
| bool added_to_scope = scope->AddVariable(var); |
| if (!added_to_scope) { |
| @@ -6836,7 +6877,8 @@ |
| void Parser::PushTryBlock(Block* try_block) { |
| intptr_t try_index = AllocateTryIndex(); |
| - TryBlocks* block = new TryBlocks(try_block, try_blocks_list_, try_index); |
| + TryBlocks* block = new(isolate()) TryBlocks( |
| + try_block, try_blocks_list_, try_index); |
| try_blocks_list_ = block; |
| } |
| @@ -6951,26 +6993,25 @@ |
| // Generate code to load the exception object (:exception_var) into |
| // the exception variable specified in this block. |
| ASSERT(exception_var != NULL); |
| - current_block_->statements->Add( |
| - new StoreLocalNode(catch_pos, exception_param.var, |
| - new LoadLocalNode(catch_pos, exception_var))); |
| + current_block_->statements->Add(new(isolate()) StoreLocalNode( |
| + catch_pos, exception_param.var, new(isolate()) LoadLocalNode( |
| + catch_pos, exception_var))); |
| } |
| if (stack_trace_param.var != NULL) { |
| // A stack trace variable is specified in this block, so generate code |
| // to load the stack trace object (:stack_trace_var) into the stack |
| // trace variable specified in this block. |
| *needs_stack_trace = true; |
| - ArgumentListNode* no_args = new ArgumentListNode(catch_pos); |
| + ArgumentListNode* no_args = new(isolate()) ArgumentListNode(catch_pos); |
| ASSERT(stack_trace_var != NULL); |
| - current_block_->statements->Add( |
| - new StoreLocalNode(catch_pos, stack_trace_param.var, |
| - new LoadLocalNode(catch_pos, stack_trace_var))); |
| - current_block_->statements->Add( |
| - new InstanceCallNode( |
| - catch_pos, |
| - new LoadLocalNode(catch_pos, stack_trace_param.var), |
| - Library::PrivateCoreLibName(Symbols::_setupFullStackTrace()), |
| - no_args)); |
| + current_block_->statements->Add(new(isolate()) StoreLocalNode( |
| + catch_pos, stack_trace_param.var, new(isolate()) LoadLocalNode( |
| + catch_pos, stack_trace_var))); |
| + current_block_->statements->Add(new(isolate()) InstanceCallNode( |
| + catch_pos, |
| + new(isolate()) LoadLocalNode(catch_pos, stack_trace_param.var), |
| + Library::PrivateCoreLibName(Symbols::_setupFullStackTrace()), |
| + no_args)); |
| } |
| // Add nested block with user-defined code. This blocks allows |
| @@ -6987,10 +7028,10 @@ |
| // In the first case, unconditionally execute the catch body. In the |
| // second case, unconditionally throw. |
| generic_catch_seen = true; |
| - type_tests.Add(new LiteralNode(catch_pos, Bool::True())); |
| + type_tests.Add(new(isolate()) LiteralNode(catch_pos, Bool::True())); |
| if (is_bad_type) { |
| // Replace the body with one that throws. |
| - SequenceNode* block = new SequenceNode(catch_pos, NULL); |
| + SequenceNode* block = new(isolate()) SequenceNode(catch_pos, NULL); |
| block->Add(ThrowTypeError(catch_pos, *exception_param.type)); |
| catch_blocks.Last() = block; |
| } |
| @@ -7006,13 +7047,15 @@ |
| // Make sure that the instantiator is captured. |
| CaptureInstantiator(); |
| } |
| - TypeNode* exception_type = new TypeNode(catch_pos, *exception_param.type); |
| - AstNode* exception_value = new LoadLocalNode(catch_pos, exception_var); |
| + TypeNode* exception_type = new(isolate()) TypeNode( |
| + catch_pos, *exception_param.type); |
| + AstNode* exception_value = new(isolate()) LoadLocalNode( |
| + catch_pos, exception_var); |
| if (!exception_type->type().IsInstantiated()) { |
| EnsureExpressionTemp(); |
| } |
| - type_tests.Add(new ComparisonNode(catch_pos, Token::kIS, exception_value, |
| - exception_type)); |
| + type_tests.Add(new(isolate()) ComparisonNode( |
| + catch_pos, Token::kIS, exception_value, exception_type)); |
| // Do not add uninstantiated types (e.g. type parameter T or generic |
| // type List<T>), since the debugger won't be able to instantiate it |
| @@ -7039,11 +7082,11 @@ |
| // There isn't a generic catch clause so create a clause body that |
| // rethrows the exception. This includes the case that there were no |
| // catch clauses. |
| - current = new SequenceNode(handler_pos, NULL); |
| - current->Add( |
| - new ThrowNode(handler_pos, |
| - new LoadLocalNode(handler_pos, exception_var), |
| - new LoadLocalNode(handler_pos, stack_trace_var))); |
| + current = new(isolate()) SequenceNode(handler_pos, NULL); |
| + current->Add(new(isolate()) ThrowNode( |
| + handler_pos, |
| + new(isolate()) LoadLocalNode(handler_pos, exception_var), |
| + new(isolate()) LoadLocalNode(handler_pos, stack_trace_var))); |
| } else if (type_tests.Last()->IsLiteralNode()) { |
| ASSERT(type_tests.Last()->AsLiteralNode()->literal().raw() == |
| Bool::True().raw()); |
| @@ -7061,8 +7104,8 @@ |
| while (!type_tests.is_empty()) { |
| AstNode* type_test = type_tests.RemoveLast(); |
| SequenceNode* catch_block = catch_blocks.RemoveLast(); |
| - current_block_->statements->Add( |
| - new IfNode(type_test->token_pos(), type_test, catch_block, current)); |
| + current_block_->statements->Add(new(isolate()) IfNode( |
| + type_test->token_pos(), type_test, catch_block, current)); |
| current = CloseBlock(); |
| } |
| return current; |
| @@ -7088,25 +7131,28 @@ |
| LocalVariable* context_var = |
| current_block_->scope->LocalLookupVariable(Symbols::SavedTryContextVar()); |
| if (context_var == NULL) { |
| - context_var = new LocalVariable(TokenPos(), |
| - Symbols::SavedTryContextVar(), |
| - Type::ZoneHandle(Type::DynamicType())); |
| + context_var = new(isolate()) LocalVariable( |
| + TokenPos(), |
| + Symbols::SavedTryContextVar(), |
| + Type::ZoneHandle(Type::DynamicType())); |
| current_block_->scope->AddVariable(context_var); |
| } |
| LocalVariable* exception_var = |
| current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar()); |
| if (exception_var == NULL) { |
| - exception_var = new LocalVariable(TokenPos(), |
| - Symbols::ExceptionVar(), |
| - Type::ZoneHandle(Type::DynamicType())); |
| + exception_var = new(isolate()) LocalVariable( |
| + TokenPos(), |
| + Symbols::ExceptionVar(), |
| + Type::ZoneHandle(Type::DynamicType())); |
| current_block_->scope->AddVariable(exception_var); |
| } |
| LocalVariable* stack_trace_var = |
| current_block_->scope->LocalLookupVariable(Symbols::StackTraceVar()); |
| if (stack_trace_var == NULL) { |
| - stack_trace_var = new LocalVariable(TokenPos(), |
| - Symbols::StackTraceVar(), |
| - Type::ZoneHandle(Type::DynamicType())); |
| + stack_trace_var = new(isolate()) LocalVariable( |
| + TokenPos(), |
| + Symbols::StackTraceVar(), |
| + Type::ZoneHandle(Type::DynamicType())); |
| current_block_->scope->AddVariable(stack_trace_var); |
| } |
| @@ -7137,7 +7183,7 @@ |
| try_blocks_list_->enter_catch(); |
| const intptr_t handler_pos = TokenPos(); |
| const GrowableObjectArray& handler_types = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| + GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New()); |
| bool needs_stack_trace = false; |
| SequenceNode* catch_handler_list = |
| ParseCatchClauses(handler_pos, exception_var, stack_trace_var, |
| @@ -7161,7 +7207,7 @@ |
| inner_try_block->GetNodeToInlineFinally(node_index); |
| while (node_to_inline != NULL) { |
| finally_block = ParseFinallyBlock(); |
| - InlinedFinallyNode* node = new InlinedFinallyNode(finally_pos, |
| + InlinedFinallyNode* node = new(isolate()) InlinedFinallyNode(finally_pos, |
| finally_block, |
| context_var, |
| outer_try_index); |
| @@ -7173,24 +7219,22 @@ |
| finally_block = ParseFinallyBlock(); |
| } |
| - CatchClauseNode* catch_clause = |
| - new CatchClauseNode(handler_pos, |
| - catch_handler_list, |
| - Array::ZoneHandle(Array::MakeArray(handler_types)), |
| - context_var, |
| - exception_var, |
| - stack_trace_var, |
| - (finally_block != NULL) |
| - ? AllocateTryIndex() |
| - : CatchClauseNode::kInvalidTryIndex, |
| - needs_stack_trace); |
| + CatchClauseNode* catch_clause = new(isolate()) CatchClauseNode( |
| + handler_pos, |
| + catch_handler_list, |
| + Array::ZoneHandle(Array::MakeArray(handler_types)), |
| + context_var, |
| + exception_var, |
| + stack_trace_var, |
| + (finally_block != NULL) ? |
| + AllocateTryIndex() : CatchClauseNode::kInvalidTryIndex, |
| + needs_stack_trace); |
| // Now create the try/catch ast node and return it. If there is a label |
| // on the try/catch, close the block that's embedding the try statement |
| // and attach the label to it. |
| - AstNode* try_catch_node = |
| - new TryCatchNode(try_pos, try_block, context_var, catch_clause, |
| - finally_block, try_index); |
| + AstNode* try_catch_node = new(isolate()) TryCatchNode( |
| + try_pos, try_block, context_var, catch_clause, finally_block, try_index); |
| if (try_label != NULL) { |
| current_block_->statements->Add(try_catch_node); |
| @@ -7231,7 +7275,7 @@ |
| LocalScope* switch_scope = current_block_->scope->LookupSwitchScope(); |
| if (switch_scope != NULL) { |
| // We found a switch scope. Enter a forward reference to the label. |
| - target = new SourceLabel( |
| + target = new(isolate()) SourceLabel( |
| TokenPos(), target_name, SourceLabel::kForward); |
| switch_scope->AddLabel(target); |
| } |
| @@ -7261,7 +7305,7 @@ |
| ErrorMsg(jump_pos, "'%s' target must be in same function context", |
| Token::Str(jump_kind)); |
| } |
| - return new JumpNode(jump_pos, jump_kind, target); |
| + return new(isolate()) JumpNode(jump_pos, jump_kind, target); |
| } |
| @@ -7301,9 +7345,9 @@ |
| ErrorMsg(return_pos, "return of a value not allowed in constructors"); |
| } |
| AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades); |
| - statement = new ReturnNode(statement_pos, expr); |
| + statement = new(isolate()) ReturnNode(statement_pos, expr); |
| } else { |
| - statement = new ReturnNode(statement_pos); |
| + statement = new(isolate()) ReturnNode(statement_pos); |
| } |
| AddNodeForFinallyInlining(statement); |
| ExpectSemicolon(); |
| @@ -7360,9 +7404,10 @@ |
| LocalVariable* trace_var = |
| scope->LocalLookupVariable(Symbols::StackTraceVar()); |
| ASSERT(trace_var != NULL); |
| - statement = new ThrowNode(statement_pos, |
| - new LoadLocalNode(statement_pos, excp_var), |
| - new LoadLocalNode(statement_pos, trace_var)); |
| + statement = new(isolate()) ThrowNode( |
| + statement_pos, |
| + new(isolate()) LoadLocalNode(statement_pos, excp_var), |
| + new(isolate()) LoadLocalNode(statement_pos, trace_var)); |
| } else { |
| statement = ParseExpr(kAllowConst, kConsumeCascades); |
| ExpectSemicolon(); |
| @@ -7374,8 +7419,8 @@ |
| void Parser::ErrorMsg(intptr_t token_pos, const char* format, ...) const { |
| va_list args; |
| va_start(args, format); |
| - const Error& error = Error::Handle(LanguageError::NewFormattedV( |
| - Error::Handle(), script_, token_pos, |
| + const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV( |
| + Error::Handle(isolate()), script_, token_pos, |
| LanguageError::kError, Heap::kNew, format, args)); |
| va_end(args); |
| isolate()->long_jump_base()->Jump(1, error); |
| @@ -7386,8 +7431,8 @@ |
| void Parser::ErrorMsg(const char* format, ...) { |
| va_list args; |
| va_start(args, format); |
| - const Error& error = Error::Handle(LanguageError::NewFormattedV( |
| - Error::Handle(), script_, TokenPos(), |
| + const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV( |
| + Error::Handle(isolate()), script_, TokenPos(), |
| LanguageError::kError, Heap::kNew, format, args)); |
| va_end(args); |
| isolate()->long_jump_base()->Jump(1, error); |
| @@ -7405,11 +7450,10 @@ |
| const Error& prev_error, intptr_t token_pos, const char* format, ...) { |
| va_list args; |
| va_start(args, format); |
| - const Error& error = Error::Handle( |
| - LanguageError::NewFormattedV( |
| - prev_error, script_, token_pos, |
| - LanguageError::kError, Heap::kNew, |
| - format, args)); |
| + const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV( |
| + prev_error, script_, token_pos, |
| + LanguageError::kError, Heap::kNew, |
| + format, args)); |
| va_end(args); |
| isolate()->long_jump_base()->Jump(1, error); |
| UNREACHABLE(); |
| @@ -7420,11 +7464,10 @@ |
| if (FLAG_silent_warnings) return; |
| va_list args; |
| va_start(args, format); |
| - const Error& error = Error::Handle( |
| - LanguageError::NewFormattedV( |
| - Error::Handle(), script_, token_pos, |
| - LanguageError::kWarning, Heap::kNew, |
| - format, args)); |
| + const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV( |
| + Error::Handle(isolate()), script_, token_pos, |
| + LanguageError::kWarning, Heap::kNew, |
| + format, args)); |
| va_end(args); |
| if (FLAG_warning_as_error) { |
| isolate()->long_jump_base()->Jump(1, error); |
| @@ -7439,11 +7482,10 @@ |
| if (FLAG_silent_warnings) return; |
| va_list args; |
| va_start(args, format); |
| - const Error& error = Error::Handle( |
| - LanguageError::NewFormattedV( |
| - Error::Handle(), script_, TokenPos(), |
| - LanguageError::kWarning, Heap::kNew, |
| - format, args)); |
| + const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV( |
| + Error::Handle(isolate()), script_, TokenPos(), |
| + LanguageError::kWarning, Heap::kNew, |
| + format, args)); |
| va_end(args); |
| if (FLAG_warning_as_error) { |
| isolate()->long_jump_base()->Jump(1, error); |
| @@ -7549,20 +7591,20 @@ |
| AstNode* Parser::ThrowTypeError(intptr_t type_pos, const AbstractType& type) { |
| - ArgumentListNode* arguments = new ArgumentListNode(type_pos); |
| + ArgumentListNode* arguments = new(isolate()) ArgumentListNode(type_pos); |
| // Location argument. |
| - arguments->Add(new LiteralNode( |
| + arguments->Add(new(isolate()) LiteralNode( |
| type_pos, Integer::ZoneHandle(Integer::New(type_pos)))); |
| // Src value argument. |
| - arguments->Add(new LiteralNode(type_pos, Instance::ZoneHandle())); |
| + arguments->Add(new(isolate()) LiteralNode(type_pos, Instance::ZoneHandle())); |
| // Dst type name argument. |
| - arguments->Add(new LiteralNode(type_pos, Symbols::Malformed())); |
| + arguments->Add(new(isolate()) LiteralNode(type_pos, Symbols::Malformed())); |
| // Dst name argument. |
| - arguments->Add(new LiteralNode(type_pos, Symbols::Empty())); |
| + arguments->Add(new(isolate()) LiteralNode(type_pos, Symbols::Empty())); |
| // Malformed type error or malbounded type error. |
| - const Error& error = Error::Handle(type.error()); |
| + const Error& error = Error::Handle(isolate(), type.error()); |
| ASSERT(!error.IsNull()); |
| - arguments->Add(new LiteralNode(type_pos, String::ZoneHandle( |
| + arguments->Add(new(isolate()) LiteralNode(type_pos, String::ZoneHandle( |
| Symbols::New(error.ToErrorCString())))); |
| return MakeStaticCall(Symbols::TypeError(), |
| Library::PrivateCoreLibName(Symbols::ThrowNew()), |
| @@ -7577,17 +7619,17 @@ |
| InvocationMirror::Call im_call, |
| InvocationMirror::Type im_type, |
| Function* func) { |
| - ArgumentListNode* arguments = new ArgumentListNode(call_pos); |
| + ArgumentListNode* arguments = new(isolate()) ArgumentListNode(call_pos); |
| // Object receiver. |
| // TODO(regis): For now, we pass a class literal of the unresolved |
| // method's owner, but this is not specified and will probably change. |
| Type& type = Type::ZoneHandle( |
| - Type::New(cls, TypeArguments::Handle(), call_pos, Heap::kOld)); |
| + Type::New(cls, TypeArguments::Handle(isolate()), call_pos, Heap::kOld)); |
| type ^= ClassFinalizer::FinalizeType( |
| current_class(), type, ClassFinalizer::kCanonicalize); |
| - arguments->Add(new LiteralNode(call_pos, type)); |
| + arguments->Add(new(isolate()) LiteralNode(call_pos, type)); |
| // String memberName. |
| - arguments->Add(new LiteralNode( |
| + arguments->Add(new(isolate()) LiteralNode( |
| call_pos, String::ZoneHandle(Symbols::New(function_name)))); |
| // Smi invocation_type. |
| if (cls.IsTopLevel()) { |
| @@ -7595,22 +7637,24 @@ |
| im_call == InvocationMirror::kTopLevel); |
| im_call = InvocationMirror::kTopLevel; |
| } |
| - arguments->Add(new LiteralNode(call_pos, Smi::ZoneHandle( |
| + arguments->Add(new(isolate()) LiteralNode(call_pos, Smi::ZoneHandle( |
| Smi::New(InvocationMirror::EncodeType(im_call, im_type))))); |
| // List arguments. |
| if (function_arguments == NULL) { |
| - arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle())); |
| + arguments->Add(new(isolate()) LiteralNode(call_pos, Array::ZoneHandle())); |
| } else { |
| - ArrayNode* array = new ArrayNode(call_pos, |
| - Type::ZoneHandle(Type::ArrayType()), |
| - function_arguments->nodes()); |
| + ArrayNode* array = new(isolate()) ArrayNode( |
| + call_pos, |
| + Type::ZoneHandle(Type::ArrayType()), |
| + function_arguments->nodes()); |
| arguments->Add(array); |
| } |
| // List argumentNames. |
| if (function_arguments == NULL) { |
| - arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle())); |
| + arguments->Add(new(isolate()) LiteralNode(call_pos, Array::ZoneHandle())); |
| } else { |
| - arguments->Add(new LiteralNode(call_pos, function_arguments->names())); |
| + arguments->Add(new(isolate()) LiteralNode( |
| + call_pos, function_arguments->names())); |
| } |
| // List existingArgumentNames. |
| @@ -7618,7 +7662,7 @@ |
| // has done the lookup already. If there is a function with the same |
| // name but incompatible parameters, inform the NoSuchMethodError what the |
| // expected parameters are. |
| - Function& function = Function::Handle(); |
| + Function& function = Function::Handle(isolate()); |
| if (func != NULL) { |
| function = func->raw(); |
| } else { |
| @@ -7639,9 +7683,10 @@ |
| // between dart2js and VM. Update the constructor to accept a string |
| // describing the formal parameters of an incompatible call target. |
| array = Array::New(1, Heap::kOld); |
| - array.SetAt(0, String::Handle(function.UserVisibleFormalParameters())); |
| + array.SetAt(0, String::Handle(isolate(), |
| + function.UserVisibleFormalParameters())); |
| } |
| - arguments->Add(new LiteralNode(call_pos, array)); |
| + arguments->Add(new(isolate()) LiteralNode(call_pos, array)); |
| return MakeStaticCall(Symbols::NoSuchMethodError(), |
| Library::PrivateCoreLibName(Symbols::ThrowNew()), |
| @@ -7680,7 +7725,7 @@ |
| // Make sure that the instantiator is captured. |
| CaptureInstantiator(); |
| } |
| - right_operand = new TypeNode(type_pos, type); |
| + right_operand = new(isolate()) TypeNode(type_pos, type); |
| // In production mode, the type may be malformed. |
| // In checked mode, the type may be malformed or malbounded. |
| if (((op_kind == Token::kIS) || (op_kind == Token::kISNOT) || |
| @@ -7690,7 +7735,7 @@ |
| // a type cast even if the tested value is null. |
| // We need to evaluate the left operand for potential |
| // side effects. |
| - LetNode* let = new LetNode(left_operand->token_pos()); |
| + LetNode* let = new(isolate()) LetNode(left_operand->token_pos()); |
| let->AddNode(left_operand); |
| let->AddNode(ThrowTypeError(type_pos, type)); |
| left_operand = let; |
| @@ -7707,7 +7752,7 @@ |
| EnsureExpressionTemp(); |
| } |
| } |
| - left_operand = new ComparisonNode( |
| + left_operand = new(isolate()) ComparisonNode( |
| op_pos, op_kind, left_operand, right_operand); |
| break; // Equality and relational operators cannot be chained. |
| } else { |
| @@ -7726,7 +7771,7 @@ |
| AstNode* expressions = ParseExpr(kAllowConst, kConsumeCascades); |
| if (CurrentToken() == Token::kCOMMA) { |
| // Collect comma-separated expressions in a non scope owning sequence node. |
| - SequenceNode* list = new SequenceNode(TokenPos(), NULL); |
| + SequenceNode* list = new(isolate()) SequenceNode(TokenPos(), NULL); |
| list->Add(expressions); |
| while (CurrentToken() == Token::kCOMMA) { |
| ConsumeToken(); |
| @@ -7748,10 +7793,10 @@ |
| void Parser::EnsureSavedCurrentContext() { |
| // Used later by the flow_graph_builder to save current context. |
| if (!parsed_function()->has_saved_current_context_var()) { |
| - LocalVariable* temp = |
| - new LocalVariable(current_function().token_pos(), |
| - Symbols::SavedCurrentContextVar(), |
| - Type::ZoneHandle(Type::DynamicType())); |
| + LocalVariable* temp = new(isolate()) LocalVariable( |
| + current_function().token_pos(), |
| + Symbols::SavedCurrentContextVar(), |
| + Type::ZoneHandle(Type::DynamicType())); |
| ASSERT(temp != NULL); |
| parsed_function()->set_saved_current_context_var(temp); |
| } |
| @@ -7762,10 +7807,10 @@ |
| const char* s) { |
| char name[64]; |
| OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos); |
| - LocalVariable* temp = |
| - new LocalVariable(token_pos, |
| - String::ZoneHandle(Symbols::New(name)), |
| - Type::ZoneHandle(Type::DynamicType())); |
| + LocalVariable* temp = new(isolate()) LocalVariable( |
| + token_pos, |
| + String::ZoneHandle(Symbols::New(name)), |
| + Type::ZoneHandle(Type::DynamicType())); |
| temp->set_is_final(); |
| current_block_->scope->AddVariable(temp); |
| return temp; |
| @@ -7787,7 +7832,7 @@ |
| if (binary_op == Token::kDIV) { |
| const Double& dbl_obj = Double::ZoneHandle( |
| Double::NewCanonical((left_double / right_double))); |
| - return new LiteralNode(op_pos, dbl_obj); |
| + return new(isolate()) LiteralNode(op_pos, dbl_obj); |
| } |
| } |
| } |
| @@ -7810,14 +7855,14 @@ |
| (lhs->AsBinaryOpNode()->kind() == Token::kSHL)) { |
| // Merge SHL and BIT_AND into one "SHL with mask" node. |
| BinaryOpNode* old = lhs->AsBinaryOpNode(); |
| - BinaryOpWithMask32Node* binop = new BinaryOpWithMask32Node( |
| + BinaryOpWithMask32Node* binop = new(isolate()) BinaryOpWithMask32Node( |
| old->token_pos(), old->kind(), old->left(), old->right(), val); |
| return binop; |
| } |
| } |
| } |
| } |
| - return new BinaryOpNode(op_pos, binary_op, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, binary_op, lhs, rhs); |
| } |
| @@ -7830,27 +7875,27 @@ |
| case Token::kASSIGN: |
| return rhs; |
| case Token::kASSIGN_ADD: |
| - return new BinaryOpNode(op_pos, Token::kADD, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kADD, lhs, rhs); |
| case Token::kASSIGN_SUB: |
| - return new BinaryOpNode(op_pos, Token::kSUB, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs); |
| case Token::kASSIGN_MUL: |
| - return new BinaryOpNode(op_pos, Token::kMUL, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs); |
| case Token::kASSIGN_TRUNCDIV: |
| - return new BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs); |
| case Token::kASSIGN_DIV: |
| - return new BinaryOpNode(op_pos, Token::kDIV, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs); |
| case Token::kASSIGN_MOD: |
| - return new BinaryOpNode(op_pos, Token::kMOD, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs); |
| case Token::kASSIGN_SHR: |
| - return new BinaryOpNode(op_pos, Token::kSHR, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs); |
| case Token::kASSIGN_SHL: |
| - return new BinaryOpNode(op_pos, Token::kSHL, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs); |
| case Token::kASSIGN_OR: |
| - return new BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs); |
| case Token::kASSIGN_AND: |
| - return new BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs); |
| case Token::kASSIGN_XOR: |
| - return new BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs); |
| + return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs); |
| default: |
| ErrorMsg(op_pos, "internal error: ExpandAssignableOp '%s' unimplemented", |
| Token::Name(assignment_op)); |
| @@ -7869,28 +7914,29 @@ |
| if (expr->EvalConstExpr() == NULL) { |
| ErrorMsg(expr_pos, "expression is not a valid compile-time constant"); |
| } |
| - return new LiteralNode(expr_pos, EvaluateConstExpr(expr_pos, expr)); |
| + return new(isolate()) LiteralNode( |
| + expr_pos, EvaluateConstExpr(expr_pos, expr)); |
| } |
| LetNode* Parser::PrepareCompoundAssignmentNodes(AstNode** expr) { |
| AstNode* node = *expr; |
| intptr_t token_pos = node->token_pos(); |
| - LetNode* result = new LetNode(token_pos); |
| + LetNode* result = new(isolate()) LetNode(token_pos); |
| if (node->IsLoadIndexedNode()) { |
| LoadIndexedNode* load_indexed = node->AsLoadIndexedNode(); |
| AstNode* array = load_indexed->array(); |
| AstNode* index = load_indexed->index_expr(); |
| if (!IsSimpleLocalOrLiteralNode(load_indexed->array())) { |
| LocalVariable* t0 = result->AddInitializer(load_indexed->array()); |
| - array = new LoadLocalNode(token_pos, t0); |
| + array = new(isolate()) LoadLocalNode(token_pos, t0); |
| } |
| if (!IsSimpleLocalOrLiteralNode(load_indexed->index_expr())) { |
| LocalVariable* t1 = result->AddInitializer( |
| load_indexed->index_expr()); |
| - index = new LoadLocalNode(token_pos, t1); |
| + index = new(isolate()) LoadLocalNode(token_pos, t1); |
| } |
| - *expr = new LoadIndexedNode(token_pos, |
| + *expr = new(isolate()) LoadIndexedNode(token_pos, |
| array, |
| index, |
| load_indexed->super_class()); |
| @@ -7901,11 +7947,11 @@ |
| AstNode* receiver = getter->receiver(); |
| if (!IsSimpleLocalOrLiteralNode(getter->receiver())) { |
| LocalVariable* t0 = result->AddInitializer(getter->receiver()); |
| - receiver = new LoadLocalNode(token_pos, t0); |
| + receiver = new(isolate()) LoadLocalNode(token_pos, t0); |
| } |
| - *expr = new InstanceGetterNode(token_pos, |
| - receiver, |
| - getter->field_name()); |
| + *expr = new(isolate()) InstanceGetterNode(token_pos, |
| + receiver, |
| + getter->field_name()); |
| return result; |
| } |
| return result; |
| @@ -7946,8 +7992,8 @@ |
| name = Symbols::New(original->AsTypeNode()->TypeName()); |
| } else if (original->IsLoadStaticFieldNode()) { |
| name = original->AsLoadStaticFieldNode()->field().name(); |
| - target_cls = |
| - &Class::Handle(original->AsLoadStaticFieldNode()->field().owner()); |
| + target_cls = &Class::Handle(isolate(), |
| + original->AsLoadStaticFieldNode()->field().owner()); |
| } else if ((left_ident != NULL) && |
| (original->IsLiteralNode() || |
| original->IsLoadLocalNode())) { |
| @@ -7979,12 +8025,12 @@ |
| AstNode* Parser::ParseCascades(AstNode* expr) { |
| intptr_t cascade_pos = TokenPos(); |
| - LetNode* cascade = new LetNode(cascade_pos); |
| + LetNode* cascade = new(isolate()) LetNode(cascade_pos); |
| LocalVariable* cascade_receiver_var = cascade->AddInitializer(expr); |
| while (CurrentToken() == Token::kCASCADE) { |
| cascade_pos = TokenPos(); |
| LoadLocalNode* load_cascade_receiver = |
| - new LoadLocalNode(cascade_pos, cascade_receiver_var); |
| + new(isolate()) LoadLocalNode(cascade_pos, cascade_receiver_var); |
| if (Token::IsIdentifier(LookaheadToken(1))) { |
| // Replace .. with . for ParseSelectors(). |
| token_kind_ = Token::kPERIOD; |
| @@ -8029,7 +8075,8 @@ |
| } |
| // The result is an expression with the (side effects of the) cascade |
| // sequence followed by the (value of the) receiver temp variable load. |
| - cascade->AddNode(new LoadLocalNode(cascade_pos, cascade_receiver_var)); |
| + cascade->AddNode(new(isolate()) LoadLocalNode( |
| + cascade_pos, cascade_receiver_var)); |
| return cascade; |
| } |
| @@ -8062,7 +8109,7 @@ |
| ErrorMsg("expression expected after throw"); |
| } |
| AstNode* expr = ParseExpr(require_compiletime_const, consume_cascades); |
| - return new ThrowNode(expr_pos, expr, NULL); |
| + return new(isolate()) ThrowNode(expr_pos, expr, NULL); |
| } |
| AstNode* expr = ParseConditionalExpr(); |
| if (!Token::IsAssignmentOperator(CurrentToken())) { |
| @@ -8129,7 +8176,7 @@ |
| AstNode* expr1 = ParseExpr(kAllowConst, kNoCascades); |
| ExpectToken(Token::kCOLON); |
| AstNode* expr2 = ParseExpr(kAllowConst, kNoCascades); |
| - expr = new ConditionalExprNode(expr_pos, expr, expr1, expr2); |
| + expr = new(isolate()) ConditionalExprNode(expr_pos, expr, expr1, expr2); |
| } |
| return expr; |
| } |
| @@ -8165,11 +8212,11 @@ |
| LetNode* let_expr = PrepareCompoundAssignmentNodes(&expr); |
| Token::Kind binary_op = |
| (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB; |
| - BinaryOpNode* add = new BinaryOpNode( |
| + BinaryOpNode* add = new(isolate()) BinaryOpNode( |
| op_pos, |
| binary_op, |
| expr, |
| - new LiteralNode(op_pos, Smi::ZoneHandle(Smi::New(1)))); |
| + new(isolate()) LiteralNode(op_pos, Smi::ZoneHandle(Smi::New(1)))); |
| AstNode* store = CreateAssignmentNode(expr, add, expr_ident, expr_pos); |
| ASSERT(store != NULL); |
| let_expr->AddNode(store); |
| @@ -8189,15 +8236,15 @@ |
| const bool saved_mode = SetAllowFunctionLiterals(true); |
| ArgumentListNode* arguments; |
| if (implicit_arguments == NULL) { |
| - arguments = new ArgumentListNode(TokenPos()); |
| + arguments = new(isolate()) ArgumentListNode(TokenPos()); |
| } else { |
| arguments = implicit_arguments; |
| } |
| - const GrowableObjectArray& names = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld)); |
| + const GrowableObjectArray& names = GrowableObjectArray::Handle(isolate(), |
| + GrowableObjectArray::New(Heap::kOld)); |
| bool named_argument_seen = false; |
| if (LookaheadToken(1) != Token::kRPAREN) { |
| - String& arg_name = String::Handle(); |
| + String& arg_name = String::Handle(isolate()); |
| do { |
| ASSERT((CurrentToken() == Token::kLPAREN) || |
| (CurrentToken() == Token::kCOMMA)); |
| @@ -8228,7 +8275,7 @@ |
| ExpectToken(Token::kRPAREN); |
| SetAllowFunctionLiterals(saved_mode); |
| if (named_argument_seen) { |
| - arguments->set_names(Array::Handle(Array::MakeArray(names))); |
| + arguments->set_names(Array::Handle(isolate(), Array::MakeArray(names))); |
| } |
| return arguments; |
| } |
| @@ -8264,11 +8311,11 @@ |
| Object::empty_array()); |
| if (!func.IsNull()) { |
| ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter); |
| - closure = new StaticGetterNode(call_pos, |
| - NULL, |
| - false, |
| - Class::ZoneHandle(cls.raw()), |
| - func_name); |
| + closure = new(isolate()) StaticGetterNode(call_pos, |
| + NULL, |
| + false, |
| + Class::ZoneHandle(cls.raw()), |
| + func_name); |
| return BuildClosureCall(call_pos, closure, arguments); |
| } |
| } else { |
| @@ -8289,12 +8336,12 @@ |
| // This is the predefined toplevel function identical(a,b). Create |
| // a comparison node instead. |
| ASSERT(num_arguments == 2); |
| - return new ComparisonNode(ident_pos, |
| - Token::kEQ_STRICT, |
| - arguments->NodeAt(0), |
| - arguments->NodeAt(1)); |
| + return new(isolate()) ComparisonNode(ident_pos, |
| + Token::kEQ_STRICT, |
| + arguments->NodeAt(0), |
| + arguments->NodeAt(1)); |
| } |
| - return new StaticCallNode(call_pos, func, arguments); |
| + return new(isolate()) StaticCallNode(call_pos, func, arguments); |
| } |
| @@ -8303,7 +8350,8 @@ |
| const intptr_t call_pos = TokenPos(); |
| CheckToken(Token::kLPAREN); |
| ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst); |
| - return new InstanceCallNode(call_pos, receiver, func_name, arguments); |
| + return new(isolate()) InstanceCallNode( |
| + call_pos, receiver, func_name, arguments); |
| } |
| @@ -8330,19 +8378,21 @@ |
| ASSERT(field.is_static()); |
| const Class& field_owner = Class::ZoneHandle(field.owner()); |
| const String& field_name = String::ZoneHandle(field.name()); |
| - const String& getter_name = String::Handle(Field::GetterName(field_name)); |
| - const Function& getter = |
| - Function::Handle(field_owner.LookupStaticFunction(getter_name)); |
| + const String& getter_name = String::Handle(isolate(), |
| + Field::GetterName(field_name)); |
| + const Function& getter = Function::Handle(isolate(), |
| + field_owner.LookupStaticFunction(getter_name)); |
| // Never load field directly if there is a getter (deterministic AST). |
| if (getter.IsNull() || field.is_const()) { |
| - return new LoadStaticFieldNode(ident_pos, Field::ZoneHandle(field.raw())); |
| + return new(isolate()) LoadStaticFieldNode( |
| + ident_pos, Field::ZoneHandle(field.raw())); |
| } else { |
| ASSERT(getter.kind() == RawFunction::kImplicitStaticFinalGetter); |
| - return new StaticGetterNode(ident_pos, |
| - NULL, // Receiver. |
| - false, // is_super_getter. |
| - field_owner, |
| - field_name); |
| + return new(isolate()) StaticGetterNode(ident_pos, |
| + NULL, // Receiver. |
| + false, // is_super_getter. |
| + field_owner, |
| + field_name); |
| } |
| } |
| @@ -8376,19 +8426,13 @@ |
| // Create a getter call, which may later be turned into |
| // a setter call, or else the backend will generate |
| // a throw NoSuchMethodError(). |
| - access = new StaticGetterNode(ident_pos, |
| - NULL, |
| - false, |
| - Class::ZoneHandle(cls.raw()), |
| - field_name); |
| + access = new(isolate()) StaticGetterNode( |
| + ident_pos, NULL, false, Class::ZoneHandle(cls.raw()), field_name); |
| } |
| } else { |
| ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter); |
| - access = new StaticGetterNode(ident_pos, |
| - NULL, |
| - false, |
| - Class::ZoneHandle(cls.raw()), |
| - field_name); |
| + access = new(isolate()) StaticGetterNode( |
| + ident_pos, NULL, false, Class::ZoneHandle(cls.raw()), field_name); |
| } |
| } else { |
| access = GenerateStaticFieldLookup(field, ident_pos); |
| @@ -8420,11 +8464,12 @@ |
| if (current_function().is_static() || |
| current_function().IsInFactoryScope()) { |
| StaticGetterNode* getter = |
| - new StaticGetterNode(primary->token_pos(), |
| - NULL, // No receiver. |
| - false, // Not a super getter. |
| - Class::ZoneHandle(current_class().raw()), |
| - name); |
| + new(isolate()) StaticGetterNode( |
| + primary->token_pos(), |
| + NULL, // No receiver. |
| + false, // Not a super getter. |
| + Class::ZoneHandle(current_class().raw()), |
| + name); |
| getter->set_is_deferred(primary->is_deferred_reference()); |
| return getter; |
| } else { |
| @@ -8497,7 +8542,7 @@ |
| TypeParameter::Cast(primary_node->primary()), |
| ClassFinalizer::kCanonicalize); |
| ASSERT(!type_parameter.IsMalformed()); |
| - left = new TypeNode(primary->token_pos(), type_parameter); |
| + left = new(isolate()) TypeNode(primary->token_pos(), type_parameter); |
| } else { |
| // Super field access handled in ParseSuperFieldAccess(), |
| // super calls handled in ParseSuperCall(). |
| @@ -8519,7 +8564,7 @@ |
| } |
| } else { |
| // Field access. |
| - Class& cls = Class::Handle(); |
| + Class& cls = Class::Handle(isolate()); |
| if (left->IsPrimaryNode()) { |
| PrimaryNode* primary_node = left->AsPrimaryNode(); |
| if (primary_node->primary().IsClass()) { |
| @@ -8557,13 +8602,13 @@ |
| } else if (primary_node->primary().IsClass()) { |
| const Class& type_class = Class::Cast(primary_node->primary()); |
| AbstractType& type = Type::ZoneHandle( |
| - Type::New(type_class, TypeArguments::Handle(), |
| + Type::New(type_class, TypeArguments::Handle(isolate()), |
| primary_pos, Heap::kOld)); |
| type ^= ClassFinalizer::FinalizeType( |
| current_class(), type, ClassFinalizer::kCanonicalize); |
| // Type may be malbounded, but not malformed. |
| ASSERT(!type.IsMalformed()); |
| - array = new TypeNode(primary_pos, type); |
| + array = new(isolate()) TypeNode(primary_pos, type); |
| } else if (primary_node->primary().IsTypeParameter()) { |
| if (current_function().is_static()) { |
| const String& name = String::ZoneHandle( |
| @@ -8582,15 +8627,13 @@ |
| TypeParameter::Cast(primary_node->primary()), |
| ClassFinalizer::kCanonicalize); |
| ASSERT(!type_parameter.IsMalformed()); |
| - array = new TypeNode(primary_pos, type_parameter); |
| + array = new(isolate()) TypeNode(primary_pos, type_parameter); |
| } else { |
| UNREACHABLE(); // Internal parser error. |
| } |
| } |
| - selector = new LoadIndexedNode(bracket_pos, |
| - array, |
| - index, |
| - Class::ZoneHandle()); |
| + selector = new(isolate()) LoadIndexedNode( |
| + bracket_pos, array, index, Class::ZoneHandle()); |
| } else if (CurrentToken() == Token::kLPAREN) { |
| if (left->IsPrimaryNode()) { |
| PrimaryNode* primary_node = left->AsPrimaryNode(); |
| @@ -8600,7 +8643,7 @@ |
| const String& func_name = String::ZoneHandle(func.name()); |
| if (func.is_static()) { |
| // Parse static function call. |
| - Class& cls = Class::Handle(func.Owner()); |
| + Class& cls = Class::Handle(isolate(), func.Owner()); |
| selector = ParseStaticCall(cls, func_name, primary_pos); |
| } else { |
| // Dynamic function call on implicit "this" parameter. |
| @@ -8646,12 +8689,12 @@ |
| } else if (primary_node->primary().IsClass()) { |
| const Class& type_class = Class::Cast(primary_node->primary()); |
| AbstractType& type = Type::ZoneHandle(Type::New( |
| - type_class, TypeArguments::Handle(), primary_pos)); |
| + type_class, TypeArguments::Handle(isolate()), primary_pos)); |
| type ^= ClassFinalizer::FinalizeType( |
| current_class(), type, ClassFinalizer::kCanonicalize); |
| // Type may be malbounded, but not malformed. |
| ASSERT(!type.IsMalformed()); |
| - selector = new TypeNode(primary_pos, type); |
| + selector = new(isolate()) TypeNode(primary_pos, type); |
| } else { |
| UNREACHABLE(); // Internal parser error. |
| } |
| @@ -8680,12 +8723,12 @@ |
| } else if (primary_node->primary().IsClass()) { |
| const Class& type_class = Class::Cast(primary_node->primary()); |
| AbstractType& type = Type::ZoneHandle(Type::New( |
| - type_class, TypeArguments::Handle(), primary_pos)); |
| + type_class, TypeArguments::Handle(isolate()), primary_pos)); |
| type = ClassFinalizer::FinalizeType( |
| current_class(), type, ClassFinalizer::kCanonicalize); |
| // Type may be malbounded, but not malformed. |
| ASSERT(!type.IsMalformed()); |
| - left = new TypeNode(primary_pos, type); |
| + left = new(isolate()) TypeNode(primary_pos, type); |
| } else if (primary_node->primary().IsTypeParameter()) { |
| if (current_function().is_static()) { |
| const String& name = String::ZoneHandle( |
| @@ -8704,7 +8747,7 @@ |
| TypeParameter::Cast(primary_node->primary()), |
| ClassFinalizer::kCanonicalize); |
| ASSERT(!type_parameter.IsMalformed()); |
| - left = new TypeNode(primary_pos, type_parameter); |
| + left = new(isolate()) TypeNode(primary_pos, type_parameter); |
| } else if (primary_node->IsSuper()) { |
| // Return "super" to handle unary super operator calls, |
| // or to report illegal use of "super" otherwise. |
| @@ -8741,17 +8784,17 @@ |
| LocalVariable* temp = let_expr->AddInitializer(expr); |
| Token::Kind binary_op = |
| (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB; |
| - BinaryOpNode* add = new BinaryOpNode( |
| + BinaryOpNode* add = new(isolate()) BinaryOpNode( |
| expr_pos, |
| binary_op, |
| - new LoadLocalNode(expr_pos, temp), |
| - new LiteralNode(expr_pos, Smi::ZoneHandle(Smi::New(1)))); |
| + new(isolate()) LoadLocalNode(expr_pos, temp), |
| + new(isolate()) LiteralNode(expr_pos, Smi::ZoneHandle(Smi::New(1)))); |
| AstNode* store = CreateAssignmentNode(expr, add, expr_ident, expr_pos); |
| ASSERT(store != NULL); |
| // The result is a pair of the (side effects of the) store followed by |
| // the (value of the) initial value temp variable load. |
| let_expr->AddNode(store); |
| - let_expr->AddNode(new LoadLocalNode(expr_pos, temp)); |
| + let_expr->AddNode(new(isolate()) LoadLocalNode(expr_pos, temp)); |
| return let_expr; |
| } |
| return expr; |
| @@ -8933,7 +8976,7 @@ |
| } |
| const char* error_str = NULL; |
| Instance& result = |
| - Instance::Handle(instance.CheckAndCanonicalize(&error_str)); |
| + Instance::Handle(isolate(), instance.CheckAndCanonicalize(&error_str)); |
| if (result.IsNull()) { |
| ErrorMsg(token_pos, "Invalid const object %s", error_str); |
| } |
| @@ -8960,11 +9003,8 @@ |
| field_name.ToCString()); |
| } else { |
| // The implicit static getter will throw the exception if necessary. |
| - return new StaticGetterNode(field_ref_pos, |
| - NULL, |
| - false, |
| - field_owner, |
| - field_name); |
| + return new(isolate()) StaticGetterNode( |
| + field_ref_pos, NULL, false, field_owner, field_name); |
| } |
| } else if (value.raw() == Object::sentinel().raw()) { |
| // This field has not been referenced yet and thus the value has |
| @@ -8973,11 +9013,11 @@ |
| if (field.is_const()) { |
| field.set_value(Object::transition_sentinel()); |
| const int kNumArguments = 0; // no arguments. |
| - const Function& func = Function::Handle( |
| - isolate(), Resolver::ResolveStatic(field_owner, |
| - getter_name, |
| - kNumArguments, |
| - Object::empty_array())); |
| + const Function& func = Function::Handle(isolate(), |
| + Resolver::ResolveStatic(field_owner, |
| + getter_name, |
| + kNumArguments, |
| + Object::empty_array())); |
| ASSERT(!func.IsNull()); |
| ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter); |
| Object& const_value = Object::Handle(isolate()); |
| @@ -8997,24 +9037,21 @@ |
| // would raise an exception. |
| AppendErrorMsg(error, field_ref_pos, |
| "error initializing const field '%s'", |
| - String::Handle(field.name()).ToCString()); |
| + String::Handle(isolate(), field.name()).ToCString()); |
| } else { |
| isolate()->long_jump_base()->Jump(1, error); |
| UNREACHABLE(); |
| } |
| } |
| ASSERT(const_value.IsNull() || const_value.IsInstance()); |
| - Instance& instance = Instance::Handle(); |
| + Instance& instance = Instance::Handle(isolate()); |
| instance ^= const_value.raw(); |
| instance = TryCanonicalize(instance, field_ref_pos); |
| field.set_value(instance); |
| return NULL; // Constant |
| } else { |
| - return new StaticGetterNode(field_ref_pos, |
| - NULL, |
| - false, |
| - field_owner, |
| - field_name); |
| + return new(isolate()) StaticGetterNode( |
| + field_ref_pos, NULL, false, field_owner, field_name); |
| } |
| } |
| if (getter.IsNull() || |
| @@ -9022,11 +9059,8 @@ |
| return NULL; |
| } |
| ASSERT(getter.kind() == RawFunction::kImplicitGetter); |
| - return new StaticGetterNode(field_ref_pos, |
| - NULL, |
| - false, |
| - field_owner, |
| - field_name); |
| + return new(isolate()) StaticGetterNode( |
| + field_ref_pos, NULL, false, field_owner, field_name); |
| } |
| @@ -9049,10 +9083,11 @@ |
| ErrorMsg("type must be constant in const constructor"); |
| } |
| instance.SetTypeArguments( |
| - TypeArguments::Handle(type_arguments.Canonicalize())); |
| + TypeArguments::Handle(isolate(), type_arguments.Canonicalize())); |
| } |
| arg_values.SetAt(0, instance); |
| - arg_values.SetAt(1, Smi::Handle(Smi::New(Function::kCtorPhaseAll))); |
| + arg_values.SetAt(1, Smi::Handle(isolate(), |
| + Smi::New(Function::kCtorPhaseAll))); |
| } else { |
| // Prepend type_arguments to list of arguments to factory. |
| ASSERT(type_arguments.IsZoneHandle()); |
| @@ -9111,7 +9146,7 @@ |
| } |
| if (local != NULL) { |
| if (node != NULL) { |
| - *node = new LoadLocalNode(ident_pos, local); |
| + *node = new(isolate()) LoadLocalNode(ident_pos, local); |
| } |
| return true; |
| } |
| @@ -9149,8 +9184,8 @@ |
| func.IsStaticFunction() || |
| func.is_abstract())) { |
| if (node != NULL) { |
| - *node = new PrimaryNode(ident_pos, |
| - Function::ZoneHandle(isolate(), func.raw())); |
| + *node = new(isolate()) PrimaryNode( |
| + ident_pos, Function::ZoneHandle(isolate(), func.raw())); |
| } |
| return true; |
| } |
| @@ -9162,13 +9197,15 @@ |
| if (func.IsDynamicFunction() || func.is_abstract()) { |
| if (node != NULL) { |
| CheckInstanceFieldAccess(ident_pos, ident); |
| - ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); |
| + ASSERT(AbstractType::Handle(isolate(), |
| + func.result_type()).IsResolved()); |
| *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident); |
| } |
| return true; |
| } else if (func.IsStaticFunction()) { |
| if (node != NULL) { |
| - ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); |
| + ASSERT(AbstractType::Handle(isolate(), |
| + func.result_type()).IsResolved()); |
| // The static getter may later be changed into a dynamically |
| // resolved instance setter if no static setter can |
| // be found. |
| @@ -9183,7 +9220,7 @@ |
| (LookupReceiver(current_block_->scope, kTestOnly) != NULL)) { |
| receiver = LoadReceiver(ident_pos); |
| } |
| - *node = new StaticGetterNode(ident_pos, |
| + *node = new(isolate()) StaticGetterNode(ident_pos, |
| receiver, |
| false, |
| Class::ZoneHandle(isolate(), cls.raw()), |
| @@ -9201,7 +9238,8 @@ |
| // a setter node. If there is no assignment we will get an error |
| // when we try to invoke the getter. |
| CheckInstanceFieldAccess(ident_pos, ident); |
| - ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); |
| + ASSERT(AbstractType::Handle(isolate(), |
| + func.result_type()).IsResolved()); |
| *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident); |
| } |
| return true; |
| @@ -9211,11 +9249,12 @@ |
| // it could be followed by an assignment which will convert it to |
| // a setter node. If there is no assignment we will get an error |
| // when we try to invoke the getter. |
| - *node = new StaticGetterNode(ident_pos, |
| - NULL, |
| - false, |
| - Class::ZoneHandle(isolate(), cls.raw()), |
| - ident); |
| + *node = new(isolate()) StaticGetterNode( |
| + ident_pos, |
| + NULL, |
| + false, |
| + Class::ZoneHandle(isolate(), cls.raw()), |
| + ident); |
| } |
| return true; |
| } |
| @@ -9231,7 +9270,7 @@ |
| RawClass* Parser::ResolveClassInCurrentLibraryScope(const String& name) { |
| HANDLESCOPE(isolate()); |
| - const Object& obj = Object::Handle(library_.ResolveName(name)); |
| + const Object& obj = Object::Handle(isolate(), library_.ResolveName(name)); |
| if (obj.IsClass()) { |
| return Class::Cast(obj).raw(); |
| } |
| @@ -9246,10 +9285,10 @@ |
| const String& ident) { |
| TRACE_PARSER("ResolveIdentInCurrentLibraryScope"); |
| HANDLESCOPE(isolate()); |
| - const Object& obj = Object::Handle(library_.ResolveName(ident)); |
| + const Object& obj = Object::Handle(isolate(), library_.ResolveName(ident)); |
| if (obj.IsClass()) { |
| const Class& cls = Class::Cast(obj); |
| - return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw())); |
| + return new(isolate()) PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw())); |
| } else if (obj.IsField()) { |
| const Field& field = Field::Cast(obj); |
| ASSERT(field.is_static()); |
| @@ -9258,27 +9297,28 @@ |
| const Function& func = Function::Cast(obj); |
| ASSERT(func.is_static()); |
| if (func.IsGetterFunction() || func.IsSetterFunction()) { |
| - return new StaticGetterNode(ident_pos, |
| - /* receiver */ NULL, |
| - /* is_super_getter */ false, |
| - Class::ZoneHandle(func.Owner()), |
| - ident); |
| + return new(isolate()) StaticGetterNode(ident_pos, |
| + /* receiver */ NULL, |
| + /* is_super_getter */ false, |
| + Class::ZoneHandle(func.Owner()), |
| + ident); |
| } else { |
| - return new PrimaryNode(ident_pos, Function::ZoneHandle(func.raw())); |
| + return new(isolate()) PrimaryNode(ident_pos, |
| + Function::ZoneHandle(func.raw())); |
| } |
| } else { |
| ASSERT(obj.IsNull() || obj.IsLibraryPrefix()); |
| } |
| // Lexically unresolved primary identifiers are referenced by their name. |
| - return new PrimaryNode(ident_pos, ident); |
| + return new(isolate()) PrimaryNode(ident_pos, ident); |
| } |
| RawClass* Parser::ResolveClassInPrefixScope(const LibraryPrefix& prefix, |
| const String& name) { |
| HANDLESCOPE(isolate()); |
| - const Object& obj = Object::Handle(prefix.LookupObject(name)); |
| + const Object& obj = Object::Handle(isolate(), prefix.LookupObject(name)); |
| if (obj.IsClass()) { |
| return Class::Cast(obj).raw(); |
| } |
| @@ -9294,7 +9334,7 @@ |
| const String& ident) { |
| TRACE_PARSER("ResolveIdentInPrefixScope"); |
| HANDLESCOPE(isolate()); |
| - Object& obj = Object::Handle(); |
| + Object& obj = Object::Handle(isolate()); |
| if (prefix.is_loaded()) { |
| obj = prefix.LookupObject(ident); |
| } else { |
| @@ -9312,7 +9352,7 @@ |
| } else if (obj.IsClass()) { |
| const Class& cls = Class::Cast(obj); |
| PrimaryNode* primary = |
| - new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw())); |
| + new(isolate()) PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw())); |
| primary->set_is_deferred(is_deferred); |
| return primary; |
| } else if (obj.IsField()) { |
| @@ -9333,16 +9373,16 @@ |
| ASSERT(func.is_static()); |
| if (func.IsGetterFunction() || func.IsSetterFunction()) { |
| StaticGetterNode* getter = |
| - new StaticGetterNode(ident_pos, |
| + new(isolate()) StaticGetterNode(ident_pos, |
| /* receiver */ NULL, |
| /* is_super_getter */ false, |
| - Class::ZoneHandle(func.Owner()), |
| + Class::ZoneHandle(isolate(), func.Owner()), |
| ident); |
| getter->set_is_deferred(is_deferred); |
| return getter; |
| } else { |
| - PrimaryNode* primary = |
| - new PrimaryNode(ident_pos, Function::ZoneHandle(func.raw())); |
| + PrimaryNode* primary = new(isolate()) PrimaryNode( |
| + ident_pos, Function::ZoneHandle(isolate(), func.raw())); |
| primary->set_is_deferred(is_deferred); |
| return primary; |
| } |
| @@ -9379,7 +9419,7 @@ |
| type_parameter ^= ClassFinalizer::FinalizeType( |
| current_class(), type_parameter, ClassFinalizer::kCanonicalize); |
| ASSERT(!type_parameter.IsMalformed()); |
| - return new TypeNode(ident_pos, type_parameter); |
| + return new(isolate()) TypeNode(ident_pos, type_parameter); |
| } |
| } |
| // Not found in the local scope, and the name is not a type parameter. |
| @@ -9418,12 +9458,12 @@ |
| } else if (primary->primary().IsClass()) { |
| const Class& type_class = Class::Cast(primary->primary()); |
| AbstractType& type = Type::ZoneHandle( |
| - Type::New(type_class, TypeArguments::Handle(), primary_pos)); |
| + Type::New(type_class, TypeArguments::Handle(isolate()), primary_pos)); |
| type ^= ClassFinalizer::FinalizeType( |
| current_class(), type, ClassFinalizer::kCanonicalize); |
| // Type may be malbounded, but not malformed. |
| ASSERT(!type.IsMalformed()); |
| - resolved = new TypeNode(primary_pos, type); |
| + resolved = new(isolate()) TypeNode(primary_pos, type); |
| } |
| } |
| return resolved; |
| @@ -9454,7 +9494,7 @@ |
| // The type is malformed. Skip over its type arguments. |
| ParseTypeArguments(ClassFinalizer::kIgnore); |
| return ClassFinalizer::NewFinalizedMalformedType( |
| - Error::Handle(), // No previous error. |
| + Error::Handle(isolate()), // No previous error. |
| script_, |
| type_name.ident_pos, |
| "using '%s' in this context is invalid", |
| @@ -9465,11 +9505,11 @@ |
| !allow_deferred_type) { |
| ParseTypeArguments(ClassFinalizer::kIgnore); |
| return ClassFinalizer::NewFinalizedMalformedType( |
| - Error::Handle(), // No previous error. |
| + Error::Handle(isolate()), // No previous error. |
| script_, |
| type_name.ident_pos, |
| "using deferred type '%s.%s' is invalid", |
| - String::Handle(type_name.lib_prefix->name()).ToCString(), |
| + String::Handle(isolate(), type_name.lib_prefix->name()).ToCString(), |
| type_name.ident->ToCString()); |
| } |
| } |
| @@ -9505,7 +9545,8 @@ |
| intptr_t pos, const Function& constructor, |
| const TypeArguments& type_arguments) { |
| if (!type_arguments.IsNull()) { |
| - const Class& constructor_class = Class::Handle(constructor.Owner()); |
| + const Class& constructor_class = Class::Handle(isolate(), |
| + constructor.Owner()); |
| ASSERT(!constructor_class.IsNull()); |
| ASSERT(constructor_class.is_finalized()); |
| ASSERT(type_arguments.IsCanonical()); |
| @@ -9562,7 +9603,7 @@ |
| } |
| } |
| ASSERT(list_type_arguments.IsNull() || (list_type_arguments.Length() == 1)); |
| - const Class& array_class = Class::Handle( |
| + const Class& array_class = Class::Handle(isolate(), |
| isolate()->object_store()->array_class()); |
| Type& type = Type::ZoneHandle( |
| Type::New(array_class, list_type_arguments, type_pos)); |
| @@ -9579,10 +9620,10 @@ |
| if (FLAG_enable_type_checks && |
| !is_const && |
| !element_type.IsDynamicType()) { |
| - element = new AssignableNode(element_pos, |
| - element, |
| - element_type, |
| - Symbols::ListLiteralElement()); |
| + element = new(isolate()) AssignableNode(element_pos, |
| + element, |
| + element_type, |
| + Symbols::ListLiteralElement()); |
| } |
| element_list.Add(element); |
| if (CurrentToken() == Token::kCOMMA) { |
| @@ -9600,8 +9641,8 @@ |
| Array& const_list = |
| Array::ZoneHandle(Array::New(element_list.length(), Heap::kOld)); |
| const_list.SetTypeArguments( |
| - TypeArguments::Handle(list_type_arguments.Canonicalize())); |
| - Error& malformed_error = Error::Handle(); |
| + TypeArguments::Handle(isolate(), list_type_arguments.Canonicalize())); |
| + Error& malformed_error = Error::Handle(isolate()); |
| for (int i = 0; i < element_list.length(); i++) { |
| AstNode* elem = element_list[i]; |
| // Arguments have been evaluated to a literal value already. |
| @@ -9611,7 +9652,9 @@ |
| !element_type.IsDynamicType() && |
| (!elem->AsLiteralNode()->literal().IsNull() && |
| !elem->AsLiteralNode()->literal().IsInstanceOf( |
| - element_type, TypeArguments::Handle(), &malformed_error))) { |
| + element_type, |
| + TypeArguments::Handle(isolate()), |
| + &malformed_error))) { |
| // If the failure is due to a malformed type error, display it instead. |
| if (!malformed_error.IsNull()) { |
| ErrorMsg(malformed_error); |
| @@ -9620,18 +9663,19 @@ |
| "list literal element at index %d must be " |
| "a constant of type '%s'", |
| i, |
| - String::Handle(element_type.UserVisibleName()).ToCString()); |
| + String::Handle(isolate(), |
| + element_type.UserVisibleName()).ToCString()); |
| } |
| } |
| const_list.SetAt(i, elem->AsLiteralNode()->literal()); |
| } |
| const_list ^= TryCanonicalize(const_list, literal_pos); |
| const_list.MakeImmutable(); |
| - return new LiteralNode(literal_pos, const_list); |
| + return new(isolate()) LiteralNode(literal_pos, const_list); |
| } else { |
| // Factory call at runtime. |
| const Class& factory_class = |
| - Class::Handle(Library::LookupCoreClass(Symbols::List())); |
| + Class::Handle(isolate(), Library::LookupCoreClass(Symbols::List())); |
| ASSERT(!factory_class.IsNull()); |
| const Function& factory_method = Function::ZoneHandle( |
| factory_class.LookupFactory( |
| @@ -9649,7 +9693,7 @@ |
| // type argument vector. |
| if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 1)) { |
| ASSERT(factory_type_args.Length() == 1); |
| - Type& factory_type = Type::Handle(Type::New( |
| + Type& factory_type = Type::Handle(isolate(), Type::New( |
| factory_class, factory_type_args, type_pos, Heap::kNew)); |
| factory_type ^= ClassFinalizer::FinalizeType( |
| current_class(), factory_type, ClassFinalizer::kFinalize); |
| @@ -9657,15 +9701,17 @@ |
| ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments()); |
| } |
| factory_type_args = factory_type_args.Canonicalize(); |
| - ArgumentListNode* factory_param = new ArgumentListNode(literal_pos); |
| + ArgumentListNode* factory_param = new(isolate()) ArgumentListNode( |
| + literal_pos); |
| if (element_list.length() == 0) { |
| // TODO(srdjan): Use Object::empty_array once issue 9871 has been fixed. |
| Array& empty_array = Array::ZoneHandle(Object::empty_array().raw()); |
| LiteralNode* empty_array_literal = |
| - new LiteralNode(TokenPos(), empty_array); |
| + new(isolate()) LiteralNode(TokenPos(), empty_array); |
| factory_param->Add(empty_array_literal); |
| } else { |
| - ArrayNode* list = new ArrayNode(TokenPos(), type, element_list); |
| + ArrayNode* list = new(isolate()) ArrayNode( |
| + TokenPos(), type, element_list); |
| factory_param->Add(list); |
| } |
| return CreateConstructorCallNode(literal_pos, |
| @@ -9684,10 +9730,8 @@ |
| if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) { |
| EnsureExpressionTemp(); |
| } |
| - return new ConstructorCallNode(token_pos, |
| - type_arguments, |
| - constructor, |
| - arguments); |
| + return new(isolate()) ConstructorCallNode( |
| + token_pos, type_arguments, constructor, arguments); |
| } |
| @@ -9772,10 +9816,8 @@ |
| if (FLAG_enable_type_checks && |
| !is_const && |
| !key_type.IsDynamicType()) { |
| - key = new AssignableNode(key_pos, |
| - key, |
| - key_type, |
| - Symbols::ListLiteralElement()); |
| + key = new(isolate()) AssignableNode( |
| + key_pos, key, key_type, Symbols::ListLiteralElement()); |
| } |
| if (is_const) { |
| ASSERT(key->IsLiteralNode()); |
| @@ -9796,10 +9838,8 @@ |
| if (FLAG_enable_type_checks && |
| !is_const && |
| !value_type.IsDynamicType()) { |
| - value = new AssignableNode(value_pos, |
| - value, |
| - value_type, |
| - Symbols::ListLiteralElement()); |
| + value = new(isolate()) AssignableNode( |
| + value_pos, value, value_type, Symbols::ListLiteralElement()); |
| } |
| AddKeyValuePair(&kv_pairs_list, is_const, key, value); |
| @@ -9820,8 +9860,8 @@ |
| // First, create the canonicalized key-value pair array. |
| Array& key_value_array = |
| Array::ZoneHandle(Array::New(kv_pairs_list.length(), Heap::kOld)); |
| - AbstractType& arg_type = Type::Handle(); |
| - Error& malformed_error = Error::Handle(); |
| + AbstractType& arg_type = Type::Handle(isolate()); |
| + Error& malformed_error = Error::Handle(isolate()); |
| for (int i = 0; i < kv_pairs_list.length(); i++) { |
| AstNode* arg = kv_pairs_list[i]; |
| // Arguments have been evaluated to a literal value already. |
| @@ -9850,7 +9890,8 @@ |
| "a constant of type '%s'", |
| ((i % 2) == 0) ? "key" : "value", |
| i >> 1, |
| - String::Handle(arg_type.UserVisibleName()).ToCString()); |
| + String::Handle(isolate(), |
| + arg_type.UserVisibleName()).ToCString()); |
| } |
| } |
| } |
| @@ -9860,19 +9901,19 @@ |
| key_value_array.MakeImmutable(); |
| // Construct the map object. |
| - const Class& immutable_map_class = |
| - Class::Handle(Library::LookupCoreClass(Symbols::ImmutableMap())); |
| + const Class& immutable_map_class = Class::Handle(isolate(), |
| + Library::LookupCoreClass(Symbols::ImmutableMap())); |
| ASSERT(!immutable_map_class.IsNull()); |
| // If the immutable map class extends other parameterized classes, we need |
| // to adjust the type argument vector. This is currently not the case. |
| ASSERT(immutable_map_class.NumTypeArguments() == 2); |
| - ArgumentListNode* constr_args = new ArgumentListNode(TokenPos()); |
| - constr_args->Add(new LiteralNode(literal_pos, key_value_array)); |
| + ArgumentListNode* constr_args = new(isolate()) ArgumentListNode(TokenPos()); |
| + constr_args->Add(new(isolate()) LiteralNode(literal_pos, key_value_array)); |
| const Function& map_constr = |
| Function::ZoneHandle(immutable_map_class.LookupConstructor( |
| Library::PrivateCoreLibName(Symbols::ImmutableMapConstructor()))); |
| ASSERT(!map_constr.IsNull()); |
| - const Object& constructor_result = Object::Handle( |
| + const Object& constructor_result = Object::Handle(isolate(), |
| EvaluateConstConstructorCall(immutable_map_class, |
| map_type_arguments, |
| map_constr, |
| @@ -9883,13 +9924,13 @@ |
| "error executing const Map constructor"); |
| } else { |
| const Instance& const_instance = Instance::Cast(constructor_result); |
| - return new LiteralNode(literal_pos, |
| - Instance::ZoneHandle(const_instance.raw())); |
| + return new(isolate()) LiteralNode( |
| + literal_pos, Instance::ZoneHandle(const_instance.raw())); |
| } |
| } else { |
| // Factory call at runtime. |
| const Class& factory_class = |
| - Class::Handle(Library::LookupCoreClass(Symbols::Map())); |
| + Class::Handle(isolate(), Library::LookupCoreClass(Symbols::Map())); |
| ASSERT(!factory_class.IsNull()); |
| const Function& factory_method = Function::ZoneHandle( |
| factory_class.LookupFactory( |
| @@ -9907,7 +9948,7 @@ |
| // type argument vector. |
| if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 2)) { |
| ASSERT(factory_type_args.Length() == 2); |
| - Type& factory_type = Type::Handle(Type::New( |
| + Type& factory_type = Type::Handle(isolate(), Type::New( |
| factory_class, factory_type_args, type_pos, Heap::kNew)); |
| factory_type ^= ClassFinalizer::FinalizeType( |
| current_class(), factory_type, ClassFinalizer::kFinalize); |
| @@ -9915,10 +9956,11 @@ |
| ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments()); |
| } |
| factory_type_args = factory_type_args.Canonicalize(); |
| - ArgumentListNode* factory_param = new ArgumentListNode(literal_pos); |
| + ArgumentListNode* factory_param = |
| + new(isolate()) ArgumentListNode(literal_pos); |
| // The kv_pair array is temporary and of element type dynamic. It is passed |
| // to the factory to initialize a properly typed map. |
| - ArrayNode* kv_pairs = new ArrayNode( |
| + ArrayNode* kv_pairs = new(isolate()) ArrayNode( |
| TokenPos(), |
| Type::ZoneHandle(Type::ArrayType()), |
| kv_pairs_list); |
| @@ -9941,7 +9983,7 @@ |
| ConsumeToken(); |
| } |
| const intptr_t type_pos = TokenPos(); |
| - TypeArguments& type_arguments = TypeArguments::Handle( |
| + TypeArguments& type_arguments = TypeArguments::Handle(isolate(), |
| ParseTypeArguments(ClassFinalizer::kCanonicalize)); |
| // Malformed type arguments are mapped to dynamic, so we will not encounter |
| // them here. |
| @@ -9964,7 +10006,7 @@ |
| ASSERT(CurrentToken() == Token::kHASH); |
| ConsumeToken(); |
| intptr_t symbol_pos = TokenPos(); |
| - String& symbol = String::Handle(); |
| + String& symbol = String::Handle(isolate()); |
| if (IsIdentifier()) { |
| symbol = CurrentLiteral()->raw(); |
| ConsumeToken(); |
| @@ -9982,18 +10024,19 @@ |
| } |
| // Lookup class Symbol from internal library and call the |
| // constructor to create a symbol instance. |
| - const Library& lib = Library::Handle(Library::InternalLibrary()); |
| - const Class& symbol_class = Class::Handle(lib.LookupClass(Symbols::Symbol())); |
| + const Library& lib = Library::Handle(isolate(), Library::InternalLibrary()); |
| + const Class& symbol_class = Class::Handle(isolate(), |
| + lib.LookupClass(Symbols::Symbol())); |
| ASSERT(!symbol_class.IsNull()); |
| - ArgumentListNode* constr_args = new ArgumentListNode(symbol_pos); |
| - constr_args->Add(new LiteralNode( |
| + ArgumentListNode* constr_args = new(isolate()) ArgumentListNode(symbol_pos); |
| + constr_args->Add(new(isolate()) LiteralNode( |
| symbol_pos, String::ZoneHandle(Symbols::New(symbol)))); |
| const Function& constr = Function::ZoneHandle( |
| symbol_class.LookupConstructor(Symbols::SymbolCtor())); |
| ASSERT(!constr.IsNull()); |
| - const Object& result = Object::Handle( |
| + const Object& result = Object::Handle(isolate(), |
| EvaluateConstConstructorCall(symbol_class, |
| - TypeArguments::Handle(), |
| + TypeArguments::Handle(isolate()), |
| constr, |
| constr_args)); |
| if (result.IsUnhandledException()) { |
| @@ -10002,7 +10045,8 @@ |
| "error executing const Symbol constructor"); |
| } |
| const Instance& instance = Instance::Cast(result); |
| - return new LiteralNode(symbol_pos, Instance::ZoneHandle(instance.raw())); |
| + return new(isolate()) LiteralNode(symbol_pos, |
| + Instance::ZoneHandle(instance.raw())); |
| } |
| @@ -10032,20 +10076,21 @@ |
| intptr_t type_pos = TokenPos(); |
| // Can't allocate const objects of a deferred type. |
| const bool allow_deferred_type = !is_const; |
| - AbstractType& type = AbstractType::Handle( |
| + AbstractType& type = AbstractType::Handle(isolate(), |
| ParseType(ClassFinalizer::kCanonicalizeWellFormed, allow_deferred_type)); |
| // In case the type is malformed, throw a dynamic type error after finishing |
| // parsing the instance creation expression. |
| if (!type.IsMalformed() && (type.IsTypeParameter() || type.IsDynamicType())) { |
| // Replace the type with a malformed type. |
| type = ClassFinalizer::NewFinalizedMalformedType( |
| - Error::Handle(), // No previous error. |
| + Error::Handle(isolate()), // No previous error. |
| script_, |
| type_pos, |
| "%s'%s' cannot be instantiated", |
| type.IsTypeParameter() ? "type parameter " : "", |
| type.IsTypeParameter() ? |
| - String::Handle(type.UserVisibleName()).ToCString() : "dynamic"); |
| + String::Handle(isolate(), type.UserVisibleName()).ToCString() : |
| + "dynamic"); |
| } |
| // The grammar allows for an optional ('.' identifier)? after the type, which |
| @@ -10067,15 +10112,15 @@ |
| // malbounded type or report a compile-time error if the constructor is const. |
| if (type.IsMalformedOrMalbounded()) { |
| if (is_const) { |
| - const Error& error = Error::Handle(type.error()); |
| + const Error& error = Error::Handle(isolate(), type.error()); |
| ErrorMsg(error); |
| } |
| return ThrowTypeError(type_pos, type); |
| } |
| // Resolve the type and optional identifier to a constructor or factory. |
| - Class& type_class = Class::Handle(type.type_class()); |
| - String& type_class_name = String::Handle(type_class.Name()); |
| + Class& type_class = Class::Handle(isolate(), type.type_class()); |
| + String& type_class_name = String::Handle(isolate(), type_class.Name()); |
| TypeArguments& type_arguments = |
| TypeArguments::ZoneHandle(type.arguments()); |
| @@ -10102,13 +10147,13 @@ |
| // compile-time error if the constructor is const. |
| if (is_const) { |
| type = ClassFinalizer::NewFinalizedMalformedType( |
| - Error::Handle(), // No previous error. |
| + Error::Handle(isolate()), // No previous error. |
| script_, |
| call_pos, |
| "class '%s' has no constructor or factory named '%s'", |
| - String::Handle(type_class.Name()).ToCString(), |
| + String::Handle(isolate(), type_class.Name()).ToCString(), |
| external_constructor_name.ToCString()); |
| - ErrorMsg(Error::Handle(type.error())); |
| + ErrorMsg(Error::Handle(isolate(), type.error())); |
| } |
| return ThrowNoSuchMethodError(call_pos, |
| type_class, |
| @@ -10119,12 +10164,13 @@ |
| &constructor); |
| } else if (constructor.IsRedirectingFactory()) { |
| ClassFinalizer::ResolveRedirectingFactory(type_class, constructor); |
| - Type& redirect_type = Type::Handle(constructor.RedirectionType()); |
| + Type& redirect_type = Type::Handle(isolate(), |
| + constructor.RedirectionType()); |
| if (!redirect_type.IsMalformedOrMalbounded() && |
| !redirect_type.IsInstantiated()) { |
| // The type arguments of the redirection type are instantiated from the |
| // type arguments of the parsed type of the 'new' or 'const' expression. |
| - Error& error = Error::Handle(); |
| + Error& error = Error::Handle(isolate()); |
| redirect_type ^= redirect_type.InstantiateFrom(type_arguments, &error); |
| if (!error.IsNull()) { |
| redirect_type = ClassFinalizer::NewFinalizedMalformedType( |
| @@ -10132,12 +10178,13 @@ |
| script_, |
| call_pos, |
| "redirecting factory type '%s' cannot be instantiated", |
| - String::Handle(redirect_type.UserVisibleName()).ToCString()); |
| + String::Handle(isolate(), |
| + redirect_type.UserVisibleName()).ToCString()); |
| } |
| } |
| if (redirect_type.IsMalformedOrMalbounded()) { |
| if (is_const) { |
| - ErrorMsg(Error::Handle(redirect_type.error())); |
| + ErrorMsg(Error::Handle(isolate(), redirect_type.error())); |
| } |
| return ThrowTypeError(redirect_type.token_pos(), redirect_type); |
| } |
| @@ -10164,14 +10211,15 @@ |
| ASSERT(!constructor.IsNull()); |
| if (type_class.is_abstract() && !constructor.IsFactory()) { |
| // Evaluate arguments before throwing. |
| - LetNode* result = new LetNode(call_pos); |
| + LetNode* result = new(isolate()) LetNode(call_pos); |
| for (intptr_t i = 0; i < arguments->length(); ++i) { |
| result->AddNode(arguments->NodeAt(i)); |
| } |
| - ArgumentListNode* error_arguments = new ArgumentListNode(type_pos); |
| - error_arguments->Add(new LiteralNode( |
| + ArgumentListNode* error_arguments = |
| + new(isolate()) ArgumentListNode(type_pos); |
| + error_arguments->Add(new(isolate()) LiteralNode( |
| TokenPos(), Integer::ZoneHandle(Integer::New(type_pos)))); |
| - error_arguments->Add(new LiteralNode( |
| + error_arguments->Add(new(isolate()) LiteralNode( |
| TokenPos(), String::ZoneHandle(type_class_name.raw()))); |
| result->AddNode( |
| MakeStaticCall(Symbols::AbstractClassInstantiationError(), |
| @@ -10179,7 +10227,7 @@ |
| error_arguments)); |
| return result; |
| } |
| - String& error_message = String::Handle(); |
| + String& error_message = String::Handle(isolate()); |
| if (!constructor.AreValidArguments(arguments_length, |
| arguments->names(), |
| &error_message)) { |
| @@ -10190,7 +10238,7 @@ |
| "invalid arguments passed to constructor '%s' " |
| "for class '%s': %s", |
| external_constructor_name.ToCString(), |
| - String::Handle(type_class.Name()).ToCString(), |
| + String::Handle(isolate(), type_class.Name()).ToCString(), |
| error_message.ToCString()); |
| } |
| return ThrowNoSuchMethodError(call_pos, |
| @@ -10206,7 +10254,7 @@ |
| // compile-time error if the constructor is const. |
| if (type.IsMalformedOrMalbounded()) { |
| if (is_const) { |
| - ErrorMsg(Error::Handle(type.error())); |
| + ErrorMsg(Error::Handle(isolate(), type.error())); |
| } |
| return ThrowTypeError(type_pos, type); |
| } |
| @@ -10221,7 +10269,7 @@ |
| "const object creation", |
| external_constructor_name.ToCString()); |
| } |
| - const Object& constructor_result = Object::Handle( |
| + const Object& constructor_result = Object::Handle(isolate(), |
| EvaluateConstConstructorCall(type_class, |
| type_arguments, |
| constructor, |
| @@ -10235,23 +10283,24 @@ |
| } else { |
| // Const constructors can return null in the case where a const native |
| // factory returns a null value. Thus we cannot use a Instance::Cast here. |
| - Instance& const_instance = Instance::Handle(); |
| + Instance& const_instance = Instance::Handle(isolate()); |
| const_instance ^= constructor_result.raw(); |
| - new_object = new LiteralNode(new_pos, |
| + new_object = new(isolate()) LiteralNode(new_pos, |
| Instance::ZoneHandle(const_instance.raw())); |
| if (!type_bound.IsNull()) { |
| ASSERT(!type_bound.IsMalformed()); |
| - Error& malformed_error = Error::Handle(); |
| + Error& malformed_error = Error::Handle(isolate()); |
| ASSERT(!is_top_level_); // We cannot check unresolved types. |
| if (!const_instance.IsInstanceOf(type_bound, |
| - TypeArguments::Handle(), |
| + TypeArguments::Handle(isolate()), |
| &malformed_error)) { |
| type_bound = ClassFinalizer::NewFinalizedMalformedType( |
| malformed_error, |
| script_, |
| new_pos, |
| "const factory result is not an instance of '%s'", |
| - String::Handle(type_bound.UserVisibleName()).ToCString()); |
| + String::Handle(isolate(), |
| + type_bound.UserVisibleName()).ToCString()); |
| new_object = ThrowTypeError(new_pos, type_bound); |
| } |
| type_bound = AbstractType::null(); |
| @@ -10271,10 +10320,8 @@ |
| new_pos, type_arguments, constructor, arguments); |
| } |
| if (!type_bound.IsNull()) { |
| - new_object = new AssignableNode(new_pos, |
| - new_object, |
| - type_bound, |
| - Symbols::FactoryResult()); |
| + new_object = new(isolate()) AssignableNode( |
| + new_pos, new_object, type_bound, Symbols::FactoryResult()); |
| } |
| return new_object; |
| } |
| @@ -10332,7 +10379,7 @@ |
| (l1_token != Token::kINTERPOL_VAR) && |
| (l1_token != Token::kINTERPOL_START)) { |
| // Common case: no interpolation. |
| - primary = new LiteralNode(literal_start, *CurrentLiteral()); |
| + primary = new(isolate()) LiteralNode(literal_start, *CurrentLiteral()); |
| ConsumeToken(); |
| return primary; |
| } |
| @@ -10344,7 +10391,8 @@ |
| if (CurrentLiteral()->Length() > 0) { |
| // Only add non-empty string sections to the values list |
| // that will be concatenated. |
| - values_list.Add(new LiteralNode(TokenPos(), *CurrentLiteral())); |
| + values_list.Add(new(isolate()) LiteralNode(TokenPos(), |
| + *CurrentLiteral())); |
| } |
| ConsumeToken(); |
| while ((CurrentToken() == Token::kINTERPOL_VAR) || |
| @@ -10378,7 +10426,8 @@ |
| const_expr->IsBool() || |
| const_expr->IsNull())) { |
| // Change expr into a literal. |
| - expr = new LiteralNode(expr_pos, EvaluateConstExpr(expr_pos, expr)); |
| + expr = new(isolate()) LiteralNode(expr_pos, |
| + EvaluateConstExpr(expr_pos, expr)); |
| } else { |
| is_compiletime_const = false; |
| } |
| @@ -10388,9 +10437,11 @@ |
| } |
| if (is_compiletime_const) { |
| if (has_interpolation) { |
| - primary = new LiteralNode(literal_start, Interpolate(values_list)); |
| + primary = new(isolate()) LiteralNode( |
| + literal_start, Interpolate(values_list)); |
| } else { |
| - const Array& strings = Array::Handle(Array::New(values_list.length())); |
| + const Array& strings = Array::Handle(isolate(), |
| + Array::New(values_list.length())); |
| for (int i = 0; i < values_list.length(); i++) { |
| const Instance& part = values_list[i]->AsLiteralNode()->literal(); |
| ASSERT(part.IsString()); |
| @@ -10398,14 +10449,14 @@ |
| } |
| String& lit = String::ZoneHandle(String::ConcatAll(strings, Heap::kOld)); |
| lit = Symbols::New(lit); |
| - primary = new LiteralNode(literal_start, lit); |
| + primary = new(isolate()) LiteralNode(literal_start, lit); |
| } |
| } else { |
| - ArrayNode* values = new ArrayNode( |
| + ArrayNode* values = new(isolate()) ArrayNode( |
| TokenPos(), |
| Type::ZoneHandle(Type::ArrayType()), |
| values_list); |
| - primary = new StringInterpolateNode(TokenPos(), values); |
| + primary = new(isolate()) StringInterpolateNode(TokenPos(), values); |
| } |
| return primary; |
| } |
| @@ -10434,7 +10485,7 @@ |
| TypeParameter& type_param = TypeParameter::ZoneHandle( |
| current_class().LookupTypeParameter(*(qual_ident.ident))); |
| if (!type_param.IsNull()) { |
| - return new PrimaryNode(qual_ident.ident_pos, type_param); |
| + return new(isolate()) PrimaryNode(qual_ident.ident_pos, type_param); |
| } |
| } |
| // This is a non-local unqualified identifier so resolve the |
| @@ -10462,7 +10513,8 @@ |
| // let ParseSelectors() handle the loadLibrary call. |
| SetPosition(qual_ident_pos); |
| ConsumeToken(); // Prefix name. |
| - primary = new LiteralNode(qual_ident_pos, *qual_ident.lib_prefix); |
| + primary = new(isolate()) LiteralNode( |
| + qual_ident_pos, *qual_ident.lib_prefix); |
| } else { |
| // TODO(hausner): Ideally we should generate the NoSuchMethodError |
| // later, when we know more about how the unresolved name is used. |
| @@ -10498,20 +10550,20 @@ |
| if (local == NULL) { |
| ErrorMsg("receiver 'this' is not in scope"); |
| } |
| - primary = new LoadLocalNode(TokenPos(), local); |
| + primary = new(isolate()) LoadLocalNode(TokenPos(), local); |
| ConsumeToken(); |
| } else if (CurrentToken() == Token::kINTEGER) { |
| const Integer& literal = Integer::ZoneHandle(CurrentIntegerLiteral()); |
| - primary = new LiteralNode(TokenPos(), literal); |
| + primary = new(isolate()) LiteralNode(TokenPos(), literal); |
| ConsumeToken(); |
| } else if (CurrentToken() == Token::kTRUE) { |
| - primary = new LiteralNode(TokenPos(), Bool::True()); |
| + primary = new(isolate()) LiteralNode(TokenPos(), Bool::True()); |
| ConsumeToken(); |
| } else if (CurrentToken() == Token::kFALSE) { |
| - primary = new LiteralNode(TokenPos(), Bool::False()); |
| + primary = new(isolate()) LiteralNode(TokenPos(), Bool::False()); |
| ConsumeToken(); |
| } else if (CurrentToken() == Token::kNULL) { |
| - primary = new LiteralNode(TokenPos(), Instance::ZoneHandle()); |
| + primary = new(isolate()) LiteralNode(TokenPos(), Instance::ZoneHandle()); |
| ConsumeToken(); |
| } else if (CurrentToken() == Token::kLPAREN) { |
| ConsumeToken(); |
| @@ -10524,7 +10576,7 @@ |
| if (double_value.IsNull()) { |
| ErrorMsg("invalid double literal"); |
| } |
| - primary = new LiteralNode(TokenPos(), double_value); |
| + primary = new(isolate()) LiteralNode(TokenPos(), double_value); |
| ConsumeToken(); |
| } else if (CurrentToken() == Token::kSTRING) { |
| primary = ParseStringLiteral(true); |
| @@ -10557,13 +10609,13 @@ |
| } |
| if (current_class().SuperClass() == Class::null()) { |
| ErrorMsg("class '%s' does not have a superclass", |
| - String::Handle(current_class().Name()).ToCString()); |
| + String::Handle(isolate(), current_class().Name()).ToCString()); |
| } |
| if (current_class().IsMixinApplication()) { |
| - const Type& mixin_type = Type::Handle(current_class().mixin()); |
| + const Type& mixin_type = Type::Handle(isolate(), current_class().mixin()); |
| if (mixin_type.type_class() == current_function().origin()) { |
| ErrorMsg("method of mixin class '%s' may not refer to 'super'", |
| - String::Handle(Class::Handle( |
| + String::Handle(isolate(), Class::Handle(isolate(), |
| current_function().origin()).Name()).ToCString()); |
| } |
| } |
| @@ -10583,7 +10635,7 @@ |
| (CurrentToken() == Token::kNE)) { |
| primary = ParseSuperOperator(); |
| } else { |
| - primary = new PrimaryNode(super_pos, Symbols::Super()); |
| + primary = new(isolate()) PrimaryNode(super_pos, Symbols::Super()); |
| } |
| } else { |
| UnexpectedToken(); |
| @@ -10610,14 +10662,15 @@ |
| return Instance::ZoneHandle(field.value()); |
| } else { |
| ASSERT(expr->EvalConstExpr() != NULL); |
| - ReturnNode* ret = new ReturnNode(expr->token_pos(), expr); |
| + ReturnNode* ret = new(isolate()) ReturnNode(expr->token_pos(), expr); |
| // Compile time constant expressions cannot reference anything from a |
| // local scope. |
| - LocalScope* empty_scope = new LocalScope(NULL, 0, 0); |
| - SequenceNode* seq = new SequenceNode(expr->token_pos(), empty_scope); |
| + LocalScope* empty_scope = new(isolate()) LocalScope(NULL, 0, 0); |
| + SequenceNode* seq = new(isolate()) SequenceNode(expr->token_pos(), |
| + empty_scope); |
| seq->Add(ret); |
| - Object& result = Object::Handle(Compiler::ExecuteOnce(seq)); |
| + Object& result = Object::Handle(isolate(), Compiler::ExecuteOnce(seq)); |
| if (result.IsError()) { |
| AppendErrorMsg(Error::Cast(result), |
| expr_pos, |