MCPcopy Index your code
hub / github.com/nodejs/node-addon-api / NewOrCopy

Method NewOrCopy

napi-inl.h:3201–7207  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3199template <typename T>
3200template <typename Finalizer, typename Hint>
3201inline 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
3235template <typename T>
3236inline 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
3244template <typename T>
3245inline 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
3254template <typename T>
3255inline Buffer<T>::Buffer() : Uint8Array() {}
3256
3257template <typename T>
3258inline Buffer<T>::Buffer(napi_env env, napi_value value)

Callers

nothing calls this directly

Calls 5

WrapperGCWithHintFunction · 0.85
BufferClass · 0.85
EnvMethod · 0.80
ValueMethod · 0.80
UnwrapToMethod · 0.80

Tested by

no test coverage detected