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 1618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1629 /** Gets the number of internal fields for this Object. */ | 1629 /** Gets the number of internal fields for this Object. */ |
1630 int InternalFieldCount(); | 1630 int InternalFieldCount(); |
1631 | 1631 |
1632 /** Gets the value from an internal field. */ | 1632 /** Gets the value from an internal field. */ |
1633 V8_INLINE(Local<Value> GetInternalField(int index)); | 1633 V8_INLINE(Local<Value> GetInternalField(int index)); |
1634 | 1634 |
1635 /** Sets the value in an internal field. */ | 1635 /** Sets the value in an internal field. */ |
1636 void SetInternalField(int index, Handle<Value> value); | 1636 void SetInternalField(int index, Handle<Value> value); |
1637 | 1637 |
1638 /** | 1638 /** |
1639 * Gets a native pointer from an internal field. Deprecated. If the pointer is | |
1640 * always 2-byte-aligned, use GetAlignedPointerFromInternalField instead, | |
1641 * otherwise use a combination of GetInternalField, External::Cast and | |
1642 * External::Value. | |
1643 */ | |
1644 V8_DEPRECATED(void* GetPointerFromInternalField(int index)); | |
1645 | |
1646 /** | |
1647 * Sets a native pointer in an internal field. Deprecated. If the pointer is | |
1648 * always 2-byte aligned, use SetAlignedPointerInInternalField instead, | |
1649 * otherwise use a combination of External::New and SetInternalField. | |
1650 */ | |
1651 V8_DEPRECATED(V8_INLINE(void SetPointerInInternalField(int index, | |
1652 void* value))); | |
1653 | |
1654 /** | |
1655 * Gets a 2-byte-aligned native pointer from an internal field. This field | 1639 * Gets a 2-byte-aligned native pointer from an internal field. This field |
1656 * must have been set by SetAlignedPointerInInternalField, everything else | 1640 * must have been set by SetAlignedPointerInInternalField, everything else |
1657 * leads to undefined behavior. | 1641 * leads to undefined behavior. |
1658 */ | 1642 */ |
1659 V8_INLINE(void* GetAlignedPointerFromInternalField(int index)); | 1643 V8_INLINE(void* GetAlignedPointerFromInternalField(int index)); |
1660 | 1644 |
1661 /** | 1645 /** |
1662 * Sets a 2-byte-aligned native pointer in an internal field. To retrieve such | 1646 * Sets a 2-byte-aligned native pointer in an internal field. To retrieve such |
1663 * a field, GetAlignedPointerFromInternalField must be used, everything else | 1647 * a field, GetAlignedPointerFromInternalField must be used, everything else |
1664 * leads to undefined behavior. | 1648 * leads to undefined behavior. |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1998 static void CheckCast(v8::Value* obj); | 1982 static void CheckCast(v8::Value* obj); |
1999 }; | 1983 }; |
2000 | 1984 |
2001 | 1985 |
2002 /** | 1986 /** |
2003 * A JavaScript value that wraps a C++ void*. This type of value is mainly used | 1987 * A JavaScript value that wraps a C++ void*. This type of value is mainly used |
2004 * to associate C++ data structures with JavaScript objects. | 1988 * to associate C++ data structures with JavaScript objects. |
2005 */ | 1989 */ |
2006 class V8EXPORT External : public Value { | 1990 class V8EXPORT External : public Value { |
2007 public: | 1991 public: |
2008 /** Deprecated, use New instead. */ | |
2009 V8_DEPRECATED(V8_INLINE(static Local<Value> Wrap(void* value))); | |
2010 | |
2011 /** Deprecated, use a combination of Cast and Value instead. */ | |
2012 V8_DEPRECATED(V8_INLINE(static void* Unwrap(Handle<Value> obj))); | |
2013 | |
2014 static Local<External> New(void* value); | 1992 static Local<External> New(void* value); |
2015 V8_INLINE(static External* Cast(Value* obj)); | 1993 V8_INLINE(static External* Cast(Value* obj)); |
2016 void* Value() const; | 1994 void* Value() const; |
2017 private: | 1995 private: |
2018 static void CheckCast(v8::Value* obj); | 1996 static void CheckCast(v8::Value* obj); |
2019 }; | 1997 }; |
2020 | 1998 |
2021 | 1999 |
2022 // --- Templates --- | 2000 // --- Templates --- |
2023 | 2001 |
(...skipping 1788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3812 */ | 3790 */ |
3813 void Exit(); | 3791 void Exit(); |
3814 | 3792 |
3815 /** Returns true if the context has experienced an out of memory situation. */ | 3793 /** Returns true if the context has experienced an out of memory situation. */ |
3816 bool HasOutOfMemoryException(); | 3794 bool HasOutOfMemoryException(); |
3817 | 3795 |
3818 /** Returns true if V8 has a current context. */ | 3796 /** Returns true if V8 has a current context. */ |
3819 static bool InContext(); | 3797 static bool InContext(); |
3820 | 3798 |
3821 /** | 3799 /** |
3822 * Gets embedder data with index 0. Deprecated, use GetEmbedderData with index | |
3823 * 0 instead. | |
3824 */ | |
3825 V8_DEPRECATED(V8_INLINE(Local<Value> GetData())); | |
3826 | |
3827 /** | |
3828 * Sets embedder data with index 0. Deprecated, use SetEmbedderData with index | |
3829 * 0 instead. | |
3830 */ | |
3831 V8_DEPRECATED(V8_INLINE(void SetData(Handle<Value> value))); | |
3832 | |
3833 /** | |
3834 * Gets the embedder data with the given index, which must have been set by a | 3800 * Gets the embedder data with the given index, which must have been set by a |
3835 * previous call to SetEmbedderData with the same index. Note that index 0 | 3801 * previous call to SetEmbedderData with the same index. Note that index 0 |
3836 * currently has a special meaning for Chrome's debugger. | 3802 * currently has a special meaning for Chrome's debugger. |
3837 */ | 3803 */ |
3838 V8_INLINE(Local<Value> GetEmbedderData(int index)); | 3804 V8_INLINE(Local<Value> GetEmbedderData(int index)); |
3839 | 3805 |
3840 /** | 3806 /** |
3841 * Sets the embedder data with the given index, growing the data as | 3807 * Sets the embedder data with the given index, growing the data as |
3842 * needed. Note that index 0 currently has a special meaning for Chrome's | 3808 * needed. Note that index 0 currently has a special meaning for Chrome's |
3843 * debugger. | 3809 * debugger. |
(...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4517 int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); | 4483 int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); |
4518 O* value = I::ReadField<O*>(obj, offset); | 4484 O* value = I::ReadField<O*>(obj, offset); |
4519 O** result = HandleScope::CreateHandle(value); | 4485 O** result = HandleScope::CreateHandle(value); |
4520 return Local<Value>(reinterpret_cast<Value*>(result)); | 4486 return Local<Value>(reinterpret_cast<Value*>(result)); |
4521 } | 4487 } |
4522 #endif | 4488 #endif |
4523 return SlowGetInternalField(index); | 4489 return SlowGetInternalField(index); |
4524 } | 4490 } |
4525 | 4491 |
4526 | 4492 |
4527 void Object::SetPointerInInternalField(int index, void* value) { | |
4528 SetInternalField(index, External::New(value)); | |
4529 } | |
4530 | |
4531 | |
4532 void* Object::GetAlignedPointerFromInternalField(int index) { | 4493 void* Object::GetAlignedPointerFromInternalField(int index) { |
4533 #ifndef V8_ENABLE_CHECKS | 4494 #ifndef V8_ENABLE_CHECKS |
4534 typedef internal::Object O; | 4495 typedef internal::Object O; |
4535 typedef internal::Internals I; | 4496 typedef internal::Internals I; |
4536 O* obj = *reinterpret_cast<O**>(this); | 4497 O* obj = *reinterpret_cast<O**>(this); |
4537 // Fast path: If the object is a plain JSObject, which is the common case, we | 4498 // Fast path: If the object is a plain JSObject, which is the common case, we |
4538 // know where to find the internal fields and can return the value directly. | 4499 // know where to find the internal fields and can return the value directly. |
4539 if (I::GetInstanceType(obj) == I::kJSObjectType) { | 4500 if (I::GetInstanceType(obj) == I::kJSObjectType) { |
4540 int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); | 4501 int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index); |
4541 return I::ReadField<void*>(obj, offset); | 4502 return I::ReadField<void*>(obj, offset); |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4726 | 4687 |
4727 | 4688 |
4728 Function* Function::Cast(v8::Value* value) { | 4689 Function* Function::Cast(v8::Value* value) { |
4729 #ifdef V8_ENABLE_CHECKS | 4690 #ifdef V8_ENABLE_CHECKS |
4730 CheckCast(value); | 4691 CheckCast(value); |
4731 #endif | 4692 #endif |
4732 return static_cast<Function*>(value); | 4693 return static_cast<Function*>(value); |
4733 } | 4694 } |
4734 | 4695 |
4735 | 4696 |
4736 Local<Value> External::Wrap(void* value) { | |
4737 return External::New(value); | |
4738 } | |
4739 | |
4740 | |
4741 void* External::Unwrap(Handle<v8::Value> obj) { | |
4742 return External::Cast(*obj)->Value(); | |
4743 } | |
4744 | |
4745 | |
4746 External* External::Cast(v8::Value* value) { | 4697 External* External::Cast(v8::Value* value) { |
4747 #ifdef V8_ENABLE_CHECKS | 4698 #ifdef V8_ENABLE_CHECKS |
4748 CheckCast(value); | 4699 CheckCast(value); |
4749 #endif | 4700 #endif |
4750 return static_cast<External*>(value); | 4701 return static_cast<External*>(value); |
4751 } | 4702 } |
4752 | 4703 |
4753 | 4704 |
4754 Isolate* AccessorInfo::GetIsolate() const { | 4705 Isolate* AccessorInfo::GetIsolate() const { |
4755 return *reinterpret_cast<Isolate**>(&args_[-3]); | 4706 return *reinterpret_cast<Isolate**>(&args_[-3]); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4812 I::SetEmbedderData(this, data); | 4763 I::SetEmbedderData(this, data); |
4813 } | 4764 } |
4814 | 4765 |
4815 | 4766 |
4816 void* Isolate::GetData() { | 4767 void* Isolate::GetData() { |
4817 typedef internal::Internals I; | 4768 typedef internal::Internals I; |
4818 return I::GetEmbedderData(this); | 4769 return I::GetEmbedderData(this); |
4819 } | 4770 } |
4820 | 4771 |
4821 | 4772 |
4822 Local<Value> Context::GetData() { | |
4823 return GetEmbedderData(0); | |
4824 } | |
4825 | |
4826 void Context::SetData(Handle<Value> data) { | |
4827 SetEmbedderData(0, data); | |
4828 } | |
4829 | |
4830 | |
4831 Local<Value> Context::GetEmbedderData(int index) { | 4773 Local<Value> Context::GetEmbedderData(int index) { |
4832 #ifndef V8_ENABLE_CHECKS | 4774 #ifndef V8_ENABLE_CHECKS |
4833 typedef internal::Object O; | 4775 typedef internal::Object O; |
4834 typedef internal::Internals I; | 4776 typedef internal::Internals I; |
4835 O** result = HandleScope::CreateHandle(I::ReadEmbedderData<O*>(this, index)); | 4777 O** result = HandleScope::CreateHandle(I::ReadEmbedderData<O*>(this, index)); |
4836 return Local<Value>(reinterpret_cast<Value*>(result)); | 4778 return Local<Value>(reinterpret_cast<Value*>(result)); |
4837 #else | 4779 #else |
4838 return SlowGetEmbedderData(index); | 4780 return SlowGetEmbedderData(index); |
4839 #endif | 4781 #endif |
4840 } | 4782 } |
(...skipping 22 matching lines...) Expand all Loading... |
4863 | 4805 |
4864 | 4806 |
4865 } // namespace v8 | 4807 } // namespace v8 |
4866 | 4808 |
4867 | 4809 |
4868 #undef V8EXPORT | 4810 #undef V8EXPORT |
4869 #undef TYPE_CHECK | 4811 #undef TYPE_CHECK |
4870 | 4812 |
4871 | 4813 |
4872 #endif // V8_H_ | 4814 #endif // V8_H_ |
OLD | NEW |