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

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

Issue 30533004: Report correct error message in case of super invocation (fix issue 8208). (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/parser.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/flow_graph_builder.h" 5 #include "vm/flow_graph_builder.h"
6 6
7 #include "lib/invocation_mirror.h" 7 #include "lib/invocation_mirror.h"
8 #include "vm/ast_printer.h" 8 #include "vm/ast_printer.h"
9 #include "vm/bit_vector.h" 9 #include "vm/bit_vector.h"
10 #include "vm/code_descriptors.h" 10 #include "vm/code_descriptors.h"
(...skipping 2728 matching lines...) Expand 10 before | Expand all | Expand 10 after
2739 getter_function = Resolver::ResolveDynamicAnyArgs(node->cls(), getter_name); 2739 getter_function = Resolver::ResolveDynamicAnyArgs(node->cls(), getter_name);
2740 if (getter_function.IsNull()) { 2740 if (getter_function.IsNull()) {
2741 // Resolve and call noSuchMethod. 2741 // Resolve and call noSuchMethod.
2742 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos()); 2742 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
2743 arguments->Add(node->receiver()); 2743 arguments->Add(node->receiver());
2744 StaticCallInstr* call = 2744 StaticCallInstr* call =
2745 BuildStaticNoSuchMethodCall(node->cls(), 2745 BuildStaticNoSuchMethodCall(node->cls(),
2746 node->receiver(), 2746 node->receiver(),
2747 getter_name, 2747 getter_name,
2748 arguments, 2748 arguments,
2749 false); // Don't save last argument. 2749 false, // Don't save last argument.
2750 true); // Super invocation.
2750 ReturnDefinition(call); 2751 ReturnDefinition(call);
2751 return; 2752 return;
2752 } else { 2753 } else {
2753 ValueGraphVisitor receiver_value(owner(), temp_index()); 2754 ValueGraphVisitor receiver_value(owner(), temp_index());
2754 node->receiver()->Visit(&receiver_value); 2755 node->receiver()->Visit(&receiver_value);
2755 Append(receiver_value); 2756 Append(receiver_value);
2756 arguments->Add(PushArgument(receiver_value.value())); 2757 arguments->Add(PushArgument(receiver_value.value()));
2757 } 2758 }
2758 } else { 2759 } else {
2759 getter_function = node->cls().LookupStaticFunction(getter_name); 2760 getter_function = node->cls().LookupStaticFunction(getter_name);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2817 ASSERT(node->receiver() != NULL); 2818 ASSERT(node->receiver() != NULL);
2818 // Resolve and call noSuchMethod. 2819 // Resolve and call noSuchMethod.
2819 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos()); 2820 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
2820 arguments->Add(node->receiver()); 2821 arguments->Add(node->receiver());
2821 arguments->Add(node->value()); 2822 arguments->Add(node->value());
2822 call = BuildStaticNoSuchMethodCall( 2823 call = BuildStaticNoSuchMethodCall(
2823 node->cls(), 2824 node->cls(),
2824 node->receiver(), 2825 node->receiver(),
2825 setter_name, 2826 setter_name,
2826 arguments, 2827 arguments,
2827 result_is_needed); // Save last arg if result is needed. 2828 result_is_needed, // Save last arg if result is needed.
2829 true); // Super invocation.
2828 } else { 2830 } else {
2829 // Throw a NoSuchMethodError. 2831 // Throw a NoSuchMethodError.
2830 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos()); 2832 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
2831 arguments->Add(node->value()); 2833 arguments->Add(node->value());
2832 call = BuildThrowNoSuchMethodError( 2834 call = BuildThrowNoSuchMethodError(
2833 node->token_pos(), 2835 node->token_pos(),
2834 node->cls(), 2836 node->cls(),
2835 setter_name, 2837 setter_name,
2836 arguments, // Argument is the value passed to the setter. 2838 arguments, // Argument is the value passed to the setter.
2837 InvocationMirror::EncodeType( 2839 InvocationMirror::EncodeType(
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
3173 // Could not resolve super operator. Generate call noSuchMethod() of the 3175 // Could not resolve super operator. Generate call noSuchMethod() of the
3174 // super class instead. 3176 // super class instead.
3175 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos()); 3177 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
3176 arguments->Add(node->array()); 3178 arguments->Add(node->array());
3177 arguments->Add(node->index_expr()); 3179 arguments->Add(node->index_expr());
3178 StaticCallInstr* call = 3180 StaticCallInstr* call =
3179 BuildStaticNoSuchMethodCall(node->super_class(), 3181 BuildStaticNoSuchMethodCall(node->super_class(),
3180 node->array(), 3182 node->array(),
3181 Symbols::IndexToken(), 3183 Symbols::IndexToken(),
3182 arguments, 3184 arguments,
3183 false); // Don't save last arg. 3185 false, // Don't save last arg.
3186 true); // Super invocation.
3184 ReturnDefinition(call); 3187 ReturnDefinition(call);
3185 return; 3188 return;
3186 } 3189 }
3187 } 3190 }
3188 ZoneGrowableArray<PushArgumentInstr*>* arguments = 3191 ZoneGrowableArray<PushArgumentInstr*>* arguments =
3189 new ZoneGrowableArray<PushArgumentInstr*>(2); 3192 new ZoneGrowableArray<PushArgumentInstr*>(2);
3190 ValueGraphVisitor for_array(owner(), temp_index()); 3193 ValueGraphVisitor for_array(owner(), temp_index());
3191 node->array()->Visit(&for_array); 3194 node->array()->Visit(&for_array);
3192 Append(for_array); 3195 Append(for_array);
3193 arguments->Add(PushArgument(for_array.value())); 3196 arguments->Add(PushArgument(for_array.value()));
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3234 // super class instead. 3237 // super class instead.
3235 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos()); 3238 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
3236 arguments->Add(node->array()); 3239 arguments->Add(node->array());
3237 arguments->Add(node->index_expr()); 3240 arguments->Add(node->index_expr());
3238 arguments->Add(node->value()); 3241 arguments->Add(node->value());
3239 StaticCallInstr* call = BuildStaticNoSuchMethodCall( 3242 StaticCallInstr* call = BuildStaticNoSuchMethodCall(
3240 node->super_class(), 3243 node->super_class(),
3241 node->array(), 3244 node->array(),
3242 Symbols::AssignIndexToken(), 3245 Symbols::AssignIndexToken(),
3243 arguments, 3246 arguments,
3244 result_is_needed); // Save last arg if result is needed. 3247 result_is_needed, // Save last arg if result is needed.
3248 true); // Super invocation.
3245 if (result_is_needed) { 3249 if (result_is_needed) {
3246 Do(call); 3250 Do(call);
3247 // BuildStaticNoSuchMethodCall stores the value in expression_temp. 3251 // BuildStaticNoSuchMethodCall stores the value in expression_temp.
3248 return BuildLoadExprTemp(); 3252 return BuildLoadExprTemp();
3249 } else { 3253 } else {
3250 return call; 3254 return call;
3251 } 3255 }
3252 } 3256 }
3253 } 3257 }
3254 3258
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
3615 } 3619 }
3616 3620
3617 3621
3618 // Looks up dynamic method noSuchMethod in target_class 3622 // Looks up dynamic method noSuchMethod in target_class
3619 // (including its super class chain) and builds a static call to it. 3623 // (including its super class chain) and builds a static call to it.
3620 StaticCallInstr* EffectGraphVisitor::BuildStaticNoSuchMethodCall( 3624 StaticCallInstr* EffectGraphVisitor::BuildStaticNoSuchMethodCall(
3621 const Class& target_class, 3625 const Class& target_class,
3622 AstNode* receiver, 3626 AstNode* receiver,
3623 const String& method_name, 3627 const String& method_name,
3624 ArgumentListNode* method_arguments, 3628 ArgumentListNode* method_arguments,
3625 bool save_last_arg) { 3629 bool save_last_arg,
3630 bool is_super_invocation) {
3626 intptr_t args_pos = method_arguments->token_pos(); 3631 intptr_t args_pos = method_arguments->token_pos();
3627 LocalVariable* temp = NULL; 3632 LocalVariable* temp = NULL;
3628 if (save_last_arg) { 3633 if (save_last_arg) {
3629 temp = owner()->parsed_function()->EnsureExpressionTemp(); 3634 temp = owner()->parsed_function()->EnsureExpressionTemp();
3630 } 3635 }
3631 ArgumentListNode* args = 3636 ArgumentListNode* args =
3632 Parser::BuildNoSuchMethodArguments(args_pos, 3637 Parser::BuildNoSuchMethodArguments(args_pos,
3633 method_name, 3638 method_name,
3634 *method_arguments, 3639 *method_arguments,
3635 temp); 3640 temp,
3641 is_super_invocation);
3636 const Function& no_such_method_func = Function::ZoneHandle( 3642 const Function& no_such_method_func = Function::ZoneHandle(
3637 Resolver::ResolveDynamicAnyArgs(target_class, Symbols::NoSuchMethod())); 3643 Resolver::ResolveDynamicAnyArgs(target_class, Symbols::NoSuchMethod()));
3638 // We are guaranteed to find noSuchMethod of class Object. 3644 // We are guaranteed to find noSuchMethod of class Object.
3639 ASSERT(!no_such_method_func.IsNull()); 3645 ASSERT(!no_such_method_func.IsNull());
3640 ZoneGrowableArray<PushArgumentInstr*>* push_arguments = 3646 ZoneGrowableArray<PushArgumentInstr*>* push_arguments =
3641 new ZoneGrowableArray<PushArgumentInstr*>(2); 3647 new ZoneGrowableArray<PushArgumentInstr*>(2);
3642 BuildPushArguments(*args, push_arguments); 3648 BuildPushArguments(*args, push_arguments);
3643 return new StaticCallInstr(args_pos, 3649 return new StaticCallInstr(args_pos,
3644 no_such_method_func, 3650 no_such_method_func,
3645 Object::null_array(), 3651 Object::null_array(),
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
3843 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, reason) + 1; 3849 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, reason) + 1;
3844 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 3850 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
3845 OS::SNPrint(chars, len, kFormat, function_name, reason); 3851 OS::SNPrint(chars, len, kFormat, function_name, reason);
3846 const Error& error = Error::Handle( 3852 const Error& error = Error::Handle(
3847 LanguageError::New(String::Handle(String::New(chars)))); 3853 LanguageError::New(String::Handle(String::New(chars))));
3848 Isolate::Current()->long_jump_base()->Jump(1, error); 3854 Isolate::Current()->long_jump_base()->Jump(1, error);
3849 } 3855 }
3850 3856
3851 3857
3852 } // namespace dart 3858 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698