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

Side by Side Diff: runtime/vm/raw_object.h

Issue 154393003: Implement eager instantiation and canonicalization of type arguments at run (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 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
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 #ifndef VM_RAW_OBJECT_H_ 5 #ifndef VM_RAW_OBJECT_H_
6 #define VM_RAW_OBJECT_H_ 6 #define VM_RAW_OBJECT_H_
7 7
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/globals.h" 9 #include "vm/globals.h"
10 #include "vm/token.h" 10 #include "vm/token.h"
11 #include "vm/snapshot.h" 11 #include "vm/snapshot.h"
12 12
13 namespace dart { 13 namespace dart {
14 14
15 // Macrobatics to define the Object hierarchy of VM implementation classes. 15 // Macrobatics to define the Object hierarchy of VM implementation classes.
16 #define CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V) \ 16 #define CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V) \
17 V(Class) \ 17 V(Class) \
18 V(UnresolvedClass) \ 18 V(UnresolvedClass) \
19 V(AbstractTypeArguments) \ 19 V(TypeArguments) \
20 V(TypeArguments) \
21 V(InstantiatedTypeArguments) \
22 V(PatchClass) \ 20 V(PatchClass) \
23 V(Function) \ 21 V(Function) \
24 V(ClosureData) \ 22 V(ClosureData) \
25 V(RedirectionData) \ 23 V(RedirectionData) \
26 V(Field) \ 24 V(Field) \
27 V(LiteralToken) \ 25 V(LiteralToken) \
28 V(TokenStream) \ 26 V(TokenStream) \
29 V(Script) \ 27 V(Script) \
30 V(Library) \ 28 V(Library) \
31 V(LibraryPrefix) \ 29 V(LibraryPrefix) \
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 } 528 }
531 RawLibraryPrefix* library_prefix_; // Library prefix qualifier for the ident. 529 RawLibraryPrefix* library_prefix_; // Library prefix qualifier for the ident.
532 RawString* ident_; // Name of the unresolved identifier. 530 RawString* ident_; // Name of the unresolved identifier.
533 RawObject** to() { 531 RawObject** to() {
534 return reinterpret_cast<RawObject**>(&ptr()->ident_); 532 return reinterpret_cast<RawObject**>(&ptr()->ident_);
535 } 533 }
536 intptr_t token_pos_; 534 intptr_t token_pos_;
537 }; 535 };
538 536
539 537
540 class RawAbstractTypeArguments : public RawObject { 538 class RawTypeArguments : public RawObject {
541 private:
542 RAW_HEAP_OBJECT_IMPLEMENTATION(AbstractTypeArguments);
543 };
544
545
546 class RawTypeArguments : public RawAbstractTypeArguments {
547 private: 539 private:
548 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments); 540 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments);
549 541
550 RawObject** from() { 542 RawObject** from() {
551 return reinterpret_cast<RawObject**>(&ptr()->length_); 543 return reinterpret_cast<RawObject**>(&ptr()->instantiations_);
552 } 544 }
545 // The instantiations_ array remains empty for instantiated type arguments.
546 RawArray* instantiations_; // Array of paired canonical vectors:
547 // Even index: instantiator.
548 // Odd index: instantiated (without bound error).
549 // Instantiations leading to bound errors do not get cached.
553 RawSmi* length_; 550 RawSmi* length_;
554 551
555 // Variable length data follows here. 552 // Variable length data follows here.
556 RawAbstractType* types_[0]; 553 RawAbstractType* types_[0];
557 RawObject** to(intptr_t length) { 554 RawObject** to(intptr_t length) {
558 return reinterpret_cast<RawObject**>(&ptr()->types_[length - 1]); 555 return reinterpret_cast<RawObject**>(&ptr()->types_[length - 1]);
559 } 556 }
560 557
561 friend class SnapshotReader; 558 friend class SnapshotReader;
562 }; 559 };
563 560
564 561
565 class RawInstantiatedTypeArguments : public RawAbstractTypeArguments {
566 private:
567 RAW_HEAP_OBJECT_IMPLEMENTATION(InstantiatedTypeArguments);
568
569 RawObject** from() {
570 return reinterpret_cast<RawObject**>(
571 &ptr()->uninstantiated_type_arguments_);
572 }
573 RawAbstractTypeArguments* uninstantiated_type_arguments_;
574 RawAbstractTypeArguments* instantiator_type_arguments_;
575 RawObject** to() {
576 return reinterpret_cast<RawObject**>(&ptr()->instantiator_type_arguments_);
577 }
578 };
579
580
581 class RawPatchClass : public RawObject { 562 class RawPatchClass : public RawObject {
582 private: 563 private:
583 RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass); 564 RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass);
584 565
585 RawObject** from() { 566 RawObject** from() {
586 return reinterpret_cast<RawObject**>(&ptr()->patched_class_); 567 return reinterpret_cast<RawObject**>(&ptr()->patched_class_);
587 } 568 }
588 RawClass* patched_class_; 569 RawClass* patched_class_;
589 RawClass* source_class_; 570 RawClass* source_class_;
590 RawObject** to() { 571 RawObject** to() {
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 1148
1168 1149
1169 class RawType : public RawAbstractType { 1150 class RawType : public RawAbstractType {
1170 private: 1151 private:
1171 RAW_HEAP_OBJECT_IMPLEMENTATION(Type); 1152 RAW_HEAP_OBJECT_IMPLEMENTATION(Type);
1172 1153
1173 RawObject** from() { 1154 RawObject** from() {
1174 return reinterpret_cast<RawObject**>(&ptr()->type_class_); 1155 return reinterpret_cast<RawObject**>(&ptr()->type_class_);
1175 } 1156 }
1176 RawObject* type_class_; // Either resolved class or unresolved class. 1157 RawObject* type_class_; // Either resolved class or unresolved class.
1177 RawAbstractTypeArguments* arguments_; 1158 RawTypeArguments* arguments_;
1178 RawLanguageError* error_; // Error object if type is malformed or malbounded. 1159 RawLanguageError* error_; // Error object if type is malformed or malbounded.
1179 RawObject** to() { 1160 RawObject** to() {
1180 return reinterpret_cast<RawObject**>(&ptr()->error_); 1161 return reinterpret_cast<RawObject**>(&ptr()->error_);
1181 } 1162 }
1182 intptr_t token_pos_; 1163 intptr_t token_pos_;
1183 int8_t type_state_; 1164 int8_t type_state_;
1184 }; 1165 };
1185 1166
1186 1167
1187 class RawTypeRef : public RawAbstractType { 1168 class RawTypeRef : public RawAbstractType {
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1378 bool value_; 1359 bool value_;
1379 }; 1360 };
1380 1361
1381 1362
1382 class RawArray : public RawInstance { 1363 class RawArray : public RawInstance {
1383 RAW_HEAP_OBJECT_IMPLEMENTATION(Array); 1364 RAW_HEAP_OBJECT_IMPLEMENTATION(Array);
1384 1365
1385 RawObject** from() { 1366 RawObject** from() {
1386 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); 1367 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_);
1387 } 1368 }
1388 RawAbstractTypeArguments* type_arguments_; 1369 RawTypeArguments* type_arguments_;
1389 RawSmi* length_; 1370 RawSmi* length_;
1390 // Variable length data follows here. 1371 // Variable length data follows here.
1391 RawObject** data() { 1372 RawObject** data() {
1392 uword address_of_length = reinterpret_cast<uword>(&length_); 1373 uword address_of_length = reinterpret_cast<uword>(&length_);
1393 return reinterpret_cast<RawObject**>(address_of_length + kWordSize); 1374 return reinterpret_cast<RawObject**>(address_of_length + kWordSize);
1394 } 1375 }
1395 RawObject** to(intptr_t length) { 1376 RawObject** to(intptr_t length) {
1396 return reinterpret_cast<RawObject**>(&ptr()->data()[length - 1]); 1377 return reinterpret_cast<RawObject**>(&ptr()->data()[length - 1]);
1397 } 1378 }
1398 1379
(...skipping 11 matching lines...) Expand all
1410 friend class SnapshotReader; 1391 friend class SnapshotReader;
1411 }; 1392 };
1412 1393
1413 1394
1414 class RawGrowableObjectArray : public RawInstance { 1395 class RawGrowableObjectArray : public RawInstance {
1415 RAW_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray); 1396 RAW_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray);
1416 1397
1417 RawObject** from() { 1398 RawObject** from() {
1418 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); 1399 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_);
1419 } 1400 }
1420 RawAbstractTypeArguments* type_arguments_; 1401 RawTypeArguments* type_arguments_;
1421 RawSmi* length_; 1402 RawSmi* length_;
1422 RawArray* data_; 1403 RawArray* data_;
1423 RawObject** to() { 1404 RawObject** to() {
1424 return reinterpret_cast<RawObject**>(&ptr()->data_); 1405 return reinterpret_cast<RawObject**>(&ptr()->data_);
1425 } 1406 }
1426 1407
1427 friend class SnapshotReader; 1408 friend class SnapshotReader;
1428 }; 1409 };
1429 1410
1430 1411
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
1789 // Make sure this is updated when new TypedData types are added. 1770 // Make sure this is updated when new TypedData types are added.
1790 ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14); 1771 ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14);
1791 ASSERT(kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 15); 1772 ASSERT(kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 15);
1792 ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14); 1773 ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14);
1793 return (kNullCid - kTypedDataInt8ArrayCid); 1774 return (kNullCid - kTypedDataInt8ArrayCid);
1794 } 1775 }
1795 1776
1796 } // namespace dart 1777 } // namespace dart
1797 1778
1798 #endif // VM_RAW_OBJECT_H_ 1779 #endif // VM_RAW_OBJECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698