| #ifndef SRC_UTIL_INL_H_ |
| #define SRC_UTIL_INL_H_ |
| |
| #include "util.h" |
| |
| namespace node { |
| |
| template <typename Inner, typename Outer> |
| ContainerOfHelper<Inner, Outer>::ContainerOfHelper(Inner Outer::*field, |
| Inner* pointer) |
| : pointer_(reinterpret_cast<Outer*>( |
| reinterpret_cast<uintptr_t>(pointer) - |
| reinterpret_cast<uintptr_t>(&(static_cast<Outer*>(0)->*field)))) { |
| } |
| |
| template <typename Inner, typename Outer> |
| template <typename TypeName> |
| ContainerOfHelper<Inner, Outer>::operator TypeName*() const { |
| return static_cast<TypeName*>(pointer_); |
| } |
| |
| template <typename Inner, typename Outer> |
| inline ContainerOfHelper<Inner, Outer> ContainerOf(Inner Outer::*field, |
| Inner* pointer) { |
| return ContainerOfHelper<Inner, Outer>(field, pointer); |
| } |
| |
| template <class TypeName> |
| inline v8::Local<TypeName> PersistentToLocal( |
| v8::Isolate* isolate, |
| const v8::Persistent<TypeName>& persistent) { |
| if (persistent.IsWeak()) { |
| return WeakPersistentToLocal(isolate, persistent); |
| } else { |
| return StrongPersistentToLocal(persistent); |
| } |
| } |
| |
| template <class TypeName> |
| inline v8::Local<TypeName> StrongPersistentToLocal( |
| const v8::Persistent<TypeName>& persistent) { |
| return *reinterpret_cast<v8::Local<TypeName>*>( |
| const_cast<v8::Persistent<TypeName>*>(&persistent)); |
| } |
| |
| template <class TypeName> |
| inline v8::Local<TypeName> WeakPersistentToLocal( |
| v8::Isolate* isolate, |
| const v8::Persistent<TypeName>& persistent) { |
| return v8::Local<TypeName>::New(isolate, persistent); |
| } |
| |
| inline v8::Local<v8::String> OneByteString(v8::Isolate* isolate, |
| const char* data, |
| int length) { |
| return v8::String::NewFromOneByte(isolate, |
| reinterpret_cast<const uint8_t*>(data), |
| v8::String::kNormalString, |
| length); |
| } |
| |
| inline v8::Local<v8::String> OneByteString(v8::Isolate* isolate, |
| const signed char* data, |
| int length) { |
| return v8::String::NewFromOneByte(isolate, |
| reinterpret_cast<const uint8_t*>(data), |
| v8::String::kNormalString, |
| length); |
| } |
| |
| inline v8::Local<v8::String> OneByteString(v8::Isolate* isolate, |
| const unsigned char* data, |
| int length) { |
| return v8::String::NewFromOneByte(isolate, |
| reinterpret_cast<const uint8_t*>(data), |
| v8::String::kNormalString, |
| length); |
| } |
| |
| template <typename TypeName> |
| void Wrap(v8::Local<v8::Object> object, TypeName* pointer) { |
| CHECK_EQ(false, object.IsEmpty()); |
| CHECK_GT(object->InternalFieldCount(), 0); |
| object->SetAlignedPointerInInternalField(0, pointer); |
| } |
| |
| void ClearWrap(v8::Local<v8::Object> object) { |
| Wrap<void>(object, nullptr); |
| } |
| |
| template <typename TypeName> |
| TypeName* Unwrap(v8::Local<v8::Object> object) { |
| CHECK_EQ(false, object.IsEmpty()); |
| CHECK_GT(object->InternalFieldCount(), 0); |
| void* pointer = object->GetAlignedPointerFromInternalField(0); |
| return static_cast<TypeName*>(pointer); |
| } |
| |
| } // namespace node |
| |
| #endif // SRC_UTIL_INL_H_ |