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

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

Issue 9703080: Split the computation of uninstantiated type arguments between the factory case (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 9 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/flow_graph_compiler_x64.cc » ('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 "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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/flow_graph_compiler_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698