| Index: runtime/vm/parser.cc
|
| diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
|
| index 3581662c14f696f979b44ba1988a2f582f1766d9..5057e239cb8c70f9a88534e1103f8ccd5b2af625 100644
|
| --- a/runtime/vm/parser.cc
|
| +++ b/runtime/vm/parser.cc
|
| @@ -186,7 +186,7 @@ void ParsedFunction::EnsureFinallyReturnTemp(bool is_async) {
|
| if (!has_finally_return_temp_var()) {
|
| LocalVariable* temp = new(Z) LocalVariable(
|
| function_.token_pos(),
|
| - String::ZoneHandle(Z, Symbols::New(":finally_ret_val")),
|
| + Symbols::FinallyRetVal(),
|
| Object::dynamic_type());
|
| ASSERT(temp != NULL);
|
| temp->set_is_final();
|
| @@ -1233,7 +1233,7 @@ ParsedFunction* Parser::ParseStaticFieldInitializer(const Field& field) {
|
|
|
| const String& field_name = String::Handle(zone, field.name());
|
| String& init_name = String::Handle(zone,
|
| - Symbols::FromConcat(Symbols::InitPrefix(), field_name));
|
| + Symbols::FromConcat(thread, Symbols::InitPrefix(), field_name));
|
|
|
| const Script& script = Script::Handle(zone, field.Script());
|
| Object& initializer_owner = Object::Handle(field.Owner());
|
| @@ -1574,7 +1574,7 @@ void Parser::BuildDispatcherScope(const Function& func,
|
| ParamDesc p;
|
| char name[64];
|
| OS::SNPrint(name, 64, ":p%" Pd, i);
|
| - p.name = &String::ZoneHandle(Z, Symbols::New(name));
|
| + p.name = &String::ZoneHandle(Z, Symbols::New(T, name));
|
| p.type = &Object::dynamic_type();
|
| params.parameters->Add(p);
|
| params.num_fixed_parameters++;
|
| @@ -1688,7 +1688,7 @@ SequenceNode* Parser::ParseInvokeFieldDispatcher(const Function& func) {
|
| function_object = receiver;
|
| } else {
|
| const String& getter_name = String::ZoneHandle(Z,
|
| - Symbols::New(String::Handle(Z, Field::GetterSymbol(name))));
|
| + Field::GetterSymbol(name));
|
| function_object = new(Z) InstanceCallNode(
|
| token_pos, receiver, getter_name, no_args);
|
| }
|
| @@ -2091,7 +2091,7 @@ RawFunction* Parser::GetSuperFunction(TokenPosition token_pos,
|
| String::Handle(Z, current_class().Name()).ToCString());
|
| }
|
| Function& super_func = Function::Handle(Z,
|
| - Resolver::ResolveDynamicAnyArgs(super_class, name));
|
| + Resolver::ResolveDynamicAnyArgs(Z, super_class, name));
|
| if (!super_func.IsNull() &&
|
| !super_func.AreValidArguments(arguments->length(),
|
| arguments->names(),
|
| @@ -2099,13 +2099,13 @@ RawFunction* Parser::GetSuperFunction(TokenPosition token_pos,
|
| super_func = Function::null();
|
| } else if (super_func.IsNull() && resolve_getter) {
|
| const String& getter_name = String::ZoneHandle(Z, Field::GetterName(name));
|
| - super_func = Resolver::ResolveDynamicAnyArgs(super_class, getter_name);
|
| + super_func = Resolver::ResolveDynamicAnyArgs(Z, super_class, getter_name);
|
| ASSERT(super_func.IsNull() ||
|
| (super_func.kind() != RawFunction::kImplicitStaticFinalGetter));
|
| }
|
| if (super_func.IsNull()) {
|
| - super_func =
|
| - Resolver::ResolveDynamicAnyArgs(super_class, Symbols::NoSuchMethod());
|
| + super_func = Resolver::ResolveDynamicAnyArgs(Z,
|
| + super_class, Symbols::NoSuchMethod());
|
| ASSERT(!super_func.IsNull());
|
| *is_no_such_method = true;
|
| } else {
|
| @@ -2239,8 +2239,7 @@ AstNode* Parser::BuildUnarySuperOperator(Token::Kind op, PrimaryNode* super) {
|
| if ((op == Token::kNEGATE) ||
|
| (op == Token::kBIT_NOT)) {
|
| // Resolve the operator function in the superclass.
|
| - const String& operator_function_name =
|
| - String::ZoneHandle(Z, Symbols::New(Token::Str(op)));
|
| + const String& operator_function_name = Symbols::Token(op);
|
| ArgumentListNode* op_arguments = new ArgumentListNode(super_pos);
|
| AstNode* receiver = LoadReceiver(super_pos);
|
| op_arguments->Add(receiver);
|
| @@ -2300,8 +2299,7 @@ AstNode* Parser::ParseSuperOperator() {
|
| op_arguments->Add(other_operand);
|
|
|
| // Resolve the operator function in the superclass.
|
| - const String& operator_function_name =
|
| - String::ZoneHandle(Z, Symbols::New(Token::Str(op)));
|
| + const String& operator_function_name = Symbols::Token(op);
|
| const bool kResolveGetter = false;
|
| bool is_no_such_method = false;
|
| const Function& super_operator = Function::ZoneHandle(Z,
|
| @@ -2359,14 +2357,15 @@ AstNode* Parser::ParseSuperFieldAccess(const String& field_name,
|
| String::ZoneHandle(Z, Field::LookupGetterSymbol(field_name));
|
| Function& super_getter = Function::ZoneHandle(Z);
|
| if (!getter_name.IsNull()) {
|
| - super_getter = Resolver::ResolveDynamicAnyArgs(super_class, getter_name);
|
| + super_getter = Resolver::ResolveDynamicAnyArgs(Z, super_class, getter_name);
|
| }
|
| if (super_getter.IsNull()) {
|
| const String& setter_name =
|
| String::ZoneHandle(Z, Field::LookupSetterSymbol(field_name));
|
| Function& super_setter = Function::ZoneHandle(Z);
|
| if (!setter_name.IsNull()) {
|
| - super_setter = Resolver::ResolveDynamicAnyArgs(super_class, setter_name);
|
| + super_setter = Resolver::ResolveDynamicAnyArgs(Z,
|
| + super_class, setter_name);
|
| }
|
| if (super_setter.IsNull()) {
|
| // Check if this is an access to an implicit closure using 'super'.
|
| @@ -2374,7 +2373,7 @@ AstNode* Parser::ParseSuperFieldAccess(const String& field_name,
|
| // accessing it as a getter, at runtime we will handle this by
|
| // creating an implicit closure of the function and returning it.
|
| const Function& super_function = Function::ZoneHandle(Z,
|
| - Resolver::ResolveDynamicAnyArgs(super_class, field_name));
|
| + Resolver::ResolveDynamicAnyArgs(Z, super_class, field_name));
|
| if (!super_function.IsNull()) {
|
| // In case CreateAssignmentNode is called later on this
|
| // CreateImplicitClosureNode, it will be replaced by a StaticSetterNode.
|
| @@ -2406,7 +2405,7 @@ StaticCallNode* Parser::GenerateSuperConstructorCall(
|
| return NULL;
|
| }
|
| String& super_ctor_name = String::Handle(Z, super_class.Name());
|
| - super_ctor_name = Symbols::FromConcat(super_ctor_name, Symbols::Dot());
|
| + super_ctor_name = Symbols::FromDot(T, super_ctor_name);
|
|
|
| ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
|
| // Implicit 'this' parameter is the first argument.
|
| @@ -2426,8 +2425,8 @@ StaticCallNode* Parser::GenerateSuperConstructorCall(
|
| // Generating a forwarding call to a named constructor 'C.n'.
|
| // Add the constructor name 'n' to the super constructor.
|
| const intptr_t kLen = class_name.Length() + 1;
|
| - ctor_name = Symbols::New(ctor_name, kLen, ctor_name.Length() - kLen);
|
| - super_ctor_name = Symbols::FromConcat(super_ctor_name, ctor_name);
|
| + ctor_name = Symbols::New(T, ctor_name, kLen, ctor_name.Length() - kLen);
|
| + super_ctor_name = Symbols::FromConcat(T, super_ctor_name, ctor_name);
|
| }
|
| }
|
|
|
| @@ -2465,10 +2464,10 @@ StaticCallNode* Parser::ParseSuperInitializer(const Class& cls,
|
| const Class& super_class = Class::Handle(Z, cls.SuperClass());
|
| ASSERT(!super_class.IsNull());
|
| String& ctor_name = String::Handle(Z, super_class.Name());
|
| - ctor_name = Symbols::FromConcat(ctor_name, Symbols::Dot());
|
| + ctor_name = String::Concat(ctor_name, Symbols::Dot());
|
| if (CurrentToken() == Token::kPERIOD) {
|
| ConsumeToken();
|
| - ctor_name = Symbols::FromConcat(
|
| + ctor_name = Symbols::FromConcat(T,
|
| ctor_name, *ExpectIdentifier("constructor name expected"));
|
| }
|
| CheckToken(Token::kLPAREN, "parameter list expected");
|
| @@ -2862,7 +2861,7 @@ void Parser::ParseConstructorRedirection(const Class& cls,
|
| ConsumeToken();
|
| pieces.Add(*ExpectIdentifier("constructor name expected"));
|
| }
|
| - ctor_name = Symbols::FromConcatAll(pieces);
|
| + ctor_name = Symbols::FromConcatAll(T, pieces);
|
| CheckToken(Token::kLPAREN, "parameter list expected");
|
|
|
| ArgumentListNode* arguments = new ArgumentListNode(call_pos);
|
| @@ -3622,7 +3621,7 @@ void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
|
| // Patch up name for unary operator - so it does not clash with the
|
| // name for binary operator -.
|
| method->operator_token = Token::kNEGATE;
|
| - *method->name = Symbols::New(Token::Str(Token::kNEGATE));
|
| + *method->name = Symbols::Token(Token::kNEGATE).raw();
|
| }
|
| CheckOperatorArity(*method);
|
| }
|
| @@ -3639,7 +3638,7 @@ void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
|
| ASSERT(method->IsSetter());
|
| expected_num_parameters = (method->has_static) ? 1 : 2;
|
| method->dict_name = &String::ZoneHandle(Z,
|
| - Symbols::FromConcat(*method->name, Symbols::Equals()));
|
| + Symbols::FromConcat(T, *method->name, Symbols::Equals()));
|
| method->name = &String::ZoneHandle(Z, Field::SetterSymbol(*method->name));
|
| }
|
| if ((method->params.num_fixed_parameters != expected_num_parameters) ||
|
| @@ -3724,7 +3723,7 @@ void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
|
| pieces.Add(*ExpectIdentifier("constructor name expected"));
|
| }
|
| String& redir_name =
|
| - String::ZoneHandle(Z, Symbols::FromConcatAll(pieces));
|
| + String::ZoneHandle(Z, Symbols::FromConcatAll(T, pieces));
|
|
|
| method->redirect_name = &redir_name;
|
| CheckToken(Token::kLPAREN);
|
| @@ -4255,7 +4254,7 @@ void Parser::ParseClassMemberDefinition(ClassDesc* members,
|
| member.dict_name = ExpectIdentifier("identifier expected");
|
| to_concat.Add(*member.dict_name);
|
| }
|
| - *member.name = Symbols::FromConcatAll(to_concat);
|
| + *member.name = Symbols::FromConcatAll(T, to_concat);
|
| CheckToken(Token::kLPAREN);
|
| } else if ((CurrentToken() == Token::kGET) && !member.has_var &&
|
| (LookaheadToken(1) != Token::kLPAREN) &&
|
| @@ -4298,8 +4297,7 @@ void Parser::ParseClassMemberDefinition(ClassDesc* members,
|
| member.has_operator = true;
|
| member.kind = RawFunction::kRegularFunction;
|
| member.name_pos = this->TokenPos();
|
| - member.name =
|
| - &String::ZoneHandle(Z, Symbols::New(Token::Str(member.operator_token)));
|
| + member.name = &String::ZoneHandle(Z, Symbols::Token(member.operator_token));
|
| ConsumeToken();
|
| } else if (IsIdentifier()) {
|
| member.name = CurrentLiteral();
|
| @@ -4759,7 +4757,7 @@ void Parser::ParseEnumDefinition(const Class& cls) {
|
| if (enum_ident->CharAt(0) == '_') {
|
| *enum_ident = String::ScrubName(*enum_ident);
|
| }
|
| - enum_value_name = Symbols::FromConcat(name_prefix, *enum_ident);
|
| + enum_value_name = Symbols::FromConcat(T, name_prefix, *enum_ident);
|
| enum_names.Add(enum_value_name, Heap::kOld);
|
|
|
| ConsumeToken(); // Enum value name.
|
| @@ -4826,7 +4824,7 @@ void Parser::ParseEnumDefinition(const Class& cls) {
|
| void Parser::AddImplicitConstructor(const Class& cls) {
|
| // The implicit constructor is unnamed, has no explicit parameter.
|
| String& ctor_name = String::ZoneHandle(Z, cls.Name());
|
| - ctor_name = Symbols::FromConcat(ctor_name, Symbols::Dot());
|
| + ctor_name = Symbols::FromDot(T, ctor_name);
|
| // 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.
|
| @@ -5778,7 +5776,7 @@ void Parser::ParseLibraryName() {
|
| pieces.Add(Symbols::Dot());
|
| pieces.Add(*ExpectIdentifier("malformed library name"));
|
| }
|
| - lib_name = Symbols::FromConcatAll(pieces);
|
| + lib_name = Symbols::FromConcatAll(T, pieces);
|
| }
|
| library_.SetName(lib_name);
|
| ExpectSemicolon();
|
| @@ -6588,8 +6586,7 @@ RawFunction* Parser::OpenSyncGeneratorFunction(TokenPosition func_pos) {
|
| // Create the closure containing the body of this generator function.
|
| String& generator_name = String::Handle(Z, innermost_function().name());
|
| body_closure_name =
|
| - Symbols::NewFormatted("<%s_sync_body>", generator_name.ToCString());
|
| - body_closure_name = Symbols::New(body_closure_name);
|
| + Symbols::NewFormatted(T, "<%s_sync_body>", generator_name.ToCString());
|
| body = Function::NewClosureFunction(body_closure_name,
|
| innermost_function(),
|
| func_pos);
|
| @@ -6720,8 +6717,8 @@ RawFunction* Parser::OpenAsyncFunction(TokenPosition async_func_pos) {
|
| // Create the closure containing the body of this async function.
|
| const String& async_func_name =
|
| String::Handle(Z, innermost_function().name());
|
| - String& closure_name = String::Handle(Z,
|
| - Symbols::NewFormatted("<%s_async_body>", async_func_name.ToCString()));
|
| + String& closure_name = String::Handle(Z, Symbols::NewFormatted(T,
|
| + "<%s_async_body>", async_func_name.ToCString()));
|
| closure = Function::NewClosureFunction(
|
| closure_name,
|
| innermost_function(),
|
| @@ -6853,13 +6850,11 @@ RawFunction* Parser::OpenAsyncGeneratorFunction(
|
| // Create the closure containing the body of this async generator function.
|
| const String& async_generator_name =
|
| String::Handle(Z, innermost_function().name());
|
| - String& closure_name = String::Handle(Z,
|
| - Symbols::NewFormatted("<%s_async_gen_body>",
|
| - async_generator_name.ToCString()));
|
| - closure = Function::NewClosureFunction(
|
| - String::Handle(Z, Symbols::New(closure_name)),
|
| - innermost_function(),
|
| - async_func_pos);
|
| + const String& closure_name = String::Handle(Z, Symbols::NewFormatted(T,
|
| + "<%s_async_gen_body>", async_generator_name.ToCString()));
|
| + closure = Function::NewClosureFunction(closure_name,
|
| + innermost_function(),
|
| + async_func_pos);
|
| closure.set_is_generated_body(true);
|
| closure.set_result_type(Object::dynamic_type());
|
| is_new_closure = true;
|
| @@ -8161,10 +8156,10 @@ AstNode* Parser::ParseIfStatement(String* label_name) {
|
|
|
| // Return true if the type class of the given value implements the
|
| // == operator.
|
| -static bool ImplementsEqualOperator(const Instance& value) {
|
| +static bool ImplementsEqualOperator(Zone* zone, const Instance& value) {
|
| Class& cls = Class::Handle(value.clazz());
|
| - const Function& equal_op = Function::Handle(
|
| - Resolver::ResolveDynamicAnyArgs(cls, Symbols::EqualOperator()));
|
| + const Function& equal_op = Function::Handle(zone,
|
| + Resolver::ResolveDynamicAnyArgs(zone, cls, Symbols::EqualOperator()));
|
| ASSERT(!equal_op.IsNull());
|
| cls = equal_op.Owner();
|
| return !cls.IsObjectClass();
|
| @@ -8211,7 +8206,7 @@ RawClass* Parser::CheckCaseExpressions(
|
| // Check that the type class does not override the == operator.
|
| // Check this only in the first loop iteration since all values
|
| // are of the same type, which we check above.
|
| - if (ImplementsEqualOperator(val)) {
|
| + if (ImplementsEqualOperator(Z, val)) {
|
| ReportError(val_pos,
|
| "type class of case expression must not "
|
| "implement operator ==");
|
| @@ -8463,13 +8458,15 @@ static LocalVariable* LookupSavedTryContextVar(LocalScope* scope) {
|
| }
|
|
|
|
|
| -static LocalVariable* LookupAsyncSavedTryContextVar(LocalScope* scope,
|
| +static LocalVariable* LookupAsyncSavedTryContextVar(Thread* thread,
|
| + LocalScope* scope,
|
| uint16_t try_index) {
|
| - const String& async_saved_try_ctx_name =
|
| - String::ZoneHandle(Symbols::NewFormatted(
|
| - "%s%d",
|
| - Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
|
| - try_index));
|
| + Zone* zone = thread->zone();
|
| + const String& async_saved_try_ctx_name = String::ZoneHandle(zone,
|
| + Symbols::NewFormatted(thread,
|
| + "%s%d",
|
| + Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
|
| + try_index));
|
| LocalVariable* var = scope->LocalLookupVariable(async_saved_try_ctx_name);
|
| ASSERT(var != NULL);
|
| return var;
|
| @@ -8507,8 +8504,8 @@ void Parser::CheckAsyncOpInTryBlock(
|
| // The block declaring :saved_try_ctx_var variable is the parent of the
|
| // pushed try block.
|
| *saved_try_ctx = LookupSavedTryContextVar(scope->parent());
|
| - *async_saved_try_ctx = LookupAsyncSavedTryContextVar(async_temp_scope_,
|
| - try_index);
|
| + *async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
|
| + async_temp_scope_, try_index);
|
| if ((try_stack_->outer_try() != NULL) && !try_stack_->inside_finally()) {
|
| // Collecting the outer try scope is not necessary if we
|
| // are in a finally block.
|
| @@ -8516,8 +8513,8 @@ void Parser::CheckAsyncOpInTryBlock(
|
| try_index = try_stack_->outer_try()->try_index();
|
| if (scope->function_level() == current_function_level) {
|
| *outer_saved_try_ctx = LookupSavedTryContextVar(scope->parent());
|
| - *outer_async_saved_try_ctx =
|
| - LookupAsyncSavedTryContextVar(async_temp_scope_, try_index);
|
| + *outer_async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
|
| + async_temp_scope_, try_index);
|
| }
|
| }
|
| }
|
| @@ -8542,7 +8539,7 @@ AstNode* Parser::DartPrint(const char* str) {
|
| ASSERT(!print_fn.IsNull());
|
| ArgumentListNode* one_arg =
|
| new(Z) ArgumentListNode(TokenPosition::kNoSource);
|
| - String& msg = String::ZoneHandle(Symbols::NewFormatted("%s", str));
|
| + String& msg = String::ZoneHandle(Symbols::NewFormatted(T, "%s", str));
|
| one_arg->Add(new(Z) LiteralNode(TokenPosition::kNoSource, msg));
|
| AstNode* print_call =
|
| new(Z) StaticCallNode(TokenPosition::kNoSource, print_fn, one_arg);
|
| @@ -9202,9 +9199,8 @@ SequenceNode* Parser::EnsureFinallyClause(
|
| if (scope->function_level() == current_block_->scope->function_level()) {
|
| LocalVariable* saved_try_ctx =
|
| LookupSavedTryContextVar(scope->parent());
|
| - LocalVariable* async_saved_try_ctx =
|
| - LookupAsyncSavedTryContextVar(async_temp_scope_,
|
| - try_stack_->try_index());
|
| + LocalVariable* async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
|
| + async_temp_scope_, try_stack_->try_index());
|
| current_block_->statements->Add(
|
| new (Z) StoreLocalNode(
|
| TokenPosition::kNoSource,
|
| @@ -9475,9 +9471,8 @@ SequenceNode* Parser::ParseCatchClauses(
|
| if (scope->function_level() == current_block_->scope->function_level()) {
|
| LocalVariable* saved_try_ctx =
|
| LookupSavedTryContextVar(scope->parent());
|
| - LocalVariable* async_saved_try_ctx =
|
| - LookupAsyncSavedTryContextVar(async_temp_scope_,
|
| - try_block->try_index());
|
| + LocalVariable* async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
|
| + async_temp_scope_, try_block->try_index());
|
| async_code->Add(
|
| new (Z) StoreLocalNode(
|
| TokenPosition::kNoSource,
|
| @@ -9505,9 +9500,10 @@ SequenceNode* Parser::ParseCatchClauses(
|
|
|
| void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) {
|
| const String& async_saved_try_ctx_name = String::ZoneHandle(Z,
|
| - Symbols::NewFormatted("%s%d",
|
| - Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
|
| - last_used_try_index_ - 1));
|
| + Symbols::NewFormatted(T,
|
| + "%s%d",
|
| + Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
|
| + last_used_try_index_ - 1));
|
| LocalVariable* async_saved_try_ctx = new (Z) LocalVariable(
|
| TokenPosition::kNoSource,
|
| async_saved_try_ctx_name,
|
| @@ -10345,7 +10341,7 @@ AstNode* Parser::ThrowNoSuchMethodError(TokenPosition call_pos,
|
| }
|
| // String memberName.
|
| arguments->Add(new(Z) LiteralNode(
|
| - call_pos, String::ZoneHandle(Z, Symbols::New(function_name))));
|
| + call_pos, String::ZoneHandle(Z, Symbols::New(T, function_name))));
|
| // Smi invocation_type.
|
| if (cls.IsTopLevel()) {
|
| ASSERT(im_call == InvocationMirror::kStatic ||
|
| @@ -10513,7 +10509,7 @@ LocalVariable* Parser::CreateTempConstVariable(TokenPosition token_pos,
|
| OS::SNPrint(name, 64, ":%s%" Pd "", s, token_pos.value());
|
| LocalVariable* temp = new(Z) LocalVariable(
|
| token_pos,
|
| - String::ZoneHandle(Z, Symbols::New(name)),
|
| + String::ZoneHandle(Z, Symbols::New(T, name)),
|
| Object::dynamic_type());
|
| temp->set_is_final();
|
| current_block_->scope->AddVariable(temp);
|
| @@ -10725,7 +10721,7 @@ AstNode* Parser::CreateAssignmentNode(AstNode* original,
|
| String& name = String::ZoneHandle(Z);
|
| const Class* target_cls = ¤t_class();
|
| if (original->IsTypeNode()) {
|
| - name = Symbols::New(original->AsTypeNode()->TypeName());
|
| + name = Symbols::New(T, original->AsTypeNode()->TypeName());
|
| } else if (original->IsLoadStaticFieldNode()) {
|
| name = original->AsLoadStaticFieldNode()->field().name();
|
| target_cls = &Class::Handle(Z,
|
| @@ -11626,7 +11622,7 @@ AstNode* Parser::ParseClosurization(AstNode* primary) {
|
| is_setter_name = true;
|
| }
|
| } else if (Token::CanBeOverloaded(CurrentToken())) {
|
| - extractor_name = Symbols::New(Token::Str(CurrentToken()));
|
| + extractor_name = Symbols::Token(CurrentToken()).raw();
|
| ConsumeToken();
|
| } else {
|
| ReportError("identifier or operator expected");
|
| @@ -11753,7 +11749,7 @@ AstNode* Parser::ParseClosurization(AstNode* primary) {
|
| pieces.Add(Symbols::SetterPrefix());
|
| }
|
| pieces.Add(extractor_name);
|
| - extractor_name = Symbols::FromConcatAll(pieces);
|
| + extractor_name = Symbols::FromConcatAll(T, pieces);
|
| return new(Z) InstanceGetterNode(property_pos, primary, extractor_name);
|
| }
|
|
|
| @@ -12943,7 +12939,7 @@ AstNode* Parser::ParseMapLiteral(TokenPosition type_pos,
|
| if (!key_value.IsInteger() &&
|
| !key_value.IsString() &&
|
| (key_value.clazz() != I->object_store()->symbol_class()) &&
|
| - ImplementsEqualOperator(key_value)) {
|
| + ImplementsEqualOperator(Z, key_value)) {
|
| ReportError(key_pos, "key value must not implement operator ==");
|
| }
|
| }
|
| @@ -13141,9 +13137,9 @@ AstNode* Parser::ParseSymbolLiteral() {
|
| ConsumeToken();
|
| pieces.Add(*ExpectIdentifier("identifier expected"));
|
| }
|
| - symbol = Symbols::FromConcatAll(pieces);
|
| + symbol = Symbols::FromConcatAll(T, pieces);
|
| } else if (Token::CanBeOverloaded(CurrentToken())) {
|
| - symbol = Symbols::New(Token::Str(CurrentToken()));
|
| + symbol = Symbols::Token(CurrentToken()).raw();
|
| ConsumeToken();
|
| } else {
|
| ReportError("illegal symbol literal");
|
| @@ -13190,8 +13186,8 @@ RawFunction* Parser::BuildConstructorClosureFunction(
|
| }
|
|
|
| String& closure_name = String::Handle(Z, ctr.name());
|
| - closure_name = Symbols::FromConcat(Symbols::ConstructorClosurePrefix(),
|
| - closure_name);
|
| + closure_name = Symbols::FromConcat(T,
|
| + Symbols::ConstructorClosurePrefix(), closure_name);
|
|
|
| ParamList params;
|
| params.AddFinalParameter(token_pos,
|
| @@ -13223,17 +13219,19 @@ RawFunction* Parser::BuildConstructorClosureFunction(
|
| }
|
|
|
|
|
| -static String& BuildConstructorName(const String& type_class_name,
|
| +static String& BuildConstructorName(Thread* thread,
|
| + const String& type_class_name,
|
| const String* named_constructor) {
|
| // By convention, the static function implementing a named constructor 'C'
|
| // for class 'A' is labeled 'A.C', and the static function implementing the
|
| // unnamed constructor for class 'A' is labeled 'A.'.
|
| // This convention prevents users from explicitly calling constructors.
|
| - String& constructor_name =
|
| - String::Handle(Symbols::FromConcat(type_class_name, Symbols::Dot()));
|
| + Zone* zone = thread->zone();
|
| + String& constructor_name = String::Handle(zone,
|
| + Symbols::FromDot(thread, type_class_name));
|
| if (named_constructor != NULL) {
|
| constructor_name =
|
| - Symbols::FromConcat(constructor_name, *named_constructor);
|
| + Symbols::FromConcat(thread, constructor_name, *named_constructor);
|
| }
|
| return constructor_name;
|
| }
|
| @@ -13272,8 +13270,8 @@ void Parser::ParseConstructorClosurization(Function* constructor,
|
| Class& type_class = Class::Handle(Z, type.type_class());
|
| String& type_class_name = String::Handle(Z, type_class.Name());
|
| *type_arguments = type.arguments();
|
| - String& constructor_name =
|
| - BuildConstructorName(type_class_name, named_constructor);
|
| + String& constructor_name = BuildConstructorName(T,
|
| + type_class_name, named_constructor);
|
| *constructor = type_class.LookupConstructor(constructor_name);
|
| if (constructor->IsNull()) {
|
| *constructor = type_class.LookupFactory(constructor_name);
|
| @@ -13413,8 +13411,8 @@ AstNode* Parser::ParseNewOperator(Token::Kind op_kind) {
|
| AbstractType& type_bound = AbstractType::ZoneHandle(Z);
|
|
|
| // Make sure that an appropriate constructor exists.
|
| - String& constructor_name =
|
| - BuildConstructorName(type_class_name, named_constructor);
|
| + String& constructor_name = BuildConstructorName(T,
|
| + type_class_name, named_constructor);
|
| Function& constructor = Function::ZoneHandle(Z,
|
| type_class.LookupConstructor(constructor_name));
|
| if (constructor.IsNull()) {
|
| @@ -13682,7 +13680,7 @@ String& Parser::Interpolate(const GrowableArray<AstNode*>& values) {
|
| }
|
| String& concatenated = String::ZoneHandle(Z);
|
| concatenated ^= result.raw();
|
| - concatenated = Symbols::New(concatenated);
|
| + concatenated = Symbols::New(T, concatenated);
|
| return concatenated;
|
| }
|
|
|
| @@ -13780,7 +13778,8 @@ AstNode* Parser::ParseStringLiteral(bool allow_interpolation) {
|
| ASSERT(part.IsString());
|
| pieces.Add(String::Cast(part));
|
| }
|
| - const String& lit = String::ZoneHandle(Z, Symbols::FromConcatAll(pieces));
|
| + const String& lit = String::ZoneHandle(Z,
|
| + Symbols::FromConcatAll(T, pieces));
|
| primary = new(Z) LiteralNode(literal_start, lit);
|
| // Caching of constant not necessary because the symbol lookup will
|
| // find the value next time.
|
| @@ -13870,7 +13869,7 @@ AstNode* Parser::ParsePrimary() {
|
| pieces.Add(Symbols::Dot());
|
| pieces.Add(ident);
|
| const String& qualified_name = String::ZoneHandle(Z,
|
| - Symbols::FromConcatAll(pieces));
|
| + Symbols::FromConcatAll(T, pieces));
|
| InvocationMirror::Type call_type =
|
| CurrentToken() == Token::kLPAREN ?
|
| InvocationMirror::kMethod : InvocationMirror::kGetter;
|
| @@ -13884,9 +13883,12 @@ AstNode* Parser::ParsePrimary() {
|
| }
|
| } else if (FLAG_load_deferred_eagerly && prefix.is_deferred_load()) {
|
| // primary != NULL.
|
| - String& qualified_name = String::ZoneHandle(Z, prefix.name());
|
| - qualified_name = String::Concat(qualified_name, Symbols::Dot());
|
| - qualified_name = Symbols::FromConcat(qualified_name, ident);
|
| + GrowableHandlePtrArray<const String> pieces(Z, 3);
|
| + pieces.Add(String::Handle(Z, prefix.name()));
|
| + pieces.Add(Symbols::Dot());
|
| + pieces.Add(ident);
|
| + const String& qualified_name = String::ZoneHandle(Z,
|
| + Symbols::FromConcatAll(T, pieces));
|
| InvocationMirror::Type call_type =
|
| CurrentToken() == Token::kLPAREN ?
|
| InvocationMirror::kMethod : InvocationMirror::kGetter;
|
|
|