1
- /*!{id:msgpack.js,ver:1.03 ,license:"MIT",author:"uupaa.js@gmail .com"}*/
1
+ /*!{id:msgpack.js,ver:1.04 ,license:"MIT",author:"uupaa.js@gmail .com"}*/
2
2
3
3
// === msgpack ===
4
4
// MessagePack -> http://msgpack.sourceforge.net/
5
5
6
6
this . msgpack || ( function ( globalScope ) {
7
7
8
8
globalScope . msgpack = {
9
- pack : msgpackpack , // msgpack.pack(data:Mix, toString:Boolean = false):ByteArray/ByteString
9
+ pack : msgpackpack , // msgpack.pack(data:Mix, toString:Boolean = false):ByteArray/ByteString/false
10
10
// [1][mix to String] msgpack.pack({}, true) -> "..."
11
11
// [2][mix to ByteArray] msgpack.pack({}) -> [...]
12
12
unpack : msgpackunpack , // msgpack.unpack(data:BinaryString/ByteArray):Mix
@@ -25,8 +25,10 @@ var _ie = /MSIE/.test(navigator.userAgent),
25
25
_sign = { 8 : 0x80 , 16 : 0x8000 , 32 : 0x80000000 } ,
26
26
_buf = [ ] , // decode buffer
27
27
_idx = 0 , // decode buffer[index]
28
+ _error = 0 , // msgpack.pack() error code. 1 = CYCLIC_REFERENCE_ERROR
28
29
_ary = [ ] , // pooled array
29
- _toString = Object . prototype . toString ;
30
+ _toString = Object . prototype . toString ,
31
+ _MAX_DEPTH = 512 ;
30
32
31
33
// for WebWorkers Code Block
32
34
self . importScripts && ( onmessage = function ( event ) {
@@ -40,14 +42,18 @@ self.importScripts && (onmessage = function(event) {
40
42
// msgpack.pack
41
43
function msgpackpack ( data , // @param Mix:
42
44
toString ) { // @param Boolean(= false):
43
- // @return ByteArray/BinaryString:
45
+ // @return ByteArray/BinaryString/false:
46
+ // false is Error
44
47
// [1][mix to String] msgpack.pack({}, true) -> "..."
45
48
// [2][mix to ByteArray] msgpack.pack({}) -> [...]
46
49
47
- var byteArray = encode ( [ ] , data ) ;
50
+ _error = 0 ;
48
51
49
- return toString ? byteArrayToByteString ( byteArray )
50
- : byteArray ;
52
+ var byteArray = encode ( [ ] , data , 0 ) ;
53
+
54
+ return _error ? false
55
+ : toString ? byteArrayToByteString ( byteArray )
56
+ : byteArray ;
51
57
}
52
58
53
59
// msgpack.unpack
@@ -62,10 +68,11 @@ function msgpackunpack(data) { // @param BinaryString/ByteArray:
62
68
}
63
69
64
70
// inner - encoder
65
- function encode ( rv , // @param ByteArray: result
66
- mix ) { // @param Mix: source data
67
- var size = 0 , i = 0 , iz , c , pos ,
68
- high , low , i64 = 0 , sign , exp , frac ;
71
+ function encode ( rv , // @param ByteArray: result
72
+ mix , // @param Mix: source data
73
+ depth ) { // @param Number: depth
74
+ var size = 0 , i = 0 , iz = 0 , c = 0 , pos = 0 ,
75
+ high = 0 , low = 0 , i64 = 0 , sign = false , exp = 0 , frac = 0 ;
69
76
70
77
if ( mix == null ) { // null or undefined
71
78
rv . push ( 0xc0 ) ;
@@ -148,7 +155,7 @@ function encode(rv, // @param ByteArray: result
148
155
// 1 4 09 6
149
156
low = frac & 0xffffffff ;
150
157
high = ( ( frac / 0x100000000 ) & 0xfffff ) | ( exp << 20 ) ;
151
- sign && ( high + = 0x80000000 ) ;
158
+ sign && ( high | = 0x80000000 ) ;
152
159
153
160
rv . push ( 0xcb , ( high >> 24 ) & 0xff , ( high >> 16 ) & 0xff ,
154
161
( high >> 8 ) & 0xff , high & 0xff ,
@@ -192,11 +199,15 @@ function encode(rv, // @param ByteArray: result
192
199
}
193
200
break ;
194
201
default : // array or hash
202
+ if ( depth >= _MAX_DEPTH ) {
203
+ _error = 1 ; // CYCLIC_REFERENCE_ERROR
204
+ return rv = [ ] ;
205
+ }
195
206
if ( _toString . call ( mix ) === "[object Array]" ) { // array
196
207
size = mix . length ;
197
208
setType ( rv , 16 , size , [ 0x90 , 0xdc , 0xdd ] ) ;
198
209
for ( ; i < size ; ++ i ) {
199
- encode ( rv , mix [ i ] ) ;
210
+ encode ( rv , mix [ i ] , depth + 1 ) ;
200
211
}
201
212
} else { // hash
202
213
// http://d.hatena.ne.jp/uupaa/20101129
@@ -208,8 +219,8 @@ function encode(rv, // @param ByteArray: result
208
219
209
220
for ( i in mix ) {
210
221
++ size ;
211
- encode ( rv , i ) ;
212
- encode ( rv , mix [ i ] ) ;
222
+ encode ( rv , i , depth + 1 ) ;
223
+ encode ( rv , mix [ i ] , depth + 1 ) ;
213
224
}
214
225
215
226
// rewrite hash type.
@@ -229,7 +240,8 @@ function encode(rv, // @param ByteArray: result
229
240
230
241
// inner - decoder
231
242
function decode ( ) { // @return Mix:
232
- var ary , hash , num = 0 , i = 0 , iz , msb = 0 , c , sign , exp , frac , key ,
243
+ var ary , hash , num = 0 , i = 0 , iz = 0 , msb = 0 , c = 0 , sign = 0 ,
244
+ exp = 0 , frac = 0 , key ,
233
245
buf = _buf , type = buf [ ++ _idx ] ;
234
246
235
247
if ( type >= 0xe0 ) { // Negative FixNum (111x xxxx) (-32 ~ -1)
0 commit comments