I'd like to make use of the V8 Float32Array data structure. How can I initialise it?
I'd also be interested in direct memory access to the data. How could that be done?
I'd like to make use of the V8 Float32Array data structure. How can I initialise it?
I'd also be interested in direct memory access to the data. How could that be done?
Updated
The best way now is to use the helper Nan::TypedArrayContents
.
assert(args[i]->IsFloat32Array());
Local<Float32Array> myarr = args[i].As<Float32Array>();
Nan::TypedArrayContents<float> dest(myarr);
// Now use dest, e.g. (*dest)[0]
There's a good example of this in node-canvas.
Original Answer, which shows why the helper is useful
The v8 API is changing rapidly right now so this depends on your version of node/io.js. To access the data from the array provided as an argument, this should work for node 0.12 through io.js <3.0:
assert(args[i]->IsFloat32Array()); // These type-check methods are available.
Local<Float32Array> myarr = args[i].As<Float32Array>();
void* dataPtr = myarr->GetIndexedPropertiesExternalArrayData();
In io.js >=3.0 (v8 4.3) you should instead use ArrayBuffer::GetContents
. (I haven't used this yet and will update this when 3.0 is released.) Docs are here.
In node 0.10, TypedArrays were home-brewed. This was one way of doing it:
Local<Object> buffer = args[i]->Get(NanNew("buffer"))->ToObject();
void* dataPtr = buffer->GetPointerFromInternalField(0);
Constructing a typed array can be done with:
Float32Array::New(ArrayBuffer::New(Isolate::GetCurrent(), size * 4), 0, size);