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

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

Issue 8247014: Changes to handle unresolved qualified identifiers. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 years, 2 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
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "vm/assembler.h" 7 #include "vm/assembler.h"
8 #include "vm/assert.h" 8 #include "vm/assert.h"
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 #endif 43 #endif
44 #define RAW_NULL kHeapObjectTag 44 #define RAW_NULL kHeapObjectTag
45 RawObject* Object::null_ = reinterpret_cast<RawInstance*>(RAW_NULL); 45 RawObject* Object::null_ = reinterpret_cast<RawInstance*>(RAW_NULL);
46 RawInstance* Object::sentinel_ = reinterpret_cast<RawInstance*>(RAW_NULL); 46 RawInstance* Object::sentinel_ = reinterpret_cast<RawInstance*>(RAW_NULL);
47 RawInstance* Object::transition_sentinel_ = 47 RawInstance* Object::transition_sentinel_ =
48 reinterpret_cast<RawInstance*>(RAW_NULL); 48 reinterpret_cast<RawInstance*>(RAW_NULL);
49 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 49 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
50 RawClass* Object::null_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 50 RawClass* Object::null_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
51 RawClass* Object::var_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 51 RawClass* Object::var_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
52 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 52 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
53 RawClass* Object::unresolved_class_class_ =
54 reinterpret_cast<RawClass*>(RAW_NULL);
53 RawClass* Object::parameterized_type_class_ = 55 RawClass* Object::parameterized_type_class_ =
54 reinterpret_cast<RawClass*>(RAW_NULL); 56 reinterpret_cast<RawClass*>(RAW_NULL);
55 RawClass* Object::type_parameter_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 57 RawClass* Object::type_parameter_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
56 RawClass* Object::instantiated_type_class_ = 58 RawClass* Object::instantiated_type_class_ =
57 reinterpret_cast<RawClass*>(RAW_NULL); 59 reinterpret_cast<RawClass*>(RAW_NULL);
58 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 60 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
59 RawClass* Object::type_array_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 61 RawClass* Object::type_array_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
60 RawClass* Object::instantiated_type_arguments_class_ = 62 RawClass* Object::instantiated_type_arguments_class_ =
61 reinterpret_cast<RawClass*>(RAW_NULL); 63 reinterpret_cast<RawClass*>(RAW_NULL);
62 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 64 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
(...skipping 14 matching lines...) Expand all
77 int Object::GetSingletonClassIndex(const RawClass* raw_class) { 79 int Object::GetSingletonClassIndex(const RawClass* raw_class) {
78 ASSERT(raw_class->IsHeapObject()); 80 ASSERT(raw_class->IsHeapObject());
79 if (raw_class == class_class()) { 81 if (raw_class == class_class()) {
80 return kClassClass; 82 return kClassClass;
81 } else if (raw_class == null_class()) { 83 } else if (raw_class == null_class()) {
82 return kNullClass; 84 return kNullClass;
83 } else if (raw_class == var_class()) { 85 } else if (raw_class == var_class()) {
84 return kVarClass; 86 return kVarClass;
85 } else if (raw_class == void_class()) { 87 } else if (raw_class == void_class()) {
86 return kVoidClass; 88 return kVoidClass;
89 } else if (raw_class == unresolved_class_class()) {
90 return kUnresolvedClassClass;
87 } else if (raw_class == parameterized_type_class()) { 91 } else if (raw_class == parameterized_type_class()) {
88 return kParameterizedTypeClass; 92 return kParameterizedTypeClass;
89 } else if (raw_class == type_parameter_class()) { 93 } else if (raw_class == type_parameter_class()) {
90 return kTypeParameterClass; 94 return kTypeParameterClass;
91 } else if (raw_class == instantiated_type_class()) { 95 } else if (raw_class == instantiated_type_class()) {
92 return kInstantiatedTypeClass; 96 return kInstantiatedTypeClass;
93 } else if (raw_class == type_arguments_class()) { 97 } else if (raw_class == type_arguments_class()) {
94 return kTypeArgumentsClass; 98 return kTypeArgumentsClass;
95 } else if (raw_class == type_array_class()) { 99 } else if (raw_class == type_array_class()) {
96 return kTypeArrayClass; 100 return kTypeArrayClass;
(...skipping 27 matching lines...) Expand all
124 return kInvalidIndex; 128 return kInvalidIndex;
125 } 129 }
126 130
127 131
128 RawClass* Object::GetSingletonClass(int index) { 132 RawClass* Object::GetSingletonClass(int index) {
129 switch (index) { 133 switch (index) {
130 case kClassClass: return class_class(); 134 case kClassClass: return class_class();
131 case kNullClass: return null_class(); 135 case kNullClass: return null_class();
132 case kVarClass: return var_class(); 136 case kVarClass: return var_class();
133 case kVoidClass: return void_class(); 137 case kVoidClass: return void_class();
138 case kUnresolvedClassClass: return unresolved_class_class();
134 case kParameterizedTypeClass: return parameterized_type_class(); 139 case kParameterizedTypeClass: return parameterized_type_class();
135 case kTypeParameterClass: return type_parameter_class(); 140 case kTypeParameterClass: return type_parameter_class();
136 case kInstantiatedTypeClass: return instantiated_type_class(); 141 case kInstantiatedTypeClass: return instantiated_type_class();
137 case kTypeArgumentsClass: return type_arguments_class(); 142 case kTypeArgumentsClass: return type_arguments_class();
138 case kTypeArrayClass: return type_array_class(); 143 case kTypeArrayClass: return type_array_class();
139 case kInstantiatedTypeArgumentsClass: 144 case kInstantiatedTypeArgumentsClass:
140 return instantiated_type_arguments_class(); 145 return instantiated_type_arguments_class();
141 case kFunctionClass: return function_class(); 146 case kFunctionClass: return function_class();
142 case kFieldClass: return field_class(); 147 case kFieldClass: return field_class();
143 case kTokenStreamClass: return token_stream_class(); 148 case kTokenStreamClass: return token_stream_class();
(...skipping 12 matching lines...) Expand all
156 return reinterpret_cast<RawClass*>(kHeapObjectTag); // return RAW_NULL. 161 return reinterpret_cast<RawClass*>(kHeapObjectTag); // return RAW_NULL.
157 } 162 }
158 163
159 164
160 const char* Object::GetSingletonClassName(int index) { 165 const char* Object::GetSingletonClassName(int index) {
161 switch (index) { 166 switch (index) {
162 case kClassClass: return "Class"; 167 case kClassClass: return "Class";
163 case kNullClass: return "Null"; 168 case kNullClass: return "Null";
164 case kVarClass: return "var"; 169 case kVarClass: return "var";
165 case kVoidClass: return "void"; 170 case kVoidClass: return "void";
171 case kUnresolvedClassClass: return "UnresolvedClass";
166 case kParameterizedTypeClass: return "ParameterizedType"; 172 case kParameterizedTypeClass: return "ParameterizedType";
167 case kTypeParameterClass: return "TypeParameter"; 173 case kTypeParameterClass: return "TypeParameter";
168 case kInstantiatedTypeClass: return "InstantiatedType"; 174 case kInstantiatedTypeClass: return "InstantiatedType";
169 case kTypeArgumentsClass: return "TypeArguments"; 175 case kTypeArgumentsClass: return "TypeArguments";
170 case kTypeArrayClass: return "TypeArray"; 176 case kTypeArrayClass: return "TypeArray";
171 case kInstantiatedTypeArgumentsClass: return "InstantiatedTypeArguments"; 177 case kInstantiatedTypeArgumentsClass: return "InstantiatedTypeArguments";
172 case kFunctionClass: return "Function"; 178 case kFunctionClass: return "Function";
173 case kFieldClass: return "Field"; 179 case kFieldClass: return "Field";
174 case kTokenStreamClass: return "TokenStream"; 180 case kTokenStreamClass: return "TokenStream";
175 case kScriptClass: return "Script"; 181 case kScriptClass: return "Script";
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 sentinel ^= Object::Allocate(cls, Instance::InstanceSize(), Heap::kOld); 247 sentinel ^= Object::Allocate(cls, Instance::InstanceSize(), Heap::kOld);
242 sentinel_ = sentinel.raw(); 248 sentinel_ = sentinel.raw();
243 249
244 Instance& transition_sentinel = Instance::Handle(); 250 Instance& transition_sentinel = Instance::Handle();
245 transition_sentinel ^= 251 transition_sentinel ^=
246 Object::Allocate(cls, Instance::InstanceSize(), Heap::kOld); 252 Object::Allocate(cls, Instance::InstanceSize(), Heap::kOld);
247 transition_sentinel_ = transition_sentinel.raw(); 253 transition_sentinel_ = transition_sentinel.raw();
248 } 254 }
249 255
250 // Allocate the remaining VM internal classes. 256 // Allocate the remaining VM internal classes.
257 cls = Class::New<UnresolvedClass>();
258 unresolved_class_class_ = cls.raw();
259
251 cls = Class::New<Instance>(); 260 cls = Class::New<Instance>();
252 var_class_ = cls.raw(); 261 var_class_ = cls.raw();
253 262
254 cls = Class::New<Instance>(); 263 cls = Class::New<Instance>();
255 void_class_ = cls.raw(); 264 void_class_ = cls.raw();
256 265
257 cls = Class::New<ParameterizedType>(); 266 cls = Class::New<ParameterizedType>();
258 parameterized_type_class_ = cls.raw(); 267 parameterized_type_class_ = cls.raw();
259 268
260 cls = Class::New<TypeParameter>(); 269 cls = Class::New<TypeParameter>();
(...skipping 1206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1467 const char* library_name = lib.IsNull() ? "" : lib.ToCString(); 1476 const char* library_name = lib.IsNull() ? "" : lib.ToCString();
1468 const char* class_name = String::Handle(Name()).ToCString(); 1477 const char* class_name = String::Handle(Name()).ToCString();
1469 intptr_t len = OS::SNPrint(NULL, 0, format, library_name, class_name) + 1; 1478 intptr_t len = OS::SNPrint(NULL, 0, format, library_name, class_name) + 1;
1470 char* chars = reinterpret_cast<char*>( 1479 char* chars = reinterpret_cast<char*>(
1471 Isolate::Current()->current_zone()->Allocate(len)); 1480 Isolate::Current()->current_zone()->Allocate(len));
1472 OS::SNPrint(chars, len, format, library_name, class_name); 1481 OS::SNPrint(chars, len, format, library_name, class_name);
1473 return chars; 1482 return chars;
1474 } 1483 }
1475 1484
1476 1485
1486 RawUnresolvedClass* UnresolvedClass::New(intptr_t token_index,
1487 const String& qualifier,
1488 const String& ident) {
1489 const UnresolvedClass& type = UnresolvedClass::Handle(UnresolvedClass::New());
1490 type.set_token_index(token_index);
1491 type.set_qualifier(qualifier);
1492 type.set_ident(ident);
1493 return type.raw();
1494 }
1495
1496
1497 RawUnresolvedClass* UnresolvedClass::New() {
1498 const Class& unresolved_class_class =
1499 Class::Handle(Object::unresolved_class_class());
1500 RawObject* raw = Object::Allocate(unresolved_class_class,
1501 UnresolvedClass::InstanceSize(),
1502 Heap::kNew);
1503 return reinterpret_cast<RawUnresolvedClass*>(raw);
1504 }
1505
1506
1507 void UnresolvedClass::set_token_index(intptr_t token_index) const {
1508 raw_ptr()->token_index_ = token_index;
1509 }
1510
1511
1512 void UnresolvedClass::set_ident(const String& ident) const {
1513 StorePointer(&raw_ptr()->ident_, ident.raw());
1514 }
1515
1516
1517 void UnresolvedClass::set_qualifier(const String& qualifier) const {
1518 StorePointer(&raw_ptr()->qualifier_, qualifier.raw());
1519 }
1520
1521
1522 RawString* UnresolvedClass::Name() const {
1523 if (qualifier() != String::null()) {
1524 String& name = String::Handle();
1525 name = qualifier();
1526 String& str = String::Handle();
1527 str = String::New(".");
1528 name = String::Concat(name, str);
1529 str = ident();
1530 name = String::Concat(name, str);
1531 return name.raw();
1532 } else {
1533 return ident();
1534 }
1535 }
1536
1537
1538 const char* UnresolvedClass::ToCString() const {
1539 return "UnresolvedClass";
1540 }
1541
1542
1477 bool Type::IsResolved() const { 1543 bool Type::IsResolved() const {
1478 // Type is an abstract class. 1544 // Type is an abstract class.
1479 UNREACHABLE(); 1545 UNREACHABLE();
1480 return false; 1546 return false;
1481 } 1547 }
1482 1548
1483 1549
1484 bool Type::HasResolvedTypeClass() const { 1550 bool Type::HasResolvedTypeClass() const {
1485 // Type is an abstract class. 1551 // Type is an abstract class.
1486 UNREACHABLE(); 1552 UNREACHABLE();
1487 return false; 1553 return false;
1488 } 1554 }
1489 1555
1490 1556
1491 RawClass* Type::type_class() const { 1557 RawClass* Type::type_class() const {
1492 // Type is an abstract class. 1558 // Type is an abstract class.
1493 UNREACHABLE(); 1559 UNREACHABLE();
1494 return Class::null(); 1560 return Class::null();
1495 } 1561 }
1496 1562
1497 1563
1498 RawString* Type::unresolved_type_class() const { 1564 RawUnresolvedClass* Type::unresolved_class() const {
1499 // Type is an abstract class. 1565 // Type is an abstract class.
1500 UNREACHABLE(); 1566 UNREACHABLE();
1501 return String::null(); 1567 return UnresolvedClass::null();
1502 } 1568 }
1503 1569
1504 1570
1505 RawTypeArguments* Type::arguments() const { 1571 RawTypeArguments* Type::arguments() const {
1506 // Type is an abstract class. 1572 // Type is an abstract class.
1507 UNREACHABLE(); 1573 UNREACHABLE();
1508 return TypeArguments::null(); 1574 return TypeArguments::null();
1509 } 1575 }
1510 1576
1511 1577
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1543 class_name = cls.Name(); 1609 class_name = cls.Name();
1544 num_type_params = cls.NumTypeParameters(); // Do not print the full vector. 1610 num_type_params = cls.NumTypeParameters(); // Do not print the full vector.
1545 if (num_type_params > num_args) { 1611 if (num_type_params > num_args) {
1546 ASSERT(!IsFinalized()); 1612 ASSERT(!IsFinalized());
1547 // We fill up with "var". 1613 // We fill up with "var".
1548 first_type_param_index = 0; 1614 first_type_param_index = 0;
1549 } else { 1615 } else {
1550 first_type_param_index = num_args - num_type_params; 1616 first_type_param_index = num_args - num_type_params;
1551 } 1617 }
1552 } else { 1618 } else {
1553 class_name = unresolved_type_class(); 1619 const UnresolvedClass& type = UnresolvedClass::Handle(unresolved_class());
1620 class_name = type.Name();
1554 num_type_params = num_args; 1621 num_type_params = num_args;
1555 first_type_param_index = 0; 1622 first_type_param_index = 0;
1556 } 1623 }
1557 String& type_name = String::Handle(); 1624 String& type_name = String::Handle();
1558 if (num_type_params == 0) { 1625 if (num_type_params == 0) {
1559 type_name = class_name.raw(); 1626 type_name = class_name.raw();
1560 } else { 1627 } else {
1561 const intptr_t num_strings = 2*num_type_params + 2; // "C""<""T"", ""T"">". 1628 const intptr_t num_strings = 2*num_type_params + 2; // "C""<""T"", ""T"">".
1562 const Array& strings = Array::Handle(Array::New(num_strings)); 1629 const Array& strings = Array::Handle(Array::New(num_strings));
1563 intptr_t s = 0; 1630 intptr_t s = 0;
(...skipping 28 matching lines...) Expand all
1592 // Type is an abstract class. 1659 // Type is an abstract class.
1593 UNREACHABLE(); 1660 UNREACHABLE();
1594 return -1; 1661 return -1;
1595 } 1662 }
1596 1663
1597 1664
1598 RawString* Type::ClassName() const { 1665 RawString* Type::ClassName() const {
1599 if (HasResolvedTypeClass()) { 1666 if (HasResolvedTypeClass()) {
1600 return Class::Handle(type_class()).Name(); 1667 return Class::Handle(type_class()).Name();
1601 } else { 1668 } else {
1602 return unresolved_type_class(); 1669 return UnresolvedClass::Handle(unresolved_class()).Name();
1603 } 1670 }
1604 } 1671 }
1605 1672
1606 1673
1607 bool Type::IsBoolInterface() const { 1674 bool Type::IsBoolInterface() const {
1608 return HasResolvedTypeClass() && 1675 return HasResolvedTypeClass() &&
1609 (type_class() == Type::Handle(Type::BoolInterface()).type_class()); 1676 (type_class() == Type::Handle(Type::BoolInterface()).type_class());
1610 } 1677 }
1611 1678
1612 1679
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1799 1866
1800 1867
1801 RawClass* ParameterizedType::type_class() const { 1868 RawClass* ParameterizedType::type_class() const {
1802 ASSERT(HasResolvedTypeClass()); 1869 ASSERT(HasResolvedTypeClass());
1803 Class& type_class = Class::Handle(); 1870 Class& type_class = Class::Handle();
1804 type_class ^= raw_ptr()->type_class_; 1871 type_class ^= raw_ptr()->type_class_;
1805 return type_class.raw(); 1872 return type_class.raw();
1806 } 1873 }
1807 1874
1808 1875
1809 RawString* ParameterizedType::unresolved_type_class() const { 1876 RawUnresolvedClass* ParameterizedType::unresolved_class() const {
1810 ASSERT(!HasResolvedTypeClass()); 1877 ASSERT(!HasResolvedTypeClass());
1811 String& unresolved_type_class = String::Handle(); 1878 UnresolvedClass& unresolved_class = UnresolvedClass::Handle();
1812 unresolved_type_class ^= raw_ptr()->type_class_; 1879 unresolved_class ^= raw_ptr()->type_class_;
1813 return unresolved_type_class.raw(); 1880 ASSERT(!unresolved_class.IsNull());
1881 return unresolved_class.raw();
1814 } 1882 }
1815 1883
1816 1884
1817 RawTypeArguments* ParameterizedType::arguments() const { 1885 RawTypeArguments* ParameterizedType::arguments() const {
1818 return raw_ptr()->arguments_; 1886 return raw_ptr()->arguments_;
1819 } 1887 }
1820 1888
1821 1889
1822 bool ParameterizedType::IsInstantiated() const { 1890 bool ParameterizedType::IsInstantiated() const {
1823 const TypeArguments& args = TypeArguments::Handle(arguments()); 1891 const TypeArguments& args = TypeArguments::Handle(arguments());
(...skipping 13 matching lines...) Expand all
1837 offset); 1905 offset);
1838 } 1906 }
1839 ParameterizedType& instantiated_type = ParameterizedType::Handle( 1907 ParameterizedType& instantiated_type = ParameterizedType::Handle(
1840 ParameterizedType::New(Object::Handle(type_class()), type_arguments)); 1908 ParameterizedType::New(Object::Handle(type_class()), type_arguments));
1841 instantiated_type.set_is_finalized(); 1909 instantiated_type.set_is_finalized();
1842 return instantiated_type.raw(); 1910 return instantiated_type.raw();
1843 } 1911 }
1844 1912
1845 1913
1846 void ParameterizedType::set_type_class(const Object& value) const { 1914 void ParameterizedType::set_type_class(const Object& value) const {
1847 ASSERT(!value.IsNull() && (value.IsClass() || value.IsString())); 1915 ASSERT(!value.IsNull() && (value.IsClass() || value.IsUnresolvedClass()));
1848 StorePointer(&raw_ptr()->type_class_, value.raw()); 1916 StorePointer(&raw_ptr()->type_class_, value.raw());
1849 } 1917 }
1850 1918
1851 1919
1852 void ParameterizedType::set_arguments(const TypeArguments& value) const { 1920 void ParameterizedType::set_arguments(const TypeArguments& value) const {
1853 StorePointer(&raw_ptr()->arguments_, value.raw()); 1921 StorePointer(&raw_ptr()->arguments_, value.raw());
1854 } 1922 }
1855 1923
1856 1924
1857 RawParameterizedType* ParameterizedType::New() { 1925 RawParameterizedType* ParameterizedType::New() {
(...skipping 4427 matching lines...) Expand 10 before | Expand all | Expand 10 after
6285 const String& str = String::Handle(pattern()); 6353 const String& str = String::Handle(pattern());
6286 const char* format = "JSRegExp: pattern=%s flags=%s"; 6354 const char* format = "JSRegExp: pattern=%s flags=%s";
6287 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 6355 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
6288 char* chars = reinterpret_cast<char*>( 6356 char* chars = reinterpret_cast<char*>(
6289 Isolate::Current()->current_zone()->Allocate(len + 1)); 6357 Isolate::Current()->current_zone()->Allocate(len + 1));
6290 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 6358 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
6291 return chars; 6359 return chars;
6292 } 6360 }
6293 6361
6294 } // namespace dart 6362 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698