| 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/code_generator.h" | 10 #include "vm/code_generator.h" |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 LongJump jump; | 415 LongJump jump; |
| 416 isolate->set_long_jump_base(&jump); | 416 isolate->set_long_jump_base(&jump); |
| 417 // Skips parsing if we need to only install unoptimized code. | 417 // Skips parsing if we need to only install unoptimized code. |
| 418 if (!optimized && !Code::Handle(function.unoptimized_code()).IsNull()) { | 418 if (!optimized && !Code::Handle(function.unoptimized_code()).IsNull()) { |
| 419 InstallUnoptimizedCode(function); | 419 InstallUnoptimizedCode(function); |
| 420 isolate->set_long_jump_base(base); | 420 isolate->set_long_jump_base(base); |
| 421 return Error::null(); | 421 return Error::null(); |
| 422 } | 422 } |
| 423 if (setjmp(*jump.Set()) == 0) { | 423 if (setjmp(*jump.Set()) == 0) { |
| 424 TIMERSCOPE(time_compilation); | 424 TIMERSCOPE(time_compilation); |
| 425 ParsedFunction parsed_function(function); | 425 ParsedFunction* parsed_function = new ParsedFunction(function); |
| 426 if (FLAG_trace_compiler) { | 426 if (FLAG_trace_compiler) { |
| 427 OS::Print("Compiling %sfunction: '%s' @ token %"Pd"\n", | 427 OS::Print("Compiling %sfunction: '%s' @ token %"Pd"\n", |
| 428 (optimized ? "optimized " : ""), | 428 (optimized ? "optimized " : ""), |
| 429 function.ToFullyQualifiedCString(), | 429 function.ToFullyQualifiedCString(), |
| 430 function.token_pos()); | 430 function.token_pos()); |
| 431 } | 431 } |
| 432 Parser::ParseFunction(&parsed_function); | 432 Parser::ParseFunction(parsed_function); |
| 433 parsed_function.AllocateVariables(); | 433 parsed_function->AllocateVariables(); |
| 434 | 434 |
| 435 const bool success = | 435 const bool success = |
| 436 CompileParsedFunctionHelper(parsed_function, optimized); | 436 CompileParsedFunctionHelper(*parsed_function, optimized); |
| 437 if (optimized && !success) { | 437 if (optimized && !success) { |
| 438 // Optimizer bailed out. Disable optimizations and to never try again. | 438 // Optimizer bailed out. Disable optimizations and to never try again. |
| 439 if (FLAG_trace_compiler) { | 439 if (FLAG_trace_compiler) { |
| 440 OS::Print("--> disabling optimizations for '%s'\n", | 440 OS::Print("--> disabling optimizations for '%s'\n", |
| 441 function.ToFullyQualifiedCString()); | 441 function.ToFullyQualifiedCString()); |
| 442 } | 442 } |
| 443 function.set_is_optimizable(false); | 443 function.set_is_optimizable(false); |
| 444 isolate->set_long_jump_base(base); | 444 isolate->set_long_jump_base(base); |
| 445 return Error::null(); | 445 return Error::null(); |
| 446 } | 446 } |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 | 558 |
| 559 func.set_result_type(Type::Handle(Type::DynamicType())); | 559 func.set_result_type(Type::Handle(Type::DynamicType())); |
| 560 func.set_num_fixed_parameters(0); | 560 func.set_num_fixed_parameters(0); |
| 561 func.SetNumOptionalParameters(0, true); | 561 func.SetNumOptionalParameters(0, true); |
| 562 // Manually generated AST, do not recompile. | 562 // Manually generated AST, do not recompile. |
| 563 func.set_is_optimizable(false); | 563 func.set_is_optimizable(false); |
| 564 | 564 |
| 565 // We compile the function here, even though InvokeStatic() below | 565 // We compile the function here, even though InvokeStatic() below |
| 566 // would compile func automatically. We are checking fewer invariants | 566 // would compile func automatically. We are checking fewer invariants |
| 567 // here. | 567 // here. |
| 568 ParsedFunction parsed_function(func); | 568 ParsedFunction* parsed_function = new ParsedFunction(func); |
| 569 parsed_function.SetNodeSequence(fragment); | 569 parsed_function->SetNodeSequence(fragment); |
| 570 parsed_function.set_default_parameter_values(Array::Handle()); | 570 parsed_function->set_default_parameter_values(Array::Handle()); |
| 571 parsed_function.set_expression_temp_var( | 571 parsed_function->set_expression_temp_var( |
| 572 ParsedFunction::CreateExpressionTempVar(0)); | 572 ParsedFunction::CreateExpressionTempVar(0)); |
| 573 fragment->scope()->AddVariable(parsed_function.expression_temp_var()); | 573 fragment->scope()->AddVariable(parsed_function->expression_temp_var()); |
| 574 parsed_function.AllocateVariables(); | 574 parsed_function->AllocateVariables(); |
| 575 | 575 |
| 576 // Non-optimized code generator. | 576 // Non-optimized code generator. |
| 577 CompileParsedFunctionHelper(parsed_function, false); | 577 CompileParsedFunctionHelper(*parsed_function, false); |
| 578 | 578 |
| 579 GrowableArray<const Object*> arguments; // no arguments. | 579 GrowableArray<const Object*> arguments; // no arguments. |
| 580 const Array& kNoArgumentNames = Array::Handle(); | 580 const Array& kNoArgumentNames = Array::Handle(); |
| 581 Object& result = Object::Handle(); | 581 Object& result = Object::Handle(); |
| 582 result = DartEntry::InvokeStatic(func, | 582 result = DartEntry::InvokeStatic(func, |
| 583 arguments, | 583 arguments, |
| 584 kNoArgumentNames); | 584 kNoArgumentNames); |
| 585 isolate->set_long_jump_base(base); | 585 isolate->set_long_jump_base(base); |
| 586 return result.raw(); | 586 return result.raw(); |
| 587 } else { | 587 } else { |
| 588 Object& result = Object::Handle(); | 588 Object& result = Object::Handle(); |
| 589 result = isolate->object_store()->sticky_error(); | 589 result = isolate->object_store()->sticky_error(); |
| 590 isolate->object_store()->clear_sticky_error(); | 590 isolate->object_store()->clear_sticky_error(); |
| 591 isolate->set_long_jump_base(base); | 591 isolate->set_long_jump_base(base); |
| 592 return result.raw(); | 592 return result.raw(); |
| 593 } | 593 } |
| 594 UNREACHABLE(); | 594 UNREACHABLE(); |
| 595 return Object::null(); | 595 return Object::null(); |
| 596 } | 596 } |
| 597 | 597 |
| 598 } // namespace dart | 598 } // namespace dart |
| OLD | NEW |