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 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 class Date; | 116 class Date; |
117 class DeclaredAccessorDescriptor; | 117 class DeclaredAccessorDescriptor; |
118 class External; | 118 class External; |
119 class Function; | 119 class Function; |
120 class FunctionTemplate; | 120 class FunctionTemplate; |
121 class HeapProfiler; | 121 class HeapProfiler; |
122 class ImplementationUtilities; | 122 class ImplementationUtilities; |
123 class Int32; | 123 class Int32; |
124 class Integer; | 124 class Integer; |
125 class Isolate; | 125 class Isolate; |
126 class LocalContext; | |
127 class Number; | 126 class Number; |
128 class NumberObject; | 127 class NumberObject; |
129 class Object; | 128 class Object; |
130 class ObjectOperationDescriptor; | 129 class ObjectOperationDescriptor; |
131 class ObjectTemplate; | 130 class ObjectTemplate; |
132 class Primitive; | 131 class Primitive; |
133 class RawOperationDescriptor; | 132 class RawOperationDescriptor; |
134 class Signature; | 133 class Signature; |
135 class StackFrame; | 134 class StackFrame; |
136 class StackTrace; | 135 class StackTrace; |
(...skipping 18 matching lines...) Expand all Loading... |
155 class DeclaredAccessorDescriptor; | 154 class DeclaredAccessorDescriptor; |
156 class ObjectOperationDescriptor; | 155 class ObjectOperationDescriptor; |
157 class RawOperationDescriptor; | 156 class RawOperationDescriptor; |
158 | 157 |
159 namespace internal { | 158 namespace internal { |
160 class Arguments; | 159 class Arguments; |
161 class Heap; | 160 class Heap; |
162 class HeapObject; | 161 class HeapObject; |
163 class Isolate; | 162 class Isolate; |
164 class Object; | 163 class Object; |
165 template<typename T> | 164 template<typename T> class CustomArguments; |
166 class CustomArguments; | |
167 class PropertyCallbackArguments; | 165 class PropertyCallbackArguments; |
168 class FunctionCallbackArguments; | 166 class FunctionCallbackArguments; |
169 } | 167 } |
170 | 168 |
171 | 169 |
172 /** | 170 /** |
173 * General purpose unique identifier. | 171 * General purpose unique identifier. |
174 */ | 172 */ |
175 class UniqueId { | 173 class UniqueId { |
176 public: | 174 public: |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 | 356 |
359 private: | 357 private: |
360 #endif | 358 #endif |
361 /** | 359 /** |
362 * Creates a new handle for the specified value. | 360 * Creates a new handle for the specified value. |
363 */ | 361 */ |
364 V8_INLINE(explicit Handle(T* val)) : val_(val) {} | 362 V8_INLINE(explicit Handle(T* val)) : val_(val) {} |
365 #endif | 363 #endif |
366 | 364 |
367 private: | 365 private: |
| 366 friend class Utils; |
368 template<class F> friend class Persistent; | 367 template<class F> friend class Persistent; |
369 template<class F> friend class Local; | 368 template<class F> friend class Local; |
370 friend class Arguments; | 369 friend class Arguments; |
371 template<class F> friend class FunctionCallbackInfo; | 370 template<class F> friend class FunctionCallbackInfo; |
372 template<class F> friend class PropertyCallbackInfo; | 371 template<class F> friend class PropertyCallbackInfo; |
373 friend class String; | 372 template<class F> friend class CustomArguments; |
374 friend class Object; | |
375 friend class AccessorInfo; | 373 friend class AccessorInfo; |
376 friend Handle<Primitive> Undefined(Isolate* isolate); | 374 friend Handle<Primitive> Undefined(Isolate* isolate); |
377 friend Handle<Primitive> Null(Isolate* isolate); | 375 friend Handle<Primitive> Null(Isolate* isolate); |
378 friend Handle<Boolean> True(Isolate* isolate); | 376 friend Handle<Boolean> True(Isolate* isolate); |
379 friend Handle<Boolean> False(Isolate* isolate); | 377 friend Handle<Boolean> False(Isolate* isolate); |
380 friend class Context; | 378 friend class Context; |
381 friend class InternalHandleHelper; | |
382 friend class LocalContext; | |
383 friend class HandleScope; | 379 friend class HandleScope; |
384 | 380 |
385 #ifndef V8_USE_UNSAFE_HANDLES | 381 #ifndef V8_USE_UNSAFE_HANDLES |
386 V8_INLINE(static Handle<T> New(Isolate* isolate, T* that)); | 382 V8_INLINE(static Handle<T> New(Isolate* isolate, T* that)); |
387 #endif | 383 #endif |
388 | 384 |
389 T* val_; | 385 T* val_; |
390 }; | 386 }; |
391 | 387 |
392 | 388 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 V8_INLINE(static Local<T> New(Isolate* isolate, const Persistent<T>& that)); | 443 V8_INLINE(static Local<T> New(Isolate* isolate, const Persistent<T>& that)); |
448 | 444 |
449 #ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR | 445 #ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR |
450 | 446 |
451 private: | 447 private: |
452 #endif | 448 #endif |
453 template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { } | 449 template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { } |
454 #endif | 450 #endif |
455 | 451 |
456 private: | 452 private: |
| 453 friend class Utils; |
457 template<class F> friend class Persistent; | 454 template<class F> friend class Persistent; |
458 template<class F> friend class Handle; | 455 template<class F> friend class Handle; |
459 friend class Arguments; | 456 friend class Arguments; |
460 template<class F> friend class FunctionCallbackInfo; | 457 template<class F> friend class FunctionCallbackInfo; |
461 template<class F> friend class PropertyCallbackInfo; | 458 template<class F> friend class PropertyCallbackInfo; |
462 friend class String; | 459 friend class String; |
463 friend class Object; | 460 friend class Object; |
464 friend class AccessorInfo; | 461 friend class AccessorInfo; |
465 friend class Context; | 462 friend class Context; |
466 friend class InternalHandleHelper; | 463 template<class F> friend class CustomArguments; |
467 friend class LocalContext; | |
468 friend class HandleScope; | 464 friend class HandleScope; |
469 | 465 |
470 V8_INLINE(static Local<T> New(Isolate* isolate, T* that)); | 466 V8_INLINE(static Local<T> New(Isolate* isolate, T* that)); |
471 }; | 467 }; |
472 | 468 |
473 /** | 469 /** |
474 * An object reference that is independent of any handle scope. Where | 470 * An object reference that is independent of any handle scope. Where |
475 * a Local handle only lives as long as the HandleScope in which it was | 471 * a Local handle only lives as long as the HandleScope in which it was |
476 * allocated, a Persistent handle remains valid until it is explicitly | 472 * allocated, a Persistent handle remains valid until it is explicitly |
477 * disposed. | 473 * disposed. |
(...skipping 26 matching lines...) Expand all Loading... |
504 // TODO(dcarney): remove somehow before cutover | 500 // TODO(dcarney): remove somehow before cutover |
505 // The handle should either be 0, or a pointer to a live cell. | 501 // The handle should either be 0, or a pointer to a live cell. |
506 V8_INLINE(void Clear()) { val_ = 0; } | 502 V8_INLINE(void Clear()) { val_ = 0; } |
507 | 503 |
508 /** | 504 /** |
509 * A constructor that creates a new global cell pointing to that. In contrast | 505 * A constructor that creates a new global cell pointing to that. In contrast |
510 * to the copy constructor, this creates a new persistent handle which needs | 506 * to the copy constructor, this creates a new persistent handle which needs |
511 * to be separately disposed. | 507 * to be separately disposed. |
512 */ | 508 */ |
513 template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that)) | 509 template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that)) |
514 : val_(*New(isolate, that)) { } | 510 : val_(New(isolate, *that)) { } |
515 | 511 |
516 template <class S> V8_INLINE(Persistent(Isolate* isolate, | 512 template <class S> V8_INLINE(Persistent(Isolate* isolate, |
517 Persistent<S>& that)) // NOLINT | 513 Persistent<S>& that)) // NOLINT |
518 : val_(*New(isolate, that)) { } | 514 : val_(New(isolate, *that)) { } |
519 | 515 |
520 #else | 516 #else |
521 /** | 517 /** |
522 * Creates an empty persistent handle that doesn't point to any | 518 * Creates an empty persistent handle that doesn't point to any |
523 * storage cell. | 519 * storage cell. |
524 */ | 520 */ |
525 V8_INLINE(Persistent()) : Handle<T>() { } | 521 V8_INLINE(Persistent()) : Handle<T>() { } |
526 | 522 |
527 /** | 523 /** |
528 * Creates a persistent handle for the same storage cell as the | 524 * Creates a persistent handle for the same storage cell as the |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 if (!that.IsEmpty()) T::Cast(*that); | 583 if (!that.IsEmpty()) T::Cast(*that); |
588 #endif | 584 #endif |
589 return reinterpret_cast<Persistent<T>&>(that); | 585 return reinterpret_cast<Persistent<T>&>(that); |
590 } | 586 } |
591 | 587 |
592 template <class S> V8_INLINE(Persistent<S>& As()) { // NOLINT | 588 template <class S> V8_INLINE(Persistent<S>& As()) { // NOLINT |
593 return Persistent<S>::Cast(*this); | 589 return Persistent<S>::Cast(*this); |
594 } | 590 } |
595 #endif | 591 #endif |
596 | 592 |
| 593 #ifdef V8_USE_UNSAFE_HANDLES |
597 V8_DEPRECATED(static Persistent<T> New(Handle<T> that)); | 594 V8_DEPRECATED(static Persistent<T> New(Handle<T> that)); |
598 | |
599 /** | |
600 * Creates a new persistent handle for an existing local or persistent handle. | |
601 */ | |
602 // TODO(dcarney): remove before cutover | |
603 V8_INLINE(static Persistent<T> New(Isolate* isolate, Handle<T> that)); | 595 V8_INLINE(static Persistent<T> New(Isolate* isolate, Handle<T> that)); |
604 #ifndef V8_USE_UNSAFE_HANDLES | |
605 // TODO(dcarney): remove before cutover | |
606 V8_INLINE(static Persistent<T> New(Isolate* isolate, Persistent<T> that)); | 596 V8_INLINE(static Persistent<T> New(Isolate* isolate, Persistent<T> that)); |
607 #endif | 597 #endif |
608 | 598 |
609 #ifndef V8_USE_UNSAFE_HANDLES | 599 #ifndef V8_USE_UNSAFE_HANDLES |
610 template <class S> V8_INLINE( | 600 template <class S> V8_INLINE( |
611 bool operator==(const Persistent<S>& that) const) { | 601 bool operator==(const Persistent<S>& that) const) { |
612 internal::Object** a = reinterpret_cast<internal::Object**>(**this); | 602 internal::Object** a = reinterpret_cast<internal::Object**>(**this); |
613 internal::Object** b = reinterpret_cast<internal::Object**>(*that); | 603 internal::Object** b = reinterpret_cast<internal::Object**>(*that); |
614 if (a == 0) return b == 0; | 604 if (a == 0) return b == 0; |
615 if (b == 0) return false; | 605 if (b == 0) return false; |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 return *this; | 762 return *this; |
773 } | 763 } |
774 | 764 |
775 public: | 765 public: |
776 #ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR | 766 #ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR |
777 | 767 |
778 private: | 768 private: |
779 #endif | 769 #endif |
780 // TODO(dcarney): remove before cutover | 770 // TODO(dcarney): remove before cutover |
781 template <class S> V8_INLINE(Persistent(S* that)) : val_(that) { } | 771 template <class S> V8_INLINE(Persistent(S* that)) : val_(that) { } |
782 // TODO(dcarney): remove before cutover | 772 |
783 template <class S> V8_INLINE(Persistent(Persistent<S> that)) | |
784 : val_(*that) { | |
785 TYPE_CHECK(T, S); | |
786 } | |
787 // TODO(dcarney): remove before cutover | 773 // TODO(dcarney): remove before cutover |
788 V8_INLINE(T* operator*() const) { return val_; } | 774 V8_INLINE(T* operator*() const) { return val_; } |
789 | 775 |
790 private: | 776 private: |
791 // TODO(dcarney): remove before cutover | 777 // TODO(dcarney): remove before cutover |
792 V8_INLINE(T* operator->() const) { return val_; } | 778 V8_INLINE(T* operator->() const) { return val_; } |
793 public: | 779 public: |
794 #endif | 780 #endif |
795 | 781 |
796 private: | 782 private: |
| 783 friend class Utils; |
797 template<class F> friend class Handle; | 784 template<class F> friend class Handle; |
798 template<class F> friend class Local; | 785 template<class F> friend class Local; |
| 786 template<class F> friend class Persistent; |
799 template<class F> friend class ReturnValue; | 787 template<class F> friend class ReturnValue; |
800 friend class ImplementationUtilities; | |
801 friend class ObjectTemplate; | |
802 friend class Context; | |
803 friend class InternalHandleHelper; | |
804 friend class LocalContext; | |
805 | 788 |
806 V8_INLINE(static Persistent<T> New(Isolate* isolate, T* that)); | 789 V8_INLINE(static T* New(Isolate* isolate, T* that)); |
807 | 790 |
808 #ifndef V8_USE_UNSAFE_HANDLES | 791 #ifndef V8_USE_UNSAFE_HANDLES |
809 T* val_; | 792 T* val_; |
810 #endif | 793 #endif |
811 }; | 794 }; |
812 | 795 |
813 | 796 |
814 /** | 797 /** |
815 * A stack-allocated class that governs a number of local handles. | 798 * A stack-allocated class that governs a number of local handles. |
816 * After a handle scope has been created, all local handles will be | 799 * After a handle scope has been created, all local handles will be |
(...skipping 4686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5503 template <class T> | 5486 template <class T> |
5504 Local<T> Local<T>::New(Isolate* isolate, T* that) { | 5487 Local<T> Local<T>::New(Isolate* isolate, T* that) { |
5505 if (that == NULL) return Local<T>(); | 5488 if (that == NULL) return Local<T>(); |
5506 T* that_ptr = that; | 5489 T* that_ptr = that; |
5507 internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); | 5490 internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); |
5508 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( | 5491 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( |
5509 reinterpret_cast<internal::Isolate*>(isolate), *p))); | 5492 reinterpret_cast<internal::Isolate*>(isolate), *p))); |
5510 } | 5493 } |
5511 | 5494 |
5512 | 5495 |
| 5496 #ifdef V8_USE_UNSAFE_HANDLES |
5513 template <class T> | 5497 template <class T> |
5514 Persistent<T> Persistent<T>::New(Handle<T> that) { | 5498 Persistent<T> Persistent<T>::New(Handle<T> that) { |
5515 return New(Isolate::GetCurrent(), that.val_); | 5499 return New(Isolate::GetCurrent(), that.val_); |
5516 } | 5500 } |
5517 | 5501 |
5518 | 5502 |
5519 template <class T> | 5503 template <class T> |
5520 Persistent<T> Persistent<T>::New(Isolate* isolate, Handle<T> that) { | 5504 Persistent<T> Persistent<T>::New(Isolate* isolate, Handle<T> that) { |
5521 return New(Isolate::GetCurrent(), that.val_); | 5505 return New(Isolate::GetCurrent(), that.val_); |
5522 } | 5506 } |
5523 | 5507 |
5524 #ifndef V8_USE_UNSAFE_HANDLES | |
5525 template <class T> | 5508 template <class T> |
5526 Persistent<T> Persistent<T>::New(Isolate* isolate, Persistent<T> that) { | 5509 Persistent<T> Persistent<T>::New(Isolate* isolate, Persistent<T> that) { |
5527 return New(Isolate::GetCurrent(), that.val_); | 5510 return New(Isolate::GetCurrent(), that.val_); |
5528 } | 5511 } |
5529 #endif | 5512 #endif |
5530 | 5513 |
| 5514 |
5531 template <class T> | 5515 template <class T> |
5532 Persistent<T> Persistent<T>::New(Isolate* isolate, T* that) { | 5516 T* Persistent<T>::New(Isolate* isolate, T* that) { |
5533 if (that == NULL) return Persistent<T>(); | 5517 if (that == NULL) return NULL; |
5534 internal::Object** p = reinterpret_cast<internal::Object**>(that); | 5518 internal::Object** p = reinterpret_cast<internal::Object**>(that); |
5535 return Persistent<T>(reinterpret_cast<T*>( | 5519 return reinterpret_cast<T*>( |
5536 V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), | 5520 V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), |
5537 p))); | 5521 p)); |
5538 } | 5522 } |
5539 | 5523 |
5540 | 5524 |
5541 template <class T> | 5525 template <class T> |
5542 bool Persistent<T>::IsIndependent() const { | 5526 bool Persistent<T>::IsIndependent() const { |
5543 typedef internal::Internals I; | 5527 typedef internal::Internals I; |
5544 if (this->IsEmpty()) return false; | 5528 if (this->IsEmpty()) return false; |
5545 return I::GetNodeFlag(reinterpret_cast<internal::Object**>(this->val_), | 5529 return I::GetNodeFlag(reinterpret_cast<internal::Object**>(this->val_), |
5546 I::kNodeIsIndependentShift); | 5530 I::kNodeIsIndependentShift); |
5547 } | 5531 } |
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6369 | 6353 |
6370 | 6354 |
6371 } // namespace v8 | 6355 } // namespace v8 |
6372 | 6356 |
6373 | 6357 |
6374 #undef V8EXPORT | 6358 #undef V8EXPORT |
6375 #undef TYPE_CHECK | 6359 #undef TYPE_CHECK |
6376 | 6360 |
6377 | 6361 |
6378 #endif // V8_H_ | 6362 #endif // V8_H_ |
OLD | NEW |