| 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 |