Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(450)

Side by Side Diff: runtime/vm/parser.cc

Issue 1569213003: Eliminate phase parameter in constructors (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/parser.h ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/parser.h" 5 #include "vm/parser.h"
6 #include "vm/flags.h" 6 #include "vm/flags.h"
7 7
8 #ifndef DART_PRECOMPILED 8 #ifndef DART_PRECOMPILED
9 9
10 #include "lib/invocation_mirror.h" 10 #include "lib/invocation_mirror.h"
(...skipping 30 matching lines...) Expand all
41 namespace dart { 41 namespace dart {
42 42
43 DEFINE_FLAG(bool, enable_debug_break, false, "Allow use of break \"message\"."); 43 DEFINE_FLAG(bool, enable_debug_break, false, "Allow use of break \"message\".");
44 DEFINE_FLAG(bool, enable_mirrors, true, 44 DEFINE_FLAG(bool, enable_mirrors, true,
45 "Disable to make importing dart:mirrors an error."); 45 "Disable to make importing dart:mirrors an error.");
46 DEFINE_FLAG(bool, load_deferred_eagerly, false, 46 DEFINE_FLAG(bool, load_deferred_eagerly, false,
47 "Load deferred libraries eagerly."); 47 "Load deferred libraries eagerly.");
48 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations."); 48 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations.");
49 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef."); 49 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef.");
50 DEFINE_FLAG(bool, link_natives_lazily, false, "Link native calls lazily"); 50 DEFINE_FLAG(bool, link_natives_lazily, false, "Link native calls lazily");
51 DEFINE_FLAG(bool, move_super, true, "Move super initializer to end of list.");
52 DEFINE_FLAG(bool, conditional_directives, false, 51 DEFINE_FLAG(bool, conditional_directives, false,
53 "Enable conditional directives"); 52 "Enable conditional directives");
54 DEFINE_FLAG(bool, warn_super, false, 53 DEFINE_FLAG(bool, warn_super, false,
55 "Warning if super initializer not last in initializer list."); 54 "Warning if super initializer not last in initializer list.");
56 55
57 DECLARE_FLAG(bool, lazy_dispatchers); 56 DECLARE_FLAG(bool, lazy_dispatchers);
58 DECLARE_FLAG(bool, load_deferred_eagerly); 57 DECLARE_FLAG(bool, load_deferred_eagerly);
59 DECLARE_FLAG(bool, profile_vm); 58 DECLARE_FLAG(bool, profile_vm);
60 DECLARE_FLAG(bool, throw_on_javascript_int_overflow); 59 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
61 DECLARE_FLAG(bool, warn_on_javascript_compatibility); 60 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
(...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after
945 const Script& script = Script::Handle(zone, func.script()); 944 const Script& script = Script::Handle(zone, func.script());
946 Parser parser(script, parsed_function, func.token_pos()); 945 Parser parser(script, parsed_function, func.token_pos());
947 if (tds.enabled()) { 946 if (tds.enabled()) {
948 tds.SetNumArguments(1); 947 tds.SetNumArguments(1);
949 tds.CopyArgument(0, "function", String::Handle(func.name()).ToCString()); 948 tds.CopyArgument(0, "function", String::Handle(func.name()).ToCString());
950 } 949 }
951 SequenceNode* node_sequence = NULL; 950 SequenceNode* node_sequence = NULL;
952 switch (func.kind()) { 951 switch (func.kind()) {
953 case RawFunction::kClosureFunction: 952 case RawFunction::kClosureFunction:
954 if (func.IsImplicitClosureFunction()) { 953 if (func.IsImplicitClosureFunction()) {
955 node_sequence = 954 node_sequence = parser.ParseImplicitClosure(func);
956 parser.ParseImplicitClosure(func);
957 break; 955 break;
958 } 956 }
959 if (func.IsConstructorClosureFunction()) { 957 if (func.IsConstructorClosureFunction()) {
960 node_sequence = 958 node_sequence = parser.ParseConstructorClosure(func);
961 parser.ParseConstructorClosure(func);
962 break; 959 break;
963 } 960 }
964 // Fall-through: Handle non-implicit closures. 961 // Fall-through: Handle non-implicit closures.
965 case RawFunction::kRegularFunction: 962 case RawFunction::kRegularFunction:
966 case RawFunction::kGetterFunction: 963 case RawFunction::kGetterFunction:
967 case RawFunction::kSetterFunction: 964 case RawFunction::kSetterFunction:
968 case RawFunction::kConstructor: 965 case RawFunction::kConstructor:
969 // The call to a redirecting factory is redirected. 966 // The call to a redirecting factory is redirected.
970 ASSERT(!func.IsRedirectingFactory()); 967 ASSERT(!func.IsRedirectingFactory());
971 if (!func.IsImplicitConstructor()) { 968 if (!func.IsImplicitConstructor()) {
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
1364 SequenceNode* Parser::ParseConstructorClosure(const Function& func) { 1361 SequenceNode* Parser::ParseConstructorClosure(const Function& func) {
1365 TRACE_PARSER("ParseConstructorClosure"); 1362 TRACE_PARSER("ParseConstructorClosure");
1366 const intptr_t token_pos = func.token_pos(); 1363 const intptr_t token_pos = func.token_pos();
1367 1364
1368 Function& constructor = Function::ZoneHandle(Z); 1365 Function& constructor = Function::ZoneHandle(Z);
1369 TypeArguments& type_args = TypeArguments::ZoneHandle(Z); 1366 TypeArguments& type_args = TypeArguments::ZoneHandle(Z);
1370 ParseConstructorClosurization(&constructor, &type_args); 1367 ParseConstructorClosurization(&constructor, &type_args);
1371 ASSERT(!constructor.IsNull()); 1368 ASSERT(!constructor.IsNull());
1372 1369
1373 ParamList params; 1370 ParamList params;
1374 // The first parameter of the closure function is the implicit closure 1371 // The first parameter of the closure function is the
1375 // argument. 1372 // implicit closure argument.
1376 params.AddFinalParameter(token_pos, 1373 params.AddFinalParameter(token_pos,
1377 &Symbols::ClosureParameter(), 1374 &Symbols::ClosureParameter(),
1378 &Object::dynamic_type()); 1375 &Object::dynamic_type());
1379 bool params_ok = ParseFormalParameters(constructor, &params); 1376 bool params_ok = ParseFormalParameters(constructor, &params);
1380 USE(params_ok); 1377 USE(params_ok);
1381 ASSERT(params_ok); 1378 ASSERT(params_ok);
1382 // Per language spec, the type of the closure parameters is dynamic. 1379 // Per language spec, the type of the closure parameters is dynamic.
1383 // Replace the types parsed from the constructor. 1380 // Replace the types parsed from the constructor.
1384 params.EraseParameterTypes(); 1381 params.EraseParameterTypes();
1385 1382
(...skipping 981 matching lines...) Expand 10 before | Expand all | Expand 10 after
2367 } 2364 }
2368 return new(Z) StaticGetterNode( 2365 return new(Z) StaticGetterNode(
2369 field_pos, implicit_argument, super_class, field_name); 2366 field_pos, implicit_argument, super_class, field_name);
2370 } 2367 }
2371 2368
2372 2369
2373 StaticCallNode* Parser::GenerateSuperConstructorCall( 2370 StaticCallNode* Parser::GenerateSuperConstructorCall(
2374 const Class& cls, 2371 const Class& cls,
2375 intptr_t supercall_pos, 2372 intptr_t supercall_pos,
2376 LocalVariable* receiver, 2373 LocalVariable* receiver,
2377 AstNode* phase_parameter,
2378 ArgumentListNode* forwarding_args) { 2374 ArgumentListNode* forwarding_args) {
2379 const Class& super_class = Class::Handle(Z, cls.SuperClass()); 2375 const Class& super_class = Class::Handle(Z, cls.SuperClass());
2380 // Omit the implicit super() if there is no super class (i.e. 2376 // Omit the implicit super() if there is no super class (i.e.
2381 // we're not compiling class Object), or if the super class is an 2377 // we're not compiling class Object), or if the super class is an
2382 // artificially generated "wrapper class" that has no constructor. 2378 // artificially generated "wrapper class" that has no constructor.
2383 if (super_class.IsNull() || 2379 if (super_class.IsNull() ||
2384 (super_class.num_native_fields() > 0 && 2380 (super_class.num_native_fields() > 0 &&
2385 Class::Handle(Z, super_class.SuperClass()).IsObjectClass())) { 2381 Class::Handle(Z, super_class.SuperClass()).IsObjectClass())) {
2386 return NULL; 2382 return NULL;
2387 } 2383 }
2388 String& super_ctor_name = String::Handle(Z, super_class.Name()); 2384 String& super_ctor_name = String::Handle(Z, super_class.Name());
2389 super_ctor_name = Symbols::FromConcat(super_ctor_name, Symbols::Dot()); 2385 super_ctor_name = Symbols::FromConcat(super_ctor_name, Symbols::Dot());
2390 2386
2391 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos); 2387 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
2392 // Implicit 'this' parameter is the first argument. 2388 // Implicit 'this' parameter is the first argument.
2393 AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver); 2389 AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver);
2394 arguments->Add(implicit_argument); 2390 arguments->Add(implicit_argument);
2395 // Implicit construction phase parameter is second argument.
2396 arguments->Add(phase_parameter);
2397 2391
2398 // If this is a super call in a forwarding constructor, add the user- 2392 // If this is a super call in a forwarding constructor, add the user-
2399 // defined arguments to the super call and adjust the the super 2393 // defined arguments to the super call and adjust the the super
2400 // constructor name to the respective named constructor if necessary. 2394 // constructor name to the respective named constructor if necessary.
2401 if (forwarding_args != NULL) { 2395 if (forwarding_args != NULL) {
2402 for (int i = 0; i < forwarding_args->length(); i++) { 2396 for (int i = 0; i < forwarding_args->length(); i++) {
2403 arguments->Add(forwarding_args->NodeAt(i)); 2397 arguments->Add(forwarding_args->NodeAt(i));
2404 } 2398 }
2405 String& ctor_name = String::Handle(Z, current_function().name()); 2399 String& ctor_name = String::Handle(Z, current_function().name());
2406 String& class_name = String::Handle(Z, cls.Name()); 2400 String& class_name = String::Handle(Z, cls.Name());
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2452 ConsumeToken(); 2446 ConsumeToken();
2453 ctor_name = Symbols::FromConcat( 2447 ctor_name = Symbols::FromConcat(
2454 ctor_name, *ExpectIdentifier("constructor name expected")); 2448 ctor_name, *ExpectIdentifier("constructor name expected"));
2455 } 2449 }
2456 CheckToken(Token::kLPAREN, "parameter list expected"); 2450 CheckToken(Token::kLPAREN, "parameter list expected");
2457 2451
2458 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos); 2452 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
2459 // 'this' parameter is the first argument to super class constructor. 2453 // 'this' parameter is the first argument to super class constructor.
2460 AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver); 2454 AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver);
2461 arguments->Add(implicit_argument); 2455 arguments->Add(implicit_argument);
2462 // Second implicit parameter is the construction phase. We optimistically 2456
2463 // assume that we can execute both the super initializer and the super
2464 // constructor body. We may later change this to only execute the
2465 // super initializer.
2466 AstNode* phase_parameter =
2467 new LiteralNode(supercall_pos,
2468 Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseAll)));
2469 arguments->Add(phase_parameter);
2470 // 'this' parameter must not be accessible to the other super call arguments. 2457 // 'this' parameter must not be accessible to the other super call arguments.
2471 receiver->set_invisible(true); 2458 receiver->set_invisible(true);
2472 ParseActualParameters(arguments, kAllowConst); 2459 ParseActualParameters(arguments, kAllowConst);
2473 receiver->set_invisible(false); 2460 receiver->set_invisible(false);
2474 2461
2475 // Resolve the constructor. 2462 // Resolve the constructor.
2476 const Function& super_ctor = Function::ZoneHandle(Z, 2463 const Function& super_ctor = Function::ZoneHandle(Z,
2477 super_class.LookupConstructor(ctor_name)); 2464 super_class.LookupConstructor(ctor_name));
2478 if (super_ctor.IsNull()) { 2465 if (super_ctor.IsNull()) {
2479 ReportError(supercall_pos, 2466 ReportError(supercall_pos,
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
2787 AstNode* init_statement = 2774 AstNode* init_statement =
2788 ParseInitializer(cls, receiver, initialized_fields); 2775 ParseInitializer(cls, receiver, initialized_fields);
2789 super_init_is_last = false; 2776 super_init_is_last = false;
2790 current_block_->statements->Add(init_statement); 2777 current_block_->statements->Add(init_statement);
2791 } 2778 }
2792 } while (CurrentToken() == Token::kCOMMA); 2779 } while (CurrentToken() == Token::kCOMMA);
2793 } 2780 }
2794 if (super_init_call == NULL) { 2781 if (super_init_call == NULL) {
2795 // Generate implicit super() if we haven't seen an explicit super call 2782 // Generate implicit super() if we haven't seen an explicit super call
2796 // or constructor redirection. 2783 // or constructor redirection.
2797 AstNode* phase_parameter = new LiteralNode( 2784 super_init_call =
2798 TokenPos(), Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseAll))); 2785 GenerateSuperConstructorCall(cls, TokenPos(), receiver, NULL);
2799 super_init_call = GenerateSuperConstructorCall(
2800 cls, TokenPos(), receiver, phase_parameter, NULL);
2801 if (super_init_call != NULL) { 2786 if (super_init_call != NULL) {
2802 super_init_index = current_block_->statements->length(); 2787 super_init_index = current_block_->statements->length();
2803 current_block_->statements->Add(super_init_call); 2788 current_block_->statements->Add(super_init_call);
2804 super_init_is_last = true; 2789 super_init_is_last = true;
2805 } 2790 }
2806 } 2791 }
2807 if (FLAG_move_super && (super_init_call != NULL) && !super_init_is_last) { 2792 if ((super_init_call != NULL) && !super_init_is_last) {
2808 // If the super initializer call is not at the end of the initializer 2793 // If the super initializer call is not at the end of the initializer
2809 // list, implicitly move it to the end. The actual parameter values 2794 // list, implicitly move it to the end. The actual parameter values
2810 // are evaluated at the original position in the list and preserved 2795 // are evaluated at the original position in the list and preserved
2811 // in temporary variables. (The following initializer expressions 2796 // in temporary variables. (The following initializer expressions
2812 // could have side effects that alter the arguments to the super 2797 // could have side effects that alter the arguments to the super
2813 // initializer.) E.g: 2798 // initializer.) E.g:
2814 // A(x) : super(x), f = x++ { ... } 2799 // A(x) : super(x), f = x++ { ... }
2815 // is transformed to: 2800 // is transformed to:
2816 // A(x) : temp = x, f = x++, super(temp) { ... } 2801 // A(x) : temp = x, f = x++, super(temp) { ... }
2817 if (FLAG_warn_super) { 2802 if (FLAG_warn_super) {
2818 ReportWarning("Super initializer not at end"); 2803 ReportWarning("Super initializer not at end");
2819 } 2804 }
2820 ASSERT(super_init_index >= 0); 2805 ASSERT(super_init_index >= 0);
2821 ArgumentListNode* ctor_args = super_init_call->arguments(); 2806 ArgumentListNode* ctor_args = super_init_call->arguments();
2822 LetNode* saved_args = new(Z) LetNode(super_init_call->token_pos()); 2807 LetNode* saved_args = new(Z) LetNode(super_init_call->token_pos());
2823 // The super initializer call has at least 2 arguments: the 2808 // The super initializer call has at least 1 arguments: the
2824 // implicit receiver, and the hidden construction phase. 2809 // implicit receiver.
2825 ASSERT(ctor_args->length() >= 2); 2810 ASSERT(ctor_args->length() >= 1);
2826 for (int i = 2; i < ctor_args->length(); i++) { 2811 for (int i = 1; i < ctor_args->length(); i++) {
2827 AstNode* arg = ctor_args->NodeAt(i); 2812 AstNode* arg = ctor_args->NodeAt(i);
2828 LocalVariable* temp = CreateTempConstVariable(arg->token_pos(), "sca"); 2813 LocalVariable* temp = CreateTempConstVariable(arg->token_pos(), "sca");
2829 AstNode* save_temp = new(Z) StoreLocalNode(arg->token_pos(), temp, arg); 2814 AstNode* save_temp = new(Z) StoreLocalNode(arg->token_pos(), temp, arg);
2830 saved_args->AddNode(save_temp); 2815 saved_args->AddNode(save_temp);
2831 ctor_args->SetNodeAt(i, new(Z) LoadLocalNode(arg->token_pos(), temp)); 2816 ctor_args->SetNodeAt(i, new(Z) LoadLocalNode(arg->token_pos(), temp));
2832 } 2817 }
2833 current_block_->statements->ReplaceNodeAt(super_init_index, saved_args); 2818 current_block_->statements->ReplaceNodeAt(super_init_index, saved_args);
2834 current_block_->statements->Add(super_init_call); 2819 current_block_->statements->Add(super_init_call);
2835 } 2820 }
2836 CheckFieldsInitialized(cls); 2821 CheckFieldsInitialized(cls);
(...skipping 15 matching lines...) Expand all
2852 ConsumeToken(); 2837 ConsumeToken();
2853 pieces.Add(*ExpectIdentifier("constructor name expected")); 2838 pieces.Add(*ExpectIdentifier("constructor name expected"));
2854 } 2839 }
2855 ctor_name = Symbols::FromConcatAll(pieces); 2840 ctor_name = Symbols::FromConcatAll(pieces);
2856 CheckToken(Token::kLPAREN, "parameter list expected"); 2841 CheckToken(Token::kLPAREN, "parameter list expected");
2857 2842
2858 ArgumentListNode* arguments = new ArgumentListNode(call_pos); 2843 ArgumentListNode* arguments = new ArgumentListNode(call_pos);
2859 // 'this' parameter is the first argument to constructor. 2844 // 'this' parameter is the first argument to constructor.
2860 AstNode* implicit_argument = new LoadLocalNode(call_pos, receiver); 2845 AstNode* implicit_argument = new LoadLocalNode(call_pos, receiver);
2861 arguments->Add(implicit_argument); 2846 arguments->Add(implicit_argument);
2862 // Construction phase parameter is second argument. 2847
2863 LocalVariable* phase_param = LookupPhaseParameter();
2864 ASSERT(phase_param != NULL);
2865 AstNode* phase_argument = new LoadLocalNode(call_pos, phase_param);
2866 arguments->Add(phase_argument);
2867 receiver->set_invisible(true); 2848 receiver->set_invisible(true);
2868 ParseActualParameters(arguments, kAllowConst); 2849 ParseActualParameters(arguments, kAllowConst);
2869 receiver->set_invisible(false); 2850 receiver->set_invisible(false);
2870 // Resolve the constructor. 2851 // Resolve the constructor.
2871 const Function& redirect_ctor = Function::ZoneHandle(Z, 2852 const Function& redirect_ctor = Function::ZoneHandle(Z,
2872 cls.LookupConstructor(ctor_name)); 2853 cls.LookupConstructor(ctor_name));
2873 if (redirect_ctor.IsNull()) { 2854 if (redirect_ctor.IsNull()) {
2874 ReportError(call_pos, "constructor '%s' not found", ctor_name.ToCString()); 2855 ReportError(call_pos, "constructor '%s' not found", ctor_name.ToCString());
2875 } 2856 }
2876 String& error_message = String::Handle(Z); 2857 String& error_message = String::Handle(Z);
(...skipping 13 matching lines...) Expand all
2890 SequenceNode* Parser::MakeImplicitConstructor(const Function& func) { 2871 SequenceNode* Parser::MakeImplicitConstructor(const Function& func) {
2891 ASSERT(func.IsGenerativeConstructor()); 2872 ASSERT(func.IsGenerativeConstructor());
2892 ASSERT(func.Owner() == current_class().raw()); 2873 ASSERT(func.Owner() == current_class().raw());
2893 const intptr_t ctor_pos = TokenPos(); 2874 const intptr_t ctor_pos = TokenPos();
2894 OpenFunctionBlock(func); 2875 OpenFunctionBlock(func);
2895 2876
2896 LocalVariable* receiver = new LocalVariable( 2877 LocalVariable* receiver = new LocalVariable(
2897 Scanner::kNoSourcePos, Symbols::This(), *ReceiverType(current_class())); 2878 Scanner::kNoSourcePos, Symbols::This(), *ReceiverType(current_class()));
2898 current_block_->scope->InsertParameterAt(0, receiver); 2879 current_block_->scope->InsertParameterAt(0, receiver);
2899 2880
2900 LocalVariable* phase_parameter =
2901 new LocalVariable(Scanner::kNoSourcePos,
2902 Symbols::PhaseParameter(),
2903 Type::ZoneHandle(Z, Type::SmiType()));
2904 current_block_->scope->InsertParameterAt(1, phase_parameter);
2905
2906 // Parse expressions of instance fields that have an explicit 2881 // Parse expressions of instance fields that have an explicit
2907 // initializer expression. 2882 // initializer expression.
2908 // The receiver must not be visible to field initializer expressions. 2883 // The receiver must not be visible to field initializer expressions.
2909 receiver->set_invisible(true); 2884 receiver->set_invisible(true);
2910 GrowableArray<Field*> initialized_fields; 2885 GrowableArray<Field*> initialized_fields;
2911 ParseInitializedInstanceFields( 2886 ParseInitializedInstanceFields(
2912 current_class(), receiver, &initialized_fields); 2887 current_class(), receiver, &initialized_fields);
2913 receiver->set_invisible(false); 2888 receiver->set_invisible(false);
2914 2889
2915 // If the class of this implicit constructor is a mixin application alias, 2890 // If the class of this implicit constructor is a mixin application alias,
(...skipping 19 matching lines...) Expand all
2935 "cannot generate an implicit mixin application constructor " 2910 "cannot generate an implicit mixin application constructor "
2936 "forwarding to a super class constructor with optional " 2911 "forwarding to a super class constructor with optional "
2937 "parameters; add a constructor without optional parameters " 2912 "parameters; add a constructor without optional parameters "
2938 "to class '%s' that redirects to the constructor with " 2913 "to class '%s' that redirects to the constructor with "
2939 "optional parameters and invoke it via super from a " 2914 "optional parameters and invoke it via super from a "
2940 "constructor of the class extending the mixin application", 2915 "constructor of the class extending the mixin application",
2941 String::Handle(Z, super_class.Name()).ToCString()); 2916 String::Handle(Z, super_class.Name()).ToCString());
2942 } 2917 }
2943 2918
2944 // Prepare user-defined arguments to be forwarded to super call. 2919 // Prepare user-defined arguments to be forwarded to super call.
2945 // The first user-defined argument is at position 2. 2920 // The first user-defined argument is at position 1.
2946 forwarding_args = new ArgumentListNode(Scanner::kNoSourcePos); 2921 forwarding_args = new ArgumentListNode(Scanner::kNoSourcePos);
2947 for (int i = 2; i < func.NumParameters(); i++) { 2922 for (int i = 1; i < func.NumParameters(); i++) {
2948 LocalVariable* param = new LocalVariable( 2923 LocalVariable* param = new LocalVariable(
2949 Scanner::kNoSourcePos, 2924 Scanner::kNoSourcePos,
2950 String::ZoneHandle(Z, func.ParameterNameAt(i)), 2925 String::ZoneHandle(Z, func.ParameterNameAt(i)),
2951 Object::dynamic_type()); 2926 Object::dynamic_type());
2952 current_block_->scope->InsertParameterAt(i, param); 2927 current_block_->scope->InsertParameterAt(i, param);
2953 forwarding_args->Add(new LoadLocalNode(Scanner::kNoSourcePos, param)); 2928 forwarding_args->Add(new LoadLocalNode(Scanner::kNoSourcePos, param));
2954 } 2929 }
2955 } 2930 }
2956 2931
2957 AstNode* super_call = GenerateSuperConstructorCall( 2932 AstNode* super_call = GenerateSuperConstructorCall(
2958 current_class(), 2933 current_class(),
2959 Scanner::kNoSourcePos, 2934 Scanner::kNoSourcePos,
2960 receiver, 2935 receiver,
2961 new LoadLocalNode(Scanner::kNoSourcePos, phase_parameter),
2962 forwarding_args); 2936 forwarding_args);
2963 if (super_call != NULL) { 2937 if (super_call != NULL) {
2964 current_block_->statements->Add(super_call); 2938 current_block_->statements->Add(super_call);
2965 } 2939 }
2966 CheckFieldsInitialized(current_class()); 2940 CheckFieldsInitialized(current_class());
2967 2941
2968 // Empty constructor body. 2942 // Empty constructor body.
2969 current_block_->statements->Add(new ReturnNode(Scanner::kNoSourcePos)); 2943 current_block_->statements->Add(new ReturnNode(Scanner::kNoSourcePos));
2970 SequenceNode* statements = CloseBlock(); 2944 SequenceNode* statements = CloseBlock();
2971 return statements; 2945 return statements;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3014 OpenFunctionBlock(func); 2988 OpenFunctionBlock(func);
3015 ParamList params; 2989 ParamList params;
3016 const bool allow_explicit_default_values = true; 2990 const bool allow_explicit_default_values = true;
3017 ASSERT(CurrentToken() == Token::kLPAREN); 2991 ASSERT(CurrentToken() == Token::kLPAREN);
3018 2992
3019 // Add implicit receiver parameter which is passed the allocated 2993 // Add implicit receiver parameter which is passed the allocated
3020 // but uninitialized instance to construct. 2994 // but uninitialized instance to construct.
3021 ASSERT(current_class().raw() == func.Owner()); 2995 ASSERT(current_class().raw() == func.Owner());
3022 params.AddReceiver(ReceiverType(current_class()), func.token_pos()); 2996 params.AddReceiver(ReceiverType(current_class()), func.token_pos());
3023 2997
3024 // Add implicit parameter for construction phase.
3025 params.AddFinalParameter(
3026 TokenPos(),
3027 &Symbols::PhaseParameter(),
3028 &Type::ZoneHandle(Z, Type::SmiType()));
3029
3030 if (func.is_const()) { 2998 if (func.is_const()) {
3031 params.SetImplicitlyFinal(); 2999 params.SetImplicitlyFinal();
3032 } 3000 }
3033 ParseFormalParameterList(allow_explicit_default_values, false, &params); 3001 ParseFormalParameterList(allow_explicit_default_values, false, &params);
3034 3002
3035 SetupDefaultsForOptionalParams(params); 3003 SetupDefaultsForOptionalParams(params);
3036 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); 3004 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
3037 ASSERT(func.NumParameters() == params.parameters->length()); 3005 ASSERT(func.NumParameters() == params.parameters->length());
3038 3006
3039 // Now populate function scope with the formal parameters. 3007 // Now populate function scope with the formal parameters.
(...skipping 19 matching lines...) Expand all
3059 // storing values. We make the formal parameters temporarily invisible 3027 // storing values. We make the formal parameters temporarily invisible
3060 // while parsing the instance field initializer expressions. 3028 // while parsing the instance field initializer expressions.
3061 params.SetInvisible(true); 3029 params.SetInvisible(true);
3062 ParseInitializedInstanceFields(cls, receiver, &initialized_fields); 3030 ParseInitializedInstanceFields(cls, receiver, &initialized_fields);
3063 // Make the parameters (which are in the outer scope) visible again. 3031 // Make the parameters (which are in the outer scope) visible again.
3064 params.SetInvisible(false); 3032 params.SetInvisible(false);
3065 } 3033 }
3066 3034
3067 // Turn formal field parameters into field initializers. 3035 // Turn formal field parameters into field initializers.
3068 if (params.has_field_initializer) { 3036 if (params.has_field_initializer) {
3069 // First two parameters are implicit receiver and phase. 3037 // The first parameter is the implicit receiver.
3070 ASSERT(params.parameters->length() >= 2); 3038 ASSERT(params.parameters->length() >= 1);
3071 for (int i = 2; i < params.parameters->length(); i++) { 3039 for (int i = 1; i < params.parameters->length(); i++) {
3072 ParamDesc& param = (*params.parameters)[i]; 3040 ParamDesc& param = (*params.parameters)[i];
3073 if (param.is_field_initializer) { 3041 if (param.is_field_initializer) {
3074 const String& field_name = *param.name; 3042 const String& field_name = *param.name;
3075 Field& field = 3043 Field& field =
3076 Field::ZoneHandle(Z, cls.LookupInstanceField(field_name)); 3044 Field::ZoneHandle(Z, cls.LookupInstanceField(field_name));
3077 if (field.IsNull()) { 3045 if (field.IsNull()) {
3078 ReportError(param.name_pos, 3046 ReportError(param.name_pos,
3079 "unresolved reference to instance field '%s'", 3047 "unresolved reference to instance field '%s'",
3080 field_name.ToCString()); 3048 field_name.ToCString());
3081 } 3049 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3118 } 3086 }
3119 } 3087 }
3120 3088
3121 if (is_redirecting_constructor) { 3089 if (is_redirecting_constructor) {
3122 ParseConstructorRedirection(cls, receiver); 3090 ParseConstructorRedirection(cls, receiver);
3123 } else { 3091 } else {
3124 ParseInitializers(cls, receiver, &initialized_fields); 3092 ParseInitializers(cls, receiver, &initialized_fields);
3125 } 3093 }
3126 3094
3127 SequenceNode* init_statements = CloseBlock(); 3095 SequenceNode* init_statements = CloseBlock();
3128 if (FLAG_move_super) { 3096 current_block_->statements->Add(init_statements);
3129 // Ignore the phase parameter.
3130 current_block_->statements->Add(init_statements);
3131 } else if (is_redirecting_constructor) {
3132 // A redirecting super constructor simply passes the phase parameter on to
3133 // the target which executes the corresponding phase.
3134 current_block_->statements->Add(init_statements);
3135 } else if (init_statements->length() > 0) {
3136 // Generate guard around the initializer code.
3137 LocalVariable* phase_param = LookupPhaseParameter();
3138 AstNode* phase_value = new
3139 LoadLocalNode(Scanner::kNoSourcePos, phase_param);
3140 AstNode* phase_check = new BinaryOpNode(
3141 Scanner::kNoSourcePos, Token::kBIT_AND, phase_value,
3142 new LiteralNode(Scanner::kNoSourcePos,
3143 Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseInit))));
3144 AstNode* comparison =
3145 new ComparisonNode(Scanner::kNoSourcePos,
3146 Token::kNE_STRICT,
3147 phase_check,
3148 new LiteralNode(TokenPos(),
3149 Smi::ZoneHandle(Z, Smi::New(0))));
3150 AstNode* guarded_init_statements =
3151 new IfNode(Scanner::kNoSourcePos,
3152 comparison,
3153 init_statements,
3154 NULL);
3155 current_block_->statements->Add(guarded_init_statements);
3156 }
3157 3097
3158 // Parsing of initializers done. Now we parse the constructor body 3098 // Parsing of initializers done. Now we parse the constructor body.
3159 // and add the implicit super call to the super constructor's body
3160 // if necessary.
3161 StaticCallNode* super_call = NULL;
3162 // Look for the super initializer call in the sequence of initializer
3163 // statements. If it exists and is not the last initializer statement,
3164 // we need to create an implicit super call to the super constructor's
3165 // body.
3166 // Thus, iterate over all but the last initializer to see whether
3167 // it's a super constructor call.
3168 for (int i = 0; i < init_statements->length() - 1; i++) {
3169 if (init_statements->NodeAt(i)->IsStaticCallNode()) {
3170 StaticCallNode* static_call =
3171 init_statements->NodeAt(i)->AsStaticCallNode();
3172 if (static_call->function().IsGenerativeConstructor()) {
3173 super_call = static_call;
3174 break;
3175 }
3176 }
3177 }
3178 if (super_call != NULL) {
3179 ASSERT(!FLAG_move_super);
3180 // Generate an implicit call to the super constructor's body.
3181 // We need to patch the super _initializer_ call so that it
3182 // saves the evaluated actual arguments in temporary variables.
3183 // The temporary variables are necessary so that the argument
3184 // expressions are not evaluated twice.
3185 // Note: we should never get here in the case of a redirecting
3186 // constructor. In that case, the call to the target constructor
3187 // is the "super call" and is implicitly at the end of the
3188 // initializer list.
3189 ASSERT(!is_redirecting_constructor);
3190 ArgumentListNode* ctor_args = super_call->arguments();
3191 // The super initializer call has at least 2 arguments: the
3192 // implicit receiver, and the hidden construction phase.
3193 ASSERT(ctor_args->length() >= 2);
3194 for (int i = 2; i < ctor_args->length(); i++) {
3195 AstNode* arg = ctor_args->NodeAt(i);
3196 if (!IsSimpleLocalOrLiteralNode(arg)) {
3197 LocalVariable* temp = CreateTempConstVariable(arg->token_pos(), "sca");
3198 AstNode* save_temp = new StoreLocalNode(arg->token_pos(), temp, arg);
3199 ctor_args->SetNodeAt(i, save_temp);
3200 }
3201 }
3202 }
3203 OpenBlock(); // Block to collect constructor body nodes. 3099 OpenBlock(); // Block to collect constructor body nodes.
3204 intptr_t body_pos = TokenPos();
3205
3206 // Insert the implicit super call to the super constructor body.
3207 if (super_call != NULL) {
3208 ASSERT(!FLAG_move_super);
3209 ArgumentListNode* initializer_args = super_call->arguments();
3210 const Function& super_ctor = super_call->function();
3211 // Patch the initializer call so it only executes the super initializer.
3212 initializer_args->SetNodeAt(1, new LiteralNode(
3213 body_pos, Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseInit))));
3214
3215 ArgumentListNode* super_call_args = new ArgumentListNode(body_pos);
3216 // First argument is the receiver.
3217 super_call_args->Add(new LoadLocalNode(body_pos, receiver));
3218 // Second argument is the construction phase argument.
3219 AstNode* phase_parameter = new(Z) LiteralNode(
3220 body_pos, Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseBody)));
3221 super_call_args->Add(phase_parameter);
3222 super_call_args->set_names(initializer_args->names());
3223 for (int i = 2; i < initializer_args->length(); i++) {
3224 AstNode* arg = initializer_args->NodeAt(i);
3225 if (arg->IsLiteralNode()) {
3226 LiteralNode* lit = arg->AsLiteralNode();
3227 super_call_args->Add(new LiteralNode(body_pos, lit->literal()));
3228 } else {
3229 ASSERT(arg->IsLoadLocalNode() || arg->IsStoreLocalNode());
3230 if (arg->IsLoadLocalNode()) {
3231 const LocalVariable& temp = arg->AsLoadLocalNode()->local();
3232 super_call_args->Add(new LoadLocalNode(body_pos, &temp));
3233 } else if (arg->IsStoreLocalNode()) {
3234 const LocalVariable& temp = arg->AsStoreLocalNode()->local();
3235 super_call_args->Add(new LoadLocalNode(body_pos, &temp));
3236 }
3237 }
3238 }
3239 ASSERT(super_ctor.AreValidArguments(super_call_args->length(),
3240 super_call_args->names(),
3241 NULL));
3242 current_block_->statements->Add(
3243 new StaticCallNode(body_pos, super_ctor, super_call_args));
3244 }
3245
3246 if (CurrentToken() == Token::kLBRACE) { 3100 if (CurrentToken() == Token::kLBRACE) {
3247 // We checked in the top-level parse phase that a redirecting 3101 // We checked in the top-level parse phase that a redirecting
3248 // constructor does not have a body. 3102 // constructor does not have a body.
3249 ASSERT(!is_redirecting_constructor); 3103 ASSERT(!is_redirecting_constructor);
3250 ConsumeToken(); 3104 ConsumeToken();
3251 ParseStatementSequence(); 3105 ParseStatementSequence();
3252 ExpectToken(Token::kRBRACE); 3106 ExpectToken(Token::kRBRACE);
3253 } else if (CurrentToken() == Token::kARROW) { 3107 } else if (CurrentToken() == Token::kARROW) {
3254 ReportError("constructors may not return a value"); 3108 ReportError("constructors may not return a value");
3255 } else if (IsSymbol(Symbols::Native())) { 3109 } else if (IsSymbol(Symbols::Native())) {
(...skipping 12 matching lines...) Expand all
3268 InvocationMirror::kStatic, 3122 InvocationMirror::kStatic,
3269 InvocationMirror::kMethod, 3123 InvocationMirror::kMethod,
3270 NULL)); // No existing function. 3124 NULL)); // No existing function.
3271 } 3125 }
3272 } else { 3126 } else {
3273 UnexpectedToken(); 3127 UnexpectedToken();
3274 } 3128 }
3275 3129
3276 SequenceNode* ctor_block = CloseBlock(); 3130 SequenceNode* ctor_block = CloseBlock();
3277 if (ctor_block->length() > 0) { 3131 if (ctor_block->length() > 0) {
3278 if (FLAG_move_super) { 3132 current_block_->statements->Add(ctor_block);
3279 // Ignore the phase parameter.
3280 current_block_->statements->Add(ctor_block);
3281 } else {
3282 // Generate guard around the constructor body code.
3283 LocalVariable* phase_param = LookupPhaseParameter();
3284 AstNode* phase_value =
3285 new LoadLocalNode(Scanner::kNoSourcePos, phase_param);
3286 AstNode* phase_check =
3287 new BinaryOpNode(Scanner::kNoSourcePos, Token::kBIT_AND,
3288 phase_value,
3289 new LiteralNode(Scanner::kNoSourcePos,
3290 Smi::ZoneHandle(Smi::New(Function::kCtorPhaseBody))));
3291 AstNode* comparison =
3292 new ComparisonNode(Scanner::kNoSourcePos,
3293 Token::kNE_STRICT,
3294 phase_check,
3295 new LiteralNode(body_pos,
3296 Smi::ZoneHandle(Smi::New(0))));
3297 AstNode* guarded_block_statements =
3298 new IfNode(Scanner::kNoSourcePos, comparison, ctor_block, NULL);
3299 current_block_->statements->Add(guarded_block_statements);
3300 }
3301 } 3133 }
3302 current_block_->statements->Add(new ReturnNode(func.end_token_pos())); 3134 current_block_->statements->Add(new ReturnNode(func.end_token_pos()));
3303 SequenceNode* statements = CloseBlock(); 3135 SequenceNode* statements = CloseBlock();
3304 return statements; 3136 return statements;
3305 } 3137 }
3306 3138
3307 3139
3308 // Parser is at the opening parenthesis of the formal parameter 3140 // Parser is at the opening parenthesis of the formal parameter
3309 // declaration of the function or constructor. 3141 // declaration of the function or constructor.
3310 // Parse the formal parameters and code. 3142 // Parse the formal parameters and code.
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
3710 // The first parameter of a factory is the TypeArguments vector of 3542 // The first parameter of a factory is the TypeArguments vector of
3711 // the type of the instance to be allocated. 3543 // the type of the instance to be allocated.
3712 if (!method->has_static || method->IsConstructor()) { 3544 if (!method->has_static || method->IsConstructor()) {
3713 method->params.AddReceiver(ReceiverType(current_class()), formal_param_pos); 3545 method->params.AddReceiver(ReceiverType(current_class()), formal_param_pos);
3714 } else if (method->IsFactory()) { 3546 } else if (method->IsFactory()) {
3715 method->params.AddFinalParameter( 3547 method->params.AddFinalParameter(
3716 formal_param_pos, 3548 formal_param_pos,
3717 &Symbols::TypeArgumentsParameter(), 3549 &Symbols::TypeArgumentsParameter(),
3718 &Object::dynamic_type()); 3550 &Object::dynamic_type());
3719 } 3551 }
3720 // Constructors have an implicit parameter for the construction phase.
3721 if (method->IsConstructor()) {
3722 method->params.AddFinalParameter(
3723 TokenPos(),
3724 &Symbols::PhaseParameter(),
3725 &Type::ZoneHandle(Z, Type::SmiType()));
3726 }
3727 if (are_implicitly_final) { 3552 if (are_implicitly_final) {
3728 method->params.SetImplicitlyFinal(); 3553 method->params.SetImplicitlyFinal();
3729 } 3554 }
3730 if (!method->IsGetter()) { 3555 if (!method->IsGetter()) {
3731 ParseFormalParameterList(allow_explicit_default_values, 3556 ParseFormalParameterList(allow_explicit_default_values,
3732 false, 3557 false,
3733 &method->params); 3558 &method->params);
3734 } 3559 }
3735 3560
3736 // Now that we know the parameter list, we can distinguish between the 3561 // Now that we know the parameter list, we can distinguish between the
(...skipping 1216 matching lines...) Expand 10 before | Expand all | Expand 10 after
4953 ctor.set_end_token_pos(ctor.token_pos()); 4778 ctor.set_end_token_pos(ctor.token_pos());
4954 ctor.set_is_debuggable(false); 4779 ctor.set_is_debuggable(false);
4955 if (library_.is_dart_scheme() && library_.IsPrivate(ctor_name)) { 4780 if (library_.is_dart_scheme() && library_.IsPrivate(ctor_name)) {
4956 ctor.set_is_reflectable(false); 4781 ctor.set_is_reflectable(false);
4957 } 4782 }
4958 4783
4959 ParamList params; 4784 ParamList params;
4960 // Add implicit 'this' parameter. 4785 // Add implicit 'this' parameter.
4961 const AbstractType* receiver_type = ReceiverType(cls); 4786 const AbstractType* receiver_type = ReceiverType(cls);
4962 params.AddReceiver(receiver_type, cls.token_pos()); 4787 params.AddReceiver(receiver_type, cls.token_pos());
4963 // Add implicit parameter for construction phase.
4964 params.AddFinalParameter(cls.token_pos(),
4965 &Symbols::PhaseParameter(),
4966 &Type::ZoneHandle(Z, Type::SmiType()));
4967 4788
4968 AddFormalParamsToFunction(&params, ctor); 4789 AddFormalParamsToFunction(&params, ctor);
4969 // The body of the constructor cannot modify the type of the constructed 4790 // The body of the constructor cannot modify the type of the constructed
4970 // instance, which is passed in as the receiver. 4791 // instance, which is passed in as the receiver.
4971 ctor.set_result_type(*receiver_type); 4792 ctor.set_result_type(*receiver_type);
4972 cls.AddFunction(ctor); 4793 cls.AddFunction(ctor);
4973 } 4794 }
4974 4795
4975 4796
4976 // Check for cycles in constructor redirection. 4797 // Check for cycles in constructor redirection.
(...skipping 2506 matching lines...) Expand 10 before | Expand all | Expand 10 after
7483 7304
7484 7305
7485 LocalVariable* Parser::LookupTypeArgumentsParameter(LocalScope* from_scope, 7306 LocalVariable* Parser::LookupTypeArgumentsParameter(LocalScope* from_scope,
7486 bool test_only) { 7307 bool test_only) {
7487 ASSERT(current_function().IsInFactoryScope()); 7308 ASSERT(current_function().IsInFactoryScope());
7488 return from_scope->LookupVariable(Symbols::TypeArgumentsParameter(), 7309 return from_scope->LookupVariable(Symbols::TypeArgumentsParameter(),
7489 test_only); 7310 test_only);
7490 } 7311 }
7491 7312
7492 7313
7493 LocalVariable* Parser::LookupPhaseParameter() {
7494 const bool kTestOnly = false;
7495 return current_block_->scope->LookupVariable(Symbols::PhaseParameter(),
7496 kTestOnly);
7497 }
7498
7499
7500 void Parser::CaptureInstantiator() { 7314 void Parser::CaptureInstantiator() {
7501 ASSERT(current_block_->scope->function_level() > 0); 7315 ASSERT(current_block_->scope->function_level() > 0);
7502 const String* variable_name = current_function().IsInFactoryScope() ? 7316 const String* variable_name = current_function().IsInFactoryScope() ?
7503 &Symbols::TypeArgumentsParameter() : &Symbols::This(); 7317 &Symbols::TypeArgumentsParameter() : &Symbols::This();
7504 current_block_->scope->CaptureVariable( 7318 current_block_->scope->CaptureVariable(
7505 current_block_->scope->LookupVariable(*variable_name, true)); 7319 current_block_->scope->LookupVariable(*variable_name, true));
7506 } 7320 }
7507 7321
7508 7322
7509 AstNode* Parser::LoadReceiver(intptr_t token_pos) { 7323 AstNode* Parser::LoadReceiver(intptr_t token_pos) {
(...skipping 4741 matching lines...) Expand 10 before | Expand all | Expand 10 after
12251 field_ref_pos, NULL, field_owner, field_name); 12065 field_ref_pos, NULL, field_owner, field_name);
12252 } 12066 }
12253 12067
12254 12068
12255 RawObject* Parser::EvaluateConstConstructorCall( 12069 RawObject* Parser::EvaluateConstConstructorCall(
12256 const Class& type_class, 12070 const Class& type_class,
12257 const TypeArguments& type_arguments, 12071 const TypeArguments& type_arguments,
12258 const Function& constructor, 12072 const Function& constructor,
12259 ArgumentListNode* arguments) { 12073 ArgumentListNode* arguments) {
12260 // Factories have one extra argument: the type arguments. 12074 // Factories have one extra argument: the type arguments.
12261 // Constructors have 2 extra arguments: rcvr and construction phase. 12075 // Constructors have 1 extra arguments: receiver.
12262 const int kNumExtraArgs = constructor.IsFactory() ? 1 : 2; 12076 const int kNumExtraArgs = 1;
12263 const int num_arguments = arguments->length() + kNumExtraArgs; 12077 const int num_arguments = arguments->length() + kNumExtraArgs;
12264 const Array& arg_values = 12078 const Array& arg_values =
12265 Array::Handle(Z, Array::New(num_arguments, Heap::kOld)); 12079 Array::Handle(Z, Array::New(num_arguments, Heap::kOld));
12266 Instance& instance = Instance::Handle(Z); 12080 Instance& instance = Instance::Handle(Z);
12267 if (!constructor.IsFactory()) { 12081 if (!constructor.IsFactory()) {
12268 instance = Instance::New(type_class, Heap::kOld); 12082 instance = Instance::New(type_class, Heap::kOld);
12269 if (!type_arguments.IsNull()) { 12083 if (!type_arguments.IsNull()) {
12270 if (!type_arguments.IsInstantiated()) { 12084 if (!type_arguments.IsInstantiated()) {
12271 ReportError("type must be constant in const constructor"); 12085 ReportError("type must be constant in const constructor");
12272 } 12086 }
12273 instance.SetTypeArguments( 12087 instance.SetTypeArguments(
12274 TypeArguments::Handle(Z, type_arguments.Canonicalize())); 12088 TypeArguments::Handle(Z, type_arguments.Canonicalize()));
12275 } 12089 }
12276 arg_values.SetAt(0, instance); 12090 arg_values.SetAt(0, instance);
12277 arg_values.SetAt(1, Smi::Handle(Z, Smi::New(Function::kCtorPhaseAll)));
12278 } else { 12091 } else {
12279 // Prepend type_arguments to list of arguments to factory. 12092 // Prepend type_arguments to list of arguments to factory.
12280 ASSERT(type_arguments.IsZoneHandle()); 12093 ASSERT(type_arguments.IsZoneHandle());
12281 arg_values.SetAt(0, type_arguments); 12094 arg_values.SetAt(0, type_arguments);
12282 } 12095 }
12283 for (int i = 0; i < arguments->length(); i++) { 12096 for (int i = 0; i < arguments->length(); i++) {
12284 AstNode* arg = arguments->NodeAt(i); 12097 AstNode* arg = arguments->NodeAt(i);
12285 // Arguments have been evaluated to a literal value already. 12098 // Arguments have been evaluated to a literal value already.
12286 ASSERT(arg->IsLiteralNode()); 12099 ASSERT(arg->IsLiteralNode());
12287 arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal()); 12100 arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal());
(...skipping 1211 matching lines...) Expand 10 before | Expand all | Expand 10 after
13499 return ThrowTypeError(type_pos, type); 13312 return ThrowTypeError(type_pos, type);
13500 } 13313 }
13501 13314
13502 // Resolve the type and optional identifier to a constructor or factory. 13315 // Resolve the type and optional identifier to a constructor or factory.
13503 String& type_class_name = String::Handle(Z, type_class.Name()); 13316 String& type_class_name = String::Handle(Z, type_class.Name());
13504 TypeArguments& type_arguments = 13317 TypeArguments& type_arguments =
13505 TypeArguments::ZoneHandle(Z, type.arguments()); 13318 TypeArguments::ZoneHandle(Z, type.arguments());
13506 13319
13507 // A constructor has an implicit 'this' parameter (instance to construct) 13320 // A constructor has an implicit 'this' parameter (instance to construct)
13508 // and a factory has an implicit 'this' parameter (type_arguments). 13321 // and a factory has an implicit 'this' parameter (type_arguments).
13509 // A constructor has a second implicit 'phase' parameter. 13322 intptr_t arguments_length = arguments->length() + 1;
13510 intptr_t arguments_length = arguments->length() + 2;
13511 13323
13512 // An additional type check of the result of a redirecting factory may be 13324 // An additional type check of the result of a redirecting factory may be
13513 // required. 13325 // required.
13514 AbstractType& type_bound = AbstractType::ZoneHandle(Z); 13326 AbstractType& type_bound = AbstractType::ZoneHandle(Z);
13515 13327
13516 // Make sure that an appropriate constructor exists. 13328 // Make sure that an appropriate constructor exists.
13517 String& constructor_name = 13329 String& constructor_name =
13518 BuildConstructorName(type_class_name, named_constructor); 13330 BuildConstructorName(type_class_name, named_constructor);
13519 Function& constructor = Function::ZoneHandle(Z, 13331 Function& constructor = Function::ZoneHandle(Z,
13520 type_class.LookupConstructor(constructor_name)); 13332 type_class.LookupConstructor(constructor_name));
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
13598 type_bound = type.raw(); 13410 type_bound = type.raw();
13599 } 13411 }
13600 type = redirect_type.raw(); 13412 type = redirect_type.raw();
13601 type_class = type.type_class(); 13413 type_class = type.type_class();
13602 type_class_name = type_class.Name(); 13414 type_class_name = type_class.Name();
13603 type_arguments = type.arguments(); 13415 type_arguments = type.arguments();
13604 constructor = constructor.RedirectionTarget(); 13416 constructor = constructor.RedirectionTarget();
13605 constructor_name = constructor.name(); 13417 constructor_name = constructor.name();
13606 ASSERT(!constructor.IsNull()); 13418 ASSERT(!constructor.IsNull());
13607 } 13419 }
13608 if (constructor.IsFactory()) {
13609 // A factory does not have the implicit 'phase' parameter.
13610 arguments_length -= 1;
13611 }
13612 } 13420 }
13613 ASSERT(!constructor.IsNull()); 13421 ASSERT(!constructor.IsNull());
13614 13422
13615 // It is ok to call a factory method of an abstract class, but it is 13423 // It is ok to call a factory method of an abstract class, but it is
13616 // a dynamic error to instantiate an abstract class. 13424 // a dynamic error to instantiate an abstract class.
13617 if (type_class.is_abstract() && !constructor.IsFactory()) { 13425 if (type_class.is_abstract() && !constructor.IsFactory()) {
13618 // Evaluate arguments before throwing. 13426 // Evaluate arguments before throwing.
13619 LetNode* result = new(Z) LetNode(call_pos); 13427 LetNode* result = new(Z) LetNode(call_pos);
13620 for (intptr_t i = 0; i < arguments->length(); ++i) { 13428 for (intptr_t i = 0; i < arguments->length(); ++i) {
13621 result->AddNode(arguments->NodeAt(i)); 13429 result->AddNode(arguments->NodeAt(i));
(...skipping 955 matching lines...) Expand 10 before | Expand all | Expand 10 after
14577 const ArgumentListNode& function_args, 14385 const ArgumentListNode& function_args,
14578 const LocalVariable* temp_for_last_arg, 14386 const LocalVariable* temp_for_last_arg,
14579 bool is_super_invocation) { 14387 bool is_super_invocation) {
14580 UNREACHABLE(); 14388 UNREACHABLE();
14581 return NULL; 14389 return NULL;
14582 } 14390 }
14583 14391
14584 } // namespace dart 14392 } // namespace dart
14585 14393
14586 #endif // DART_PRECOMPILED 14394 #endif // DART_PRECOMPILED
OLDNEW
« no previous file with comments | « runtime/vm/parser.h ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698