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 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 | 371 |
372 template <class S> V8_INLINE Local<S> As() { | 372 template <class S> V8_INLINE Local<S> As() { |
373 return Local<S>::Cast(*this); | 373 return Local<S>::Cast(*this); |
374 } | 374 } |
375 | 375 |
376 /** | 376 /** |
377 * Create a local handle for the content of another handle. | 377 * Create a local handle for the content of another handle. |
378 * The referee is kept alive by the local handle even when | 378 * The referee is kept alive by the local handle even when |
379 * the original handle is destroyed/disposed. | 379 * the original handle is destroyed/disposed. |
380 */ | 380 */ |
381 V8_INLINE static Local<T> New(Handle<T> that); | |
382 V8_INLINE static Local<T> New(Isolate* isolate, Handle<T> that); | 381 V8_INLINE static Local<T> New(Isolate* isolate, Handle<T> that); |
383 template<class M> | 382 template<class M> |
384 V8_INLINE static Local<T> New(Isolate* isolate, | 383 V8_INLINE static Local<T> New(Isolate* isolate, |
385 const Persistent<T, M>& that); | 384 const Persistent<T, M>& that); |
386 | 385 |
387 #ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR | 386 #ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR |
388 | 387 |
389 private: | 388 private: |
390 #endif | 389 #endif |
391 template <class S> V8_INLINE Local(S* that) : Handle<T>(that) { } | 390 template <class S> V8_INLINE Local(S* that) : Handle<T>(that) { } |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 ~HandleScope(); | 775 ~HandleScope(); |
777 | 776 |
778 // TODO(dcarney): deprecated - use EscapableHandleScope::Escape. | 777 // TODO(dcarney): deprecated - use EscapableHandleScope::Escape. |
779 template <class T> Local<T> Close(Handle<T> value); | 778 template <class T> Local<T> Close(Handle<T> value); |
780 | 779 |
781 /** | 780 /** |
782 * Counts the number of allocated handles. | 781 * Counts the number of allocated handles. |
783 */ | 782 */ |
784 static int NumberOfHandles(); | 783 static int NumberOfHandles(); |
785 | 784 |
| 785 private: |
786 /** | 786 /** |
787 * Creates a new handle with the given value. | 787 * Creates a new handle with the given value. |
788 */ | 788 */ |
789 static internal::Object** CreateHandle(internal::Object* value); | |
790 static internal::Object** CreateHandle(internal::Isolate* isolate, | 789 static internal::Object** CreateHandle(internal::Isolate* isolate, |
791 internal::Object* value); | 790 internal::Object* value); |
792 // Faster version, uses HeapObject to obtain the current Isolate. | 791 // Uses HeapObject to obtain the current Isolate. |
793 static internal::Object** CreateHandle(internal::HeapObject* value); | 792 static internal::Object** CreateHandle(internal::HeapObject* heap_object, |
| 793 internal::Object* value); |
794 | 794 |
795 private: | |
796 V8_INLINE HandleScope() {} | 795 V8_INLINE HandleScope() {} |
797 void Initialize(Isolate* isolate); | 796 void Initialize(Isolate* isolate); |
798 | 797 |
799 // Make it hard to create heap-allocated or illegal handle scopes by | 798 // Make it hard to create heap-allocated or illegal handle scopes by |
800 // disallowing certain operations. | 799 // disallowing certain operations. |
801 HandleScope(const HandleScope&); | 800 HandleScope(const HandleScope&); |
802 void operator=(const HandleScope&); | 801 void operator=(const HandleScope&); |
803 void* operator new(size_t size); | 802 void* operator new(size_t size); |
804 void operator delete(void*, size_t); | 803 void operator delete(void*, size_t); |
805 | 804 |
(...skipping 17 matching lines...) Expand all Loading... |
823 internal::Object** prev_limit_; | 822 internal::Object** prev_limit_; |
824 | 823 |
825 // TODO(dcarney): remove this field | 824 // TODO(dcarney): remove this field |
826 // Allow for the active closing of HandleScopes which allows to pass a handle | 825 // Allow for the active closing of HandleScopes which allows to pass a handle |
827 // from the HandleScope being closed to the next top most HandleScope. | 826 // from the HandleScope being closed to the next top most HandleScope. |
828 bool is_closed_; | 827 bool is_closed_; |
829 internal::Object** RawClose(internal::Object** value); | 828 internal::Object** RawClose(internal::Object** value); |
830 | 829 |
831 friend class ImplementationUtilities; | 830 friend class ImplementationUtilities; |
832 friend class EscapableHandleScope; | 831 friend class EscapableHandleScope; |
| 832 template<class F> friend class Handle; |
| 833 template<class F> friend class Local; |
| 834 friend class Object; |
| 835 friend class Context; |
833 }; | 836 }; |
834 | 837 |
835 | 838 |
836 /** | 839 /** |
837 * A HandleScope which first allocates a handle in the current scope | 840 * A HandleScope which first allocates a handle in the current scope |
838 * which will be later filled with the escape value. | 841 * which will be later filled with the escape value. |
839 */ | 842 */ |
840 class V8_EXPORT EscapableHandleScope : public HandleScope { | 843 class V8_EXPORT EscapableHandleScope : public HandleScope { |
841 public: | 844 public: |
842 EscapableHandleScope(Isolate* isolate); | 845 EscapableHandleScope(Isolate* isolate); |
(...skipping 4719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5562 }; | 5565 }; |
5563 | 5566 |
5564 } // namespace internal | 5567 } // namespace internal |
5565 | 5568 |
5566 | 5569 |
5567 template <class T> | 5570 template <class T> |
5568 Local<T>::Local() : Handle<T>() { } | 5571 Local<T>::Local() : Handle<T>() { } |
5569 | 5572 |
5570 | 5573 |
5571 template <class T> | 5574 template <class T> |
5572 Local<T> Local<T>::New(Handle<T> that) { | |
5573 if (that.IsEmpty()) return Local<T>(); | |
5574 T* that_ptr = *that; | |
5575 internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); | |
5576 if (internal::Internals::CanCastToHeapObject(that_ptr)) { | |
5577 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( | |
5578 reinterpret_cast<internal::HeapObject*>(*p)))); | |
5579 } | |
5580 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(*p))); | |
5581 } | |
5582 | |
5583 | |
5584 template <class T> | |
5585 Local<T> Local<T>::New(Isolate* isolate, Handle<T> that) { | 5575 Local<T> Local<T>::New(Isolate* isolate, Handle<T> that) { |
5586 return New(isolate, that.val_); | 5576 return New(isolate, that.val_); |
5587 } | 5577 } |
5588 | 5578 |
5589 template <class T> | 5579 template <class T> |
5590 template <class M> | 5580 template <class M> |
5591 Local<T> Local<T>::New(Isolate* isolate, const Persistent<T, M>& that) { | 5581 Local<T> Local<T>::New(Isolate* isolate, const Persistent<T, M>& that) { |
5592 return New(isolate, that.val_); | 5582 return New(isolate, that.val_); |
5593 } | 5583 } |
5594 | 5584 |
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6010 | 6000 |
6011 | 6001 |
6012 void Template::Set(const char* name, v8::Handle<Data> value) { | 6002 void Template::Set(const char* name, v8::Handle<Data> value) { |
6013 Set(v8::String::New(name), value); | 6003 Set(v8::String::New(name), value); |
6014 } | 6004 } |
6015 | 6005 |
6016 | 6006 |
6017 Local<Value> Object::GetInternalField(int index) { | 6007 Local<Value> Object::GetInternalField(int index) { |
6018 #ifndef V8_ENABLE_CHECKS | 6008 #ifndef V8_ENABLE_CHECKS |
6019 typedef internal::Object O; | 6009 typedef internal::Object O; |
| 6010 typedef internal::HeapObject HO; |
6020 typedef internal::Internals I; | 6011 typedef internal::Internals I; |
6021 O* obj = *reinterpret_cast<O**>(this); | 6012 O* obj = *reinterpret_cast<O**>(this); |
6022 // Fast path: If the object is a plain JSObject, which is the common case, we | 6013 // Fast path: If the object is a plain JSObject, which is the common case, we |
6023 // know where to find the internal fields and can return the value directly. | 6014 // know where to find the internal fields and can return the value directly. |
6024 if (I::GetInstanceType(obj) == I::kJSObjectType) { | 6015 if (I::GetInstanceType(obj) == I::kJSObjectType) { |
6025 int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); | 6016 int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); |
6026 O* value = I::ReadField<O*>(obj, offset); | 6017 O* value = I::ReadField<O*>(obj, offset); |
6027 O** result = HandleScope::CreateHandle(value); | 6018 O** result = HandleScope::CreateHandle(reinterpret_cast<HO*>(obj), value); |
6028 return Local<Value>(reinterpret_cast<Value*>(result)); | 6019 return Local<Value>(reinterpret_cast<Value*>(result)); |
6029 } | 6020 } |
6030 #endif | 6021 #endif |
6031 return SlowGetInternalField(index); | 6022 return SlowGetInternalField(index); |
6032 } | 6023 } |
6033 | 6024 |
6034 | 6025 |
6035 void* Object::GetAlignedPointerFromInternalField(int index) { | 6026 void* Object::GetAlignedPointerFromInternalField(int index) { |
6036 #ifndef V8_ENABLE_CHECKS | 6027 #ifndef V8_ENABLE_CHECKS |
6037 typedef internal::Object O; | 6028 typedef internal::Object O; |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6469 | 6460 |
6470 void* Isolate::GetData() { | 6461 void* Isolate::GetData() { |
6471 typedef internal::Internals I; | 6462 typedef internal::Internals I; |
6472 return I::GetEmbedderData(this); | 6463 return I::GetEmbedderData(this); |
6473 } | 6464 } |
6474 | 6465 |
6475 | 6466 |
6476 Local<Value> Context::GetEmbedderData(int index) { | 6467 Local<Value> Context::GetEmbedderData(int index) { |
6477 #ifndef V8_ENABLE_CHECKS | 6468 #ifndef V8_ENABLE_CHECKS |
6478 typedef internal::Object O; | 6469 typedef internal::Object O; |
| 6470 typedef internal::HeapObject HO; |
6479 typedef internal::Internals I; | 6471 typedef internal::Internals I; |
6480 O** result = HandleScope::CreateHandle(I::ReadEmbedderData<O*>(this, index)); | 6472 HO* context = *reinterpret_cast<HO**>(this); |
| 6473 O** result = |
| 6474 HandleScope::CreateHandle(context, I::ReadEmbedderData<O*>(this, index)); |
6481 return Local<Value>(reinterpret_cast<Value*>(result)); | 6475 return Local<Value>(reinterpret_cast<Value*>(result)); |
6482 #else | 6476 #else |
6483 return SlowGetEmbedderData(index); | 6477 return SlowGetEmbedderData(index); |
6484 #endif | 6478 #endif |
6485 } | 6479 } |
6486 | 6480 |
6487 | 6481 |
6488 void* Context::GetAlignedPointerFromEmbedderData(int index) { | 6482 void* Context::GetAlignedPointerFromEmbedderData(int index) { |
6489 #ifndef V8_ENABLE_CHECKS | 6483 #ifndef V8_ENABLE_CHECKS |
6490 typedef internal::Internals I; | 6484 typedef internal::Internals I; |
(...skipping 16 matching lines...) Expand all Loading... |
6507 */ | 6501 */ |
6508 | 6502 |
6509 | 6503 |
6510 } // namespace v8 | 6504 } // namespace v8 |
6511 | 6505 |
6512 | 6506 |
6513 #undef TYPE_CHECK | 6507 #undef TYPE_CHECK |
6514 | 6508 |
6515 | 6509 |
6516 #endif // V8_H_ | 6510 #endif // V8_H_ |
OLD | NEW |