| 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 "vm/ast_printer.h" | 7 #include "vm/ast_printer.h" |
| 8 #include "vm/flags.h" | 8 #include "vm/flags.h" |
| 9 #include "vm/intermediate_language.h" | 9 #include "vm/intermediate_language.h" |
| 10 #include "vm/longjump.h" | 10 #include "vm/longjump.h" |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 temp_index() + 2); | 428 temp_index() + 2); |
| 429 // 4. Perform the store and return the original value. | 429 // 4. Perform the store and return the original value. |
| 430 StoreLocalComp* store = | 430 StoreLocalComp* store = |
| 431 new StoreLocalComp(node->local(), new TempVal(temp_index() + 1)); | 431 new StoreLocalComp(node->local(), new TempVal(temp_index() + 1)); |
| 432 AddInstruction(new DoInstr(store)); | 432 AddInstruction(new DoInstr(store)); |
| 433 ReturnValue(new TempVal(AllocateTempIndex())); | 433 ReturnValue(new TempVal(AllocateTempIndex())); |
| 434 } | 434 } |
| 435 | 435 |
| 436 | 436 |
| 437 int EffectGraphVisitor::BuildIncrOpFieldLoad(IncrOpInstanceFieldNode* node, | 437 int EffectGraphVisitor::BuildIncrOpFieldLoad(IncrOpInstanceFieldNode* node, |
| 438 int start_index) { | 438 intptr_t start_index) { |
| 439 // Evaluate the receiver and duplicate it (it has two uses). | 439 // Evaluate the receiver and duplicate it (it has two uses). |
| 440 // t_n <- ... receiver ... | 440 // t_n <- ... receiver ... |
| 441 // t_n+1 <- Pick(t_n) | 441 // t_n+1 <- Pick(t_n) |
| 442 ArgumentGraphVisitor for_receiver(owner(), start_index); | 442 ArgumentGraphVisitor for_receiver(owner(), start_index); |
| 443 node->receiver()->Visit(&for_receiver); | 443 node->receiver()->Visit(&for_receiver); |
| 444 Append(for_receiver); | 444 Append(for_receiver); |
| 445 const int next_index = for_receiver.temp_index(); | 445 const int next_index = for_receiver.temp_index(); |
| 446 ASSERT(next_index == start_index + 1); | 446 ASSERT(next_index == start_index + 1); |
| 447 AddInstruction(new PickTempInstr(next_index, start_index)); | 447 AddInstruction(new PickTempInstr(next_index, start_index)); |
| 448 | 448 |
| 449 // Load the value. | 449 // Load the value. |
| 450 // t_n+1 <- InstanceCall(get:name, t_n+1) | 450 // t_n+1 <- InstanceCall(get:name, t_n+1) |
| 451 const String& getter_name = | 451 const String& getter_name = |
| 452 String::ZoneHandle(Field::GetterSymbol(node->field_name())); | 452 String::ZoneHandle(Field::GetterSymbol(node->field_name())); |
| 453 ZoneGrowableArray<Value*>* arguments = new ZoneGrowableArray<Value*>(1); | 453 ZoneGrowableArray<Value*>* arguments = new ZoneGrowableArray<Value*>(1); |
| 454 arguments->Add(new TempVal(next_index)); | 454 arguments->Add(new TempVal(next_index)); |
| 455 InstanceCallComp* load = | 455 InstanceCallComp* load = |
| 456 new InstanceCallComp(node->getter_id(), node->token_index(), getter_name, | 456 new InstanceCallComp(node->getter_id(), node->token_index(), getter_name, |
| 457 arguments, Array::ZoneHandle(), 1); | 457 arguments, Array::ZoneHandle(), 1); |
| 458 AddInstruction(new BindInstr(next_index, load)); | 458 AddInstruction(new BindInstr(next_index, load)); |
| 459 | 459 |
| 460 return next_index; | 460 return next_index; |
| 461 } | 461 } |
| 462 | 462 |
| 463 | 463 |
| 464 void EffectGraphVisitor::BuildIncrOpIncrement(Token::Kind kind, | 464 void EffectGraphVisitor::BuildIncrOpIncrement(Token::Kind kind, |
| 465 intptr_t node_id, | 465 intptr_t node_id, |
| 466 intptr_t token_index, | 466 intptr_t token_index, |
| 467 int start_index) { | 467 intptr_t start_index) { |
| 468 ASSERT((kind == Token::kINCR) || (kind == Token::kDECR)); | 468 ASSERT((kind == Token::kINCR) || (kind == Token::kDECR)); |
| 469 // Assumed that t_n-1 (where n is start_index) is the field value. | 469 // Assumed that t_n-1 (where n is start_index) is the field value. |
| 470 // t_n <- #1 | 470 // t_n <- #1 |
| 471 // t_n-1 <- InstanceCall(op, t_n-1, t_n) | 471 // t_n-1 <- InstanceCall(op, t_n-1, t_n) |
| 472 const Smi& one = Smi::ZoneHandle(Smi::New(1)); | 472 const Smi& one = Smi::ZoneHandle(Smi::New(1)); |
| 473 AddInstruction(new BindInstr(start_index, new ConstantVal(one))); | 473 AddInstruction(new BindInstr(start_index, new ConstantVal(one))); |
| 474 ZoneGrowableArray<Value*>* arguments = new ZoneGrowableArray<Value*>(2); | 474 ZoneGrowableArray<Value*>* arguments = new ZoneGrowableArray<Value*>(2); |
| 475 arguments->Add(new TempVal(start_index - 1)); | 475 arguments->Add(new TempVal(start_index - 1)); |
| 476 arguments->Add(new TempVal(start_index)); | 476 arguments->Add(new TempVal(start_index)); |
| 477 const String& op_name = | 477 const String& op_name = |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 arguments->Add(new TempVal(value_index)); | 533 arguments->Add(new TempVal(value_index)); |
| 534 InstanceCallComp* store = | 534 InstanceCallComp* store = |
| 535 new InstanceCallComp(node->setter_id(), node->token_index(), | 535 new InstanceCallComp(node->setter_id(), node->token_index(), |
| 536 setter_name, arguments, Array::ZoneHandle(), 1); | 536 setter_name, arguments, Array::ZoneHandle(), 1); |
| 537 AddInstruction(new DoInstr(store)); | 537 AddInstruction(new DoInstr(store)); |
| 538 ReturnValue(new TempVal(AllocateTempIndex())); | 538 ReturnValue(new TempVal(AllocateTempIndex())); |
| 539 } | 539 } |
| 540 | 540 |
| 541 | 541 |
| 542 int EffectGraphVisitor::BuildIncrOpIndexedLoad(IncrOpIndexedNode* node, | 542 int EffectGraphVisitor::BuildIncrOpIndexedLoad(IncrOpIndexedNode* node, |
| 543 int start_index) { | 543 intptr_t start_index) { |
| 544 // Evaluate the receiver and index. | 544 // Evaluate the receiver and index. |
| 545 // t_n <- ... receiver ... | 545 // t_n <- ... receiver ... |
| 546 // t_n+1 <- ... index ... | 546 // t_n+1 <- ... index ... |
| 547 ArgumentGraphVisitor for_receiver(owner(), start_index); | 547 ArgumentGraphVisitor for_receiver(owner(), start_index); |
| 548 node->array()->Visit(&for_receiver); | 548 node->array()->Visit(&for_receiver); |
| 549 Append(for_receiver); | 549 Append(for_receiver); |
| 550 ASSERT(for_receiver.temp_index() == start_index + 1); | 550 ASSERT(for_receiver.temp_index() == start_index + 1); |
| 551 ArgumentGraphVisitor for_index(owner(), start_index + 1); | 551 ArgumentGraphVisitor for_index(owner(), start_index + 1); |
| 552 node->index()->Visit(&for_index); | 552 node->index()->Visit(&for_index); |
| 553 Append(for_index); | 553 Append(for_index); |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 | 911 |
| 912 void EffectGraphVisitor::VisitCloneContextNode(CloneContextNode* node) { | 912 void EffectGraphVisitor::VisitCloneContextNode(CloneContextNode* node) { |
| 913 Bailout("EffectGraphVisitor::VisitCloneContextNode"); | 913 Bailout("EffectGraphVisitor::VisitCloneContextNode"); |
| 914 } | 914 } |
| 915 | 915 |
| 916 | 916 |
| 917 void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) { | 917 void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) { |
| 918 if (node->constructor().IsFactory()) { | 918 if (node->constructor().IsFactory()) { |
| 919 ZoneGrowableArray<Value*>* factory_arguments = | 919 ZoneGrowableArray<Value*>* factory_arguments = |
| 920 new ZoneGrowableArray<Value*>(); | 920 new ZoneGrowableArray<Value*>(); |
| 921 BuildTypeArguments(node, factory_arguments); | 921 factory_arguments->Add(BuildFactoryTypeArguments(node, temp_index())); |
| 922 ASSERT(factory_arguments->length() == 1); | 922 ASSERT(factory_arguments->length() == 1); |
| 923 TranslateArgumentList(*node->arguments(), | 923 TranslateArgumentList(*node->arguments(), |
| 924 temp_index() + 1, | 924 temp_index() + 1, |
| 925 factory_arguments); | 925 factory_arguments); |
| 926 StaticCallComp* call = | 926 StaticCallComp* call = |
| 927 new StaticCallComp(node->token_index(), | 927 new StaticCallComp(node->token_index(), |
| 928 node->constructor(), | 928 node->constructor(), |
| 929 node->arguments()->names(), | 929 node->arguments()->names(), |
| 930 factory_arguments); | 930 factory_arguments); |
| 931 ReturnComputation(call); | 931 ReturnComputation(call); |
| 932 return; | 932 return; |
| 933 } | 933 } |
| 934 Bailout("EffectGraphVisitor::VisitConstructorCallNode"); | 934 Bailout("EffectGraphVisitor::VisitConstructorCallNode"); |
| 935 } | 935 } |
| 936 | 936 |
| 937 | 937 |
| 938 Value* EffectGraphVisitor::GenerateInstantiatorTypeArguments( | 938 Value* EffectGraphVisitor::BuildInstantiatorTypeArguments( |
| 939 intptr_t token_index, intptr_t value_index) { | 939 intptr_t token_index, intptr_t start_index) { |
| 940 const Class& instantiator_class = Class::Handle( | 940 const Class& instantiator_class = Class::Handle( |
| 941 owner()->parsed_function().function().owner()); | 941 owner()->parsed_function().function().owner()); |
| 942 if (instantiator_class.NumTypeParameters() == 0) { | 942 if (instantiator_class.NumTypeParameters() == 0) { |
| 943 // The type arguments are compile time constants. | 943 // The type arguments are compile time constants. |
| 944 AbstractTypeArguments& type_arguments = AbstractTypeArguments::ZoneHandle(); | 944 AbstractTypeArguments& type_arguments = AbstractTypeArguments::ZoneHandle(); |
| 945 // TODO(regis): Temporary type should be allocated in new gen heap. | 945 // TODO(regis): Temporary type should be allocated in new gen heap. |
| 946 Type& type = Type::Handle( | 946 Type& type = Type::Handle( |
| 947 Type::New(instantiator_class, type_arguments, token_index)); | 947 Type::New(instantiator_class, type_arguments, token_index)); |
| 948 type ^= ClassFinalizer::FinalizeType( | 948 type ^= ClassFinalizer::FinalizeType( |
| 949 instantiator_class, type, ClassFinalizer::kFinalizeWellFormed); | 949 instantiator_class, type, ClassFinalizer::kFinalizeWellFormed); |
| 950 type_arguments = type.arguments(); | 950 type_arguments = type.arguments(); |
| 951 AddInstruction(new BindInstr(value_index, new ConstantVal(type_arguments))); | 951 AddInstruction(new BindInstr(start_index, new ConstantVal(type_arguments))); |
| 952 return new TempVal(value_index); | 952 return new TempVal(start_index); |
| 953 } | 953 } |
| 954 ASSERT(owner()->parsed_function().instantiator() != NULL); | 954 ASSERT(owner()->parsed_function().instantiator() != NULL); |
| 955 ValueGraphVisitor for_instantiator(owner(), value_index); | 955 ValueGraphVisitor for_instantiator(owner(), start_index); |
| 956 owner()->parsed_function().instantiator()->Visit(&for_instantiator); | 956 owner()->parsed_function().instantiator()->Visit(&for_instantiator); |
| 957 Append(for_instantiator); | 957 Append(for_instantiator); |
| 958 Function& outer_function = | 958 Function& outer_function = |
| 959 Function::Handle(owner()->parsed_function().function().raw()); | 959 Function::Handle(owner()->parsed_function().function().raw()); |
| 960 while (outer_function.IsLocalFunction()) { | 960 while (outer_function.IsLocalFunction()) { |
| 961 outer_function = outer_function.parent_function(); | 961 outer_function = outer_function.parent_function(); |
| 962 } | 962 } |
| 963 if (outer_function.IsFactory()) { | 963 if (outer_function.IsFactory()) { |
| 964 // All OK. | 964 // All OK. |
| 965 return for_instantiator.value(); | 965 return for_instantiator.value(); |
| 966 } | 966 } |
| 967 | 967 |
| 968 // The instantiator is the receiver of the caller, which is not a factory. | 968 // The instantiator is the receiver of the caller, which is not a factory. |
| 969 // The receiver cannot be null; extract its AbstractTypeArguments object. | 969 // The receiver cannot be null; extract its AbstractTypeArguments object. |
| 970 // Note that in the factory case, the instantiator is the first parameter | 970 // Note that in the factory case, the instantiator is the first parameter |
| 971 // of the factory, i.e. already an AbstractTypeArguments object. | 971 // of the factory, i.e. already an AbstractTypeArguments object. |
| 972 intptr_t type_arguments_instance_field_offset = | 972 intptr_t type_arguments_instance_field_offset = |
| 973 instantiator_class.type_arguments_instance_field_offset(); | 973 instantiator_class.type_arguments_instance_field_offset(); |
| 974 ASSERT(type_arguments_instance_field_offset != Class::kNoTypeArguments); | 974 ASSERT(type_arguments_instance_field_offset != Class::kNoTypeArguments); |
| 975 | 975 |
| 976 NativeLoadFieldComp* load = new NativeLoadFieldComp( | 976 NativeLoadFieldComp* load = new NativeLoadFieldComp( |
| 977 for_instantiator.value(), type_arguments_instance_field_offset); | 977 for_instantiator.value(), type_arguments_instance_field_offset); |
| 978 AddInstruction(new BindInstr(value_index, load)); | 978 AddInstruction(new BindInstr(start_index, load)); |
| 979 return new TempVal(value_index); | 979 return new TempVal(start_index); |
| 980 } | 980 } |
| 981 | 981 |
| 982 | 982 |
| 983 | 983 Value* EffectGraphVisitor::BuildFactoryTypeArguments( |
| 984 void EffectGraphVisitor::BuildTypeArguments(ConstructorCallNode* node, | 984 ConstructorCallNode* node, intptr_t start_index) { |
| 985 ZoneGrowableArray<Value*>* args) { | 985 ASSERT(node->constructor().IsFactory()); |
| 986 const Class& cls = Class::ZoneHandle(node->constructor().owner()); | |
| 987 ASSERT(cls.HasTypeArguments() || node->constructor().IsFactory()); | |
| 988 if (node->type_arguments().IsNull() || | 986 if (node->type_arguments().IsNull() || |
| 989 node->type_arguments().IsInstantiated()) { | 987 node->type_arguments().IsInstantiated()) { |
| 990 AddInstruction( | 988 AddInstruction( |
| 991 new BindInstr(temp_index(), new ConstantVal(node->type_arguments()))); | 989 new BindInstr(start_index, new ConstantVal(node->type_arguments()))); |
| 992 args->Add(new TempVal(temp_index())); | 990 return new TempVal(start_index); |
| 993 if (!node->constructor().IsFactory()) { | |
| 994 // Null instantiator. | |
| 995 AddInstruction(new BindInstr( | |
| 996 temp_index() + 1, new ConstantVal(Object::ZoneHandle()))); | |
| 997 args->Add(new TempVal(temp_index() + 1)); | |
| 998 } | |
| 999 return; | |
| 1000 } | |
| 1001 if (!node->constructor().IsFactory()) { | |
| 1002 // Place holder instruction as ExtractTypeArgumentsComp returns two values. | |
| 1003 AddInstruction(new BindInstr(temp_index(), | |
| 1004 new ConstantVal(Object::ZoneHandle()))); | |
| 1005 } | 991 } |
| 1006 // The type arguments are uninstantiated. | 992 // The type arguments are uninstantiated. |
| 1007 Value* instantiator_value = | 993 Value* instantiator_value = |
| 1008 GenerateInstantiatorTypeArguments(node->token_index(), temp_index() + 1); | 994 BuildInstantiatorTypeArguments(node->token_index(), start_index); |
| 1009 ExtractTypeArgumentsComp* extract = new ExtractTypeArgumentsComp( | 995 ExtractFactoryTypeArgumentsComp* extract = |
| 1010 node, instantiator_value); | 996 new ExtractFactoryTypeArgumentsComp(node, instantiator_value); |
| 1011 AddInstruction(new BindInstr(temp_index() + 1, extract)); | 997 AddInstruction(new BindInstr(start_index, extract)); |
| 1012 if (node->constructor().IsFactory()) { | 998 return new TempVal(start_index); |
| 1013 args->Add(new TempVal(temp_index())); | |
| 1014 } else { | |
| 1015 args->Add(new TempVal(temp_index())); | |
| 1016 args->Add(new TempVal(temp_index() + 1)); | |
| 1017 } | |
| 1018 } | 999 } |
| 1019 | 1000 |
| 1020 | 1001 |
| 1002 void EffectGraphVisitor::BuildConstructorTypeArguments( |
| 1003 ConstructorCallNode* node, |
| 1004 intptr_t start_index, |
| 1005 ZoneGrowableArray<Value*>* args) { |
| 1006 const Class& cls = Class::ZoneHandle(node->constructor().owner()); |
| 1007 ASSERT(cls.HasTypeArguments() && !node->constructor().IsFactory()); |
| 1008 if (node->type_arguments().IsNull() || |
| 1009 node->type_arguments().IsInstantiated()) { |
| 1010 AddInstruction( |
| 1011 new BindInstr(start_index, new ConstantVal(node->type_arguments()))); |
| 1012 args->Add(new TempVal(start_index)); |
| 1013 // Null instantiator. |
| 1014 AddInstruction(new BindInstr( |
| 1015 start_index + 1, new ConstantVal(Object::ZoneHandle()))); |
| 1016 args->Add(new TempVal(start_index + 1)); |
| 1017 return; |
| 1018 } |
| 1019 // The type arguments are uninstantiated. |
| 1020 // Place holder to hold uninstantiated constructor type arguments. |
| 1021 AddInstruction(new BindInstr(start_index, |
| 1022 new ConstantVal(Object::ZoneHandle()))); |
| 1023 Value* instantiator_value = |
| 1024 BuildInstantiatorTypeArguments(node->token_index(), start_index + 1); |
| 1025 AddInstruction(new PickTempInstr(start_index + 2, start_index + 1)); |
| 1026 Value* dup_instantiator_value = new TempVal(start_index + 2); |
| 1027 ExtractConstructorTypeArgumentsComp* extract_type_arguments = |
| 1028 new ExtractConstructorTypeArgumentsComp(node, dup_instantiator_value); |
| 1029 AddInstruction(new BindInstr(start_index + 2, extract_type_arguments)); |
| 1030 AddInstruction(new TuckTempInstr(start_index, start_index + 2)); |
| 1031 Value* constructor_type_arguments_value = new TempVal(start_index); |
| 1032 args->Add(constructor_type_arguments_value); |
| 1033 Value* discard_value = new TempVal(start_index + 2); |
| 1034 ExtractConstructorInstantiatorComp* extract_instantiator = |
| 1035 new ExtractConstructorInstantiatorComp(node, |
| 1036 instantiator_value, |
| 1037 discard_value); |
| 1038 AddInstruction(new BindInstr(start_index + 1, extract_instantiator)); |
| 1039 Value* constructor_instantiator_value = new TempVal(start_index + 1); |
| 1040 args->Add(constructor_instantiator_value); |
| 1041 } |
| 1042 |
| 1043 |
| 1021 void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) { | 1044 void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) { |
| 1022 if (node->constructor().IsFactory()) { | 1045 if (node->constructor().IsFactory()) { |
| 1023 EffectGraphVisitor::VisitConstructorCallNode(node); | 1046 EffectGraphVisitor::VisitConstructorCallNode(node); |
| 1024 return; | 1047 return; |
| 1025 } | 1048 } |
| 1026 | 1049 |
| 1027 const Class& cls = Class::ZoneHandle(node->constructor().owner()); | 1050 const Class& cls = Class::ZoneHandle(node->constructor().owner()); |
| 1028 const bool requires_type_arguments = cls.HasTypeArguments(); | 1051 const bool requires_type_arguments = cls.HasTypeArguments(); |
| 1029 | 1052 |
| 1030 ZoneGrowableArray<Value*>* allocate_arguments = | 1053 ZoneGrowableArray<Value*>* allocate_arguments = |
| 1031 new ZoneGrowableArray<Value*>(); | 1054 new ZoneGrowableArray<Value*>(); |
| 1032 if (requires_type_arguments) { | 1055 if (requires_type_arguments) { |
| 1033 BuildTypeArguments(node, allocate_arguments); | 1056 BuildConstructorTypeArguments(node, temp_index(), allocate_arguments); |
| 1034 } | 1057 } |
| 1035 // t_n contains the allocated and initialized object. | 1058 // t_n contains the allocated and initialized object. |
| 1036 // t_n <- AllocateObject(class) | 1059 // t_n <- AllocateObject(class) |
| 1037 // t_n+1 <- Pick(t_n) | 1060 // t_n+1 <- Pick(t_n) |
| 1038 // t_n+2 <- ctor-arg | 1061 // t_n+2 <- ctor-arg |
| 1039 // t_n+3... <- constructor arguments start here | 1062 // t_n+3... <- constructor arguments start here |
| 1040 // StaticCall(constructor, t_n+1, t_n+2, ...) | 1063 // StaticCall(constructor, t_n+1, t_n+2, ...) |
| 1041 | 1064 |
| 1042 AllocateObjectComp* alloc_comp = | 1065 AllocateObjectComp* alloc_comp = |
| 1043 new AllocateObjectComp(node, allocate_arguments); | 1066 new AllocateObjectComp(node, allocate_arguments); |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1546 } | 1569 } |
| 1547 | 1570 |
| 1548 | 1571 |
| 1549 void FlowGraphPrinter::VisitNativeLoadField(NativeLoadFieldComp* comp) { | 1572 void FlowGraphPrinter::VisitNativeLoadField(NativeLoadFieldComp* comp) { |
| 1550 OS::Print("NativeLoadField("); | 1573 OS::Print("NativeLoadField("); |
| 1551 comp->value()->Accept(this); | 1574 comp->value()->Accept(this); |
| 1552 OS::Print(", %d)", comp->offset_in_bytes()); | 1575 OS::Print(", %d)", comp->offset_in_bytes()); |
| 1553 } | 1576 } |
| 1554 | 1577 |
| 1555 | 1578 |
| 1556 void FlowGraphPrinter::VisitExtractTypeArguments( | 1579 void FlowGraphPrinter::VisitExtractFactoryTypeArguments( |
| 1557 ExtractTypeArgumentsComp* comp) { | 1580 ExtractFactoryTypeArgumentsComp* comp) { |
| 1558 OS::Print("ExtractTypeArguments("); | 1581 OS::Print("ExtractFactoryTypeArguments("); |
| 1559 comp->instantiator()->Accept(this); | 1582 comp->instantiator()->Accept(this); |
| 1560 OS::Print(")"); | 1583 OS::Print(")"); |
| 1561 } | 1584 } |
| 1562 | 1585 |
| 1563 | 1586 |
| 1587 void FlowGraphPrinter::VisitExtractConstructorTypeArguments( |
| 1588 ExtractConstructorTypeArgumentsComp* comp) { |
| 1589 OS::Print("ExtractConstructorTypeArguments("); |
| 1590 comp->instantiator()->Accept(this); |
| 1591 OS::Print(")"); |
| 1592 } |
| 1593 |
| 1594 |
| 1595 void FlowGraphPrinter::VisitExtractConstructorInstantiator( |
| 1596 ExtractConstructorInstantiatorComp* comp) { |
| 1597 OS::Print("ExtractConstructorInstantiator("); |
| 1598 comp->instantiator()->Accept(this); |
| 1599 OS::Print(", "); |
| 1600 comp->discard_value()->Accept(this); |
| 1601 OS::Print(")"); |
| 1602 } |
| 1603 |
| 1604 |
| 1564 void FlowGraphPrinter::VisitJoinEntry(JoinEntryInstr* instr) { | 1605 void FlowGraphPrinter::VisitJoinEntry(JoinEntryInstr* instr) { |
| 1565 OS::Print("%2d: [join]", instr->block_number()); | 1606 OS::Print("%2d: [join]", instr->block_number()); |
| 1566 } | 1607 } |
| 1567 | 1608 |
| 1568 | 1609 |
| 1569 void FlowGraphPrinter::VisitTargetEntry(TargetEntryInstr* instr) { | 1610 void FlowGraphPrinter::VisitTargetEntry(TargetEntryInstr* instr) { |
| 1570 OS::Print("%2d: [target]", instr->block_number()); | 1611 OS::Print("%2d: [target]", instr->block_number()); |
| 1571 } | 1612 } |
| 1572 | 1613 |
| 1573 | 1614 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1641 char* chars = reinterpret_cast<char*>( | 1682 char* chars = reinterpret_cast<char*>( |
| 1642 Isolate::Current()->current_zone()->Allocate(len)); | 1683 Isolate::Current()->current_zone()->Allocate(len)); |
| 1643 OS::SNPrint(chars, len, kFormat, function_name, reason); | 1684 OS::SNPrint(chars, len, kFormat, function_name, reason); |
| 1644 const Error& error = Error::Handle( | 1685 const Error& error = Error::Handle( |
| 1645 LanguageError::New(String::Handle(String::New(chars)))); | 1686 LanguageError::New(String::Handle(String::New(chars)))); |
| 1646 Isolate::Current()->long_jump_base()->Jump(1, error); | 1687 Isolate::Current()->long_jump_base()->Jump(1, error); |
| 1647 } | 1688 } |
| 1648 | 1689 |
| 1649 | 1690 |
| 1650 } // namespace dart | 1691 } // namespace dart |
| OLD | NEW |