Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: runtime/vm/object_test.cc

Issue 9325047: Add token index position to classes and types for more accurate error reporting. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/parser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698