diff --git a/binding.gyp b/binding.gyp index b22d3e3..64cf2ea 100644 --- a/binding.gyp +++ b/binding.gyp @@ -2,7 +2,8 @@ "targets": [ { "libraries": [ - "-lnetcdf" + "-lnetcdf", + "-lhdf5" ], "sources": [ "src/Group.cpp", diff --git a/src/Attribute.cpp b/src/Attribute.cpp index 815fab1..655f6d4 100644 --- a/src/Attribute.cpp +++ b/src/Attribute.cpp @@ -76,104 +76,96 @@ void Attribute::GetValue(v8::Local property, const v8::PropertyCallb switch (obj->type) { case NC_BYTE: { - int8_t* v = new int8_t[len]; - retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v); + std::unique_ptr v = v8::ArrayBuffer::NewBackingStore(isolate, len * sizeof(int8_t)); + retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v->Data()); if (len == 1) { - info.GetReturnValue().Set(v8::Integer::New(isolate, v[0])); + info.GetReturnValue().Set(v8::Integer::New(isolate, static_cast(v->Data())[0])); } else { - info.GetReturnValue().Set(v8::Int8Array::New(v8::ArrayBuffer::New(isolate, v, len * 1), 0, len)); + info.GetReturnValue().Set(v8::Int8Array::New(v8::ArrayBuffer::New(isolate, std::move(v)), 0, len)); } - delete[] v; } break; case NC_SHORT: { - int16_t* v = new int16_t[len]; - retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v); + std::unique_ptr v = v8::ArrayBuffer::NewBackingStore(isolate, len * sizeof(int16_t)); + retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v->Data()); if (len == 1) { - info.GetReturnValue().Set(v8::Integer::New(isolate, v[0])); + info.GetReturnValue().Set(v8::Integer::New(isolate, static_cast(v->Data())[0])); } else { - info.GetReturnValue().Set(v8::Int16Array::New(v8::ArrayBuffer::New(isolate, v, len * 2), 0, len)); + info.GetReturnValue().Set(v8::Int16Array::New(v8::ArrayBuffer::New(isolate, std::move(v)), 0, len)); } - delete[] v; } break; case NC_INT: { - int32_t* v = new int32_t[len]; - retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v); + std::unique_ptr v = v8::ArrayBuffer::NewBackingStore(isolate, len * sizeof(int32_t)); + retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v->Data()); if (len == 1) { - info.GetReturnValue().Set(v8::Integer::New(isolate, v[0])); + info.GetReturnValue().Set(v8::Integer::New(isolate, static_cast(v->Data())[0])); } else { - info.GetReturnValue().Set(v8::Int32Array::New(v8::ArrayBuffer::New(isolate, v, len * 4), 0, len)); + info.GetReturnValue().Set(v8::Int32Array::New(v8::ArrayBuffer::New(isolate, std::move(v)), 0, len)); } - delete[] v; } break; case NC_FLOAT: { - float* v = new float[len]; - retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v); + std::unique_ptr v = v8::ArrayBuffer::NewBackingStore(isolate, len * sizeof(float)); + retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v->Data()); if (len == 1) { - info.GetReturnValue().Set(v8::Number::New(isolate, v[0])); + info.GetReturnValue().Set(v8::Number::New(isolate, static_cast(v->Data())[0])); } else { - info.GetReturnValue().Set(v8::Float32Array::New(v8::ArrayBuffer::New(isolate, v, len * 4), 0, len)); + info.GetReturnValue().Set(v8::Float32Array::New(v8::ArrayBuffer::New(isolate, std::move(v)), 0, len)); } - delete[] v; } break; case NC_DOUBLE: { - double* v = new double[len]; - retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v); + std::unique_ptr v = v8::ArrayBuffer::NewBackingStore(isolate, len * sizeof(double)); + retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v->Data()); if (len == 1) { - info.GetReturnValue().Set(v8::Number::New(isolate, v[0])); + info.GetReturnValue().Set(v8::Number::New(isolate, static_cast(v->Data())[0])); } else { - info.GetReturnValue().Set(v8::Float64Array::New(v8::ArrayBuffer::New(isolate, v, len * 8), 0, len)); + info.GetReturnValue().Set(v8::Float64Array::New(v8::ArrayBuffer::New(isolate, std::move(v)), 0, len)); } - delete[] v; } break; case NC_UBYTE: { - uint8_t* v = new uint8_t[len]; - retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v); + std::unique_ptr v = v8::ArrayBuffer::NewBackingStore(isolate, len * sizeof(uint8_t)); + retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v->Data()); if (len == 1) { - info.GetReturnValue().Set(v8::Integer::New(isolate, v[0])); + info.GetReturnValue().Set(v8::Integer::New(isolate, static_cast(v->Data())[0])); } else { - info.GetReturnValue().Set(v8::Uint8Array::New(v8::ArrayBuffer::New(isolate, v, len * 1), 0, len)); + info.GetReturnValue().Set(v8::Uint8Array::New(v8::ArrayBuffer::New(isolate, std::move(v)), 0, len)); } - delete[] v; } break; case NC_USHORT: { - uint16_t* v = new uint16_t[len]; - retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v); + std::unique_ptr v = v8::ArrayBuffer::NewBackingStore(isolate, len * sizeof(uint16_t)); + retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v->Data()); if (len == 1) { - info.GetReturnValue().Set(v8::Integer::New(isolate, v[0])); + info.GetReturnValue().Set(v8::Integer::New(isolate, static_cast(v->Data())[0])); } else { - info.GetReturnValue().Set(v8::Uint16Array::New(v8::ArrayBuffer::New(isolate, v, len * 2), 0, len)); + info.GetReturnValue().Set(v8::Uint16Array::New(v8::ArrayBuffer::New(isolate, std::move(v)), 0, len)); } - delete[] v; } break; case NC_UINT: { - uint32_t* v = new uint32_t[len]; - retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v); + std::unique_ptr v = v8::ArrayBuffer::NewBackingStore(isolate, len * sizeof(uint32_t)); + retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v->Data()); if (len == 1) { - info.GetReturnValue().Set(v8::Integer::NewFromUnsigned(isolate, v[0])); + info.GetReturnValue().Set(v8::Integer::NewFromUnsigned(isolate, static_cast(v->Data())[0])); } else { - info.GetReturnValue().Set(v8::Uint32Array::New(v8::ArrayBuffer::New(isolate, v, len * 4), 0, len)); + info.GetReturnValue().Set(v8::Uint32Array::New(v8::ArrayBuffer::New(isolate, std::move(v)), 0, len)); } - delete[] v; } break; case NC_INT64: { - int64_t* v = new int64_t[len]; - retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v); + std::unique_ptr v = v8::ArrayBuffer::NewBackingStore(isolate, len * sizeof(int64_t)); + retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v->Data()); if (len == 1) { - info.GetReturnValue().Set(v8::Integer::New(isolate, static_cast(v[0]))); + info.GetReturnValue().Set(v8::Integer::New(isolate, static_cast(v->Data())[0])); } else { - info.GetReturnValue().Set(v8::Int32Array::New(v8::ArrayBuffer::New(isolate, v, len * 8), 0, len)); + // TODO: Should return BigInt64Array + info.GetReturnValue().Set(v8::Int32Array::New(v8::ArrayBuffer::New(isolate, std::move(v)), 0, len)); } - delete[] v; } break; case NC_UINT64: { - uint64_t* v = new uint64_t[len]; - retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v); + std::unique_ptr v = v8::ArrayBuffer::NewBackingStore(isolate, len * sizeof(uint64_t)); + retval = nc_get_att(obj->parent_id, obj->var_id, obj->name.c_str(), v->Data()); if (len == 1) { - info.GetReturnValue().Set(v8::Integer::NewFromUnsigned(isolate, static_cast(v[0]))); + info.GetReturnValue().Set(v8::Integer::NewFromUnsigned(isolate, static_cast(v->Data())[0])); } else { - info.GetReturnValue().Set(v8::Uint32Array::New(v8::ArrayBuffer::New(isolate, v, len * 8), 0, len)); + // TODO: Should return BigInt64Array + info.GetReturnValue().Set(v8::Uint32Array::New(v8::ArrayBuffer::New(isolate, std::move(v)), 0, len)); } - delete[] v; } break; case NC_CHAR: case NC_STRING: { diff --git a/src/Variable.cpp b/src/Variable.cpp index 206f362..5336ea1 100644 --- a/src/Variable.cpp +++ b/src/Variable.cpp @@ -213,7 +213,7 @@ void Variable::WriteSlice(const v8::FunctionCallbackInfo& args) { delete[] size; return; } - int retval = nc_put_vara(obj->parent_id, obj->id, pos, size, val->Buffer()->GetContents().Data()); + int retval = nc_put_vara(obj->parent_id, obj->id, pos, size, val->Buffer()->GetBackingStore()->Data()); if (retval != NC_NOERR) { throw_netcdf_error(isolate, retval); } @@ -293,7 +293,7 @@ void Variable::WriteStridedSlice(const v8::FunctionCallbackInfo& args delete[] stride; return; } - int retval = nc_put_vars(obj->parent_id, obj->id, pos, size, stride, val->Buffer()->GetContents().Data()); + int retval = nc_put_vars(obj->parent_id, obj->id, pos, size, stride, val->Buffer()->GetBackingStore()->Data()); if (retval != NC_NOERR) { throw_netcdf_error(isolate, retval); } @@ -320,7 +320,7 @@ void Variable::Read(const v8::FunctionCallbackInfo& args) { size[i] = 1; } v8::Local result; - int retval; + int retval = NC_EVARMETA; switch (obj->type) { case NC_BYTE: { int8_t v; @@ -400,7 +400,7 @@ void Variable::ReadSlice(const v8::FunctionCallbackInfo& args) { total_size *= s; } v8::Local buffer = v8::ArrayBuffer::New(isolate, total_size * type_sizes[obj->type]); - int retval = nc_get_vara(obj->parent_id, obj->id, pos, size, buffer->GetContents().Data()); + int retval = nc_get_vara(obj->parent_id, obj->id, pos, size, buffer->GetBackingStore()->Data()); if (retval != NC_NOERR) { throw_netcdf_error(isolate, retval); delete[] pos; @@ -470,7 +470,7 @@ void Variable::ReadStridedSlice(const v8::FunctionCallbackInfo& args) stride[i] = static_cast(args[3 * i + 2]->IntegerValue(isolate->GetCurrentContext()).ToChecked()); } v8::Local buffer = v8::ArrayBuffer::New(isolate, total_size * type_sizes[obj->type]); - int retval = nc_get_vars(obj->parent_id, obj->id, pos, size, stride, buffer->GetContents().Data()); + int retval = nc_get_vars(obj->parent_id, obj->id, pos, size, stride, buffer->GetBackingStore()->Data()); if (retval != NC_NOERR) { throw_netcdf_error(isolate, retval); delete[] pos;