OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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/precompiler.h" | 5 #include "vm/precompiler.h" |
6 | 6 |
7 #include "vm/aot_optimizer.h" | 7 #include "vm/aot_optimizer.h" |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/ast_printer.h" | 9 #include "vm/ast_printer.h" |
10 #include "vm/branch_optimizer.h" | 10 #include "vm/branch_optimizer.h" |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 void Precompiler::AddEntryPoints(Dart_QualifiedFunctionName entry_points[]) { | 341 void Precompiler::AddEntryPoints(Dart_QualifiedFunctionName entry_points[]) { |
342 Library& lib = Library::Handle(Z); | 342 Library& lib = Library::Handle(Z); |
343 Class& cls = Class::Handle(Z); | 343 Class& cls = Class::Handle(Z); |
344 Function& func = Function::Handle(Z); | 344 Function& func = Function::Handle(Z); |
345 Field& field = Field::Handle(Z); | 345 Field& field = Field::Handle(Z); |
346 String& library_uri = String::Handle(Z); | 346 String& library_uri = String::Handle(Z); |
347 String& class_name = String::Handle(Z); | 347 String& class_name = String::Handle(Z); |
348 String& function_name = String::Handle(Z); | 348 String& function_name = String::Handle(Z); |
349 | 349 |
350 for (intptr_t i = 0; entry_points[i].library_uri != NULL; i++) { | 350 for (intptr_t i = 0; entry_points[i].library_uri != NULL; i++) { |
351 library_uri = Symbols::New(entry_points[i].library_uri); | 351 library_uri = Symbols::New(thread(), entry_points[i].library_uri); |
352 class_name = Symbols::New(entry_points[i].class_name); | 352 class_name = Symbols::New(thread(), entry_points[i].class_name); |
353 function_name = Symbols::New(entry_points[i].function_name); | 353 function_name = Symbols::New(thread(), entry_points[i].function_name); |
354 | 354 |
355 lib = Library::LookupLibrary(library_uri); | 355 lib = Library::LookupLibrary(library_uri); |
356 if (lib.IsNull()) { | 356 if (lib.IsNull()) { |
357 String& msg = String::Handle(Z, String::NewFormatted( | 357 String& msg = String::Handle(Z, String::NewFormatted( |
358 "Cannot find entry point %s\n", entry_points[i].library_uri)); | 358 "Cannot find entry point %s\n", entry_points[i].library_uri)); |
359 Jump(Error::Handle(Z, ApiError::New(msg))); | 359 Jump(Error::Handle(Z, ApiError::New(msg))); |
360 UNREACHABLE(); | 360 UNREACHABLE(); |
361 } | 361 } |
362 | 362 |
363 if (class_name.raw() == Symbols::TopLevel().raw()) { | 363 if (class_name.raw() == Symbols::TopLevel().raw()) { |
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
839 if (FLAG_support_ast_printer && FLAG_trace_compiler) { | 839 if (FLAG_support_ast_printer && FLAG_trace_compiler) { |
840 THR_Print("compiling expression: "); | 840 THR_Print("compiling expression: "); |
841 AstPrinter::PrintNode(fragment); | 841 AstPrinter::PrintNode(fragment); |
842 } | 842 } |
843 | 843 |
844 // Create a dummy function object for the code generator. | 844 // Create a dummy function object for the code generator. |
845 // The function needs to be associated with a named Class: the interface | 845 // The function needs to be associated with a named Class: the interface |
846 // Function fits the bill. | 846 // Function fits the bill. |
847 const char* kEvalConst = "eval_const"; | 847 const char* kEvalConst = "eval_const"; |
848 const Function& func = Function::ZoneHandle(Function::New( | 848 const Function& func = Function::ZoneHandle(Function::New( |
849 String::Handle(Symbols::New(kEvalConst)), | 849 String::Handle(Symbols::New(thread, kEvalConst)), |
850 RawFunction::kRegularFunction, | 850 RawFunction::kRegularFunction, |
851 true, // static function | 851 true, // static function |
852 false, // not const function | 852 false, // not const function |
853 false, // not abstract | 853 false, // not abstract |
854 false, // not external | 854 false, // not external |
855 false, // not native | 855 false, // not native |
856 Class::Handle(Type::Handle(Type::DartFunctionType()).type_class()), | 856 Class::Handle(Type::Handle(Type::DartFunctionType()).type_class()), |
857 fragment->token_pos())); | 857 fragment->token_pos())); |
858 | 858 |
859 func.set_result_type(Object::dynamic_type()); | 859 func.set_result_type(Object::dynamic_type()); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
982 // if (function.HasCode()) continue; | 982 // if (function.HasCode()) continue; |
983 | 983 |
984 selector = function.name(); | 984 selector = function.name(); |
985 if (IsSent(selector)) { | 985 if (IsSent(selector)) { |
986 AddFunction(function); | 986 AddFunction(function); |
987 } | 987 } |
988 | 988 |
989 // Handle the implicit call type conversions. | 989 // Handle the implicit call type conversions. |
990 if (Field::IsGetterName(selector)) { | 990 if (Field::IsGetterName(selector)) { |
991 selector2 = Field::NameFromGetter(selector); | 991 selector2 = Field::NameFromGetter(selector); |
992 selector3 = Symbols::Lookup(selector2); | 992 selector3 = Symbols::Lookup(thread(), selector2); |
993 if (IsSent(selector2)) { | 993 if (IsSent(selector2)) { |
994 // Call-through-getter. | 994 // Call-through-getter. |
995 // Function is get:foo and somewhere foo is called. | 995 // Function is get:foo and somewhere foo is called. |
996 AddFunction(function); | 996 AddFunction(function); |
997 } | 997 } |
998 selector3 = Symbols::LookupFromConcat(Symbols::ClosurizePrefix(), | 998 selector3 = Symbols::LookupFromConcat(thread(), |
999 selector2); | 999 Symbols::ClosurizePrefix(), selector2); |
1000 if (IsSent(selector3)) { | 1000 if (IsSent(selector3)) { |
1001 // Hash-closurization. | 1001 // Hash-closurization. |
1002 // Function is get:foo and somewhere get:#foo is called. | 1002 // Function is get:foo and somewhere get:#foo is called. |
1003 AddFunction(function); | 1003 AddFunction(function); |
1004 | 1004 |
1005 function2 = function.ImplicitClosureFunction(); | 1005 function2 = function.ImplicitClosureFunction(); |
1006 AddFunction(function2); | 1006 AddFunction(function2); |
1007 | 1007 |
1008 // Add corresponding method extractor get:#foo. | 1008 // Add corresponding method extractor get:#foo. |
1009 function2 = function.GetMethodExtractor(selector3); | 1009 function2 = function.GetMethodExtractor(selector3); |
1010 AddFunction(function2); | 1010 AddFunction(function2); |
1011 } | 1011 } |
1012 } else if (Field::IsSetterName(selector)) { | 1012 } else if (Field::IsSetterName(selector)) { |
1013 selector2 = Symbols::LookupFromConcat(Symbols::ClosurizePrefix(), | 1013 selector2 = Symbols::LookupFromConcat(thread(), |
1014 selector); | 1014 Symbols::ClosurizePrefix(), selector); |
1015 if (IsSent(selector2)) { | 1015 if (IsSent(selector2)) { |
1016 // Hash-closurization. | 1016 // Hash-closurization. |
1017 // Function is set:foo and somewhere get:#set:foo is called. | 1017 // Function is set:foo and somewhere get:#set:foo is called. |
1018 AddFunction(function); | 1018 AddFunction(function); |
1019 | 1019 |
1020 function2 = function.ImplicitClosureFunction(); | 1020 function2 = function.ImplicitClosureFunction(); |
1021 AddFunction(function2); | 1021 AddFunction(function2); |
1022 | 1022 |
1023 // Add corresponding method extractor get:#set:foo. | 1023 // Add corresponding method extractor get:#set:foo. |
1024 function2 = function.GetMethodExtractor(selector2); | 1024 function2 = function.GetMethodExtractor(selector2); |
1025 AddFunction(function2); | 1025 AddFunction(function2); |
1026 } | 1026 } |
1027 } else if (function.kind() == RawFunction::kRegularFunction) { | 1027 } else if (function.kind() == RawFunction::kRegularFunction) { |
1028 selector2 = Field::LookupGetterSymbol(selector); | 1028 selector2 = Field::LookupGetterSymbol(selector); |
1029 if (IsSent(selector2)) { | 1029 if (IsSent(selector2)) { |
1030 // Closurization. | 1030 // Closurization. |
1031 // Function is foo and somewhere get:foo is called. | 1031 // Function is foo and somewhere get:foo is called. |
1032 function2 = function.ImplicitClosureFunction(); | 1032 function2 = function.ImplicitClosureFunction(); |
1033 AddFunction(function2); | 1033 AddFunction(function2); |
1034 | 1034 |
1035 // Add corresponding method extractor. | 1035 // Add corresponding method extractor. |
1036 function2 = function.GetMethodExtractor(selector2); | 1036 function2 = function.GetMethodExtractor(selector2); |
1037 AddFunction(function2); | 1037 AddFunction(function2); |
1038 } | 1038 } |
1039 selector2 = Symbols::LookupFromConcat(Symbols::ClosurizePrefix(), | 1039 selector2 = Symbols::LookupFromConcat(thread(), |
1040 selector); | 1040 Symbols::ClosurizePrefix(), selector); |
1041 if (IsSent(selector2)) { | 1041 if (IsSent(selector2)) { |
1042 // Hash-closurization. | 1042 // Hash-closurization. |
1043 // Function is foo and somewhere get:#foo is called. | 1043 // Function is foo and somewhere get:#foo is called. |
1044 function2 = function.ImplicitClosureFunction(); | 1044 function2 = function.ImplicitClosureFunction(); |
1045 AddFunction(function2); | 1045 AddFunction(function2); |
1046 | 1046 |
1047 // Add corresponding method extractor get:#foo | 1047 // Add corresponding method extractor get:#foo |
1048 function2 = function.GetMethodExtractor(selector2); | 1048 function2 = function.GetMethodExtractor(selector2); |
1049 AddFunction(function2); | 1049 AddFunction(function2); |
1050 } | 1050 } |
(...skipping 1631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2682 CompilationPipeline::New(thread->zone(), function); | 2682 CompilationPipeline::New(thread->zone(), function); |
2683 | 2683 |
2684 ASSERT(FLAG_precompiled_mode); | 2684 ASSERT(FLAG_precompiled_mode); |
2685 const bool optimized = function.IsOptimizable(); // False for natives. | 2685 const bool optimized = function.IsOptimizable(); // False for natives. |
2686 return PrecompileFunctionHelper(pipeline, function, optimized); | 2686 return PrecompileFunctionHelper(pipeline, function, optimized); |
2687 } | 2687 } |
2688 | 2688 |
2689 #endif // DART_PRECOMPILER | 2689 #endif // DART_PRECOMPILER |
2690 | 2690 |
2691 } // namespace dart | 2691 } // namespace dart |
OLD | NEW |