/********************************************************************* * NAN - Native Abstractions for Node.js * * Copyright (c) 2017 NAN contributors * * MIT License ********************************************************************/ #ifndef NAN_TYPEDARRAY_CONTENTS_H_ #define NAN_TYPEDARRAY_CONTENTS_H_ template class TypedArrayContents { public: inline explicit TypedArrayContents(v8::Local from) : length_(0), data_(NULL) { HandleScope scope; size_t length = 0; void* data = NULL; #if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) if (from->IsArrayBufferView()) { v8::Local array = v8::Local::Cast(from); const size_t byte_length = array->ByteLength(); const ptrdiff_t byte_offset = array->ByteOffset(); v8::Local buffer = array->Buffer(); length = byte_length / sizeof(T); data = static_cast(buffer->GetContents().Data()) + byte_offset; } #else if (from->IsObject() && !from->IsNull()) { v8::Local array = v8::Local::Cast(from); MaybeLocal buffer = Get(array, New("buffer").ToLocalChecked()); MaybeLocal byte_length = Get(array, New("byteLength").ToLocalChecked()); MaybeLocal byte_offset = Get(array, New("byteOffset").ToLocalChecked()); if (!buffer.IsEmpty() && !byte_length.IsEmpty() && byte_length.ToLocalChecked()->IsUint32() && !byte_offset.IsEmpty() && byte_offset.ToLocalChecked()->IsUint32()) { data = array->GetIndexedPropertiesExternalArrayData(); if(data) { length = byte_length.ToLocalChecked()->Uint32Value() / sizeof(T); } } } #endif #if defined(_MSC_VER) && _MSC_VER >= 1900 || __cplusplus >= 201103L assert(reinterpret_cast(data) % alignof (T) == 0); #elif defined(_MSC_VER) && _MSC_VER >= 1600 || defined(__GNUC__) assert(reinterpret_cast(data) % __alignof(T) == 0); #else assert(reinterpret_cast(data) % sizeof (T) == 0); #endif length_ = length; data_ = static_cast(data); } inline size_t length() const { return length_; } inline T* operator*() { return data_; } inline const T* operator*() const { return data_; } private: NAN_DISALLOW_ASSIGN_COPY_MOVE(TypedArrayContents) //Disable heap allocation void *operator new(size_t size); void operator delete(void *, size_t) { abort(); } size_t length_; T* data_; }; #endif // NAN_TYPEDARRAY_CONTENTS_H_