Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |