| 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 RUNTIME_VM_OBJECT_H_ | 5 #ifndef RUNTIME_VM_OBJECT_H_ |
| 6 #define RUNTIME_VM_OBJECT_H_ | 6 #define RUNTIME_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 7148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7159 static const RawOneByteString* raw_ptr(const String& str) { | 7159 static const RawOneByteString* raw_ptr(const String& str) { |
| 7160 return reinterpret_cast<const RawOneByteString*>(str.raw_ptr()); | 7160 return reinterpret_cast<const RawOneByteString*>(str.raw_ptr()); |
| 7161 } | 7161 } |
| 7162 | 7162 |
| 7163 static uint8_t* CharAddr(const String& str, intptr_t index) { | 7163 static uint8_t* CharAddr(const String& str, intptr_t index) { |
| 7164 ASSERT((index >= 0) && (index < str.Length())); | 7164 ASSERT((index >= 0) && (index < str.Length())); |
| 7165 ASSERT(str.IsOneByteString()); | 7165 ASSERT(str.IsOneByteString()); |
| 7166 return &str.UnsafeMutableNonPointer(raw_ptr(str)->data())[index]; | 7166 return &str.UnsafeMutableNonPointer(raw_ptr(str)->data())[index]; |
| 7167 } | 7167 } |
| 7168 | 7168 |
| 7169 static uint8_t* DataStart(const String& str) { |
| 7170 ASSERT(str.IsOneByteString()); |
| 7171 return &str.UnsafeMutableNonPointer(raw_ptr(str)->data())[0]; |
| 7172 } |
| 7173 |
| 7169 static RawOneByteString* ReadFrom(SnapshotReader* reader, | 7174 static RawOneByteString* ReadFrom(SnapshotReader* reader, |
| 7170 intptr_t object_id, | 7175 intptr_t object_id, |
| 7171 intptr_t tags, | 7176 intptr_t tags, |
| 7172 Snapshot::Kind kind, | 7177 Snapshot::Kind kind, |
| 7173 bool as_reference); | 7178 bool as_reference); |
| 7174 | 7179 |
| 7175 friend class Class; | 7180 friend class Class; |
| 7176 friend class String; | 7181 friend class String; |
| 7177 friend class Symbols; | 7182 friend class Symbols; |
| 7178 friend class ExternalOneByteString; | 7183 friend class ExternalOneByteString; |
| 7179 friend class SnapshotReader; | 7184 friend class SnapshotReader; |
| 7180 friend class StringHasher; | 7185 friend class StringHasher; |
| 7186 friend class Utf8; |
| 7181 }; | 7187 }; |
| 7182 | 7188 |
| 7183 class TwoByteString : public AllStatic { | 7189 class TwoByteString : public AllStatic { |
| 7184 public: | 7190 public: |
| 7185 static uint16_t CharAt(const String& str, intptr_t index) { | 7191 static uint16_t CharAt(const String& str, intptr_t index) { |
| 7186 ASSERT((index >= 0) && (index < str.Length())); | 7192 ASSERT((index >= 0) && (index < str.Length())); |
| 7187 ASSERT(str.IsTwoByteString()); | 7193 ASSERT(str.IsTwoByteString()); |
| 7188 return raw_ptr(str)->data()[index]; | 7194 return raw_ptr(str)->data()[index]; |
| 7189 } | 7195 } |
| 7190 | 7196 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7276 static const RawTwoByteString* raw_ptr(const String& str) { | 7282 static const RawTwoByteString* raw_ptr(const String& str) { |
| 7277 return reinterpret_cast<const RawTwoByteString*>(str.raw_ptr()); | 7283 return reinterpret_cast<const RawTwoByteString*>(str.raw_ptr()); |
| 7278 } | 7284 } |
| 7279 | 7285 |
| 7280 static uint16_t* CharAddr(const String& str, intptr_t index) { | 7286 static uint16_t* CharAddr(const String& str, intptr_t index) { |
| 7281 ASSERT((index >= 0) && (index < str.Length())); | 7287 ASSERT((index >= 0) && (index < str.Length())); |
| 7282 ASSERT(str.IsTwoByteString()); | 7288 ASSERT(str.IsTwoByteString()); |
| 7283 return &str.UnsafeMutableNonPointer(raw_ptr(str)->data())[index]; | 7289 return &str.UnsafeMutableNonPointer(raw_ptr(str)->data())[index]; |
| 7284 } | 7290 } |
| 7285 | 7291 |
| 7292 static uint16_t* DataStart(const String& str) { |
| 7293 ASSERT(str.IsTwoByteString()); |
| 7294 return &str.UnsafeMutableNonPointer(raw_ptr(str)->data())[0]; |
| 7295 } |
| 7296 |
| 7286 static RawTwoByteString* ReadFrom(SnapshotReader* reader, | 7297 static RawTwoByteString* ReadFrom(SnapshotReader* reader, |
| 7287 intptr_t object_id, | 7298 intptr_t object_id, |
| 7288 intptr_t tags, | 7299 intptr_t tags, |
| 7289 Snapshot::Kind kind, | 7300 Snapshot::Kind kind, |
| 7290 bool as_reference); | 7301 bool as_reference); |
| 7291 | 7302 |
| 7292 friend class Class; | 7303 friend class Class; |
| 7293 friend class String; | 7304 friend class String; |
| 7294 friend class SnapshotReader; | 7305 friend class SnapshotReader; |
| 7295 friend class Symbols; | 7306 friend class Symbols; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7342 static const RawExternalOneByteString* raw_ptr(const String& str) { | 7353 static const RawExternalOneByteString* raw_ptr(const String& str) { |
| 7343 return reinterpret_cast<const RawExternalOneByteString*>(str.raw_ptr()); | 7354 return reinterpret_cast<const RawExternalOneByteString*>(str.raw_ptr()); |
| 7344 } | 7355 } |
| 7345 | 7356 |
| 7346 static const uint8_t* CharAddr(const String& str, intptr_t index) { | 7357 static const uint8_t* CharAddr(const String& str, intptr_t index) { |
| 7347 ASSERT((index >= 0) && (index < str.Length())); | 7358 ASSERT((index >= 0) && (index < str.Length())); |
| 7348 ASSERT(str.IsExternalOneByteString()); | 7359 ASSERT(str.IsExternalOneByteString()); |
| 7349 return &(raw_ptr(str)->external_data_->data()[index]); | 7360 return &(raw_ptr(str)->external_data_->data()[index]); |
| 7350 } | 7361 } |
| 7351 | 7362 |
| 7363 static const uint8_t* DataStart(const String& str) { |
| 7364 ASSERT(str.IsExternalOneByteString()); |
| 7365 return &(raw_ptr(str)->external_data_->data()[0]); |
| 7366 } |
| 7367 |
| 7352 static void SetExternalData(const String& str, | 7368 static void SetExternalData(const String& str, |
| 7353 ExternalStringData<uint8_t>* data) { | 7369 ExternalStringData<uint8_t>* data) { |
| 7354 ASSERT(str.IsExternalOneByteString()); | 7370 ASSERT(str.IsExternalOneByteString()); |
| 7355 ASSERT(!Isolate::Current()->heap()->Contains( | 7371 ASSERT(!Isolate::Current()->heap()->Contains( |
| 7356 reinterpret_cast<uword>(data->data()))); | 7372 reinterpret_cast<uword>(data->data()))); |
| 7357 str.StoreNonPointer(&raw_ptr(str)->external_data_, data); | 7373 str.StoreNonPointer(&raw_ptr(str)->external_data_, data); |
| 7358 } | 7374 } |
| 7359 | 7375 |
| 7360 static void Finalize(void* isolate_callback_data, | 7376 static void Finalize(void* isolate_callback_data, |
| 7361 Dart_WeakPersistentHandle handle, | 7377 Dart_WeakPersistentHandle handle, |
| 7362 void* peer); | 7378 void* peer); |
| 7363 | 7379 |
| 7364 static RawExternalOneByteString* ReadFrom(SnapshotReader* reader, | 7380 static RawExternalOneByteString* ReadFrom(SnapshotReader* reader, |
| 7365 intptr_t object_id, | 7381 intptr_t object_id, |
| 7366 intptr_t tags, | 7382 intptr_t tags, |
| 7367 Snapshot::Kind kind, | 7383 Snapshot::Kind kind, |
| 7368 bool as_reference); | 7384 bool as_reference); |
| 7369 | 7385 |
| 7370 static intptr_t NextFieldOffset() { | 7386 static intptr_t NextFieldOffset() { |
| 7371 // Indicates this class cannot be extended by dart code. | 7387 // Indicates this class cannot be extended by dart code. |
| 7372 return -kWordSize; | 7388 return -kWordSize; |
| 7373 } | 7389 } |
| 7374 | 7390 |
| 7375 friend class Class; | 7391 friend class Class; |
| 7376 friend class String; | 7392 friend class String; |
| 7377 friend class SnapshotReader; | 7393 friend class SnapshotReader; |
| 7378 friend class Symbols; | 7394 friend class Symbols; |
| 7395 friend class Utf8; |
| 7379 }; | 7396 }; |
| 7380 | 7397 |
| 7381 class ExternalTwoByteString : public AllStatic { | 7398 class ExternalTwoByteString : public AllStatic { |
| 7382 public: | 7399 public: |
| 7383 static uint16_t CharAt(const String& str, intptr_t index) { | 7400 static uint16_t CharAt(const String& str, intptr_t index) { |
| 7384 NoSafepointScope no_safepoint; | 7401 NoSafepointScope no_safepoint; |
| 7385 return *CharAddr(str, index); | 7402 return *CharAddr(str, index); |
| 7386 } | 7403 } |
| 7387 | 7404 |
| 7388 static void* GetPeer(const String& str) { | 7405 static void* GetPeer(const String& str) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7421 static const RawExternalTwoByteString* raw_ptr(const String& str) { | 7438 static const RawExternalTwoByteString* raw_ptr(const String& str) { |
| 7422 return reinterpret_cast<const RawExternalTwoByteString*>(str.raw_ptr()); | 7439 return reinterpret_cast<const RawExternalTwoByteString*>(str.raw_ptr()); |
| 7423 } | 7440 } |
| 7424 | 7441 |
| 7425 static const uint16_t* CharAddr(const String& str, intptr_t index) { | 7442 static const uint16_t* CharAddr(const String& str, intptr_t index) { |
| 7426 ASSERT((index >= 0) && (index < str.Length())); | 7443 ASSERT((index >= 0) && (index < str.Length())); |
| 7427 ASSERT(str.IsExternalTwoByteString()); | 7444 ASSERT(str.IsExternalTwoByteString()); |
| 7428 return &(raw_ptr(str)->external_data_->data()[index]); | 7445 return &(raw_ptr(str)->external_data_->data()[index]); |
| 7429 } | 7446 } |
| 7430 | 7447 |
| 7448 static const uint16_t* DataStart(const String& str) { |
| 7449 ASSERT(str.IsExternalTwoByteString()); |
| 7450 return &(raw_ptr(str)->external_data_->data()[0]); |
| 7451 } |
| 7452 |
| 7431 static void SetExternalData(const String& str, | 7453 static void SetExternalData(const String& str, |
| 7432 ExternalStringData<uint16_t>* data) { | 7454 ExternalStringData<uint16_t>* data) { |
| 7433 ASSERT(str.IsExternalTwoByteString()); | 7455 ASSERT(str.IsExternalTwoByteString()); |
| 7434 ASSERT(!Isolate::Current()->heap()->Contains( | 7456 ASSERT(!Isolate::Current()->heap()->Contains( |
| 7435 reinterpret_cast<uword>(data->data()))); | 7457 reinterpret_cast<uword>(data->data()))); |
| 7436 str.StoreNonPointer(&raw_ptr(str)->external_data_, data); | 7458 str.StoreNonPointer(&raw_ptr(str)->external_data_, data); |
| 7437 } | 7459 } |
| 7438 | 7460 |
| 7439 static void Finalize(void* isolate_callback_data, | 7461 static void Finalize(void* isolate_callback_data, |
| 7440 Dart_WeakPersistentHandle handle, | 7462 Dart_WeakPersistentHandle handle, |
| (...skipping 1507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8948 | 8970 |
| 8949 inline void TypeArguments::SetHash(intptr_t value) const { | 8971 inline void TypeArguments::SetHash(intptr_t value) const { |
| 8950 // This is only safe because we create a new Smi, which does not cause | 8972 // This is only safe because we create a new Smi, which does not cause |
| 8951 // heap allocation. | 8973 // heap allocation. |
| 8952 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8974 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); |
| 8953 } | 8975 } |
| 8954 | 8976 |
| 8955 } // namespace dart | 8977 } // namespace dart |
| 8956 | 8978 |
| 8957 #endif // RUNTIME_VM_OBJECT_H_ | 8979 #endif // RUNTIME_VM_OBJECT_H_ |
| OLD | NEW |