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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 EXPECT(ClassFinalizer::FinalizePendingClasses()); | 338 EXPECT(ClassFinalizer::FinalizePendingClasses()); |
338 Class& cls = Class::ZoneHandle(LookupClass(lib, "A")); | 339 Class& cls = Class::ZoneHandle(LookupClass(lib, "A")); |
339 EXPECT(!cls.IsNull()); | 340 EXPECT(!cls.IsNull()); |
340 | 341 |
341 String& constructor_name = String::Handle(String::New("A.")); | 342 String& constructor_name = String::Handle(String::New("A.")); |
342 Function& constructor = | 343 Function& constructor = |
343 Function::ZoneHandle(cls.LookupConstructor(constructor_name)); | 344 Function::ZoneHandle(cls.LookupConstructor(constructor_name)); |
344 EXPECT(!constructor.IsNull()); | 345 EXPECT(!constructor.IsNull()); |
345 | 346 |
346 // The unit test creates an instance of class A and calls function 'bar'. | 347 // The unit test creates an instance of class A and calls function 'bar'. |
347 String& function_bar_name = String::ZoneHandle(String::NewSymbol("bar")); | 348 String& function_bar_name = String::ZoneHandle(Symbols::New("bar")); |
348 ArgumentListNode* no_arguments = new ArgumentListNode(kPos); | 349 ArgumentListNode* no_arguments = new ArgumentListNode(kPos); |
349 const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle(); | 350 const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle(); |
350 const LocalVariable& allocated = *test->CreateTempConstVariable("alloc"); | 351 const LocalVariable& allocated = *test->CreateTempConstVariable("alloc"); |
351 InstanceCallNode* call_bar = new InstanceCallNode( | 352 InstanceCallNode* call_bar = new InstanceCallNode( |
352 kPos, | 353 kPos, |
353 new ConstructorCallNode( | 354 new ConstructorCallNode( |
354 kPos, no_type_arguments, constructor, no_arguments, allocated), | 355 kPos, no_type_arguments, constructor, no_arguments, allocated), |
355 function_bar_name, | 356 function_bar_name, |
356 no_arguments); | 357 no_arguments); |
357 | 358 |
(...skipping 27 matching lines...) Expand all Loading... |
385 function.set_num_fixed_parameters(num_fixed_params); | 386 function.set_num_fixed_parameters(num_fixed_params); |
386 function.set_num_optional_parameters(num_opt_params); | 387 function.set_num_optional_parameters(num_opt_params); |
387 function.set_parameter_types(Array::Handle(Array::New(num_params))); | 388 function.set_parameter_types(Array::Handle(Array::New(num_params))); |
388 function.set_parameter_names(Array::Handle(Array::New(num_params))); | 389 function.set_parameter_names(Array::Handle(Array::New(num_params))); |
389 const Type& param_type = Type::Handle(Type::DynamicType()); | 390 const Type& param_type = Type::Handle(Type::DynamicType()); |
390 for (int i = 0; i < num_params - 1; i++) { | 391 for (int i = 0; i < num_params - 1; i++) { |
391 function.SetParameterTypeAt(i, param_type); | 392 function.SetParameterTypeAt(i, param_type); |
392 } | 393 } |
393 const bool has_opt_params = true; | 394 const bool has_opt_params = true; |
394 const String& native_name = | 395 const String& native_name = |
395 String::ZoneHandle(String::NewSymbol("TestSmiSum")); | 396 String::ZoneHandle(Symbols::New("TestSmiSum")); |
396 NativeFunction native_function = | 397 NativeFunction native_function = |
397 reinterpret_cast<NativeFunction>(NATIVE_ENTRY_FUNCTION(TestSmiSum)); | 398 reinterpret_cast<NativeFunction>(NATIVE_ENTRY_FUNCTION(TestSmiSum)); |
398 node_seq->Add(new ReturnNode(kPos, | 399 node_seq->Add(new ReturnNode(kPos, |
399 new NativeBodyNode(kPos, | 400 new NativeBodyNode(kPos, |
400 native_name, | 401 native_name, |
401 native_function, | 402 native_function, |
402 num_params, | 403 num_params, |
403 has_opt_params, | 404 has_opt_params, |
404 false))); | 405 false))); |
405 } | 406 } |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 EXPECT(!result.IsError()); | 498 EXPECT(!result.IsError()); |
498 const GrowableObjectArray& libs = GrowableObjectArray::Handle( | 499 const GrowableObjectArray& libs = GrowableObjectArray::Handle( |
499 Isolate::Current()->object_store()->libraries()); | 500 Isolate::Current()->object_store()->libraries()); |
500 ASSERT(!libs.IsNull()); | 501 ASSERT(!libs.IsNull()); |
501 // App lib is the last one that was loaded. | 502 // App lib is the last one that was loaded. |
502 intptr_t num_libs = libs.Length(); | 503 intptr_t num_libs = libs.Length(); |
503 Library& app_lib = Library::Handle(); | 504 Library& app_lib = Library::Handle(); |
504 app_lib ^= libs.At(num_libs - 1); | 505 app_lib ^= libs.At(num_libs - 1); |
505 ASSERT(!app_lib.IsNull()); | 506 ASSERT(!app_lib.IsNull()); |
506 const Class& cls = Class::Handle( | 507 const Class& cls = Class::Handle( |
507 app_lib.LookupClass(String::Handle(String::NewSymbol("A")))); | 508 app_lib.LookupClass(String::Handle(Symbols::New("A")))); |
508 EXPECT_EQ(cls.raw(), result.clazz()); | 509 EXPECT_EQ(cls.raw(), result.clazz()); |
509 } | 510 } |
510 | 511 |
511 } // namespace dart | 512 } // namespace dart |
512 | 513 |
513 #endif // defined TARGET_ARCH_IA32 || defined(TARGET_ARCH_X64) | 514 #endif // defined TARGET_ARCH_IA32 || defined(TARGET_ARCH_X64) |
OLD | NEW |