| 3199 | template <typename T> |
| 3200 | template <typename Finalizer, typename Hint> |
| 3201 | inline Buffer<T> Buffer<T>::NewOrCopy(napi_env env, |
| 3202 | T* data, |
| 3203 | size_t length, |
| 3204 | Finalizer finalizeCallback, |
| 3205 | Hint* finalizeHint) { |
| 3206 | details::FinalizeData<T, Finalizer, Hint>* finalizeData = |
| 3207 | new details::FinalizeData<T, Finalizer, Hint>( |
| 3208 | {std::move(finalizeCallback), finalizeHint}); |
| 3209 | #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED |
| 3210 | napi_value value; |
| 3211 | napi_status status = napi_create_external_buffer( |
| 3212 | env, |
| 3213 | length * sizeof(T), |
| 3214 | data, |
| 3215 | details::FinalizeData<T, Finalizer, Hint>::WrapperWithHint, |
| 3216 | finalizeData, |
| 3217 | &value); |
| 3218 | if (status == details::napi_no_external_buffers_allowed) { |
| 3219 | #endif |
| 3220 | // If we can't create an external buffer, we'll just copy the data. |
| 3221 | Buffer<T> ret = Buffer<T>::Copy(env, data, length); |
| 3222 | details::FinalizeData<T, Finalizer, Hint>::WrapperGCWithHint( |
| 3223 | env, data, finalizeData); |
| 3224 | return ret; |
| 3225 | #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED |
| 3226 | } |
| 3227 | if (status != napi_ok) { |
| 3228 | delete finalizeData; |
| 3229 | NAPI_THROW_IF_FAILED(env, status, Buffer()); |
| 3230 | } |
| 3231 | return Buffer(env, value); |
| 3232 | #endif |
| 3233 | } |
| 3234 | |
| 3235 | template <typename T> |
| 3236 | inline Buffer<T> Buffer<T>::Copy(napi_env env, const T* data, size_t length) { |
| 3237 | napi_value value; |
| 3238 | napi_status status = |
| 3239 | napi_create_buffer_copy(env, length * sizeof(T), data, nullptr, &value); |
| 3240 | NAPI_THROW_IF_FAILED(env, status, Buffer<T>()); |
| 3241 | return Buffer<T>(env, value); |
| 3242 | } |
| 3243 | |
| 3244 | template <typename T> |
| 3245 | inline void Buffer<T>::CheckCast(napi_env env, napi_value value) { |
| 3246 | NAPI_CHECK(value != nullptr, "Buffer::CheckCast", "empty value"); |
| 3247 | |
| 3248 | bool result; |
| 3249 | napi_status status = napi_is_buffer(env, value, &result); |
| 3250 | NAPI_CHECK(status == napi_ok, "Buffer::CheckCast", "napi_is_buffer failed"); |
| 3251 | NAPI_CHECK(result, "Buffer::CheckCast", "value is not buffer"); |
| 3252 | } |
| 3253 | |
| 3254 | template <typename T> |
| 3255 | inline Buffer<T>::Buffer() : Uint8Array() {} |
| 3256 | |
| 3257 | template <typename T> |
| 3258 | inline Buffer<T>::Buffer(napi_env env, napi_value value) |
nothing calls this directly
no test coverage detected