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/assembler.h" | 6 #include "vm/assembler.h" |
7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
8 #include "vm/isolate.h" | 8 #include "vm/isolate.h" |
9 #include "vm/object.h" | 9 #include "vm/object.h" |
10 #include "vm/object_store.h" | 10 #include "vm/object_store.h" |
11 #include "vm/unit_test.h" | 11 #include "vm/unit_test.h" |
12 | 12 |
13 namespace dart { | 13 namespace dart { |
14 | 14 |
15 TEST_CASE(Class) { | 15 TEST_CASE(Class) { |
16 // Allocate the class first. | 16 // Allocate the class first. |
17 const String& class_name = String::Handle(String::NewSymbol("MyClass")); | 17 const String& class_name = String::Handle(String::NewSymbol("MyClass")); |
18 const Script& script = Script::Handle(); | 18 const Script& script = Script::Handle(); |
19 const Class& cls = Class::Handle(Class::New(class_name, script)); | 19 const Class& cls = Class::Handle( |
| 20 Class::New(class_name, script, Scanner::kDummyTokenIndex)); |
20 | 21 |
21 // Class has no fields. | 22 // Class has no fields. |
22 const Array& no_fields = Array::Handle(Array::Empty()); | 23 const Array& no_fields = Array::Handle(Array::Empty()); |
23 cls.SetFields(no_fields); | 24 cls.SetFields(no_fields); |
24 | 25 |
25 // Create and populate the function arrays. | 26 // Create and populate the function arrays. |
26 const Array& functions = Array::Handle(Array::New(6)); | 27 const Array& functions = Array::Handle(Array::New(6)); |
27 Function& function = Function::Handle(); | 28 Function& function = Function::Handle(); |
28 String& function_name = String::Handle(); | 29 String& function_name = String::Handle(); |
29 function_name = String::NewSymbol("foo"); | 30 function_name = String::NewSymbol("foo"); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 function_name = String::New("bar"); | 88 function_name = String::New("bar"); |
88 function = cls.LookupDynamicFunction(function_name); | 89 function = cls.LookupDynamicFunction(function_name); |
89 EXPECT(!function.IsNull()); | 90 EXPECT(!function.IsNull()); |
90 EXPECT_EQ(kNumFixedParameters, function.num_fixed_parameters()); | 91 EXPECT_EQ(kNumFixedParameters, function.num_fixed_parameters()); |
91 EXPECT_EQ(kNumOptionalParameters, function.num_optional_parameters()); | 92 EXPECT_EQ(kNumOptionalParameters, function.num_optional_parameters()); |
92 | 93 |
93 const Array& interfaces = Array::Handle(Array::New(2)); | 94 const Array& interfaces = Array::Handle(Array::New(2)); |
94 Class& interface = Class::Handle(); | 95 Class& interface = Class::Handle(); |
95 String& interface_name = String::Handle(); | 96 String& interface_name = String::Handle(); |
96 interface_name = String::NewSymbol("Harley"); | 97 interface_name = String::NewSymbol("Harley"); |
97 interface = Class::New(interface_name, script); | 98 interface = Class::New(interface_name, script, Scanner::kDummyTokenIndex); |
98 interfaces.SetAt(0, Type::Handle(Type::NewNonParameterizedType(interface))); | 99 interfaces.SetAt(0, Type::Handle(Type::NewNonParameterizedType(interface))); |
99 interface_name = String::NewSymbol("Norton"); | 100 interface_name = String::NewSymbol("Norton"); |
100 interface = Class::New(interface_name, script); | 101 interface = Class::New(interface_name, script, Scanner::kDummyTokenIndex); |
101 interfaces.SetAt(1, Type::Handle(Type::NewNonParameterizedType(interface))); | 102 interfaces.SetAt(1, Type::Handle(Type::NewNonParameterizedType(interface))); |
102 cls.set_interfaces(interfaces); | 103 cls.set_interfaces(interfaces); |
103 cls.Finalize(); | 104 cls.Finalize(); |
104 | 105 |
105 const Array& array = Array::Handle(cls.functions_cache()); | 106 const Array& array = Array::Handle(cls.functions_cache()); |
106 array.SetAt(0, function_name); | 107 array.SetAt(0, function_name); |
107 cls.set_functions_cache(array); | 108 cls.set_functions_cache(array); |
108 String& test_name = String::Handle(); | 109 String& test_name = String::Handle(); |
109 test_name ^= Array::Handle(cls.functions_cache()).At(0); | 110 test_name ^= Array::Handle(cls.functions_cache()).At(0); |
110 EXPECT(test_name.Equals(function_name)); | 111 EXPECT(test_name.Equals(function_name)); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 EXPECT_EQ(Token::kLPAREN, token_stream.KindAt(1)); | 146 EXPECT_EQ(Token::kLPAREN, token_stream.KindAt(1)); |
146 EXPECT_EQ(Token::kPERIOD, token_stream.KindAt(4)); | 147 EXPECT_EQ(Token::kPERIOD, token_stream.KindAt(4)); |
147 EXPECT_EQ(Token::kEOS, token_stream.KindAt(5)); | 148 EXPECT_EQ(Token::kEOS, token_stream.KindAt(5)); |
148 } | 149 } |
149 | 150 |
150 | 151 |
151 TEST_CASE(InstanceClass) { | 152 TEST_CASE(InstanceClass) { |
152 // Allocate the class first. | 153 // Allocate the class first. |
153 String& class_name = String::Handle(String::NewSymbol("EmptyClass")); | 154 String& class_name = String::Handle(String::NewSymbol("EmptyClass")); |
154 Script& script = Script::Handle(); | 155 Script& script = Script::Handle(); |
155 const Class& empty_class = Class::Handle(Class::New(class_name, script)); | 156 const Class& empty_class = |
| 157 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex)); |
156 | 158 |
157 // No functions and no super class for the EmptyClass. | 159 // No functions and no super class for the EmptyClass. |
158 const Array& no_fields = Array::Handle(Array::Empty()); | 160 const Array& no_fields = Array::Handle(Array::Empty()); |
159 empty_class.SetFields(no_fields); | 161 empty_class.SetFields(no_fields); |
160 empty_class.Finalize(); | 162 empty_class.Finalize(); |
161 EXPECT_EQ(kObjectAlignment, empty_class.instance_size()); | 163 EXPECT_EQ(kObjectAlignment, empty_class.instance_size()); |
162 Instance& instance = Instance::Handle(Instance::New(empty_class)); | 164 Instance& instance = Instance::Handle(Instance::New(empty_class)); |
163 EXPECT_EQ(empty_class.raw(), instance.clazz()); | 165 EXPECT_EQ(empty_class.raw(), instance.clazz()); |
164 | 166 |
165 class_name = String::NewSymbol("OneFieldClass"); | 167 class_name = String::NewSymbol("OneFieldClass"); |
166 const Class& one_field_class = Class::Handle(Class::New(class_name, script)); | 168 const Class& one_field_class = |
| 169 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex)); |
167 | 170 |
168 // No functions and no super class for the OneFieldClass. | 171 // No functions and no super class for the OneFieldClass. |
169 const Array& one_fields = Array::Handle(Array::New(1)); | 172 const Array& one_fields = Array::Handle(Array::New(1)); |
170 const String& field_name = String::Handle(String::NewSymbol("the_field")); | 173 const String& field_name = String::Handle(String::NewSymbol("the_field")); |
171 const Field& field = Field::Handle(Field::New(field_name, false, false, 0)); | 174 const Field& field = Field::Handle(Field::New(field_name, false, false, 0)); |
172 one_fields.SetAt(0, field); | 175 one_fields.SetAt(0, field); |
173 one_field_class.SetFields(one_fields); | 176 one_field_class.SetFields(one_fields); |
174 one_field_class.Finalize(); | 177 one_field_class.Finalize(); |
175 intptr_t header_size = sizeof(RawObject); | 178 intptr_t header_size = sizeof(RawObject); |
176 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment), | 179 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment), |
177 one_field_class.instance_size()); | 180 one_field_class.instance_size()); |
178 EXPECT_EQ(header_size, field.Offset()); | 181 EXPECT_EQ(header_size, field.Offset()); |
179 } | 182 } |
180 | 183 |
181 | 184 |
182 TEST_CASE(Interface) { | 185 TEST_CASE(Interface) { |
183 String& class_name = String::Handle(String::NewSymbol("EmptyClass")); | 186 String& class_name = String::Handle(String::NewSymbol("EmptyClass")); |
184 Script& script = Script::Handle(); | 187 Script& script = Script::Handle(); |
185 const Class& factory_class = Class::Handle(Class::New(class_name, script)); | 188 const Class& factory_class = |
| 189 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex)); |
186 const Array& no_fields = Array::Handle(Array::Empty()); | 190 const Array& no_fields = Array::Handle(Array::Empty()); |
187 // Finalizes the class. | 191 // Finalizes the class. |
188 factory_class.SetFields(no_fields); | 192 factory_class.SetFields(no_fields); |
189 | 193 |
190 String& interface_name = String::Handle(String::NewSymbol("MyInterface")); | 194 String& interface_name = String::Handle(String::NewSymbol("MyInterface")); |
191 const Class& interface = | 195 const Class& interface = Class::Handle( |
192 Class::Handle(Class::NewInterface(interface_name, script)); | 196 Class::NewInterface(interface_name, script, Scanner::kDummyTokenIndex)); |
193 EXPECT(interface.is_interface()); | 197 EXPECT(interface.is_interface()); |
194 EXPECT(!factory_class.is_interface()); | 198 EXPECT(!factory_class.is_interface()); |
195 EXPECT(!interface.HasFactoryClass()); | 199 EXPECT(!interface.HasFactoryClass()); |
196 interface.set_factory_class(factory_class); | 200 interface.set_factory_class(factory_class); |
197 EXPECT_EQ(factory_class.raw(), interface.FactoryClass()); | 201 EXPECT_EQ(factory_class.raw(), interface.FactoryClass()); |
198 } | 202 } |
199 | 203 |
200 | 204 |
201 TEST_CASE(Smi) { | 205 TEST_CASE(Smi) { |
202 const Smi& smi = Smi::Handle(Smi::New(5)); | 206 const Smi& smi = Smi::Handle(Smi::New(5)); |
(...skipping 1845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2048 context.SetAt(2, Smi::Handle(Smi::New(3))); | 2052 context.SetAt(2, Smi::Handle(Smi::New(3))); |
2049 Smi& smi = Smi::Handle(); | 2053 Smi& smi = Smi::Handle(); |
2050 smi ^= context.At(0); | 2054 smi ^= context.At(0); |
2051 EXPECT_EQ(2, smi.Value()); | 2055 EXPECT_EQ(2, smi.Value()); |
2052 smi ^= context.At(2); | 2056 smi ^= context.At(2); |
2053 EXPECT_EQ(3, smi.Value()); | 2057 EXPECT_EQ(3, smi.Value()); |
2054 } | 2058 } |
2055 | 2059 |
2056 | 2060 |
2057 TEST_CASE(ContextScope) { | 2061 TEST_CASE(ContextScope) { |
2058 const intptr_t kPos = 1; // Dummy token index in non-existing source. | |
2059 const intptr_t parent_scope_function_level = 0; | 2062 const intptr_t parent_scope_function_level = 0; |
2060 LocalScope* parent_scope = | 2063 LocalScope* parent_scope = |
2061 new LocalScope(NULL, parent_scope_function_level, 0); | 2064 new LocalScope(NULL, parent_scope_function_level, 0); |
2062 | 2065 |
2063 const intptr_t local_scope_function_level = 1; | 2066 const intptr_t local_scope_function_level = 1; |
2064 LocalScope* local_scope = | 2067 LocalScope* local_scope = |
2065 new LocalScope(parent_scope, local_scope_function_level, 0); | 2068 new LocalScope(parent_scope, local_scope_function_level, 0); |
2066 | 2069 |
2067 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType()); | 2070 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType()); |
2068 const String& a = String::ZoneHandle(String::New("a")); | 2071 const String& a = String::ZoneHandle(String::New("a")); |
2069 LocalVariable* var_a = new LocalVariable(kPos, a, dynamic_type); | 2072 LocalVariable* var_a = |
| 2073 new LocalVariable(Scanner::kDummyTokenIndex, a, dynamic_type); |
2070 parent_scope->AddVariable(var_a); | 2074 parent_scope->AddVariable(var_a); |
2071 | 2075 |
2072 const String& b = String::ZoneHandle(String::New("b")); | 2076 const String& b = String::ZoneHandle(String::New("b")); |
2073 LocalVariable* var_b = new LocalVariable(kPos, b, dynamic_type); | 2077 LocalVariable* var_b = |
| 2078 new LocalVariable(Scanner::kDummyTokenIndex, b, dynamic_type); |
2074 local_scope->AddVariable(var_b); | 2079 local_scope->AddVariable(var_b); |
2075 | 2080 |
2076 const String& c = String::ZoneHandle(String::New("c")); | 2081 const String& c = String::ZoneHandle(String::New("c")); |
2077 LocalVariable* var_c = new LocalVariable(kPos, c, dynamic_type); | 2082 LocalVariable* var_c = |
| 2083 new LocalVariable(Scanner::kDummyTokenIndex, c, dynamic_type); |
2078 parent_scope->AddVariable(var_c); | 2084 parent_scope->AddVariable(var_c); |
2079 | 2085 |
2080 bool test_only = false; // Please, insert alias. | 2086 bool test_only = false; // Please, insert alias. |
2081 var_a = local_scope->LookupVariable(a, test_only); | 2087 var_a = local_scope->LookupVariable(a, test_only); |
2082 EXPECT(var_a->is_captured()); | 2088 EXPECT(var_a->is_captured()); |
2083 EXPECT_EQ(parent_scope_function_level, var_a->owner()->function_level()); | 2089 EXPECT_EQ(parent_scope_function_level, var_a->owner()->function_level()); |
2084 EXPECT(local_scope->LocalLookupVariable(a) == var_a); // Alias. | 2090 EXPECT(local_scope->LocalLookupVariable(a) == var_a); // Alias. |
2085 | 2091 |
2086 var_b = local_scope->LookupVariable(b, test_only); | 2092 var_b = local_scope->LookupVariable(b, test_only); |
2087 EXPECT(!var_b->is_captured()); | 2093 EXPECT(!var_b->is_captured()); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2137 EXPECT_EQ(1, var_c->index()); | 2143 EXPECT_EQ(1, var_c->index()); |
2138 EXPECT_EQ(parent_scope_context_level - local_scope_context_level, | 2144 EXPECT_EQ(parent_scope_context_level - local_scope_context_level, |
2139 var_c->owner()->context_level()); // Adjusted context level. | 2145 var_c->owner()->context_level()); // Adjusted context level. |
2140 } | 2146 } |
2141 | 2147 |
2142 | 2148 |
2143 TEST_CASE(Closure) { | 2149 TEST_CASE(Closure) { |
2144 // Allocate the class first. | 2150 // Allocate the class first. |
2145 const String& class_name = String::Handle(String::NewSymbol("MyClass")); | 2151 const String& class_name = String::Handle(String::NewSymbol("MyClass")); |
2146 const Script& script = Script::Handle(); | 2152 const Script& script = Script::Handle(); |
2147 const Class& cls = Class::Handle(Class::New(class_name, script)); | 2153 const Class& cls = |
| 2154 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex)); |
2148 const Array& functions = Array::Handle(Array::New(1)); | 2155 const Array& functions = Array::Handle(Array::New(1)); |
2149 | 2156 |
2150 const Context& context = Context::Handle(Context::New(0)); | 2157 const Context& context = Context::Handle(Context::New(0)); |
2151 Function& parent = Function::Handle(); | 2158 Function& parent = Function::Handle(); |
2152 const String& parent_name = String::Handle(String::NewSymbol("foo_papa")); | 2159 const String& parent_name = String::Handle(String::NewSymbol("foo_papa")); |
2153 parent = Function::New(parent_name, RawFunction::kFunction, false, false, 0); | 2160 parent = Function::New(parent_name, RawFunction::kFunction, false, false, 0); |
2154 functions.SetAt(0, parent); | 2161 functions.SetAt(0, parent); |
2155 cls.SetFunctions(functions); | 2162 cls.SetFunctions(functions); |
2156 | 2163 |
2157 Function& function = Function::Handle(); | 2164 Function& function = Function::Handle(); |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2342 EXPECT_EQ(3, pc_descs.TryIndex(5)); | 2349 EXPECT_EQ(3, pc_descs.TryIndex(5)); |
2343 EXPECT_EQ(static_cast<uword>(80), pc_descs.PC(5)); | 2350 EXPECT_EQ(static_cast<uword>(80), pc_descs.PC(5)); |
2344 EXPECT_EQ(150, pc_descs.TokenIndex(5)); | 2351 EXPECT_EQ(150, pc_descs.TokenIndex(5)); |
2345 EXPECT_EQ(PcDescriptors::kOther, pc_descs.DescriptorKind(0)); | 2352 EXPECT_EQ(PcDescriptors::kOther, pc_descs.DescriptorKind(0)); |
2346 EXPECT_EQ(PcDescriptors::kDeopt, pc_descs.DescriptorKind(1)); | 2353 EXPECT_EQ(PcDescriptors::kDeopt, pc_descs.DescriptorKind(1)); |
2347 } | 2354 } |
2348 | 2355 |
2349 | 2356 |
2350 static RawClass* CreateTestClass(const char* name) { | 2357 static RawClass* CreateTestClass(const char* name) { |
2351 const String& class_name = String::Handle(String::NewSymbol(name)); | 2358 const String& class_name = String::Handle(String::NewSymbol(name)); |
2352 const Class& cls = Class::Handle(Class::New(class_name, Script::Handle())); | 2359 const Class& cls = Class::Handle( |
| 2360 Class::New(class_name, Script::Handle(), Scanner::kDummyTokenIndex)); |
2353 return cls.raw(); | 2361 return cls.raw(); |
2354 } | 2362 } |
2355 | 2363 |
2356 | 2364 |
2357 static RawField* CreateTestField(const char* name) { | 2365 static RawField* CreateTestField(const char* name) { |
2358 const Class& cls = Class::Handle(CreateTestClass("global:")); | 2366 const Class& cls = Class::Handle(CreateTestClass("global:")); |
2359 const String& field_name = String::Handle(String::NewSymbol(name)); | 2367 const String& field_name = String::Handle(String::NewSymbol(name)); |
2360 const Field& field = Field::Handle(Field::New(field_name, true, false, 0)); | 2368 const Field& field = Field::Handle(Field::New(field_name, true, false, 0)); |
2361 field.set_owner(cls); | 2369 field.set_owner(cls); |
2362 return field.raw(); | 2370 return field.raw(); |
(...skipping 18 matching lines...) Expand all Loading... |
2381 cls = iterator.GetNextClass(); | 2389 cls = iterator.GetNextClass(); |
2382 ASSERT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw())); | 2390 ASSERT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw())); |
2383 count++; | 2391 count++; |
2384 } | 2392 } |
2385 ASSERT(count == 2); | 2393 ASSERT(count == 2); |
2386 } | 2394 } |
2387 | 2395 |
2388 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 2396 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
2389 | 2397 |
2390 } // namespace dart | 2398 } // namespace dart |
OLD | NEW |