Browse Source

Fix Buffer.write() with UCS-2 should not be write partial char

closes #916.
v0.7.4-release
koichik 14 years ago
committed by Ryan Dahl
parent
commit
9533e879f0
  1. 6
      src/node_buffer.cc
  2. 9
      test/simple/test-buffer.js

6
src/node_buffer.cc

@ -495,7 +495,7 @@ Handle<Value> Buffer::Ucs2Write(const Arguments &args) {
size_t max_length = args[2]->IsUndefined() ? buffer->length_ - offset size_t max_length = args[2]->IsUndefined() ? buffer->length_ - offset
: args[2]->Uint32Value(); : 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); uint16_t* p = (uint16_t*)(buffer->data_ + offset);
@ -503,6 +503,10 @@ Handle<Value> Buffer::Ucs2Write(const Arguments &args) {
0, 0,
max_length, max_length,
String::HINT_MANY_WRITES_EXPECTED); String::HINT_MANY_WRITES_EXPECTED);
constructor_template->GetFunction()->Set(chars_written_sym,
Integer::New(written));
return scope.Close(Integer::New(written * 2)); return scope.Close(Integer::New(written * 2));
} }

9
test/simple/test-buffer.js

@ -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.deepEqual(f, new Buffer([63, 4, 64, 4, 56, 4, 50, 4, 53, 4, 66, 4]));
assert.equal(f.toString('ucs2'), 'привет'); 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 arrayIsh = {0: 0, 1: 1, 2: 2, 3: 3, length: 4};
var g = new Buffer(arrayIsh); var g = new Buffer(arrayIsh);

Loading…
Cancel
Save