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 #ifndef VM_OBJECT_H_ | 5 #ifndef VM_OBJECT_H_ |
6 #define VM_OBJECT_H_ | 6 #define VM_OBJECT_H_ |
7 | 7 |
8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "platform/utils.h" | 10 #include "platform/utils.h" |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 static RawInstance* sentinel() { return sentinel_; } | 243 static RawInstance* sentinel() { return sentinel_; } |
244 // Value marking that we are transitioning from sentinel, e.g., computing | 244 // Value marking that we are transitioning from sentinel, e.g., computing |
245 // a field value. Used to detect circular initialization. | 245 // a field value. Used to detect circular initialization. |
246 static RawInstance* transition_sentinel() { return transition_sentinel_; } | 246 static RawInstance* transition_sentinel() { return transition_sentinel_; } |
247 | 247 |
248 static RawClass* class_class() { return class_class_; } | 248 static RawClass* class_class() { return class_class_; } |
249 static RawClass* null_class() { return null_class_; } | 249 static RawClass* null_class() { return null_class_; } |
250 static RawClass* dynamic_class() { return dynamic_class_; } | 250 static RawClass* dynamic_class() { return dynamic_class_; } |
251 static RawClass* void_class() { return void_class_; } | 251 static RawClass* void_class() { return void_class_; } |
252 static RawClass* unresolved_class_class() { return unresolved_class_class_; } | 252 static RawClass* unresolved_class_class() { return unresolved_class_class_; } |
253 static RawClass* type_class() { | 253 static RawClass* type_class() { return type_class_; } |
254 return type_class_; | |
255 } | |
256 static RawClass* type_parameter_class() { return type_parameter_class_; } | 254 static RawClass* type_parameter_class() { return type_parameter_class_; } |
257 static RawClass* type_arguments_class() { return type_arguments_class_; } | 255 static RawClass* type_arguments_class() { return type_arguments_class_; } |
258 static RawClass* instantiated_type_arguments_class() { | 256 static RawClass* instantiated_type_arguments_class() { |
259 return instantiated_type_arguments_class_; | 257 return instantiated_type_arguments_class_; |
260 } | 258 } |
| 259 static RawClass* patch_class_class() { return patch_class_class_; } |
261 static RawClass* function_class() { return function_class_; } | 260 static RawClass* function_class() { return function_class_; } |
262 static RawClass* field_class() { return field_class_; } | 261 static RawClass* field_class() { return field_class_; } |
263 static RawClass* literal_token_class() { return literal_token_class_; } | 262 static RawClass* literal_token_class() { return literal_token_class_; } |
264 static RawClass* token_stream_class() { return token_stream_class_; } | 263 static RawClass* token_stream_class() { return token_stream_class_; } |
265 static RawClass* script_class() { return script_class_; } | 264 static RawClass* script_class() { return script_class_; } |
266 static RawClass* library_class() { return library_class_; } | 265 static RawClass* library_class() { return library_class_; } |
267 static RawClass* library_prefix_class() { return library_prefix_class_; } | 266 static RawClass* library_prefix_class() { return library_prefix_class_; } |
268 static RawClass* code_class() { return code_class_; } | 267 static RawClass* code_class() { return code_class_; } |
269 static RawClass* instructions_class() { return instructions_class_; } | 268 static RawClass* instructions_class() { return instructions_class_; } |
270 static RawClass* pc_descriptors_class() { return pc_descriptors_class_; } | 269 static RawClass* pc_descriptors_class() { return pc_descriptors_class_; } |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 static RawClass* class_class_; // Class of the Class vm object. | 379 static RawClass* class_class_; // Class of the Class vm object. |
381 static RawClass* null_class_; // Class of the null object. | 380 static RawClass* null_class_; // Class of the null object. |
382 static RawClass* dynamic_class_; // Class of the 'Dynamic' type. | 381 static RawClass* dynamic_class_; // Class of the 'Dynamic' type. |
383 static RawClass* void_class_; // Class of the 'void' type. | 382 static RawClass* void_class_; // Class of the 'void' type. |
384 static RawClass* unresolved_class_class_; // Class of UnresolvedClass. | 383 static RawClass* unresolved_class_class_; // Class of UnresolvedClass. |
385 static RawClass* type_class_; // Class of Type. | 384 static RawClass* type_class_; // Class of Type. |
386 static RawClass* type_parameter_class_; // Class of TypeParameter vm object. | 385 static RawClass* type_parameter_class_; // Class of TypeParameter vm object. |
387 // Class of the TypeArguments vm object. | 386 // Class of the TypeArguments vm object. |
388 static RawClass* type_arguments_class_; | 387 static RawClass* type_arguments_class_; |
389 static RawClass* instantiated_type_arguments_class_; // Class of Inst..ments. | 388 static RawClass* instantiated_type_arguments_class_; // Class of Inst..ments. |
| 389 static RawClass* patch_class_class_; // Class of the PatchClass vm object. |
390 static RawClass* function_class_; // Class of the Function vm object. | 390 static RawClass* function_class_; // Class of the Function vm object. |
391 static RawClass* field_class_; // Class of the Field vm object. | 391 static RawClass* field_class_; // Class of the Field vm object. |
392 static RawClass* literal_token_class_; // Class of LiteralToken vm object. | 392 static RawClass* literal_token_class_; // Class of LiteralToken vm object. |
393 static RawClass* token_stream_class_; // Class of the TokenStream vm object. | 393 static RawClass* token_stream_class_; // Class of the TokenStream vm object. |
394 static RawClass* script_class_; // Class of the Script vm object. | 394 static RawClass* script_class_; // Class of the Script vm object. |
395 static RawClass* library_class_; // Class of the Library vm object. | 395 static RawClass* library_class_; // Class of the Library vm object. |
396 static RawClass* library_prefix_class_; // Class of Library prefix vm object. | 396 static RawClass* library_prefix_class_; // Class of Library prefix vm object. |
397 static RawClass* code_class_; // Class of the Code vm object. | 397 static RawClass* code_class_; // Class of the Code vm object. |
398 static RawClass* instructions_class_; // Class of the Instructions vm object. | 398 static RawClass* instructions_class_; // Class of the Instructions vm object. |
399 static RawClass* pc_descriptors_class_; // Class of PcDescriptors vm object. | 399 static RawClass* pc_descriptors_class_; // Class of PcDescriptors vm object. |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 | 672 |
673 RawCode* allocation_stub() const { | 673 RawCode* allocation_stub() const { |
674 return raw_ptr()->allocation_stub_; | 674 return raw_ptr()->allocation_stub_; |
675 } | 675 } |
676 void set_allocation_stub(const Code& value) const; | 676 void set_allocation_stub(const Code& value) const; |
677 | 677 |
678 RawArray* constants() const; | 678 RawArray* constants() const; |
679 | 679 |
680 void Finalize() const; | 680 void Finalize() const; |
681 | 681 |
| 682 void ApplyPatch(const Class& with) const; |
| 683 |
682 // Allocate a class used for VM internal objects. | 684 // Allocate a class used for VM internal objects. |
683 template <class FakeObject> static RawClass* New(); | 685 template <class FakeObject> static RawClass* New(); |
684 | 686 |
685 // Allocate instance classes and interfaces. | 687 // Allocate instance classes and interfaces. |
686 static RawClass* New(const String& name, | 688 static RawClass* New(const String& name, |
687 const Script& script, | 689 const Script& script, |
688 intptr_t token_pos); | 690 intptr_t token_pos); |
689 static RawClass* NewInterface(const String& name, | 691 static RawClass* NewInterface(const String& name, |
690 const Script& script, | 692 const Script& script, |
691 intptr_t token_pos); | 693 intptr_t token_pos); |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1272 const AbstractTypeArguments& value) const; | 1274 const AbstractTypeArguments& value) const; |
1273 void set_instantiator_type_arguments( | 1275 void set_instantiator_type_arguments( |
1274 const AbstractTypeArguments& value) const; | 1276 const AbstractTypeArguments& value) const; |
1275 static RawInstantiatedTypeArguments* New(); | 1277 static RawInstantiatedTypeArguments* New(); |
1276 | 1278 |
1277 HEAP_OBJECT_IMPLEMENTATION(InstantiatedTypeArguments, AbstractTypeArguments); | 1279 HEAP_OBJECT_IMPLEMENTATION(InstantiatedTypeArguments, AbstractTypeArguments); |
1278 friend class Class; | 1280 friend class Class; |
1279 }; | 1281 }; |
1280 | 1282 |
1281 | 1283 |
| 1284 class PatchClass : public Object { |
| 1285 public: |
| 1286 RawClass* patched_class() const { return raw_ptr()->patched_class_; } |
| 1287 RawScript* script() const { return raw_ptr()->script_; } |
| 1288 |
| 1289 static intptr_t InstanceSize() { |
| 1290 return RoundedAllocationSize(sizeof(RawPatchClass)); |
| 1291 } |
| 1292 |
| 1293 static RawPatchClass* New(const Class& patched_class, const Script& script); |
| 1294 |
| 1295 private: |
| 1296 void set_patched_class(const Class& value) const; |
| 1297 void set_script(const Script& value) const; |
| 1298 static RawPatchClass* New(); |
| 1299 |
| 1300 HEAP_OBJECT_IMPLEMENTATION(PatchClass, Object); |
| 1301 friend class Class; |
| 1302 }; |
| 1303 |
| 1304 |
1282 class Function : public Object { | 1305 class Function : public Object { |
1283 public: | 1306 public: |
1284 RawString* name() const { return raw_ptr()->name_; } | 1307 RawString* name() const { return raw_ptr()->name_; } |
1285 RawString* UserVisibleName() const; | 1308 RawString* UserVisibleName() const; |
1286 RawString* QualifiedUserVisibleName() const; | 1309 RawString* QualifiedUserVisibleName() const; |
1287 | 1310 |
1288 // Build a string of the form '<T, R>(T, [b: B, c: C]) => R' representing the | 1311 // Build a string of the form '<T, R>(T, [b: B, c: C]) => R' representing the |
1289 // internal signature of the given function. | 1312 // internal signature of the given function. |
1290 RawString* Signature() const { | 1313 RawString* Signature() const { |
1291 const bool instantiate = false; | 1314 const bool instantiate = false; |
1292 return BuildSignature(instantiate, kInternalName, TypeArguments::Handle()); | 1315 return BuildSignature(instantiate, kInternalName, TypeArguments::Handle()); |
1293 } | 1316 } |
1294 | 1317 |
1295 // Build a string of the form '(A, [b: B, c: C]) => D' representing the | 1318 // Build a string of the form '(A, [b: B, c: C]) => D' representing the |
1296 // signature of the given function, where all generic types (e.g. '<T, R>' in | 1319 // signature of the given function, where all generic types (e.g. '<T, R>' in |
1297 // '<T, R>(T, [b: B, c: C]) => R') are instantiated using the given | 1320 // '<T, R>(T, [b: B, c: C]) => R') are instantiated using the given |
1298 // instantiator type argument vector (e.g. '<A, D>'). | 1321 // instantiator type argument vector (e.g. '<A, D>'). |
1299 RawString* InstantiatedSignatureFrom( | 1322 RawString* InstantiatedSignatureFrom( |
1300 const AbstractTypeArguments& instantiator, | 1323 const AbstractTypeArguments& instantiator, |
1301 NameVisibility name_visibility) const { | 1324 NameVisibility name_visibility) const { |
1302 const bool instantiate = true; | 1325 const bool instantiate = true; |
1303 return BuildSignature(instantiate, name_visibility, instantiator); | 1326 return BuildSignature(instantiate, name_visibility, instantiator); |
1304 } | 1327 } |
1305 | 1328 |
1306 // Returns true if the signature of this function is instantiated, i.e. if it | 1329 // Returns true if the signature of this function is instantiated, i.e. if it |
1307 // does not involve generic parameter types or generic result type. | 1330 // does not involve generic parameter types or generic result type. |
1308 bool HasInstantiatedSignature() const; | 1331 bool HasInstantiatedSignature() const; |
1309 | 1332 |
1310 RawClass* owner() const { return raw_ptr()->owner_; } | 1333 RawClass* Owner() const; |
| 1334 |
| 1335 RawScript* script() const; |
1311 | 1336 |
1312 RawAbstractType* result_type() const { return raw_ptr()->result_type_; } | 1337 RawAbstractType* result_type() const { return raw_ptr()->result_type_; } |
1313 void set_result_type(const AbstractType& value) const; | 1338 void set_result_type(const AbstractType& value) const; |
1314 | 1339 |
1315 RawAbstractType* ParameterTypeAt(intptr_t index) const; | 1340 RawAbstractType* ParameterTypeAt(intptr_t index) const; |
1316 void SetParameterTypeAt(intptr_t index, const AbstractType& value) const; | 1341 void SetParameterTypeAt(intptr_t index, const AbstractType& value) const; |
1317 void set_parameter_types(const Array& value) const; | 1342 void set_parameter_types(const Array& value) const; |
1318 | 1343 |
1319 // Parameter names are valid for all valid parameter indices, and are not | 1344 // Parameter names are valid for all valid parameter indices, and are not |
1320 // limited to named optional parameters. | 1345 // limited to named optional parameters. |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1613 class ExternalBit : public BitField<bool, kExternalBit, 1> {}; | 1638 class ExternalBit : public BitField<bool, kExternalBit, 1> {}; |
1614 class KindBits : | 1639 class KindBits : |
1615 public BitField<RawFunction::Kind, kKindTagBit, kKindTagSize> {}; // NOLINT | 1640 public BitField<RawFunction::Kind, kKindTagBit, kKindTagSize> {}; // NOLINT |
1616 | 1641 |
1617 void set_name(const String& value) const; | 1642 void set_name(const String& value) const; |
1618 void set_kind(RawFunction::Kind value) const; | 1643 void set_kind(RawFunction::Kind value) const; |
1619 void set_is_static(bool is_static) const; | 1644 void set_is_static(bool is_static) const; |
1620 void set_is_const(bool is_const) const; | 1645 void set_is_const(bool is_const) const; |
1621 void set_is_external(bool value) const; | 1646 void set_is_external(bool value) const; |
1622 void set_parent_function(const Function& value) const; | 1647 void set_parent_function(const Function& value) const; |
1623 void set_owner(const Class& value) const; | 1648 void set_owner(const Object& value) const; |
1624 void set_token_pos(intptr_t value) const; | 1649 void set_token_pos(intptr_t value) const; |
1625 void set_implicit_closure_function(const Function& value) const; | 1650 void set_implicit_closure_function(const Function& value) const; |
1626 void set_kind_tag(intptr_t value) const; | 1651 void set_kind_tag(intptr_t value) const; |
1627 static RawFunction* New(); | 1652 static RawFunction* New(); |
1628 | 1653 |
1629 RawString* BuildSignature(bool instantiate, | 1654 RawString* BuildSignature(bool instantiate, |
1630 NameVisibility name_visibility, | 1655 NameVisibility name_visibility, |
1631 const AbstractTypeArguments& instantiator) const; | 1656 const AbstractTypeArguments& instantiator) const; |
1632 | 1657 |
1633 // Check the subtype or 'more specific' relationship. | 1658 // Check the subtype or 'more specific' relationship. |
(...skipping 3818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5452 if (this->CharAt(i) != str.CharAt(begin_index + i)) { | 5477 if (this->CharAt(i) != str.CharAt(begin_index + i)) { |
5453 return false; | 5478 return false; |
5454 } | 5479 } |
5455 } | 5480 } |
5456 return true; | 5481 return true; |
5457 } | 5482 } |
5458 | 5483 |
5459 } // namespace dart | 5484 } // namespace dart |
5460 | 5485 |
5461 #endif // VM_OBJECT_H_ | 5486 #endif // VM_OBJECT_H_ |
OLD | NEW |