buffer: add buf.toArrayBuffer() API
authorTrevor Norris <trev.norris@gmail.com>
Fri, 11 Oct 2013 18:44:56 +0000 (11:44 -0700)
committerTrevor Norris <trev.norris@gmail.com>
Fri, 11 Oct 2013 19:17:23 +0000 (12:17 -0700)
doc/api/buffer.markdown
src/node_buffer.cc
test/simple/test-buffer.js

index a753aaa..4951567 100644 (file)
@@ -671,6 +671,10 @@ buffer.
     var b = new Buffer(50);
     b.fill("h");
 
+### buf.toArrayBuffer()
+
+Creates a new `ArrayBuffer` with the copied memory of the buffer instance.
+
 ## buffer.INSPECT_MAX_BYTES
 
 * Number, Default: 50
index 61980cb..733684d 100644 (file)
@@ -59,6 +59,7 @@
 namespace node {
 namespace Buffer {
 
+using v8::ArrayBuffer;
 using v8::Context;
 using v8::Function;
 using v8::FunctionCallbackInfo;
@@ -550,6 +551,25 @@ void WriteDoubleBE(const FunctionCallbackInfo<Value>& args) {
 }
 
 
+void ToArrayBuffer(const FunctionCallbackInfo<Value>& args) {
+  HandleScope scope(node_isolate);
+
+  ARGS_THIS(args.This());
+  void* adata = malloc(obj_length);
+
+  if (adata == NULL) {
+    FatalError("node::Buffer::ToArrayBuffer("
+        "const FunctionCallbackInfo<v8::Value>&)",
+        "Out Of Memory");
+  }
+
+  memcpy(adata, obj_data, obj_length);
+
+  Local<ArrayBuffer> abuf = ArrayBuffer::New(adata, obj_length);
+  args.GetReturnValue().Set(abuf);
+}
+
+
 void ByteLength(const FunctionCallbackInfo<Value> &args) {
   HandleScope scope(node_isolate);
 
@@ -604,6 +624,8 @@ void SetupBufferJS(const FunctionCallbackInfo<Value>& args) {
   NODE_SET_METHOD(proto, "writeFloatBE", WriteFloatBE);
   NODE_SET_METHOD(proto, "writeFloatLE", WriteFloatLE);
 
+  NODE_SET_METHOD(proto, "toArrayBuffer", ToArrayBuffer);
+
   NODE_SET_METHOD(proto, "copy", Copy);
   NODE_SET_METHOD(proto, "fill", Fill);
 
index 45eb287..55a5ca7 100644 (file)
@@ -981,3 +981,15 @@ assert.throws(function() {
     assert.equal(c[i], i);
   }
 })();
+
+// Test Buffers to ArrayBuffers
+var b = new Buffer(5).fill('abcdf');
+var c = b.toArrayBuffer();
+assert.equal(c.byteLength, 5);
+assert.equal(Object.prototype.toString.call(c), '[object ArrayBuffer]');
+var d = new Uint8Array(c);
+for (var i = 0; i < 5; i++)
+  assert.equal(d[i], b[i]);
+b.fill('ghijk');
+for (var i = 0; i < 5; i++)
+  assert.notEqual(d[i], b[i]);