|
17 | 17 | var debug = require('debug')('hessian:v2:encoder'); |
18 | 18 | var is = require('is-type-of'); |
19 | 19 | var util = require('util'); |
20 | | -var EncoderV1 = require('../v1/encoder'); |
21 | | -var javaObject = require('../object'); |
| 20 | +var Long = require('long'); |
22 | 21 | var utility = require('utility'); |
| 22 | +var javaObject = require('../object'); |
| 23 | +var EncoderV1 = require('../v1/encoder'); |
23 | 24 | var supportES6Map = require('../utils').supportES6Map; |
24 | 25 |
|
25 | 26 | function Encoder(options) { |
@@ -142,23 +143,35 @@ proto.writeInt = function (val) { |
142 | 143 | * ``` |
143 | 144 | */ |
144 | 145 | proto.writeLong = function (val) { |
145 | | - if (typeof val !== 'number' && utility.isSafeNumberString(val)) { |
146 | | - val = Number(val); |
| 146 | + if (typeof val === 'string') { |
| 147 | + if (!utility.isSafeNumberString(val)) { |
| 148 | + val = Long.fromString(val); |
| 149 | + } else { |
| 150 | + val = Number(val); |
| 151 | + } |
| 152 | + } else if (Long.isLong(val) && (val.high === 0 || val.high === -1)) { |
| 153 | + val = val.toNumber(); |
147 | 154 | } |
148 | 155 |
|
149 | | - if (val >= -8 && val <= 15) { |
150 | | - this.byteBuffer.put(val + 0xe0); |
151 | | - } else if (val >= -2048 && val <= 2047) { |
152 | | - var b0 = val & 0xff; |
153 | | - var code = (val >> 8) + 0xf8; |
154 | | - this.byteBuffer.put(code).put(b0); |
155 | | - } else if (val >= -262144 && val <= 262143) { |
156 | | - var b1b0 = val & 0xffff; |
157 | | - var code = (val >> 16) + 0x3c; |
158 | | - this.byteBuffer.put(code).putUInt16(b1b0); |
159 | | - } else if (val >= -0x80000000 && val <= 0x7fffffff) { |
160 | | - // 32-bit integer cast to long |
161 | | - this.byteBuffer.put(0x59).putInt32(val); |
| 156 | + if (typeof val === 'number') { |
| 157 | + if (val >= -8 && val <= 15) { |
| 158 | + this.byteBuffer.put(val + 0xe0); |
| 159 | + } else if (val >= -2048 && val <= 2047) { |
| 160 | + var b0 = val & 0xff; |
| 161 | + var code = (val >> 8) + 0xf8; |
| 162 | + this.byteBuffer.put(code).put(b0); |
| 163 | + } else if (val >= -262144 && val <= 262143) { |
| 164 | + var b1b0 = val & 0xffff; |
| 165 | + var code = (val >> 16) + 0x3c; |
| 166 | + this.byteBuffer.put(code).putUInt16(b1b0); |
| 167 | + } else if (val >= -0x80000000 && val <= 0x7fffffff) { |
| 168 | + // 32-bit integer cast to long |
| 169 | + this.byteBuffer.put(0x59).putInt32(val); |
| 170 | + } else { |
| 171 | + this.byteBuffer |
| 172 | + .put(0x4c) // 'L' |
| 173 | + .putLong(val); |
| 174 | + } |
162 | 175 | } else { |
163 | 176 | this.byteBuffer |
164 | 177 | .put(0x4c) // 'L' |
|
0 commit comments