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

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

Issue 15979010: Fix two bugs in the Dart VM's super-noSuchMethod invocation. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 6 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') | tests/language/language.status » ('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/code_descriptors.h" 9 #include "vm/code_descriptors.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 1822 matching lines...) Expand 10 before | Expand all | Expand 10 after
1833 return kFirstLocalSlotFromFp 1833 return kFirstLocalSlotFromFp
1834 - owner()->num_stack_locals() 1834 - owner()->num_stack_locals()
1835 - owner()->num_copied_params() 1835 - owner()->num_copied_params()
1836 - owner()->args_pushed() 1836 - owner()->args_pushed()
1837 - temp_index() + 1; 1837 - temp_index() + 1;
1838 } 1838 }
1839 1839
1840 1840
1841 class TempLocalScope : public ValueObject { 1841 class TempLocalScope : public ValueObject {
1842 public: 1842 public:
1843 TempLocalScope(EffectGraphVisitor* visitor, Value* value) 1843 TempLocalScope(EffectGraphVisitor* visitor,
1844 : visitor_(visitor) { 1844 Value* value,
1845 bool return_definition = true)
srdjan 2013/05/30 17:42:30 WOuld it be better to have a subclass instead of t
Florian Schneider 2013/05/31 08:46:36 I reconsidered using the constructor/destructor of
1846 : visitor_(visitor), return_definition_(return_definition) {
1845 ASSERT(value->definition()->temp_index() == visitor->temp_index() - 1); 1847 ASSERT(value->definition()->temp_index() == visitor->temp_index() - 1);
1846 intptr_t index = visitor->GetCurrentTempLocalIndex(); 1848 intptr_t index = visitor->GetCurrentTempLocalIndex();
1847 char name[64]; 1849 char name[64];
1848 OS::SNPrint(name, 64, ":tmp_local%"Pd, index); 1850 OS::SNPrint(name, 64, ":tmp_local%"Pd, index);
1849 var_ = new LocalVariable(0, String::ZoneHandle(Symbols::New(name)), 1851 var_ = new LocalVariable(0, String::ZoneHandle(Symbols::New(name)),
1850 Type::ZoneHandle(Type::DynamicType())); 1852 Type::ZoneHandle(Type::DynamicType()));
1851 var_->set_index(index); 1853 var_->set_index(index);
1852 visitor->Do(new PushTempInstr(value)); 1854 visitor->Do(new PushTempInstr(value));
1853 visitor->AllocateTempIndex(); 1855 visitor->AllocateTempIndex();
1854 } 1856 }
1855 1857
1856 LocalVariable* var() const { return var_; } 1858 LocalVariable* var() const { return var_; }
1857 1859
1860 Value* CloseAndReturnValue() {
1861 ASSERT(!return_definition_);
1862 Value* tmp = visitor_->Bind(new LoadLocalInstr(*var_));
1863 visitor_->DeallocateTempIndex(1);
1864 return visitor_->Bind(new DropTempsInstr(1, tmp));
1865 }
1866
1858 ~TempLocalScope() { 1867 ~TempLocalScope() {
1859 Value* result = visitor_->Bind(new LoadLocalInstr(*var_)); 1868 if (return_definition_) {
1860 visitor_->DeallocateTempIndex(1); 1869 Value* result = visitor_->Bind(new LoadLocalInstr(*var_));
1861 visitor_->ReturnDefinition(new DropTempsInstr(1, result)); 1870 visitor_->DeallocateTempIndex(1);
1871 visitor_->ReturnDefinition(new DropTempsInstr(1, result));
1872 }
1862 } 1873 }
1863 1874
1864 private: 1875 private:
1865 EffectGraphVisitor* visitor_; 1876 EffectGraphVisitor* visitor_;
1866 LocalVariable* var_; 1877 LocalVariable* var_;
1878 bool return_definition_;
srdjan 2013/05/30 17:42:30 const
Florian Schneider 2013/05/31 08:46:36 Replaced TempLocalScope with EnterScope/ExitScope
1867 }; 1879 };
1868 1880
1869 1881
1870 void EffectGraphVisitor::BuildLetTempExpressions(LetNode* node) { 1882 void EffectGraphVisitor::BuildLetTempExpressions(LetNode* node) {
1871 intptr_t num_temps = node->num_temps(); 1883 intptr_t num_temps = node->num_temps();
1872 for (intptr_t i = 0; i < num_temps; ++i) { 1884 for (intptr_t i = 0; i < num_temps; ++i) {
1873 ValueGraphVisitor for_value(owner(), temp_index()); 1885 ValueGraphVisitor for_value(owner(), temp_index());
1874 node->InitializerAt(i)->Visit(&for_value); 1886 node->InitializerAt(i)->Visit(&for_value);
1875 Append(for_value); 1887 Append(for_value);
1876 Value* temp_val = for_value.value(); 1888 Value* temp_val = for_value.value();
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after
2575 new ZoneGrowableArray<PushArgumentInstr*>(); 2587 new ZoneGrowableArray<PushArgumentInstr*>();
2576 Function& getter_function = Function::ZoneHandle(); 2588 Function& getter_function = Function::ZoneHandle();
2577 if (node->is_super_getter()) { 2589 if (node->is_super_getter()) {
2578 // Statically resolved instance getter, i.e. "super getter". 2590 // Statically resolved instance getter, i.e. "super getter".
2579 ASSERT(node->receiver() != NULL); 2591 ASSERT(node->receiver() != NULL);
2580 getter_function = Resolver::ResolveDynamicAnyArgs(node->cls(), getter_name); 2592 getter_function = Resolver::ResolveDynamicAnyArgs(node->cls(), getter_name);
2581 if (getter_function.IsNull()) { 2593 if (getter_function.IsNull()) {
2582 // Resolve and call noSuchMethod. 2594 // Resolve and call noSuchMethod.
2583 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos()); 2595 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
2584 arguments->Add(node->receiver()); 2596 arguments->Add(node->receiver());
2585 StaticCallInstr* call = BuildStaticNoSuchMethodCall(node->cls(), 2597 StaticCallInstr* call =
2586 node->receiver(), 2598 BuildStaticNoSuchMethodCall(node->cls(),
2587 getter_name, 2599 node->receiver(),
2588 arguments); 2600 getter_name,
2601 arguments,
2602 false); // Don't save last argument.
2589 ReturnDefinition(call); 2603 ReturnDefinition(call);
2590 return; 2604 return;
2591 } else { 2605 } else {
2592 ValueGraphVisitor receiver_value(owner(), temp_index()); 2606 ValueGraphVisitor receiver_value(owner(), temp_index());
2593 node->receiver()->Visit(&receiver_value); 2607 node->receiver()->Visit(&receiver_value);
2594 Append(receiver_value); 2608 Append(receiver_value);
2595 arguments->Add(PushArgument(receiver_value.value())); 2609 arguments->Add(PushArgument(receiver_value.value()));
2596 } 2610 }
2597 } else { 2611 } else {
2598 getter_function = node->cls().LookupStaticFunction(getter_name); 2612 getter_function = node->cls().LookupStaticFunction(getter_name);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2649 ? Resolver::ResolveDynamicAnyArgs(node->cls(), setter_name) 2663 ? Resolver::ResolveDynamicAnyArgs(node->cls(), setter_name)
2650 : node->cls().LookupStaticFunction(setter_name)); 2664 : node->cls().LookupStaticFunction(setter_name));
2651 StaticCallInstr* call; 2665 StaticCallInstr* call;
2652 if (setter_function.IsNull()) { 2666 if (setter_function.IsNull()) {
2653 if (is_super_setter) { 2667 if (is_super_setter) {
2654 ASSERT(node->receiver() != NULL); 2668 ASSERT(node->receiver() != NULL);
2655 // Resolve and call noSuchMethod. 2669 // Resolve and call noSuchMethod.
2656 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos()); 2670 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
2657 arguments->Add(node->receiver()); 2671 arguments->Add(node->receiver());
2658 arguments->Add(node->value()); 2672 arguments->Add(node->value());
2659 call = BuildStaticNoSuchMethodCall(node->cls(), 2673 call = BuildStaticNoSuchMethodCall(
2660 node->receiver(), 2674 node->cls(),
2661 setter_name, 2675 node->receiver(),
2662 arguments); 2676 setter_name,
2677 arguments,
2678 result_is_needed); // Save last arg if result is needed.
2663 } else { 2679 } else {
2664 // Throw a NoSuchMethodError. 2680 // Throw a NoSuchMethodError.
2665 call = BuildThrowNoSuchMethodError( 2681 call = BuildThrowNoSuchMethodError(
2666 node->token_pos(), 2682 node->token_pos(),
2667 node->cls(), 2683 node->cls(),
2668 setter_name, 2684 setter_name,
2669 InvocationMirror::EncodeType( 2685 InvocationMirror::EncodeType(
2670 node->cls().IsTopLevel() ? 2686 node->cls().IsTopLevel() ?
2671 InvocationMirror::kTopLevel : 2687 InvocationMirror::kTopLevel :
2672 InvocationMirror::kStatic, 2688 InvocationMirror::kStatic,
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
2884 if (super_function->IsNull()) { 2900 if (super_function->IsNull()) {
2885 // Could not resolve super operator. Generate call noSuchMethod() of the 2901 // Could not resolve super operator. Generate call noSuchMethod() of the
2886 // super class instead. 2902 // super class instead.
2887 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos()); 2903 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
2888 arguments->Add(node->array()); 2904 arguments->Add(node->array());
2889 arguments->Add(node->index_expr()); 2905 arguments->Add(node->index_expr());
2890 StaticCallInstr* call = 2906 StaticCallInstr* call =
2891 BuildStaticNoSuchMethodCall(node->super_class(), 2907 BuildStaticNoSuchMethodCall(node->super_class(),
2892 node->array(), 2908 node->array(),
2893 Symbols::IndexToken(), 2909 Symbols::IndexToken(),
2894 arguments); 2910 arguments,
2911 false); // Don't save last arg.
2895 ReturnDefinition(call); 2912 ReturnDefinition(call);
2896 return; 2913 return;
2897 } 2914 }
2898 } 2915 }
2899 ZoneGrowableArray<PushArgumentInstr*>* arguments = 2916 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2900 new ZoneGrowableArray<PushArgumentInstr*>(2); 2917 new ZoneGrowableArray<PushArgumentInstr*>(2);
2901 ValueGraphVisitor for_array(owner(), temp_index()); 2918 ValueGraphVisitor for_array(owner(), temp_index());
2902 node->array()->Visit(&for_array); 2919 node->array()->Visit(&for_array);
2903 Append(for_array); 2920 Append(for_array);
2904 arguments->Add(PushArgument(for_array.value())); 2921 arguments->Add(PushArgument(for_array.value()));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2938 // Resolve the store indexed operator in the super class. 2955 // Resolve the store indexed operator in the super class.
2939 super_function = &Function::ZoneHandle( 2956 super_function = &Function::ZoneHandle(
2940 Resolver::ResolveDynamicAnyArgs(node->super_class(), 2957 Resolver::ResolveDynamicAnyArgs(node->super_class(),
2941 Symbols::AssignIndexToken())); 2958 Symbols::AssignIndexToken()));
2942 if (super_function->IsNull()) { 2959 if (super_function->IsNull()) {
2943 // Could not resolve super operator. Generate call noSuchMethod() of the 2960 // Could not resolve super operator. Generate call noSuchMethod() of the
2944 // super class instead. 2961 // super class instead.
2945 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos()); 2962 ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
2946 arguments->Add(node->array()); 2963 arguments->Add(node->array());
2947 arguments->Add(node->index_expr()); 2964 arguments->Add(node->index_expr());
2948 2965 arguments->Add(node->value());
2949 // Even though noSuchMethod most likely does not return, 2966 StaticCallInstr* call = BuildStaticNoSuchMethodCall(
2950 // we save the stored value if the result is needed. 2967 node->super_class(),
2951 if (result_is_needed) { 2968 node->array(),
2952 ValueGraphVisitor for_value(owner(), temp_index()); 2969 Symbols::AssignIndexToken(),
2953 node->value()->Visit(&for_value); 2970 arguments,
2954 Append(for_value); 2971 result_is_needed); // Save last arg if result is needed.
2955 Do(BuildStoreExprTemp(for_value.value()));
2956
2957 const LocalVariable* temp =
2958 owner()->parsed_function().expression_temp_var();
2959 AstNode* value = new LoadLocalNode(node->token_pos(), temp);
2960 arguments->Add(value);
2961 } else {
2962 arguments->Add(node->value());
2963 }
2964 StaticCallInstr* call =
2965 BuildStaticNoSuchMethodCall(node->super_class(),
2966 node->array(),
2967 Symbols::AssignIndexToken(),
2968 arguments);
2969 if (result_is_needed) { 2972 if (result_is_needed) {
2970 Do(call); 2973 Do(call);
2974 // BuildStaticNoSuchMethodCall stores the value in expression_temp.
2971 return BuildLoadExprTemp(); 2975 return BuildLoadExprTemp();
2972 } else { 2976 } else {
2973 return call; 2977 return call;
2974 } 2978 }
2975 } 2979 }
2976 } 2980 }
2977 2981
2978 ZoneGrowableArray<PushArgumentInstr*>* arguments = 2982 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2979 new ZoneGrowableArray<PushArgumentInstr*>(3); 2983 new ZoneGrowableArray<PushArgumentInstr*>(3);
2980 ValueGraphVisitor for_array(owner(), temp_index()); 2984 ValueGraphVisitor for_array(owner(), temp_index());
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
3310 } 3314 }
3311 } 3315 }
3312 3316
3313 3317
3314 // Looks up dynamic method noSuchMethod in target_class 3318 // Looks up dynamic method noSuchMethod in target_class
3315 // (including its super class chain) and builds a static call to it. 3319 // (including its super class chain) and builds a static call to it.
3316 StaticCallInstr* EffectGraphVisitor::BuildStaticNoSuchMethodCall( 3320 StaticCallInstr* EffectGraphVisitor::BuildStaticNoSuchMethodCall(
3317 const Class& target_class, 3321 const Class& target_class,
3318 AstNode* receiver, 3322 AstNode* receiver,
3319 const String& method_name, 3323 const String& method_name,
3320 ArgumentListNode* method_arguments) { 3324 ArgumentListNode* method_arguments,
3325 bool save_last_arg) {
3321 // Build the graph to allocate an InvocationMirror object by calling 3326 // Build the graph to allocate an InvocationMirror object by calling
3322 // the static allocation method. 3327 // the static allocation method.
3323 const Library& corelib = Library::Handle(Library::CoreLibrary()); 3328 const Library& corelib = Library::Handle(Library::CoreLibrary());
3324 const Class& mirror_class = Class::Handle( 3329 const Class& mirror_class = Class::Handle(
3325 corelib.LookupClassAllowPrivate(Symbols::InvocationMirror())); 3330 corelib.LookupClassAllowPrivate(Symbols::InvocationMirror()));
3326 ASSERT(!mirror_class.IsNull()); 3331 ASSERT(!mirror_class.IsNull());
3327 const Function& allocation_function = Function::ZoneHandle( 3332 const Function& allocation_function = Function::ZoneHandle(
3328 Resolver::ResolveStaticByName( 3333 Resolver::ResolveStaticByName(
3329 mirror_class, 3334 mirror_class,
3330 PrivateCoreLibName(Symbols::AllocateInvocationMirror()), 3335 PrivateCoreLibName(Symbols::AllocateInvocationMirror()),
3331 Resolver::kIsQualified)); 3336 Resolver::kIsQualified));
3332 ASSERT(!allocation_function.IsNull()); 3337 ASSERT(!allocation_function.IsNull());
3333 3338
3334 // Evaluate the receiver before the arguments. This will be used 3339 // Evaluate the receiver before the arguments. This will be used
3335 // as an argument to the noSuchMethod call. 3340 // as an argument to the noSuchMethod call.
3336 ValueGraphVisitor for_receiver(owner(), temp_index()); 3341 ValueGraphVisitor for_receiver(owner(), temp_index());
3337 receiver->Visit(&for_receiver); 3342 receiver->Visit(&for_receiver);
3338 Append(for_receiver); 3343 Append(for_receiver);
3339 PushArgumentInstr* push_receiver = PushArgument(for_receiver.value()); 3344 PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
3340 3345
3341 // Allocate the arguments and pass them into the construction 3346 // Allocate the arguments and pass them into the construction
3342 // of the InvocationMirror. 3347 // of the InvocationMirror.
3343 const intptr_t args_pos = method_arguments->token_pos(); 3348 ZoneGrowableArray<PushArgumentInstr*>* allocation_args =
3344 ArgumentListNode* arguments = new ArgumentListNode(args_pos); 3349 new ZoneGrowableArray<PushArgumentInstr*>(3);
3345 // The first argument is the original method name. 3350 // The first argument is the original method name.
3346 arguments->Add(new LiteralNode(args_pos, method_name)); 3351 allocation_args->Add(PushArgument(Bind(new ConstantInstr(method_name))));
3352
3347 // The second argument is the arguments descriptor of the original method. 3353 // The second argument is the arguments descriptor of the original method.
3348 const Array& args_descriptor = 3354 const Array& args_descriptor =
3349 Array::ZoneHandle(ArgumentsDescriptor::New(method_arguments->length(), 3355 Array::ZoneHandle(ArgumentsDescriptor::New(method_arguments->length(),
3350 method_arguments->names())); 3356 method_arguments->names()));
3351 arguments->Add(new LiteralNode(args_pos, args_descriptor)); 3357 allocation_args->Add(PushArgument(Bind(new ConstantInstr(args_descriptor))));
3358
3352 // The third argument is an array containing the original method arguments, 3359 // The third argument is an array containing the original method arguments,
3353 // including the receiver. 3360 // including the receiver.
3354 ArrayNode* args_array = new ArrayNode( 3361 intptr_t args_pos = method_arguments->token_pos();
3355 args_pos, 3362 Value* element_type =
3356 Type::ZoneHandle(Type::ArrayType())); 3363 Bind(new ConstantInstr(AbstractTypeArguments::ZoneHandle()));
3357 for (intptr_t i = 0; i < method_arguments->length(); i++) { 3364 CreateArrayInstr* create =
3358 args_array->AddElement(method_arguments->NodeAt(i)); 3365 new CreateArrayInstr(args_pos,
3366 method_arguments->length(),
3367 Type::ZoneHandle(Type::ArrayType()),
3368 element_type);
3369 Value* args_array = Bind(create);
3370 { TempLocalScope tmp(this,
3371 args_array,
3372 false); // Don't pass value to the visitor.
3373 const intptr_t class_id = create->Type()->ToCid();
3374 const intptr_t deopt_id = Isolate::kNoDeoptId;
3375 for (int i = 0; i < method_arguments->length(); ++i) {
3376 Value* array = Bind(new LoadLocalInstr(*tmp.var()));
3377 Value* index = Bind(new ConstantInstr(Smi::ZoneHandle(Smi::New(i))));
3378 ValueGraphVisitor for_value(owner(), temp_index());
3379 method_arguments->NodeAt(i)->Visit(&for_value);
3380 Append(for_value);
3381 Value* value = for_value.value();
3382 if (save_last_arg && i == method_arguments->length() - 1) {
srdjan 2013/05/30 17:42:30 Add parenthesis.
Florian Schneider 2013/05/31 08:51:19 Done.
3383 // We can use the expression_temp_var here because this is always the
3384 // last argument before the call.
3385 value = Bind(BuildStoreExprTemp(value));
3386 }
3387 // No store barrier needed for constants.
3388 const StoreBarrierType emit_store_barrier =
3389 value->BindsToConstant()
3390 ? kNoStoreBarrier
3391 : kEmitStoreBarrier;
3392 intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(class_id);
3393 StoreIndexedInstr* store = new StoreIndexedInstr(
3394 array, index, value,
3395 emit_store_barrier, index_scale, class_id, deopt_id);
3396 Do(store);
3397 }
3398 args_array = tmp.CloseAndReturnValue();
3359 } 3399 }
3360 arguments->Add(args_array); 3400 allocation_args->Add(PushArgument(args_array));
3361 ZoneGrowableArray<PushArgumentInstr*>* allocation_args = 3401
3362 new ZoneGrowableArray<PushArgumentInstr*>(arguments->length());
3363 BuildPushArguments(*arguments, allocation_args);
3364 StaticCallInstr* allocation = new StaticCallInstr(args_pos, 3402 StaticCallInstr* allocation = new StaticCallInstr(args_pos,
3365 allocation_function, 3403 allocation_function,
3366 Array::ZoneHandle(), 3404 Array::ZoneHandle(),
3367 allocation_args); 3405 allocation_args);
3368 Value* invocation_mirror = Bind(allocation); 3406 Value* invocation_mirror = Bind(allocation);
3369 PushArgumentInstr* push_invocation_mirror = PushArgument(invocation_mirror); 3407 PushArgumentInstr* push_invocation_mirror = PushArgument(invocation_mirror);
3370 // Lookup noSuchMethod and call it with the receiver and the InvocationMirror. 3408 // Lookup noSuchMethod and call it with the receiver and the InvocationMirror.
3371 const Function& no_such_method_func = Function::ZoneHandle( 3409 const Function& no_such_method_func = Function::ZoneHandle(
3372 Resolver::ResolveDynamicAnyArgs(target_class, Symbols::NoSuchMethod())); 3410 Resolver::ResolveDynamicAnyArgs(target_class, Symbols::NoSuchMethod()));
3373 // We are guaranteed to find noSuchMethod of class Object. 3411 // We are guaranteed to find noSuchMethod of class Object.
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
3541 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, reason) + 1; 3579 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, reason) + 1;
3542 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 3580 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
3543 OS::SNPrint(chars, len, kFormat, function_name, reason); 3581 OS::SNPrint(chars, len, kFormat, function_name, reason);
3544 const Error& error = Error::Handle( 3582 const Error& error = Error::Handle(
3545 LanguageError::New(String::Handle(String::New(chars)))); 3583 LanguageError::New(String::Handle(String::New(chars))));
3546 Isolate::Current()->long_jump_base()->Jump(1, error); 3584 Isolate::Current()->long_jump_base()->Jump(1, error);
3547 } 3585 }
3548 3586
3549 3587
3550 } // namespace dart 3588 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | tests/language/language.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698