| 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 "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 #include "vm/globals.h" | 6 #include "vm/globals.h" |
| 7 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) | 7 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) |
| 8 | 8 |
| 9 #include "vm/ast.h" | 9 #include "vm/ast.h" |
| 10 #include "vm/assembler.h" | 10 #include "vm/assembler.h" |
| 11 #include "vm/class_finalizer.h" | 11 #include "vm/class_finalizer.h" |
| 12 #include "vm/code_generator.h" | 12 #include "vm/code_generator.h" |
| 13 #include "vm/compiler.h" | 13 #include "vm/compiler.h" |
| 14 #include "vm/dart_entry.h" | 14 #include "vm/dart_entry.h" |
| 15 #include "vm/native_entry.h" | 15 #include "vm/native_entry.h" |
| 16 #include "vm/native_entry_test.h" | 16 #include "vm/native_entry_test.h" |
| 17 #include "vm/symbols.h" |
| 17 #include "vm/unit_test.h" | 18 #include "vm/unit_test.h" |
| 18 #include "vm/virtual_memory.h" | 19 #include "vm/virtual_memory.h" |
| 19 | 20 |
| 20 namespace dart { | 21 namespace dart { |
| 21 | 22 |
| 22 static const intptr_t kPos = Scanner::kDummyTokenIndex; | 23 static const intptr_t kPos = Scanner::kDummyTokenIndex; |
| 23 | 24 |
| 24 | 25 |
| 25 // Helper to allocate and return a LocalVariable. | 26 // Helper to allocate and return a LocalVariable. |
| 26 static LocalVariable* NewTestLocalVariable(const char* name) { | 27 static LocalVariable* NewTestLocalVariable(const char* name) { |
| 27 const String& variable_name = String::ZoneHandle(String::NewSymbol(name)); | 28 const String& variable_name = String::ZoneHandle(Symbols::New(name)); |
| 28 const Type& variable_type = Type::ZoneHandle(Type::DynamicType()); | 29 const Type& variable_type = Type::ZoneHandle(Type::DynamicType()); |
| 29 return new LocalVariable(kPos, variable_name, variable_type); | 30 return new LocalVariable(kPos, variable_name, variable_type); |
| 30 } | 31 } |
| 31 | 32 |
| 32 | 33 |
| 33 CODEGEN_TEST_GENERATE(SimpleReturnCodegen, test) { | 34 CODEGEN_TEST_GENERATE(SimpleReturnCodegen, test) { |
| 34 test->node_sequence()->Add(new ReturnNode(kPos)); | 35 test->node_sequence()->Add(new ReturnNode(kPos)); |
| 35 } | 36 } |
| 36 CODEGEN_TEST_RUN(SimpleReturnCodegen, Instance::null()) | 37 CODEGEN_TEST_RUN(SimpleReturnCodegen, Instance::null()) |
| 37 | 38 |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 local_scope->AddVariable(NewTestLocalVariable("b")); | 213 local_scope->AddVariable(NewTestLocalVariable("b")); |
| 213 ASSERT(local_scope->num_variables() == num_params); | 214 ASSERT(local_scope->num_variables() == num_params); |
| 214 const Array& default_values = Array::ZoneHandle(Array::New(num_opt_params)); | 215 const Array& default_values = Array::ZoneHandle(Array::New(num_opt_params)); |
| 215 default_values.SetAt(0, Smi::ZoneHandle(Smi::New(1))); // b = 1. | 216 default_values.SetAt(0, Smi::ZoneHandle(Smi::New(1))); // b = 1. |
| 216 test->set_default_parameter_values(default_values); | 217 test->set_default_parameter_values(default_values); |
| 217 const Function& function = test->function(); | 218 const Function& function = test->function(); |
| 218 function.set_num_fixed_parameters(num_fixed_params); | 219 function.set_num_fixed_parameters(num_fixed_params); |
| 219 function.set_num_optional_parameters(num_opt_params); | 220 function.set_num_optional_parameters(num_opt_params); |
| 220 const bool has_opt_params = true; | 221 const bool has_opt_params = true; |
| 221 const String& native_name = | 222 const String& native_name = |
| 222 String::ZoneHandle(String::NewSymbol("TestSmiSub")); | 223 String::ZoneHandle(Symbols::New("TestSmiSub")); |
| 223 NativeFunction native_function = | 224 NativeFunction native_function = |
| 224 reinterpret_cast<NativeFunction>(NATIVE_ENTRY_FUNCTION(TestSmiSub)); | 225 reinterpret_cast<NativeFunction>(NATIVE_ENTRY_FUNCTION(TestSmiSub)); |
| 225 node_seq->Add(new ReturnNode(kPos, | 226 node_seq->Add(new ReturnNode(kPos, |
| 226 new NativeBodyNode(kPos, | 227 new NativeBodyNode(kPos, |
| 227 native_name, | 228 native_name, |
| 228 native_function, | 229 native_function, |
| 229 num_params, | 230 num_params, |
| 230 has_opt_params, | 231 has_opt_params, |
| 231 false))); | 232 false))); |
| 232 } | 233 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 257 SequenceNode* node_seq = test->node_sequence(); | 258 SequenceNode* node_seq = test->node_sequence(); |
| 258 LiteralNode* a = | 259 LiteralNode* a = |
| 259 new LiteralNode(kPos, Double::ZoneHandle(Double::New(12.0, Heap::kOld))); | 260 new LiteralNode(kPos, Double::ZoneHandle(Double::New(12.0, Heap::kOld))); |
| 260 UnaryOpNode* neg_node = new UnaryOpNode(kPos, Token::kSUB, a); | 261 UnaryOpNode* neg_node = new UnaryOpNode(kPos, Token::kSUB, a); |
| 261 node_seq->Add(new ReturnNode(kPos, neg_node)); | 262 node_seq->Add(new ReturnNode(kPos, neg_node)); |
| 262 } | 263 } |
| 263 CODEGEN_TEST_RUN(DoubleUnaryOpCodegen, Double::New(-12.0)) | 264 CODEGEN_TEST_RUN(DoubleUnaryOpCodegen, Double::New(-12.0)) |
| 264 | 265 |
| 265 | 266 |
| 266 static Library& MakeTestLibrary(const char* url) { | 267 static Library& MakeTestLibrary(const char* url) { |
| 267 const String& lib_url = String::ZoneHandle(String::NewSymbol(url)); | 268 const String& lib_url = String::ZoneHandle(Symbols::New(url)); |
| 268 Library& lib = Library::ZoneHandle(Library::New(lib_url)); | 269 Library& lib = Library::ZoneHandle(Library::New(lib_url)); |
| 269 lib.Register(); | 270 lib.Register(); |
| 270 return lib; | 271 return lib; |
| 271 } | 272 } |
| 272 | 273 |
| 273 | 274 |
| 274 static RawClass* LookupClass(const Library& lib, const char* name) { | 275 static RawClass* LookupClass(const Library& lib, const char* name) { |
| 275 const String& cls_name = String::ZoneHandle(String::NewSymbol(name)); | 276 const String& cls_name = String::ZoneHandle(Symbols::New(name)); |
| 276 return lib.LookupClass(cls_name); | 277 return lib.LookupClass(cls_name); |
| 277 } | 278 } |
| 278 | 279 |
| 279 | 280 |
| 280 CODEGEN_TEST_GENERATE(StaticCallCodegen, test) { | 281 CODEGEN_TEST_GENERATE(StaticCallCodegen, test) { |
| 281 const char* kScriptChars = | 282 const char* kScriptChars = |
| 282 "class A {\n" | 283 "class A {\n" |
| 283 " static bar() { return 42; }\n" | 284 " static bar() { return 42; }\n" |
| 284 " static fly() { return 5; }\n" | 285 " static fly() { return 5; }\n" |
| 285 "}\n"; | 286 "}\n"; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 EXPECT(ClassFinalizer::FinalizePendingClasses()); | 342 EXPECT(ClassFinalizer::FinalizePendingClasses()); |
| 342 Class& cls = Class::ZoneHandle(LookupClass(lib, "A")); | 343 Class& cls = Class::ZoneHandle(LookupClass(lib, "A")); |
| 343 EXPECT(!cls.IsNull()); | 344 EXPECT(!cls.IsNull()); |
| 344 | 345 |
| 345 String& constructor_name = String::Handle(String::New("A.")); | 346 String& constructor_name = String::Handle(String::New("A.")); |
| 346 Function& constructor = | 347 Function& constructor = |
| 347 Function::ZoneHandle(cls.LookupConstructor(constructor_name)); | 348 Function::ZoneHandle(cls.LookupConstructor(constructor_name)); |
| 348 EXPECT(!constructor.IsNull()); | 349 EXPECT(!constructor.IsNull()); |
| 349 | 350 |
| 350 // The unit test creates an instance of class A and calls function 'bar'. | 351 // The unit test creates an instance of class A and calls function 'bar'. |
| 351 String& function_bar_name = String::ZoneHandle(String::NewSymbol("bar")); | 352 String& function_bar_name = String::ZoneHandle(Symbols::New("bar")); |
| 352 ArgumentListNode* no_arguments = new ArgumentListNode(kPos); | 353 ArgumentListNode* no_arguments = new ArgumentListNode(kPos); |
| 353 const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle(); | 354 const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle(); |
| 354 const LocalVariable& allocated = *test->CreateTempConstVariable("alloc"); | 355 const LocalVariable& allocated = *test->CreateTempConstVariable("alloc"); |
| 355 InstanceCallNode* call_bar = new InstanceCallNode( | 356 InstanceCallNode* call_bar = new InstanceCallNode( |
| 356 kPos, | 357 kPos, |
| 357 new ConstructorCallNode( | 358 new ConstructorCallNode( |
| 358 kPos, no_type_arguments, constructor, no_arguments, allocated), | 359 kPos, no_type_arguments, constructor, no_arguments, allocated), |
| 359 function_bar_name, | 360 function_bar_name, |
| 360 no_arguments); | 361 no_arguments); |
| 361 | 362 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 389 function.set_num_fixed_parameters(num_fixed_params); | 390 function.set_num_fixed_parameters(num_fixed_params); |
| 390 function.set_num_optional_parameters(num_opt_params); | 391 function.set_num_optional_parameters(num_opt_params); |
| 391 function.set_parameter_types(Array::Handle(Array::New(num_params))); | 392 function.set_parameter_types(Array::Handle(Array::New(num_params))); |
| 392 function.set_parameter_names(Array::Handle(Array::New(num_params))); | 393 function.set_parameter_names(Array::Handle(Array::New(num_params))); |
| 393 const Type& param_type = Type::Handle(Type::DynamicType()); | 394 const Type& param_type = Type::Handle(Type::DynamicType()); |
| 394 for (int i = 0; i < num_params - 1; i++) { | 395 for (int i = 0; i < num_params - 1; i++) { |
| 395 function.SetParameterTypeAt(i, param_type); | 396 function.SetParameterTypeAt(i, param_type); |
| 396 } | 397 } |
| 397 const bool has_opt_params = true; | 398 const bool has_opt_params = true; |
| 398 const String& native_name = | 399 const String& native_name = |
| 399 String::ZoneHandle(String::NewSymbol("TestSmiSum")); | 400 String::ZoneHandle(Symbols::New("TestSmiSum")); |
| 400 NativeFunction native_function = | 401 NativeFunction native_function = |
| 401 reinterpret_cast<NativeFunction>(NATIVE_ENTRY_FUNCTION(TestSmiSum)); | 402 reinterpret_cast<NativeFunction>(NATIVE_ENTRY_FUNCTION(TestSmiSum)); |
| 402 node_seq->Add(new ReturnNode(kPos, | 403 node_seq->Add(new ReturnNode(kPos, |
| 403 new NativeBodyNode(kPos, | 404 new NativeBodyNode(kPos, |
| 404 native_name, | 405 native_name, |
| 405 native_function, | 406 native_function, |
| 406 num_params, | 407 num_params, |
| 407 has_opt_params, | 408 has_opt_params, |
| 408 false))); | 409 false))); |
| 409 } | 410 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 EXPECT(!result.IsError()); | 504 EXPECT(!result.IsError()); |
| 504 const GrowableObjectArray& libs = GrowableObjectArray::Handle( | 505 const GrowableObjectArray& libs = GrowableObjectArray::Handle( |
| 505 Isolate::Current()->object_store()->libraries()); | 506 Isolate::Current()->object_store()->libraries()); |
| 506 ASSERT(!libs.IsNull()); | 507 ASSERT(!libs.IsNull()); |
| 507 // App lib is the last one that was loaded. | 508 // App lib is the last one that was loaded. |
| 508 intptr_t num_libs = libs.Length(); | 509 intptr_t num_libs = libs.Length(); |
| 509 Library& app_lib = Library::Handle(); | 510 Library& app_lib = Library::Handle(); |
| 510 app_lib ^= libs.At(num_libs - 1); | 511 app_lib ^= libs.At(num_libs - 1); |
| 511 ASSERT(!app_lib.IsNull()); | 512 ASSERT(!app_lib.IsNull()); |
| 512 const Class& cls = Class::Handle( | 513 const Class& cls = Class::Handle( |
| 513 app_lib.LookupClass(String::Handle(String::NewSymbol("A")))); | 514 app_lib.LookupClass(String::Handle(Symbols::New("A")))); |
| 514 EXPECT_EQ(cls.raw(), result.clazz()); | 515 EXPECT_EQ(cls.raw(), result.clazz()); |
| 515 } | 516 } |
| 516 | 517 |
| 517 } // namespace dart | 518 } // namespace dart |
| 518 | 519 |
| 519 #endif // defined TARGET_ARCH_IA32 || defined(TARGET_ARCH_X64) | 520 #endif // defined TARGET_ARCH_IA32 || defined(TARGET_ARCH_X64) |
| OLD | NEW |