Skip to content

Commit e1d02b9

Browse files
author
余化
committed
decode long with type
1 parent eae6bd1 commit e1d02b9

File tree

3 files changed

+41
-17
lines changed

3 files changed

+41
-17
lines changed

lib/v2/decoder.js

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -170,35 +170,34 @@ utils.addByteCodes(BYTE_CODES, [
170170
* @return {Number}
171171
* @api public
172172
*/
173-
proto.readLong = function () {
173+
proto.readLong = function (withType) {
174174
var code = this.byteBuffer.get();
175+
var val;
175176
// Compact long
176177
if (code >= 0xd8 && code <= 0xef) {
177178
// Longs between -8 and 15 are represented by a single octet in the range xd8 to xef.
178179
// value = (code - 0xe0)
179-
return code - 0xe0;
180-
}
181-
if (code >= 0xf0 && code <= 0xff) {
180+
val = code - 0xe0;
181+
} else if (code >= 0xf0 && code <= 0xff) {
182182
// Longs between -2048 and 2047 are encoded in two octets with the leading byte in the range xf0 to xff.
183183
// value = ((code - 0xf8) << 8) + b0
184-
return ((code - 0xf8) << 8) + this.byteBuffer.get();
185-
}
186-
if (code >= 0x38 && code <= 0x3f) {
184+
val = ((code - 0xf8) << 8) + this.byteBuffer.get();
185+
} else if (code >= 0x38 && code <= 0x3f) {
187186
// Longs between -262144 and 262143 are encoded in three octets with the leading byte in the range x38 to x3f.
188187
// value = ((code - 0x3c) << 16) + (b1 << 8) + b0
189188
var b1 = this.byteBuffer.get();
190189
var b0 = this.byteBuffer.get();
191-
return ((code - 0x3c) << 16) + (b1 << 8) + b0;
192-
}
193-
if (code === 0x59) {
190+
val = ((code - 0x3c) << 16) + (b1 << 8) + b0;
191+
} else if (code === 0x59) {
194192
// 32-bit integer cast to long
195-
return this.byteBuffer.getInt32();
196-
}
197-
if (code === 0x4c) {
198-
return utils.handleLong(this.byteBuffer.getLong());
193+
val = this.byteBuffer.getInt32();
194+
} else if (code === 0x4c) {
195+
val = utils.handleLong(this.byteBuffer.getLong());
196+
} else {
197+
this.throwError('readLong', code);
199198
}
200199

201-
this.throwError('readLong', code);
200+
return this.handleType('long', val, withType)
202201
};
203202

204203
utils.addByteCodes(BYTE_CODES, [

test/long.test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,45 +353,64 @@ describe('long.test.js', function () {
353353
it('should write and read equal java impl', function () {
354354
hessian.encode(java.long(0), '2.0').should.eql(utils.bytes('v2/long/0'));
355355
hessian.decode(utils.bytes('v2/long/0'), '2.0').should.equal(0);
356+
hessian.decode(utils.bytes('v2/long/0'), '2.0', true).should.eql({ $: 0, $class: 'long' });
356357
hessian.encode(java.long(-8), '2.0').should.eql(utils.bytes('v2/long/-8'));
357358
hessian.decode(utils.bytes('v2/long/-8'), '2.0').should.equal(-8);
359+
hessian.decode(utils.bytes('v2/long/-8'), '2.0', true).should.eql({ $: -8, $class: 'long' });
358360
hessian.encode(java.long(-7), '2.0').should.eql(utils.bytes('v2/long/-7'));
359361
hessian.decode(utils.bytes('v2/long/-7'), '2.0').should.equal(-7);
362+
hessian.decode(utils.bytes('v2/long/-7'), '2.0', true).should.eql({ $: -7, $class: 'long' });
360363
hessian.encode(java.long(15), '2.0').should.eql(utils.bytes('v2/long/15'));
361364
hessian.decode(utils.bytes('v2/long/15'), '2.0').should.equal(15);
365+
hessian.decode(utils.bytes('v2/long/15'), '2.0', true).should.eql({ $: 15, $class: 'long' });
362366
hessian.encode(java.long(14), '2.0').should.eql(utils.bytes('v2/long/14'));
363367
hessian.decode(utils.bytes('v2/long/14'), '2.0').should.equal(14);
368+
hessian.decode(utils.bytes('v2/long/14'), '2.0', true).should.eql({ $: 14, $class: 'long' });
364369
hessian.encode(java.long(-9), '2.0').should.eql(utils.bytes('v2/long/-9'));
365370
hessian.decode(utils.bytes('v2/long/-9'), '2.0').should.equal(-9);
371+
hessian.decode(utils.bytes('v2/long/-9'), '2.0', true).should.eql({ $: -9, $class: 'long' });
366372
hessian.encode(java.long(16), '2.0').should.eql(utils.bytes('v2/long/16'));
367373
hessian.decode(utils.bytes('v2/long/16'), '2.0').should.equal(16);
374+
hessian.decode(utils.bytes('v2/long/16'), '2.0', true).should.eql({ $: 16, $class: 'long' });
368375
hessian.encode(java.long(255), '2.0').should.eql(utils.bytes('v2/long/255'));
369376
hessian.encode(java.long(Long.fromNumber(255)), '2.0').should.eql(utils.bytes('v2/long/255'));
370377
hessian.encode(Long.fromNumber(255), '2.0').should.eql(utils.bytes('v2/long/255'));
371378

372379
hessian.decode(utils.bytes('v2/long/255'), '2.0').should.equal(255);
380+
hessian.decode(utils.bytes('v2/long/255'), '2.0', true).should.eql({ $: 255, $class: 'long' });
373381
hessian.encode(java.long(-2048), '2.0').should.eql(utils.bytes('v2/long/-2048'));
374382
hessian.decode(utils.bytes('v2/long/-2048'), '2.0').should.equal(-2048);
383+
hessian.decode(utils.bytes('v2/long/-2048'), '2.0', true).should.eql({ $: -2048, $class: 'long' });
375384
hessian.encode(java.long(2047), '2.0').should.eql(utils.bytes('v2/long/2047'));
376385
hessian.decode(utils.bytes('v2/long/2047'), '2.0').should.equal(2047);
386+
hessian.decode(utils.bytes('v2/long/2047'), '2.0', true).should.eql({ $: 2047, $class: 'long' });
377387
hessian.encode(java.long(262143), '2.0').should.eql(utils.bytes('v2/long/262143'));
378388
hessian.decode(utils.bytes('v2/long/262143'), '2.0').should.equal(262143);
389+
hessian.decode(utils.bytes('v2/long/262143'), '2.0', true).should.eql({ $: 262143, $class: 'long' });
379390
hessian.encode(java.long(-262144), '2.0').should.eql(utils.bytes('v2/long/-262144'));
380391
hessian.decode(utils.bytes('v2/long/-262144'), '2.0').should.equal(-262144);
392+
hessian.decode(utils.bytes('v2/long/-262144'), '2.0', true).should.eql({ $: -262144, $class: 'long' });
381393
hessian.encode(java.long(2048), '2.0').should.eql(utils.bytes('v2/long/2048'));
382394
hessian.decode(utils.bytes('v2/long/2048'), '2.0').should.equal(2048);
395+
hessian.decode(utils.bytes('v2/long/2048'), '2.0', true).should.eql({ $: 2048, $class: 'long' });
383396
hessian.encode(java.long(-2049), '2.0').should.eql(utils.bytes('v2/long/-2049'));
384397
hessian.decode(utils.bytes('v2/long/-2049'), '2.0').should.equal(-2049);
398+
hessian.decode(utils.bytes('v2/long/-2049'), '2.0', true).should.eql({ $: -2049, $class: 'long' });
385399
hessian.encode(java.long(-2147483648), '2.0').should.eql(utils.bytes('v2/long/-2147483648'));
386400
hessian.decode(utils.bytes('v2/long/-2147483648'), '2.0').should.equal(-2147483648);
401+
hessian.decode(utils.bytes('v2/long/-2147483648'), '2.0', true).should.eql({ $: -2147483648, $class: 'long' });
387402
hessian.encode(java.long(-2147483647), '2.0').should.eql(utils.bytes('v2/long/-2147483647'));
388403
hessian.decode(utils.bytes('v2/long/-2147483647'), '2.0').should.equal(-2147483647);
404+
hessian.decode(utils.bytes('v2/long/-2147483647'), '2.0', true).should.eql({ $: -2147483647, $class: 'long' });
389405
hessian.encode(java.long(2147483647), '2.0').should.eql(utils.bytes('v2/long/2147483647'));
390406
hessian.decode(utils.bytes('v2/long/2147483647'), '2.0').should.equal(2147483647);
407+
hessian.decode(utils.bytes('v2/long/2147483647'), '2.0', true).should.eql({ $: 2147483647, $class: 'long' });
391408
hessian.encode(java.long(2147483646), '2.0').should.eql(utils.bytes('v2/long/2147483646'));
392409
hessian.decode(utils.bytes('v2/long/2147483646'), '2.0').should.equal(2147483646);
410+
hessian.decode(utils.bytes('v2/long/2147483646'), '2.0', true).should.eql({ $: 2147483646, $class: 'long' });
393411
hessian.encode(java.long(2147483648), '2.0').should.eql(utils.bytes('v2/long/2147483648'));
394412
hessian.decode(utils.bytes('v2/long/2147483648'), '2.0').should.equal(2147483648);
413+
hessian.decode(utils.bytes('v2/long/2147483648'), '2.0', true).should.eql({ $: 2147483648, $class: 'long' });
395414
});
396415

397416
it('should read 1.0 bin as well', function () {

test/object.test.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,10 @@ describe('object.test.js', function () {
813813
a0.should.eql({
814814
$class: 'java.util.concurrent.atomic.AtomicLong',
815815
$: {
816-
value: 0
816+
value: {
817+
$class: 'long',
818+
$: 0
819+
}
817820
}
818821
});
819822
hessian.encode({
@@ -833,7 +836,10 @@ describe('object.test.js', function () {
833836
a1.should.eql({
834837
$class: 'java.util.concurrent.atomic.AtomicLong',
835838
$: {
836-
value: 1
839+
value: {
840+
$class: 'long',
841+
$: 1
842+
}
837843
}
838844
});
839845
hessian.encode({

0 commit comments

Comments
 (0)