| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 * | 150 * |
| 151 * This callback should either explicitly invoke Dispose on |object| if | 151 * This callback should either explicitly invoke Dispose on |object| if |
| 152 * V8 wrapper is not needed anymore, or 'revive' it by invocation of MakeWeak. | 152 * V8 wrapper is not needed anymore, or 'revive' it by invocation of MakeWeak. |
| 153 * | 153 * |
| 154 * \param object the weak global object to be reclaimed by the garbage collector | 154 * \param object the weak global object to be reclaimed by the garbage collector |
| 155 * \param parameter the value passed in when making the weak global object | 155 * \param parameter the value passed in when making the weak global object |
| 156 */ | 156 */ |
| 157 typedef void (*WeakReferenceCallback)(Persistent<Value> object, | 157 typedef void (*WeakReferenceCallback)(Persistent<Value> object, |
| 158 void* parameter); | 158 void* parameter); |
| 159 | 159 |
| 160 // TODO(svenpanne) Temporary definition until Chrome is in sync. |
| 161 typedef void (*NearDeathCallback)(Isolate* isolate, |
| 162 Persistent<Value> object, |
| 163 void* parameter); |
| 160 | 164 |
| 161 // --- Handles --- | 165 // --- Handles --- |
| 162 | 166 |
| 163 #define TYPE_CHECK(T, S) \ | 167 #define TYPE_CHECK(T, S) \ |
| 164 while (false) { \ | 168 while (false) { \ |
| 165 *(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \ | 169 *(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \ |
| 166 } | 170 } |
| 167 | 171 |
| 168 /** | 172 /** |
| 169 * An object reference managed by the v8 garbage collector. | 173 * An object reference managed by the v8 garbage collector. |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 // that the handle isn't empty before doing the checked cast. | 386 // that the handle isn't empty before doing the checked cast. |
| 383 if (that.IsEmpty()) return Persistent<T>(); | 387 if (that.IsEmpty()) return Persistent<T>(); |
| 384 #endif | 388 #endif |
| 385 return Persistent<T>(T::Cast(*that)); | 389 return Persistent<T>(T::Cast(*that)); |
| 386 } | 390 } |
| 387 | 391 |
| 388 template <class S> V8_INLINE(Persistent<S> As()) { | 392 template <class S> V8_INLINE(Persistent<S> As()) { |
| 389 return Persistent<S>::Cast(*this); | 393 return Persistent<S>::Cast(*this); |
| 390 } | 394 } |
| 391 | 395 |
| 396 /** Deprecated. Use Isolate version instead. */ |
| 397 V8_DEPRECATED(static Persistent<T> New(Handle<T> that)); |
| 398 |
| 392 /** | 399 /** |
| 393 * Creates a new persistent handle for an existing local or | 400 * Creates a new persistent handle for an existing local or persistent handle. |
| 394 * persistent handle. | |
| 395 */ | 401 */ |
| 396 V8_INLINE(static Persistent<T> New(Handle<T> that)); | 402 V8_INLINE(static Persistent<T> New(Isolate* isolate, Handle<T> that)); |
| 403 |
| 404 /** Deprecated. Use Isolate version instead. */ |
| 405 V8_DEPRECATED(void Dispose()); |
| 397 | 406 |
| 398 /** | 407 /** |
| 399 * Releases the storage cell referenced by this persistent handle. | 408 * Releases the storage cell referenced by this persistent handle. |
| 400 * Does not remove the reference to the cell from any handles. | 409 * Does not remove the reference to the cell from any handles. |
| 401 * This handle's reference, and any other references to the storage | 410 * This handle's reference, and any other references to the storage |
| 402 * cell remain and IsEmpty will still return false. | 411 * cell remain and IsEmpty will still return false. |
| 403 */ | 412 */ |
| 404 V8_INLINE(void Dispose()); | |
| 405 V8_INLINE(void Dispose(Isolate* isolate)); | 413 V8_INLINE(void Dispose(Isolate* isolate)); |
| 406 | 414 |
| 415 /** Deprecated. Use Isolate version instead. */ |
| 416 V8_DEPRECATED(void MakeWeak(void* parameters, |
| 417 WeakReferenceCallback callback)); |
| 418 |
| 407 /** | 419 /** |
| 408 * Make the reference to this object weak. When only weak handles | 420 * Make the reference to this object weak. When only weak handles |
| 409 * refer to the object, the garbage collector will perform a | 421 * refer to the object, the garbage collector will perform a |
| 410 * callback to the given V8::WeakReferenceCallback function, passing | 422 * callback to the given V8::NearDeathCallback function, passing |
| 411 * it the object reference and the given parameters. | 423 * it the object reference and the given parameters. |
| 412 */ | 424 */ |
| 413 V8_INLINE(void MakeWeak(void* parameters, WeakReferenceCallback callback)); | |
| 414 V8_INLINE(void MakeWeak(Isolate* isolate, | 425 V8_INLINE(void MakeWeak(Isolate* isolate, |
| 415 void* parameters, | 426 void* parameters, |
| 416 WeakReferenceCallback callback)); | 427 NearDeathCallback callback)); |
| 428 |
| 429 /** Deprecated. Use Isolate version instead. */ |
| 430 V8_DEPRECATED(void ClearWeak()); |
| 417 | 431 |
| 418 /** Clears the weak reference to this object. */ | 432 /** Clears the weak reference to this object. */ |
| 419 V8_INLINE(void ClearWeak()); | 433 V8_INLINE(void ClearWeak(Isolate* isolate)); |
| 434 |
| 435 /** Deprecated. Use Isolate version instead. */ |
| 436 V8_DEPRECATED(void MarkIndependent()); |
| 420 | 437 |
| 421 /** | 438 /** |
| 422 * Marks the reference to this object independent. Garbage collector | 439 * Marks the reference to this object independent. Garbage collector is free |
| 423 * is free to ignore any object groups containing this object. | 440 * to ignore any object groups containing this object. Weak callback for an |
| 424 * Weak callback for an independent handle should not | 441 * independent handle should not assume that it will be preceded by a global |
| 425 * assume that it will be preceded by a global GC prologue callback | 442 * GC prologue callback or followed by a global GC epilogue callback. |
| 426 * or followed by a global GC epilogue callback. | |
| 427 */ | 443 */ |
| 428 V8_INLINE(void MarkIndependent()); | |
| 429 V8_INLINE(void MarkIndependent(Isolate* isolate)); | 444 V8_INLINE(void MarkIndependent(Isolate* isolate)); |
| 430 | 445 |
| 446 /** Deprecated. Use Isolate version instead. */ |
| 447 V8_DEPRECATED(void MarkPartiallyDependent()); |
| 448 |
| 431 /** | 449 /** |
| 432 * Marks the reference to this object partially dependent. Partially | 450 * Marks the reference to this object partially dependent. Partially dependent |
| 433 * dependent handles only depend on other partially dependent handles and | 451 * handles only depend on other partially dependent handles and these |
| 434 * these dependencies are provided through object groups. It provides a way | 452 * dependencies are provided through object groups. It provides a way to build |
| 435 * to build smaller object groups for young objects that represent only a | 453 * smaller object groups for young objects that represent only a subset of all |
| 436 * subset of all external dependencies. This mark is automatically cleared | 454 * external dependencies. This mark is automatically cleared after each |
| 437 * after each garbage collection. | 455 * garbage collection. |
| 438 */ | 456 */ |
| 439 V8_INLINE(void MarkPartiallyDependent()); | |
| 440 V8_INLINE(void MarkPartiallyDependent(Isolate* isolate)); | 457 V8_INLINE(void MarkPartiallyDependent(Isolate* isolate)); |
| 441 | 458 |
| 459 /** Deprecated. Use Isolate version instead. */ |
| 460 V8_DEPRECATED(bool IsIndependent() const); |
| 461 |
| 442 /** Returns true if this handle was previously marked as independent. */ | 462 /** Returns true if this handle was previously marked as independent. */ |
| 443 V8_INLINE(bool IsIndependent() const); | |
| 444 V8_INLINE(bool IsIndependent(Isolate* isolate) const); | 463 V8_INLINE(bool IsIndependent(Isolate* isolate) const); |
| 445 | 464 |
| 465 /** Deprecated. Use Isolate version instead. */ |
| 466 V8_DEPRECATED(bool IsNearDeath() const); |
| 467 |
| 446 /** Checks if the handle holds the only reference to an object. */ | 468 /** Checks if the handle holds the only reference to an object. */ |
| 447 V8_INLINE(bool IsNearDeath() const); | 469 V8_INLINE(bool IsNearDeath(Isolate* isolate) const); |
| 470 |
| 471 /** Deprecated. Use Isolate version instead. */ |
| 472 V8_DEPRECATED(bool IsWeak() const); |
| 448 | 473 |
| 449 /** Returns true if the handle's reference is weak. */ | 474 /** Returns true if the handle's reference is weak. */ |
| 450 V8_INLINE(bool IsWeak() const); | |
| 451 V8_INLINE(bool IsWeak(Isolate* isolate) const); | 475 V8_INLINE(bool IsWeak(Isolate* isolate) const); |
| 452 | 476 |
| 453 /** | 477 /** Deprecated. Use Isolate version instead. */ |
| 454 * Assigns a wrapper class ID to the handle. See RetainedObjectInfo | 478 V8_DEPRECATED(void SetWrapperClassId(uint16_t class_id)); |
| 455 * interface description in v8-profiler.h for details. | |
| 456 */ | |
| 457 V8_INLINE(void SetWrapperClassId(uint16_t class_id)); | |
| 458 | 479 |
| 459 /** | 480 /** |
| 460 * Returns the class ID previously assigned to this handle or 0 if no class | 481 * Assigns a wrapper class ID to the handle. See RetainedObjectInfo interface |
| 461 * ID was previously assigned. | 482 * description in v8-profiler.h for details. |
| 462 */ | 483 */ |
| 463 V8_INLINE(uint16_t WrapperClassId() const); | 484 V8_INLINE(void SetWrapperClassId(Isolate* isolate, uint16_t class_id)); |
| 485 |
| 486 /** Deprecated. Use Isolate version instead. */ |
| 487 V8_DEPRECATED(uint16_t WrapperClassId() const); |
| 488 |
| 489 /** |
| 490 * Returns the class ID previously assigned to this handle or 0 if no class ID |
| 491 * was previously assigned. |
| 492 */ |
| 493 V8_INLINE(uint16_t WrapperClassId(Isolate* isolate) const); |
| 464 | 494 |
| 465 private: | 495 private: |
| 466 friend class ImplementationUtilities; | 496 friend class ImplementationUtilities; |
| 467 friend class ObjectTemplate; | 497 friend class ObjectTemplate; |
| 468 }; | 498 }; |
| 469 | 499 |
| 470 | 500 |
| 471 /** | 501 /** |
| 472 * A stack-allocated class that governs a number of local handles. | 502 * A stack-allocated class that governs a number of local handles. |
| 473 * After a handle scope has been created, all local handles will be | 503 * After a handle scope has been created, all local handles will be |
| (...skipping 3048 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3522 * Optional notification that a context has been disposed. V8 uses | 3552 * Optional notification that a context has been disposed. V8 uses |
| 3523 * these notifications to guide the GC heuristic. Returns the number | 3553 * these notifications to guide the GC heuristic. Returns the number |
| 3524 * of context disposals - including this one - since the last time | 3554 * of context disposals - including this one - since the last time |
| 3525 * V8 had a chance to clean up. | 3555 * V8 had a chance to clean up. |
| 3526 */ | 3556 */ |
| 3527 static int ContextDisposedNotification(); | 3557 static int ContextDisposedNotification(); |
| 3528 | 3558 |
| 3529 private: | 3559 private: |
| 3530 V8(); | 3560 V8(); |
| 3531 | 3561 |
| 3532 static internal::Object** GlobalizeReference(internal::Object** handle); | 3562 static internal::Object** GlobalizeReference(internal::Isolate* isolate, |
| 3533 static void DisposeGlobal(internal::Object** global_handle); | 3563 internal::Object** handle); |
| 3534 static void DisposeGlobal(internal::Isolate* isolate, | 3564 static void DisposeGlobal(internal::Isolate* isolate, |
| 3535 internal::Object** global_handle); | 3565 internal::Object** global_handle); |
| 3536 static void MakeWeak(internal::Object** global_handle, | |
| 3537 void* data, | |
| 3538 WeakReferenceCallback); | |
| 3539 static void MakeWeak(internal::Isolate* isolate, | 3566 static void MakeWeak(internal::Isolate* isolate, |
| 3540 internal::Object** global_handle, | 3567 internal::Object** global_handle, |
| 3541 void* data, | 3568 void* data, |
| 3542 WeakReferenceCallback); | 3569 WeakReferenceCallback weak_reference_callback, |
| 3543 static void ClearWeak(internal::Object** global_handle); | 3570 NearDeathCallback near_death_callback); |
| 3544 static void MarkIndependent(internal::Object** global_handle); | 3571 static void ClearWeak(internal::Isolate* isolate, |
| 3545 static void MarkIndependent(internal::Isolate* isolate, | 3572 internal::Object** global_handle); |
| 3546 internal::Object** global_handle); | |
| 3547 static void MarkPartiallyDependent(internal::Object** global_handle); | |
| 3548 static void MarkPartiallyDependent(internal::Isolate* isolate, | |
| 3549 internal::Object** global_handle); | |
| 3550 static bool IsGlobalIndependent(internal::Object** global_handle); | |
| 3551 static bool IsGlobalIndependent(internal::Isolate* isolate, | |
| 3552 internal::Object** global_handle); | |
| 3553 static bool IsGlobalNearDeath(internal::Object** global_handle); | |
| 3554 static bool IsGlobalWeak(internal::Object** global_handle); | |
| 3555 static bool IsGlobalWeak(internal::Isolate* isolate, | |
| 3556 internal::Object** global_handle); | |
| 3557 | 3573 |
| 3558 template <class T> friend class Handle; | 3574 template <class T> friend class Handle; |
| 3559 template <class T> friend class Local; | 3575 template <class T> friend class Local; |
| 3560 template <class T> friend class Persistent; | 3576 template <class T> friend class Persistent; |
| 3561 friend class Context; | 3577 friend class Context; |
| 3562 }; | 3578 }; |
| 3563 | 3579 |
| 3564 | 3580 |
| 3565 /** | 3581 /** |
| 3566 * An external exception handler. | 3582 * An external exception handler. |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3967 * // V8 Now no longer locked. | 3983 * // V8 Now no longer locked. |
| 3968 * \endcode | 3984 * \endcode |
| 3969 */ | 3985 */ |
| 3970 class V8EXPORT Unlocker { | 3986 class V8EXPORT Unlocker { |
| 3971 public: | 3987 public: |
| 3972 /** | 3988 /** |
| 3973 * Initialize Unlocker for a given Isolate. | 3989 * Initialize Unlocker for a given Isolate. |
| 3974 */ | 3990 */ |
| 3975 V8_INLINE(explicit Unlocker(Isolate* isolate)) { Initialize(isolate); } | 3991 V8_INLINE(explicit Unlocker(Isolate* isolate)) { Initialize(isolate); } |
| 3976 | 3992 |
| 3977 /** | 3993 /** Deprecated. Use Isolate version instead. */ |
| 3978 * Deprecated. Use Isolate version instead. | |
| 3979 */ | |
| 3980 V8_DEPRECATED(Unlocker()); | 3994 V8_DEPRECATED(Unlocker()); |
| 3981 | 3995 |
| 3982 ~Unlocker(); | 3996 ~Unlocker(); |
| 3983 private: | 3997 private: |
| 3984 void Initialize(Isolate* isolate); | 3998 void Initialize(Isolate* isolate); |
| 3985 | 3999 |
| 3986 internal::Isolate* isolate_; | 4000 internal::Isolate* isolate_; |
| 3987 }; | 4001 }; |
| 3988 | 4002 |
| 3989 | 4003 |
| 3990 class V8EXPORT Locker { | 4004 class V8EXPORT Locker { |
| 3991 public: | 4005 public: |
| 3992 /** | 4006 /** |
| 3993 * Initialize Locker for a given Isolate. | 4007 * Initialize Locker for a given Isolate. |
| 3994 */ | 4008 */ |
| 3995 V8_INLINE(explicit Locker(Isolate* isolate)) { Initialize(isolate); } | 4009 V8_INLINE(explicit Locker(Isolate* isolate)) { Initialize(isolate); } |
| 3996 | 4010 |
| 3997 /** | 4011 /** Deprecated. Use Isolate version instead. */ |
| 3998 * Deprecated. Use Isolate version instead. | |
| 3999 */ | |
| 4000 V8_DEPRECATED(Locker()); | 4012 V8_DEPRECATED(Locker()); |
| 4001 | 4013 |
| 4002 ~Locker(); | 4014 ~Locker(); |
| 4003 | 4015 |
| 4004 /** | 4016 /** |
| 4005 * Start preemption. | 4017 * Start preemption. |
| 4006 * | 4018 * |
| 4007 * When preemption is started, a timer is fired every n milliseconds | 4019 * When preemption is started, a timer is fired every n milliseconds |
| 4008 * that will switch between multiple threads that are in contention | 4020 * that will switch between multiple threads that are in contention |
| 4009 * for the V8 lock. | 4021 * for the V8 lock. |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4168 static const int kContextHeaderSize = 2 * kApiPointerSize; | 4180 static const int kContextHeaderSize = 2 * kApiPointerSize; |
| 4169 static const int kContextEmbedderDataIndex = 54; | 4181 static const int kContextEmbedderDataIndex = 54; |
| 4170 static const int kFullStringRepresentationMask = 0x07; | 4182 static const int kFullStringRepresentationMask = 0x07; |
| 4171 static const int kStringEncodingMask = 0x4; | 4183 static const int kStringEncodingMask = 0x4; |
| 4172 static const int kExternalTwoByteRepresentationTag = 0x02; | 4184 static const int kExternalTwoByteRepresentationTag = 0x02; |
| 4173 static const int kExternalAsciiRepresentationTag = 0x06; | 4185 static const int kExternalAsciiRepresentationTag = 0x06; |
| 4174 | 4186 |
| 4175 static const int kIsolateStateOffset = 0; | 4187 static const int kIsolateStateOffset = 0; |
| 4176 static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize; | 4188 static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize; |
| 4177 static const int kIsolateRootsOffset = 3 * kApiPointerSize; | 4189 static const int kIsolateRootsOffset = 3 * kApiPointerSize; |
| 4178 static const int kNodeClassIdOffset = 1 * kApiPointerSize; | |
| 4179 static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3; | |
| 4180 static const int kUndefinedValueRootIndex = 5; | 4190 static const int kUndefinedValueRootIndex = 5; |
| 4181 static const int kNullValueRootIndex = 7; | 4191 static const int kNullValueRootIndex = 7; |
| 4182 static const int kTrueValueRootIndex = 8; | 4192 static const int kTrueValueRootIndex = 8; |
| 4183 static const int kFalseValueRootIndex = 9; | 4193 static const int kFalseValueRootIndex = 9; |
| 4184 static const int kEmptySymbolRootIndex = 119; | 4194 static const int kEmptySymbolRootIndex = 119; |
| 4185 | 4195 |
| 4196 static const int kNodeClassIdOffset = 1 * kApiPointerSize; |
| 4197 static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3; |
| 4198 static const int kNodeStateMask = 0xf; |
| 4199 static const int kNodeStateIsWeakValue = 2; |
| 4200 static const int kNodeStateIsNearDeathValue = 4; |
| 4186 static const int kNodeIsIndependentShift = 4; | 4201 static const int kNodeIsIndependentShift = 4; |
| 4187 static const int kNodeIsPartiallyDependentShift = 5; | 4202 static const int kNodeIsPartiallyDependentShift = 5; |
| 4188 | 4203 |
| 4189 static const int kJSObjectType = 0xab; | 4204 static const int kJSObjectType = 0xab; |
| 4190 static const int kFirstNonstringType = 0x80; | 4205 static const int kFirstNonstringType = 0x80; |
| 4191 static const int kOddballType = 0x82; | 4206 static const int kOddballType = 0x82; |
| 4192 static const int kForeignType = 0x85; | 4207 static const int kForeignType = 0x85; |
| 4193 | 4208 |
| 4194 static const int kUndefinedOddballKind = 5; | 4209 static const int kUndefinedOddballKind = 5; |
| 4195 static const int kNullOddballKind = 3; | 4210 static const int kNullOddballKind = 3; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4229 return *addr & (1 << shift); | 4244 return *addr & (1 << shift); |
| 4230 } | 4245 } |
| 4231 | 4246 |
| 4232 V8_INLINE(static void UpdateNodeFlag(internal::Object** obj, | 4247 V8_INLINE(static void UpdateNodeFlag(internal::Object** obj, |
| 4233 bool value, int shift)) { | 4248 bool value, int shift)) { |
| 4234 uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; | 4249 uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; |
| 4235 uint8_t mask = 1 << shift; | 4250 uint8_t mask = 1 << shift; |
| 4236 *addr = (*addr & ~mask) | (value << shift); | 4251 *addr = (*addr & ~mask) | (value << shift); |
| 4237 } | 4252 } |
| 4238 | 4253 |
| 4254 V8_INLINE(static uint8_t GetNodeState(internal::Object** obj)) { |
| 4255 uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; |
| 4256 return *addr & kNodeStateMask; |
| 4257 } |
| 4258 |
| 4259 V8_INLINE(static void UpdateNodeState(internal::Object** obj, |
| 4260 uint8_t value)) { |
| 4261 uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset; |
| 4262 *addr = (*addr & ~kNodeStateMask) | value; |
| 4263 } |
| 4264 |
| 4239 V8_INLINE(static void SetEmbedderData(v8::Isolate* isolate, void* data)) { | 4265 V8_INLINE(static void SetEmbedderData(v8::Isolate* isolate, void* data)) { |
| 4240 uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + | 4266 uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + |
| 4241 kIsolateEmbedderDataOffset; | 4267 kIsolateEmbedderDataOffset; |
| 4242 *reinterpret_cast<void**>(addr) = data; | 4268 *reinterpret_cast<void**>(addr) = data; |
| 4243 } | 4269 } |
| 4244 | 4270 |
| 4245 V8_INLINE(static void* GetEmbedderData(v8::Isolate* isolate)) { | 4271 V8_INLINE(static void* GetEmbedderData(v8::Isolate* isolate)) { |
| 4246 uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + | 4272 uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + |
| 4247 kIsolateEmbedderDataOffset; | 4273 kIsolateEmbedderDataOffset; |
| 4248 return *reinterpret_cast<void**>(addr); | 4274 return *reinterpret_cast<void**>(addr); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4296 internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); | 4322 internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); |
| 4297 if (internal::Internals::CanCastToHeapObject(that_ptr)) { | 4323 if (internal::Internals::CanCastToHeapObject(that_ptr)) { |
| 4298 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( | 4324 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( |
| 4299 reinterpret_cast<internal::HeapObject*>(*p)))); | 4325 reinterpret_cast<internal::HeapObject*>(*p)))); |
| 4300 } | 4326 } |
| 4301 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(*p))); | 4327 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(*p))); |
| 4302 } | 4328 } |
| 4303 | 4329 |
| 4304 | 4330 |
| 4305 template <class T> | 4331 template <class T> |
| 4306 Local<T> Local<T>::New(Isolate* isolate, Handle<T> that) { | 4332 Local<T> Local<T>::New(Isolate* isolate, Handle<T> that) { |
| 4307 if (that.IsEmpty()) return Local<T>(); | 4333 if (that.IsEmpty()) return Local<T>(); |
| 4308 T* that_ptr = *that; | 4334 T* that_ptr = *that; |
| 4309 internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); | 4335 internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); |
| 4310 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( | 4336 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( |
| 4311 reinterpret_cast<internal::Isolate*>(isolate), *p))); | 4337 reinterpret_cast<internal::Isolate*>(isolate), *p))); |
| 4312 } | 4338 } |
| 4313 | 4339 |
| 4314 | 4340 |
| 4315 template <class T> | 4341 template <class T> |
| 4316 Persistent<T> Persistent<T>::New(Handle<T> that) { | 4342 Persistent<T> Persistent<T>::New(Handle<T> that) { |
| 4343 return New(Isolate::GetCurrent(), that); |
| 4344 } |
| 4345 |
| 4346 |
| 4347 template <class T> |
| 4348 Persistent<T> Persistent<T>::New(Isolate* isolate, Handle<T> that) { |
| 4317 if (that.IsEmpty()) return Persistent<T>(); | 4349 if (that.IsEmpty()) return Persistent<T>(); |
| 4318 internal::Object** p = reinterpret_cast<internal::Object**>(*that); | 4350 internal::Object** p = reinterpret_cast<internal::Object**>(*that); |
| 4319 return Persistent<T>(reinterpret_cast<T*>(V8::GlobalizeReference(p))); | 4351 return Persistent<T>(reinterpret_cast<T*>( |
| 4352 V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), |
| 4353 p))); |
| 4320 } | 4354 } |
| 4321 | 4355 |
| 4322 | 4356 |
| 4323 template <class T> | 4357 template <class T> |
| 4324 bool Persistent<T>::IsIndependent() const { | 4358 bool Persistent<T>::IsIndependent() const { |
| 4325 if (this->IsEmpty()) return false; | 4359 return IsIndependent(Isolate::GetCurrent()); |
| 4326 return V8::IsGlobalIndependent(reinterpret_cast<internal::Object**>(**this)); | |
| 4327 } | 4360 } |
| 4328 | 4361 |
| 4329 | 4362 |
| 4330 template <class T> | 4363 template <class T> |
| 4331 bool Persistent<T>::IsIndependent(Isolate* isolate) const { | 4364 bool Persistent<T>::IsIndependent(Isolate* isolate) const { |
| 4332 typedef internal::Internals I; | 4365 typedef internal::Internals I; |
| 4333 if (this->IsEmpty()) return false; | 4366 if (this->IsEmpty()) return false; |
| 4334 if (!I::IsInitialized(isolate)) return false; | 4367 if (!I::IsInitialized(isolate)) return false; |
| 4335 return I::GetNodeFlag(reinterpret_cast<internal::Object**>(**this), | 4368 return I::GetNodeFlag(reinterpret_cast<internal::Object**>(**this), |
| 4336 I::kNodeIsIndependentShift); | 4369 I::kNodeIsIndependentShift); |
| 4337 } | 4370 } |
| 4338 | 4371 |
| 4339 | 4372 |
| 4340 template <class T> | 4373 template <class T> |
| 4341 bool Persistent<T>::IsNearDeath() const { | 4374 bool Persistent<T>::IsNearDeath() const { |
| 4375 return IsNearDeath(Isolate::GetCurrent()); |
| 4376 } |
| 4377 |
| 4378 |
| 4379 template <class T> |
| 4380 bool Persistent<T>::IsNearDeath(Isolate* isolate) const { |
| 4381 typedef internal::Internals I; |
| 4342 if (this->IsEmpty()) return false; | 4382 if (this->IsEmpty()) return false; |
| 4343 return V8::IsGlobalNearDeath(reinterpret_cast<internal::Object**>(**this)); | 4383 if (!I::IsInitialized(isolate)) return false; |
| 4384 return I::GetNodeState(reinterpret_cast<internal::Object**>(**this)) == |
| 4385 I::kNodeStateIsNearDeathValue; |
| 4344 } | 4386 } |
| 4345 | 4387 |
| 4346 | 4388 |
| 4347 template <class T> | 4389 template <class T> |
| 4348 bool Persistent<T>::IsWeak() const { | 4390 bool Persistent<T>::IsWeak() const { |
| 4349 if (this->IsEmpty()) return false; | 4391 return IsWeak(Isolate::GetCurrent()); |
| 4350 return V8::IsGlobalWeak(reinterpret_cast<internal::Object**>(**this)); | |
| 4351 } | 4392 } |
| 4352 | 4393 |
| 4353 | 4394 |
| 4354 template <class T> | 4395 template <class T> |
| 4355 bool Persistent<T>::IsWeak(Isolate* isolate) const { | 4396 bool Persistent<T>::IsWeak(Isolate* isolate) const { |
| 4397 typedef internal::Internals I; |
| 4356 if (this->IsEmpty()) return false; | 4398 if (this->IsEmpty()) return false; |
| 4357 return V8::IsGlobalWeak(reinterpret_cast<internal::Isolate*>(isolate), | 4399 if (!I::IsInitialized(isolate)) return false; |
| 4358 reinterpret_cast<internal::Object**>(**this)); | 4400 return I::GetNodeState(reinterpret_cast<internal::Object**>(**this)) == |
| 4401 I::kNodeStateIsWeakValue; |
| 4359 } | 4402 } |
| 4360 | 4403 |
| 4361 | 4404 |
| 4362 template <class T> | 4405 template <class T> |
| 4363 void Persistent<T>::Dispose() { | 4406 void Persistent<T>::Dispose() { |
| 4364 if (this->IsEmpty()) return; | 4407 Dispose(Isolate::GetCurrent()); |
| 4365 V8::DisposeGlobal(reinterpret_cast<internal::Object**>(**this)); | |
| 4366 } | 4408 } |
| 4367 | 4409 |
| 4368 | 4410 |
| 4369 template <class T> | 4411 template <class T> |
| 4370 void Persistent<T>::Dispose(Isolate* isolate) { | 4412 void Persistent<T>::Dispose(Isolate* isolate) { |
| 4371 if (this->IsEmpty()) return; | 4413 if (this->IsEmpty()) return; |
| 4372 V8::DisposeGlobal(reinterpret_cast<internal::Isolate*>(isolate), | 4414 V8::DisposeGlobal(reinterpret_cast<internal::Isolate*>(isolate), |
| 4373 reinterpret_cast<internal::Object**>(**this)); | 4415 reinterpret_cast<internal::Object**>(**this)); |
| 4374 } | 4416 } |
| 4375 | 4417 |
| 4376 | 4418 |
| 4377 template <class T> | 4419 template <class T> |
| 4378 Persistent<T>::Persistent() : Handle<T>() { } | 4420 Persistent<T>::Persistent() : Handle<T>() { } |
| 4379 | 4421 |
| 4380 template <class T> | 4422 template <class T> |
| 4381 void Persistent<T>::MakeWeak(void* parameters, WeakReferenceCallback callback) { | 4423 void Persistent<T>::MakeWeak(void* parameters, WeakReferenceCallback callback) { |
| 4382 V8::MakeWeak(reinterpret_cast<internal::Object**>(**this), | 4424 Isolate* isolate = Isolate::GetCurrent(); |
| 4425 V8::MakeWeak(reinterpret_cast<internal::Isolate*>(isolate), |
| 4426 reinterpret_cast<internal::Object**>(**this), |
| 4383 parameters, | 4427 parameters, |
| 4384 callback); | 4428 callback, |
| 4429 NULL); |
| 4385 } | 4430 } |
| 4386 | 4431 |
| 4387 template <class T> | 4432 template <class T> |
| 4388 void Persistent<T>::MakeWeak(Isolate* isolate, void* parameters, | 4433 void Persistent<T>::MakeWeak(Isolate* isolate, |
| 4389 WeakReferenceCallback callback) { | 4434 void* parameters, |
| 4435 NearDeathCallback callback) { |
| 4390 V8::MakeWeak(reinterpret_cast<internal::Isolate*>(isolate), | 4436 V8::MakeWeak(reinterpret_cast<internal::Isolate*>(isolate), |
| 4391 reinterpret_cast<internal::Object**>(**this), | 4437 reinterpret_cast<internal::Object**>(**this), |
| 4392 parameters, | 4438 parameters, |
| 4439 NULL, |
| 4393 callback); | 4440 callback); |
| 4394 } | 4441 } |
| 4395 | 4442 |
| 4396 template <class T> | 4443 template <class T> |
| 4397 void Persistent<T>::ClearWeak() { | 4444 void Persistent<T>::ClearWeak() { |
| 4398 V8::ClearWeak(reinterpret_cast<internal::Object**>(**this)); | 4445 ClearWeak(Isolate::GetCurrent()); |
| 4446 } |
| 4447 |
| 4448 template <class T> |
| 4449 void Persistent<T>::ClearWeak(Isolate* isolate) { |
| 4450 V8::ClearWeak(reinterpret_cast<internal::Isolate*>(isolate), |
| 4451 reinterpret_cast<internal::Object**>(**this)); |
| 4399 } | 4452 } |
| 4400 | 4453 |
| 4401 template <class T> | 4454 template <class T> |
| 4402 void Persistent<T>::MarkIndependent() { | 4455 void Persistent<T>::MarkIndependent() { |
| 4403 V8::MarkIndependent(reinterpret_cast<internal::Object**>(**this)); | 4456 MarkIndependent(Isolate::GetCurrent()); |
| 4404 } | 4457 } |
| 4405 | 4458 |
| 4406 template <class T> | 4459 template <class T> |
| 4407 void Persistent<T>::MarkIndependent(Isolate* isolate) { | 4460 void Persistent<T>::MarkIndependent(Isolate* isolate) { |
| 4408 typedef internal::Internals I; | 4461 typedef internal::Internals I; |
| 4409 if (this->IsEmpty()) return; | 4462 if (this->IsEmpty()) return; |
| 4410 if (!I::IsInitialized(isolate)) return; | 4463 if (!I::IsInitialized(isolate)) return; |
| 4411 I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(**this), | 4464 I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(**this), |
| 4412 true, I::kNodeIsIndependentShift); | 4465 true, |
| 4466 I::kNodeIsIndependentShift); |
| 4413 } | 4467 } |
| 4414 | 4468 |
| 4415 template <class T> | 4469 template <class T> |
| 4416 void Persistent<T>::MarkPartiallyDependent() { | 4470 void Persistent<T>::MarkPartiallyDependent() { |
| 4417 V8::MarkPartiallyDependent(reinterpret_cast<internal::Object**>(**this)); | 4471 MarkPartiallyDependent(Isolate::GetCurrent()); |
| 4418 } | 4472 } |
| 4419 | 4473 |
| 4420 template <class T> | 4474 template <class T> |
| 4421 void Persistent<T>::MarkPartiallyDependent(Isolate* isolate) { | 4475 void Persistent<T>::MarkPartiallyDependent(Isolate* isolate) { |
| 4422 typedef internal::Internals I; | 4476 typedef internal::Internals I; |
| 4423 if (this->IsEmpty()) return; | 4477 if (this->IsEmpty()) return; |
| 4424 if (!I::IsInitialized(isolate)) return; | 4478 if (!I::IsInitialized(isolate)) return; |
| 4425 I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(**this), | 4479 I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(**this), |
| 4426 true, I::kNodeIsPartiallyDependentShift); | 4480 true, |
| 4481 I::kNodeIsPartiallyDependentShift); |
| 4427 } | 4482 } |
| 4428 | 4483 |
| 4429 template <class T> | 4484 template <class T> |
| 4430 void Persistent<T>::SetWrapperClassId(uint16_t class_id) { | 4485 void Persistent<T>::SetWrapperClassId(uint16_t class_id) { |
| 4486 SetWrapperClassId(Isolate::GetCurrent(), class_id); |
| 4487 } |
| 4488 |
| 4489 template <class T> |
| 4490 void Persistent<T>::SetWrapperClassId(Isolate* isolate, uint16_t class_id) { |
| 4431 typedef internal::Internals I; | 4491 typedef internal::Internals I; |
| 4492 if (this->IsEmpty()) return; |
| 4493 if (!I::IsInitialized(isolate)) return; |
| 4432 internal::Object** obj = reinterpret_cast<internal::Object**>(**this); | 4494 internal::Object** obj = reinterpret_cast<internal::Object**>(**this); |
| 4433 uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; | 4495 uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; |
| 4434 *reinterpret_cast<uint16_t*>(addr) = class_id; | 4496 *reinterpret_cast<uint16_t*>(addr) = class_id; |
| 4435 } | 4497 } |
| 4436 | 4498 |
| 4437 template <class T> | 4499 template <class T> |
| 4438 uint16_t Persistent<T>::WrapperClassId() const { | 4500 uint16_t Persistent<T>::WrapperClassId() const { |
| 4501 return WrapperClassId(Isolate::GetCurrent()); |
| 4502 } |
| 4503 |
| 4504 template <class T> |
| 4505 uint16_t Persistent<T>::WrapperClassId(Isolate* isolate) const { |
| 4439 typedef internal::Internals I; | 4506 typedef internal::Internals I; |
| 4507 if (this->IsEmpty()) return 0; |
| 4508 if (!I::IsInitialized(isolate)) return 0; |
| 4440 internal::Object** obj = reinterpret_cast<internal::Object**>(**this); | 4509 internal::Object** obj = reinterpret_cast<internal::Object**>(**this); |
| 4441 uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; | 4510 uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; |
| 4442 return *reinterpret_cast<uint16_t*>(addr); | 4511 return *reinterpret_cast<uint16_t*>(addr); |
| 4443 } | 4512 } |
| 4444 | 4513 |
| 4445 Arguments::Arguments(internal::Object** implicit_args, | 4514 Arguments::Arguments(internal::Object** implicit_args, |
| 4446 internal::Object** values, int length, | 4515 internal::Object** values, int length, |
| 4447 bool is_construct_call) | 4516 bool is_construct_call) |
| 4448 : implicit_args_(implicit_args), | 4517 : implicit_args_(implicit_args), |
| 4449 values_(values), | 4518 values_(values), |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4859 | 4928 |
| 4860 | 4929 |
| 4861 } // namespace v8 | 4930 } // namespace v8 |
| 4862 | 4931 |
| 4863 | 4932 |
| 4864 #undef V8EXPORT | 4933 #undef V8EXPORT |
| 4865 #undef TYPE_CHECK | 4934 #undef TYPE_CHECK |
| 4866 | 4935 |
| 4867 | 4936 |
| 4868 #endif // V8_H_ | 4937 #endif // V8_H_ |
| OLD | NEW |