Fix Buffer.write() with UCS-2 should not be write partial char
authorkoichik <koichik@improvement.jp>
Wed, 13 Apr 2011 16:17:18 +0000 (01:17 +0900)
committerRyan Dahl <ry@tinyclouds.org>
Wed, 13 Apr 2011 16:55:49 +0000 (09:55 -0700)
closes #916.

src/node_buffer.cc
test/simple/test-buffer.js

index b46abe1..75bac2a 100644 (file)
@@ -495,7 +495,7 @@ Handle<Value> Buffer::Ucs2Write(const Arguments &args) {
 
   size_t max_length = args[2]->IsUndefined() ? buffer->length_ - offset
                                              : args[2]->Uint32Value();
-  max_length = MIN(buffer->length_ - offset, max_length);
+  max_length = MIN(buffer->length_ - offset, max_length) / 2;
 
   uint16_t* p = (uint16_t*)(buffer->data_ + offset);
 
@@ -503,6 +503,10 @@ Handle<Value> Buffer::Ucs2Write(const Arguments &args) {
                          0,
                          max_length,
                          String::HINT_MANY_WRITES_EXPECTED);
+
+  constructor_template->GetFunction()->Set(chars_written_sym,
+                                           Integer::New(written));
+
   return scope.Close(Integer::New(written * 2));
 }
 
index ac822b2..0edb642 100644 (file)
@@ -256,6 +256,15 @@ console.error('f.length: %d     (should be 12)', f.length);
 assert.deepEqual(f, new Buffer([63, 4, 64, 4, 56, 4, 50, 4, 53, 4, 66, 4]));
 assert.equal(f.toString('ucs2'), 'привет');
 
+var f = new Buffer([0, 0, 0, 0, 0]);
+assert.equal(f.length, 5);
+var size = f.write('あいうえお', 'ucs2');
+console.error('bytes written to buffer: %d     (should be 4)', size);
+console.error('chars written to buffer: %d     (should be 2)', Buffer._charsWritten);
+assert.equal(size, 4);
+assert.equal(Buffer._charsWritten, 2);
+assert.deepEqual(f, new Buffer([0x42, 0x30, 0x44, 0x30, 0x00]));
+
 
 var arrayIsh = {0: 0, 1: 1, 2: 2, 3: 3, length: 4};
 var g = new Buffer(arrayIsh);