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

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

Issue 539153002: Port and integrate the irregexp engine from V8 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Explicitly null IC-Data, whitespace fixes in tests. Created 6 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
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/compiler.h" 5 #include "vm/compiler.h"
6 6
7 #include "vm/assembler.h" 7 #include "vm/assembler.h"
8 8
9 #include "vm/ast_printer.h" 9 #include "vm/ast_printer.h"
10 #include "vm/block_scheduler.h" 10 #include "vm/block_scheduler.h"
(...skipping 11 matching lines...) Expand all
22 #include "vm/flow_graph_compiler.h" 22 #include "vm/flow_graph_compiler.h"
23 #include "vm/flow_graph_inliner.h" 23 #include "vm/flow_graph_inliner.h"
24 #include "vm/flow_graph_optimizer.h" 24 #include "vm/flow_graph_optimizer.h"
25 #include "vm/flow_graph_type_propagator.h" 25 #include "vm/flow_graph_type_propagator.h"
26 #include "vm/il_printer.h" 26 #include "vm/il_printer.h"
27 #include "vm/longjump.h" 27 #include "vm/longjump.h"
28 #include "vm/object.h" 28 #include "vm/object.h"
29 #include "vm/object_store.h" 29 #include "vm/object_store.h"
30 #include "vm/os.h" 30 #include "vm/os.h"
31 #include "vm/parser.h" 31 #include "vm/parser.h"
32 #include "vm/regexp_parser.h"
33 #include "vm/regexp_assembler.h"
32 #include "vm/scanner.h" 34 #include "vm/scanner.h"
33 #include "vm/symbols.h" 35 #include "vm/symbols.h"
34 #include "vm/tags.h" 36 #include "vm/tags.h"
35 #include "vm/timer.h" 37 #include "vm/timer.h"
36 38
37 namespace dart { 39 namespace dart {
38 40
39 DEFINE_FLAG(bool, allocation_sinking, true, 41 DEFINE_FLAG(bool, allocation_sinking, true,
40 "Attempt to sink temporary allocations to side exits"); 42 "Attempt to sink temporary allocations to side exits");
41 DEFINE_FLAG(bool, common_subexpression_elimination, true, 43 DEFINE_FLAG(bool, common_subexpression_elimination, true,
(...skipping 14 matching lines...) Expand all
56 DEFINE_FLAG(bool, range_analysis, true, "Enable range analysis"); 58 DEFINE_FLAG(bool, range_analysis, true, "Enable range analysis");
57 DEFINE_FLAG(bool, reorder_basic_blocks, true, "Enable basic-block reordering."); 59 DEFINE_FLAG(bool, reorder_basic_blocks, true, "Enable basic-block reordering.");
58 DEFINE_FLAG(bool, trace_compiler, false, "Trace compiler operations."); 60 DEFINE_FLAG(bool, trace_compiler, false, "Trace compiler operations.");
59 DEFINE_FLAG(bool, trace_bailout, false, "Print bailout from ssa compiler."); 61 DEFINE_FLAG(bool, trace_bailout, false, "Print bailout from ssa compiler.");
60 DEFINE_FLAG(bool, use_inlining, true, "Enable call-site inlining"); 62 DEFINE_FLAG(bool, use_inlining, true, "Enable call-site inlining");
61 DEFINE_FLAG(bool, verify_compiler, false, 63 DEFINE_FLAG(bool, verify_compiler, false,
62 "Enable compiler verification assertions"); 64 "Enable compiler verification assertions");
63 65
64 DECLARE_FLAG(bool, trace_failed_optimization_attempts); 66 DECLARE_FLAG(bool, trace_failed_optimization_attempts);
65 DECLARE_FLAG(bool, trace_patching); 67 DECLARE_FLAG(bool, trace_patching);
68 DECLARE_FLAG(bool, trace_irregexp);
69
70 // TODO(jgruber): Factor out unoptimizing/optimizing pipelines and remove
71 // separate helpers functions & `optimizing` args.
72 class CompilationPipeline : public ValueObject {
73 public:
74 virtual void ParseFunction(ParsedFunction* parsed_function) = 0;
75 virtual FlowGraph* BuildFlowGraph(
76 ParsedFunction* parsed_function,
77 ZoneGrowableArray<const ICData*>* ic_data_array,
78 intptr_t osr_id) = 0;
79 virtual void CompileGraph(FlowGraphCompiler* graph_compiler) = 0;
80 virtual ~CompilationPipeline() { }
81 };
82
83
84 class StandardCompilationPipeline : public CompilationPipeline {
Vyacheslav Egorov (Google) 2014/10/07 15:48:30 I would call it 'Default' or 'Dart' CompilationPip
jgruber1 2014/10/07 17:16:51 Done.
85 public:
86 virtual void ParseFunction(ParsedFunction* parsed_function) {
87 Parser::ParseFunction(parsed_function);
88 parsed_function->AllocateVariables();
89 }
90
91 virtual FlowGraph* BuildFlowGraph(
92 ParsedFunction* parsed_function,
93 ZoneGrowableArray<const ICData*>* ic_data_array,
94 intptr_t osr_id) {
95 // Build the flow graph.
96 FlowGraphBuilder builder(parsed_function,
97 *ic_data_array,
98 NULL, // NULL = not inlining.
99 osr_id);
100
101 return builder.BuildGraph();
102 }
103
104 virtual void CompileGraph(FlowGraphCompiler* graph_compiler) {
Vyacheslav Egorov (Google) 2014/10/07 15:48:30 Given that CompileGraph is the same in both pipeli
jgruber1 2014/10/07 17:16:51 Done.
105 graph_compiler->CompileGraph();
106 }
107 };
108
109
110 class IrregexpCompilationPipeline : public StandardCompilationPipeline {
111 public:
112 explicit IrregexpCompilationPipeline(Isolate* isolate)
113 : macro_assembler_(NULL),
114 isolate_(isolate) { }
115
116 virtual void ParseFunction(ParsedFunction* parsed_function) {
117 RegExpParser::ParseFunction(parsed_function);
118 // Variables are allocated after compilation.
119 }
120
121 virtual FlowGraph* BuildFlowGraph(
122 ParsedFunction* parsed_function,
123 ZoneGrowableArray<const ICData*>* ic_data_array,
124 intptr_t osr_id) {
125 // Compile to the dart IR.
126 RegExpEngine::CompilationResult result =
127 RegExpEngine::Compile(parsed_function->regexp_compile_data(),
128 parsed_function,
129 ic_data_array);
130 macro_assembler_ = result.macro_assembler;
131
132 // Allocate variables now that we know the number of locals.
133 parsed_function->AllocateIrregexpVariables(result.num_stack_locals);
134
135 // Build the flow graph.
136 FlowGraphBuilder builder(parsed_function,
137 *ic_data_array,
138 NULL, // NULL = not inlining.
139 osr_id);
140
141 return new(isolate_) FlowGraph(builder,
142 result.graph_entry,
143 result.num_blocks);
144 }
145
146 virtual void CompileGraph(FlowGraphCompiler* graph_compiler) {
147 graph_compiler->CompileGraph();
148 macro_assembler_->FinalizeBlockOffsetTable();
149 }
150
151 private:
152 IRRegExpMacroAssembler* macro_assembler_;
153 Isolate* isolate_;
154 };
155
66 156
67 // Compile a function. Should call only if the function has not been compiled. 157 // Compile a function. Should call only if the function has not been compiled.
68 // Arg0: function object. 158 // Arg0: function object.
69 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) { 159 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) {
70 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); 160 const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
71 ASSERT(!function.HasCode()); 161 ASSERT(!function.HasCode());
72 const Error& error = Error::Handle(Compiler::CompileFunction(isolate, 162 const Error& error = Error::Handle(Compiler::CompileFunction(isolate,
73 function)); 163 function));
74 if (!error.IsNull()) { 164 if (!error.IsNull()) {
75 Exceptions::PropagateError(error); 165 Exceptions::PropagateError(error);
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 error = isolate->object_store()->sticky_error(); 347 error = isolate->object_store()->sticky_error();
258 isolate->object_store()->clear_sticky_error(); 348 isolate->object_store()->clear_sticky_error();
259 return error.raw(); 349 return error.raw();
260 } 350 }
261 UNREACHABLE(); 351 UNREACHABLE();
262 return Error::null(); 352 return Error::null();
263 } 353 }
264 354
265 355
266 // Return false if bailed out. 356 // Return false if bailed out.
267 static bool CompileParsedFunctionHelper(ParsedFunction* parsed_function, 357 static bool CompileParsedFunctionHelper(CompilationPipeline* pipeline,
358 ParsedFunction* parsed_function,
268 bool optimized, 359 bool optimized,
269 intptr_t osr_id) { 360 intptr_t osr_id) {
270 const Function& function = parsed_function->function(); 361 const Function& function = parsed_function->function();
271 if (optimized && !function.IsOptimizable()) { 362 if (optimized && !function.IsOptimizable()) {
272 return false; 363 return false;
273 } 364 }
274 TimerScope timer(FLAG_compiler_stats, &CompilerStats::codegen_timer); 365 TimerScope timer(FLAG_compiler_stats, &CompilerStats::codegen_timer);
275 bool is_compiled = false; 366 bool is_compiled = false;
276 Isolate* isolate = Isolate::Current(); 367 Isolate* isolate = Isolate::Current();
277 HANDLESCOPE(isolate); 368 HANDLESCOPE(isolate);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 if (FLAG_print_ic_data_map) { 405 if (FLAG_print_ic_data_map) {
315 for (intptr_t i = 0; i < ic_data_array->length(); i++) { 406 for (intptr_t i = 0; i < ic_data_array->length(); i++) {
316 if ((*ic_data_array)[i] != NULL) { 407 if ((*ic_data_array)[i] != NULL) {
317 OS::Print("%" Pd " ", i); 408 OS::Print("%" Pd " ", i);
318 FlowGraphPrinter::PrintICData(*(*ic_data_array)[i]); 409 FlowGraphPrinter::PrintICData(*(*ic_data_array)[i]);
319 } 410 }
320 } 411 }
321 } 412 }
322 } 413 }
323 414
324 // Build the flow graph. 415 flow_graph = pipeline->BuildFlowGraph(parsed_function,
325 FlowGraphBuilder builder(parsed_function, 416 ic_data_array,
326 *ic_data_array, 417 osr_id);
327 NULL, // NULL = not inlining.
328 osr_id);
329 flow_graph = builder.BuildGraph();
330 } 418 }
331 419
332 if (FLAG_print_flow_graph || 420 if (FLAG_print_flow_graph ||
333 (optimized && FLAG_print_flow_graph_optimized)) { 421 (optimized && FLAG_print_flow_graph_optimized)) {
334 if (osr_id == Isolate::kNoDeoptId) { 422 if (osr_id == Isolate::kNoDeoptId) {
335 FlowGraphPrinter::PrintGraph("Before Optimizations", flow_graph); 423 FlowGraphPrinter::PrintGraph("Before Optimizations", flow_graph);
336 } else { 424 } else {
337 FlowGraphPrinter::PrintGraph("For OSR", flow_graph); 425 FlowGraphPrinter::PrintGraph("For OSR", flow_graph);
338 } 426 }
339 } 427 }
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 FlowGraphPrinter::PrintGraph("After Optimizations", flow_graph); 663 FlowGraphPrinter::PrintGraph("After Optimizations", flow_graph);
576 } 664 }
577 } 665 }
578 666
579 Assembler assembler(use_far_branches); 667 Assembler assembler(use_far_branches);
580 FlowGraphCompiler graph_compiler(&assembler, flow_graph, optimized); 668 FlowGraphCompiler graph_compiler(&assembler, flow_graph, optimized);
581 { 669 {
582 TimerScope timer(FLAG_compiler_stats, 670 TimerScope timer(FLAG_compiler_stats,
583 &CompilerStats::graphcompiler_timer, 671 &CompilerStats::graphcompiler_timer,
584 isolate); 672 isolate);
585 graph_compiler.CompileGraph(); 673 pipeline->CompileGraph(&graph_compiler);
586 } 674 }
587 { 675 {
588 TimerScope timer(FLAG_compiler_stats, 676 TimerScope timer(FLAG_compiler_stats,
589 &CompilerStats::codefinalizer_timer, 677 &CompilerStats::codefinalizer_timer,
590 isolate); 678 isolate);
591 const Code& code = Code::Handle( 679 const Code& code = Code::Handle(
592 Code::FinalizeCode(function, &assembler, optimized)); 680 Code::FinalizeCode(function, &assembler, optimized));
593 code.set_is_optimized(optimized); 681 code.set_is_optimized(optimized);
594 graph_compiler.FinalizePcDescriptors(code); 682 graph_compiler.FinalizePcDescriptors(code);
595 graph_compiler.FinalizeDeoptInfo(code); 683 graph_compiler.FinalizeDeoptInfo(code);
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 start + offset.Value(), 897 start + offset.Value(),
810 function.ToFullyQualifiedCString(), 898 function.ToFullyQualifiedCString(),
811 code.raw()); 899 code.raw());
812 } 900 }
813 } 901 }
814 OS::Print("}\n"); 902 OS::Print("}\n");
815 } 903 }
816 } 904 }
817 905
818 906
819 static RawError* CompileFunctionHelper(const Function& function, 907 static RawError* CompileFunctionHelper(CompilationPipeline* pipeline,
908 const Function& function,
820 bool optimized, 909 bool optimized,
821 intptr_t osr_id) { 910 intptr_t osr_id) {
822 Isolate* isolate = Isolate::Current(); 911 Isolate* isolate = Isolate::Current();
823 StackZone zone(isolate); 912 StackZone zone(isolate);
824 LongJumpScope jump; 913 LongJumpScope jump;
825 if (setjmp(*jump.Set()) == 0) { 914 if (setjmp(*jump.Set()) == 0) {
826 TIMERSCOPE(isolate, time_compilation); 915 TIMERSCOPE(isolate, time_compilation);
827 Timer per_compile_timer(FLAG_trace_compiler, "Compilation time"); 916 Timer per_compile_timer(FLAG_trace_compiler, "Compilation time");
828 per_compile_timer.Start(); 917 per_compile_timer.Start();
829 ParsedFunction* parsed_function = new(isolate) ParsedFunction( 918 ParsedFunction* parsed_function = new(isolate) ParsedFunction(
830 isolate, Function::ZoneHandle(isolate, function.raw())); 919 isolate, Function::ZoneHandle(isolate, function.raw()));
831 if (FLAG_trace_compiler) { 920 if (FLAG_trace_compiler) {
832 OS::Print("Compiling %s%sfunction: '%s' @ token %" Pd ", size %" Pd "\n", 921 OS::Print("Compiling %s%sfunction: '%s' @ token %" Pd ", size %" Pd "\n",
833 (osr_id == Isolate::kNoDeoptId ? "" : "osr "), 922 (osr_id == Isolate::kNoDeoptId ? "" : "osr "),
834 (optimized ? "optimized " : ""), 923 (optimized ? "optimized " : ""),
835 function.ToFullyQualifiedCString(), 924 function.ToFullyQualifiedCString(),
836 function.token_pos(), 925 function.token_pos(),
837 (function.end_token_pos() - function.token_pos())); 926 (function.end_token_pos() - function.token_pos()));
838 } 927 }
839 { 928 {
840 HANDLESCOPE(isolate); 929 HANDLESCOPE(isolate);
841 Parser::ParseFunction(parsed_function); 930 pipeline->ParseFunction(parsed_function);
842 parsed_function->AllocateVariables();
843 } 931 }
844 932
845 const bool success = 933 const bool success = CompileParsedFunctionHelper(pipeline,
846 CompileParsedFunctionHelper(parsed_function, optimized, osr_id); 934 parsed_function,
935 optimized,
936 osr_id);
847 if (!success) { 937 if (!success) {
848 if (optimized) { 938 if (optimized) {
849 // Optimizer bailed out. Disable optimizations and to never try again. 939 // Optimizer bailed out. Disable optimizations and to never try again.
850 if (FLAG_trace_compiler) { 940 if (FLAG_trace_compiler) {
851 OS::Print("--> disabling optimizations for '%s'\n", 941 OS::Print("--> disabling optimizations for '%s'\n",
852 function.ToFullyQualifiedCString()); 942 function.ToFullyQualifiedCString());
853 } else if (FLAG_trace_failed_optimization_attempts) { 943 } else if (FLAG_trace_failed_optimization_attempts) {
854 OS::Print("Cannot optimize: %s\n", 944 OS::Print("Cannot optimize: %s\n",
855 function.ToFullyQualifiedCString()); 945 function.ToFullyQualifiedCString());
856 } 946 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 return error.raw(); 980 return error.raw();
891 } 981 }
892 UNREACHABLE(); 982 UNREACHABLE();
893 return Error::null(); 983 return Error::null();
894 } 984 }
895 985
896 986
897 RawError* Compiler::CompileFunction(Isolate* isolate, 987 RawError* Compiler::CompileFunction(Isolate* isolate,
898 const Function& function) { 988 const Function& function) {
899 VMTagScope tagScope(isolate, VMTag::kCompileUnoptimizedTagId); 989 VMTagScope tagScope(isolate, VMTag::kCompileUnoptimizedTagId);
900 return CompileFunctionHelper(function, false, Isolate::kNoDeoptId); 990 if (function.IsIrregexpFunction()) {
991 IrregexpCompilationPipeline pipeline(isolate);
992 return CompileFunctionHelper(
993 &pipeline, function, false, Isolate::kNoDeoptId);
994 } else {
995 StandardCompilationPipeline pipeline;
996 return CompileFunctionHelper(
997 &pipeline, function, false, Isolate::kNoDeoptId);
998 }
901 } 999 }
902 1000
903 1001
904 RawError* Compiler::CompileOptimizedFunction(Isolate* isolate, 1002 RawError* Compiler::CompileOptimizedFunction(Isolate* isolate,
905 const Function& function, 1003 const Function& function,
906 intptr_t osr_id) { 1004 intptr_t osr_id) {
907 VMTagScope tagScope(isolate, VMTag::kCompileOptimizedTagId); 1005 VMTagScope tagScope(isolate, VMTag::kCompileOptimizedTagId);
908 return CompileFunctionHelper(function, true, osr_id); 1006 if (function.IsIrregexpFunction()) {
1007 IrregexpCompilationPipeline pipeline(isolate);
1008 return CompileFunctionHelper(&pipeline, function, true, osr_id);
1009 } else {
1010 StandardCompilationPipeline pipeline;
1011 return CompileFunctionHelper(&pipeline, function, true, osr_id);
1012 }
909 } 1013 }
910 1014
911 1015
912 // This is only used from unit tests. 1016 // This is only used from unit tests.
913 RawError* Compiler::CompileParsedFunction( 1017 RawError* Compiler::CompileParsedFunction(
914 ParsedFunction* parsed_function) { 1018 ParsedFunction* parsed_function) {
915 Isolate* isolate = Isolate::Current(); 1019 Isolate* isolate = Isolate::Current();
916 LongJumpScope jump; 1020 LongJumpScope jump;
917 if (setjmp(*jump.Set()) == 0) { 1021 if (setjmp(*jump.Set()) == 0) {
918 // Non-optimized code generator. 1022 // Non-optimized code generator.
919 CompileParsedFunctionHelper(parsed_function, false, Isolate::kNoDeoptId); 1023 StandardCompilationPipeline pipeline;
1024 CompileParsedFunctionHelper(&pipeline,
1025 parsed_function,
1026 false,
1027 Isolate::kNoDeoptId);
920 if (FLAG_disassemble) { 1028 if (FLAG_disassemble) {
921 DisassembleCode(parsed_function->function(), false); 1029 DisassembleCode(parsed_function->function(), false);
922 } 1030 }
923 return Error::null(); 1031 return Error::null();
924 } else { 1032 } else {
925 Error& error = Error::Handle(); 1033 Error& error = Error::Handle();
926 // We got an error during compilation. 1034 // We got an error during compilation.
927 error = isolate->object_store()->sticky_error(); 1035 error = isolate->object_store()->sticky_error();
928 isolate->object_store()->clear_sticky_error(); 1036 isolate->object_store()->clear_sticky_error();
929 return error.raw(); 1037 return error.raw();
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 ASSERT(field.value() == Object::transition_sentinel().raw()); 1094 ASSERT(field.value() == Object::transition_sentinel().raw());
987 Isolate* isolate = Isolate::Current(); 1095 Isolate* isolate = Isolate::Current();
988 StackZone zone(isolate); 1096 StackZone zone(isolate);
989 LongJumpScope jump; 1097 LongJumpScope jump;
990 if (setjmp(*jump.Set()) == 0) { 1098 if (setjmp(*jump.Set()) == 0) {
991 ParsedFunction* parsed_function = 1099 ParsedFunction* parsed_function =
992 Parser::ParseStaticFieldInitializer(field); 1100 Parser::ParseStaticFieldInitializer(field);
993 1101
994 parsed_function->AllocateVariables(); 1102 parsed_function->AllocateVariables();
995 // Non-optimized code generator. 1103 // Non-optimized code generator.
996 CompileParsedFunctionHelper(parsed_function, false, Isolate::kNoDeoptId); 1104 StandardCompilationPipeline pipeline;
1105 CompileParsedFunctionHelper(&pipeline,
1106 parsed_function,
1107 false,
1108 Isolate::kNoDeoptId);
997 1109
998 // Invoke the function to evaluate the expression. 1110 // Invoke the function to evaluate the expression.
999 const Function& initializer = parsed_function->function(); 1111 const Function& initializer = parsed_function->function();
1000 const Object& result = PassiveObject::Handle( 1112 const Object& result = PassiveObject::Handle(
1001 DartEntry::InvokeFunction(initializer, Object::empty_array())); 1113 DartEntry::InvokeFunction(initializer, Object::empty_array()));
1002 return result.raw(); 1114 return result.raw();
1003 } else { 1115 } else {
1004 const Error& error = 1116 const Error& error =
1005 Error::Handle(isolate, isolate->object_store()->sticky_error()); 1117 Error::Handle(isolate, isolate->object_store()->sticky_error());
1006 isolate->object_store()->clear_sticky_error(); 1118 isolate->object_store()->clear_sticky_error();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1046 // would compile func automatically. We are checking fewer invariants 1158 // would compile func automatically. We are checking fewer invariants
1047 // here. 1159 // here.
1048 ParsedFunction* parsed_function = new ParsedFunction(isolate, func); 1160 ParsedFunction* parsed_function = new ParsedFunction(isolate, func);
1049 parsed_function->SetNodeSequence(fragment); 1161 parsed_function->SetNodeSequence(fragment);
1050 parsed_function->set_default_parameter_values(Object::null_array()); 1162 parsed_function->set_default_parameter_values(Object::null_array());
1051 parsed_function->EnsureExpressionTemp(); 1163 parsed_function->EnsureExpressionTemp();
1052 fragment->scope()->AddVariable(parsed_function->expression_temp_var()); 1164 fragment->scope()->AddVariable(parsed_function->expression_temp_var());
1053 parsed_function->AllocateVariables(); 1165 parsed_function->AllocateVariables();
1054 1166
1055 // Non-optimized code generator. 1167 // Non-optimized code generator.
1056 CompileParsedFunctionHelper(parsed_function, false, Isolate::kNoDeoptId); 1168 StandardCompilationPipeline pipeline;
1169 CompileParsedFunctionHelper(&pipeline,
1170 parsed_function,
1171 false,
1172 Isolate::kNoDeoptId);
1057 1173
1058 const Object& result = PassiveObject::Handle( 1174 const Object& result = PassiveObject::Handle(
1059 DartEntry::InvokeFunction(func, Object::empty_array())); 1175 DartEntry::InvokeFunction(func, Object::empty_array()));
1060 return result.raw(); 1176 return result.raw();
1061 } else { 1177 } else {
1062 const Object& result = 1178 const Object& result =
1063 PassiveObject::Handle(isolate->object_store()->sticky_error()); 1179 PassiveObject::Handle(isolate->object_store()->sticky_error());
1064 isolate->object_store()->clear_sticky_error(); 1180 isolate->object_store()->clear_sticky_error();
1065 return result.raw(); 1181 return result.raw();
1066 } 1182 }
1067 UNREACHABLE(); 1183 UNREACHABLE();
1068 return Object::null(); 1184 return Object::null();
1069 } 1185 }
1070 1186
1071 } // namespace dart 1187 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698