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/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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 return Error::null(); | 281 return Error::null(); |
282 } else { | 282 } else { |
283 Isolate* isolate = Isolate::Current(); | 283 Isolate* isolate = Isolate::Current(); |
284 Error& error = Error::Handle(isolate); | 284 Error& error = Error::Handle(isolate); |
285 error = isolate->object_store()->sticky_error(); | 285 error = isolate->object_store()->sticky_error(); |
286 isolate->object_store()->clear_sticky_error(); | 286 isolate->object_store()->clear_sticky_error(); |
287 return error.raw(); | 287 return error.raw(); |
288 } | 288 } |
289 } | 289 } |
290 | 290 |
291 Isolate* const isolate = Isolate::Current(); | 291 Thread* const thread = Thread::Current(); |
| 292 Isolate* const isolate = thread->isolate(); |
292 // We remember all the classes that are being compiled in these lists. This | 293 // We remember all the classes that are being compiled in these lists. This |
293 // also allows us to reset the marked_for_parsing state in case we see an | 294 // also allows us to reset the marked_for_parsing state in case we see an |
294 // error. | 295 // error. |
295 VMTagScope tagScope(isolate, VMTag::kCompileClassTagId); | 296 VMTagScope tagScope(thread, VMTag::kCompileClassTagId); |
296 Class& parse_class = Class::Handle(isolate); | 297 Class& parse_class = Class::Handle(isolate); |
297 const GrowableObjectArray& parse_list = | 298 const GrowableObjectArray& parse_list = |
298 GrowableObjectArray::Handle(isolate, GrowableObjectArray::New(4)); | 299 GrowableObjectArray::Handle(isolate, GrowableObjectArray::New(4)); |
299 const GrowableObjectArray& patch_list = | 300 const GrowableObjectArray& patch_list = |
300 GrowableObjectArray::Handle(isolate, GrowableObjectArray::New(4)); | 301 GrowableObjectArray::Handle(isolate, GrowableObjectArray::New(4)); |
301 | 302 |
302 // Parse the class and all the interfaces it implements and super classes. | 303 // Parse the class and all the interfaces it implements and super classes. |
303 LongJumpScope jump; | 304 LongJumpScope jump; |
304 if (setjmp(*jump.Set()) == 0) { | 305 if (setjmp(*jump.Set()) == 0) { |
305 StackZone zone(isolate); | 306 StackZone zone(thread); |
306 if (FLAG_trace_compiler) { | 307 if (FLAG_trace_compiler) { |
307 ISL_Print("Compiling Class %s '%s'\n", "", cls.ToCString()); | 308 ISL_Print("Compiling Class %s '%s'\n", "", cls.ToCString()); |
308 } | 309 } |
309 | 310 |
310 // Add the primary class which needs to be parsed to the parse list. | 311 // Add the primary class which needs to be parsed to the parse list. |
311 // Mark the class as parsed so that we don't recursively add the same | 312 // Mark the class as parsed so that we don't recursively add the same |
312 // class back into the list. | 313 // class back into the list. |
313 parse_list.Add(cls); | 314 parse_list.Add(cls); |
314 cls.set_is_marked_for_parsing(); | 315 cls.set_is_marked_for_parsing(); |
315 | 316 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 if (parse_class.is_marked_for_parsing()) { | 361 if (parse_class.is_marked_for_parsing()) { |
361 parse_class.reset_is_marked_for_parsing(); | 362 parse_class.reset_is_marked_for_parsing(); |
362 } | 363 } |
363 } | 364 } |
364 for (intptr_t i = 0; i < patch_list.Length(); i++) { | 365 for (intptr_t i = 0; i < patch_list.Length(); i++) { |
365 parse_class ^= patch_list.At(i); | 366 parse_class ^= patch_list.At(i); |
366 if (parse_class.is_marked_for_parsing()) { | 367 if (parse_class.is_marked_for_parsing()) { |
367 parse_class.reset_is_marked_for_parsing(); | 368 parse_class.reset_is_marked_for_parsing(); |
368 } | 369 } |
369 } | 370 } |
| 371 Thread* const thread = Thread::Current(); |
370 Isolate* const isolate = Isolate::Current(); | 372 Isolate* const isolate = Isolate::Current(); |
371 StackZone zone(isolate); | 373 StackZone zone(thread); |
372 Error& error = Error::Handle(isolate); | 374 Error& error = Error::Handle(isolate); |
373 error = isolate->object_store()->sticky_error(); | 375 error = isolate->object_store()->sticky_error(); |
374 isolate->object_store()->clear_sticky_error(); | 376 isolate->object_store()->clear_sticky_error(); |
375 return error.raw(); | 377 return error.raw(); |
376 } | 378 } |
377 UNREACHABLE(); | 379 UNREACHABLE(); |
378 return Error::null(); | 380 return Error::null(); |
379 } | 381 } |
380 | 382 |
381 | 383 |
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1101 return error.raw(); | 1103 return error.raw(); |
1102 } | 1104 } |
1103 UNREACHABLE(); | 1105 UNREACHABLE(); |
1104 return Error::null(); | 1106 return Error::null(); |
1105 } | 1107 } |
1106 | 1108 |
1107 | 1109 |
1108 RawError* Compiler::CompileFunction(Thread* thread, | 1110 RawError* Compiler::CompileFunction(Thread* thread, |
1109 const Function& function) { | 1111 const Function& function) { |
1110 Isolate* isolate = thread->isolate(); | 1112 Isolate* isolate = thread->isolate(); |
1111 VMTagScope tagScope(isolate, VMTag::kCompileUnoptimizedTagId); | 1113 VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId); |
1112 TIMELINE_FUNCTION_COMPILATION_DURATION(isolate, "Function", function); | 1114 TIMELINE_FUNCTION_COMPILATION_DURATION(isolate, "Function", function); |
1113 | 1115 |
1114 if (!isolate->compilation_allowed()) { | 1116 if (!isolate->compilation_allowed()) { |
1115 FATAL3("Precompilation missed function %s (%" Pd ", %s)\n", | 1117 FATAL3("Precompilation missed function %s (%" Pd ", %s)\n", |
1116 function.ToLibNamePrefixedQualifiedCString(), | 1118 function.ToLibNamePrefixedQualifiedCString(), |
1117 function.token_pos(), | 1119 function.token_pos(), |
1118 Function::KindToCString(function.kind())); | 1120 Function::KindToCString(function.kind())); |
1119 } | 1121 } |
1120 | 1122 |
1121 CompilationPipeline* pipeline = | 1123 CompilationPipeline* pipeline = |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1156 ISL_Print("Ensure unoptimized code for %s\n", function.ToCString()); | 1158 ISL_Print("Ensure unoptimized code for %s\n", function.ToCString()); |
1157 } | 1159 } |
1158 return Error::null(); | 1160 return Error::null(); |
1159 } | 1161 } |
1160 | 1162 |
1161 | 1163 |
1162 RawError* Compiler::CompileOptimizedFunction(Thread* thread, | 1164 RawError* Compiler::CompileOptimizedFunction(Thread* thread, |
1163 const Function& function, | 1165 const Function& function, |
1164 intptr_t osr_id) { | 1166 intptr_t osr_id) { |
1165 Isolate* isolate = thread->isolate(); | 1167 Isolate* isolate = thread->isolate(); |
1166 VMTagScope tagScope(isolate, VMTag::kCompileOptimizedTagId); | 1168 VMTagScope tagScope(thread, VMTag::kCompileOptimizedTagId); |
1167 TIMELINE_FUNCTION_COMPILATION_DURATION(isolate, | 1169 TIMELINE_FUNCTION_COMPILATION_DURATION(isolate, |
1168 "OptimizedFunction", function); | 1170 "OptimizedFunction", function); |
1169 | 1171 |
1170 CompilationPipeline* pipeline = | 1172 CompilationPipeline* pipeline = |
1171 CompilationPipeline::New(thread->zone(), function); | 1173 CompilationPipeline::New(thread->zone(), function); |
1172 return CompileFunctionHelper(pipeline, function, true, osr_id); | 1174 return CompileFunctionHelper(pipeline, function, true, osr_id); |
1173 } | 1175 } |
1174 | 1176 |
1175 | 1177 |
1176 // This is only used from unit tests. | 1178 // This is only used from unit tests. |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1414 const Object& result = | 1416 const Object& result = |
1415 PassiveObject::Handle(isolate->object_store()->sticky_error()); | 1417 PassiveObject::Handle(isolate->object_store()->sticky_error()); |
1416 isolate->object_store()->clear_sticky_error(); | 1418 isolate->object_store()->clear_sticky_error(); |
1417 return result.raw(); | 1419 return result.raw(); |
1418 } | 1420 } |
1419 UNREACHABLE(); | 1421 UNREACHABLE(); |
1420 return Object::null(); | 1422 return Object::null(); |
1421 } | 1423 } |
1422 | 1424 |
1423 } // namespace dart | 1425 } // namespace dart |
OLD | NEW |