divine 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +30 -0
- data/README.md +57 -0
- data/Rakefile +45 -18
- data/lib/divine.rb +3 -3
- data/lib/divine/code_generators/code_generator.rb +112 -14
- data/lib/divine/code_generators/java.rb +144 -80
- data/lib/divine/code_generators/javascript.rb +192 -104
- data/lib/divine/code_generators/ruby.rb +133 -60
- data/lib/divine/dsl.rb +70 -12
- data/lib/divine/version.rb +1 -1
- data/test/basic_complex_test/js_test/js_testBasic.js +1 -1
- data/test/basic_complex_test/js_test/js_testComplex.js +1 -1
- data/test/basic_complex_test/ruby_test/ruby_test.rb +10 -10
- data/test/binaryTree_test/js_test/js_test.js +1 -1
- data/test/binaryTree_test/ruby_test/ruby_test.rb +4 -4
- data/test/complex_test/js_test/js_test.js +3 -2
- data/test/ipv6_test/java_test/JavaTest.java +4 -6
- data/test/ipv6_test/js_test/js_test.js +1 -1
- data/test/signed_float_test/ruby_test/ruby_test.rb +36 -0
- data/test/signed_float_test/signed_float_test.rb +14 -0
- data/test/signed_int_test/java_test/JavaTest.java +83 -0
- data/test/signed_int_test/js_test/js_test.js +55 -0
- data/test/signed_int_test/ruby_test/ruby_test.rb +37 -0
- data/test/signed_int_test/signed_int_test.rb +15 -0
- data/test/unify_test/unify_test.rb +24 -13
- metadata +14 -38
- data/test/basic_complex_test/java_test/test_babel.java +0 -368
- data/test/basic_complex_test/js_test/test_babel.js +0 -523
- data/test/basic_complex_test/ruby_test/test_babel.rb +0 -368
- data/test/binaryTree_test/java_test/test_binaryTree.java +0 -301
- data/test/binaryTree_test/js_test/test_binaryTree.js +0 -447
- data/test/binaryTree_test/ruby_test/test_binaryTree.rb +0 -303
- data/test/complex_test/java_test/test_complex.java +0 -331
- data/test/complex_test/js_test/test_complex.js +0 -478
- data/test/complex_test/ruby_test/test_complex.rb +0 -330
- data/test/ipv6_test/java_test/junit.jar +0 -0
- data/test/ipv6_test/java_test/test_ipv6.java +0 -270
- data/test/ipv6_test/js_test/test_ipv6.js +0 -409
- data/test/ipv6_test/ruby_test/test_ipv6.rb +0 -267
- data/test/unify_test/java_test/test_unify.java +0 -171
- data/test/unify_test/js_test/js_test.js +0 -56
- data/test/unify_test/js_test/test_unify.js +0 -326
- data/test/unify_test/ruby_test/ruby_test.rb +0 -35
- data/test/unify_test/ruby_test/test_unify.rb +0 -187
@@ -4,96 +4,125 @@
|
|
4
4
|
# . They are 64-bit floating point values, the largest exact integral value is 2^53, or 9007199254740992 (-9007199254740992 to 9007199254740992)
|
5
5
|
|
6
6
|
|
7
|
-
require 'pp'
|
8
|
-
|
9
7
|
module Divine
|
10
8
|
$debug_javascript = false
|
11
9
|
|
12
10
|
class JavascriptHelperMethods < BabelHelperMethods
|
11
|
+
def get_header_comment
|
12
|
+
get_header_comment_text.map do |s|
|
13
|
+
"// #{s}"
|
14
|
+
end.join("\n")
|
15
|
+
end
|
16
|
+
|
13
17
|
def javascript_base_class_template_str
|
14
18
|
<<EOS
|
15
|
-
// ------------------------------------------------------------
|
16
|
-
function
|
19
|
+
// ------------------------------------------------------------ DivineDataReader
|
20
|
+
function DivineDataReader(data) {
|
17
21
|
this.data = data;
|
18
22
|
this.index = 0;
|
19
23
|
}
|
20
24
|
|
21
|
-
|
25
|
+
DivineDataReader.prototype.getbyte = function () {
|
22
26
|
return this.data[this.index++];
|
23
27
|
};
|
24
28
|
|
25
|
-
|
29
|
+
DivineDataReader.prototype.read = function (items) {
|
26
30
|
var from = this.index;
|
27
31
|
this.index += items
|
28
32
|
return this.data.subarray(from, this.index)
|
29
33
|
};
|
30
34
|
|
31
35
|
|
32
|
-
// ------------------------------------------------------------
|
33
|
-
function
|
36
|
+
// ------------------------------------------------------------ DivineDataWriter
|
37
|
+
function DivineDataWriter(data) {
|
34
38
|
this.data = data;
|
35
39
|
this.index = 0;
|
36
40
|
this.data = new Uint8Array(4096);
|
37
41
|
}
|
38
42
|
|
39
|
-
|
43
|
+
DivineDataWriter.prototype._realloc = function (size) {
|
40
44
|
size = size || 4096;
|
41
45
|
var old_data = this.data;
|
42
46
|
this.data = new Uint8Array(Math.max(size, 4096) + this.data.length);
|
43
47
|
this.data.set(old_data, 0);
|
44
48
|
};
|
45
49
|
|
46
|
-
|
50
|
+
DivineDataWriter.prototype.writeByte = function (a_byte) {
|
47
51
|
if (this.index + 1 >= this.data.length) this._realloc();
|
48
52
|
this.data[this.index++] = a_byte;
|
49
53
|
};
|
50
54
|
|
51
|
-
|
55
|
+
DivineDataWriter.prototype.write = function (bytes) {
|
52
56
|
if (this.index + bytes.length >= this.data.length) this._realloc(bytes.length);
|
53
57
|
this.data.set(bytes, this.index);
|
54
58
|
this.index += bytes.length;
|
55
59
|
};
|
56
60
|
|
57
|
-
|
61
|
+
DivineDataWriter.prototype.get_data = function () {
|
58
62
|
return this.data.subarray(0, this.index);
|
59
63
|
};
|
60
64
|
|
61
65
|
|
62
|
-
// ------------------------------------------------------------
|
63
|
-
function
|
66
|
+
// ------------------------------------------------------------ DivineHelper
|
67
|
+
function DivineHelper() {}
|
64
68
|
|
65
|
-
|
66
|
-
var out = new
|
69
|
+
DivineHelper.prototype.serialize = function () {
|
70
|
+
var out = new DivineDataWriter();
|
67
71
|
this.serialize_internal(out);
|
68
72
|
return out.get_data();
|
69
73
|
}
|
70
74
|
|
71
|
-
|
75
|
+
DivineHelper.prototype.read_int8 = function (data) {
|
72
76
|
return data.getbyte();
|
73
77
|
};
|
74
78
|
|
75
|
-
|
79
|
+
DivineHelper.prototype.read_int16 = function (data) {
|
76
80
|
return (data.getbyte() << 8) | this.read_int8(data);
|
77
81
|
};
|
78
82
|
|
79
|
-
|
83
|
+
DivineHelper.prototype.read_int24 = function (data) {
|
80
84
|
return (data.getbyte() << 16) | this.read_int16(data);
|
81
85
|
};
|
82
86
|
|
83
|
-
|
87
|
+
DivineHelper.prototype.read_int32 = function (data) {
|
84
88
|
// return (data.getbyte() << 24) | this.read_int24(data); // See notes about numbers above
|
85
89
|
return (data.getbyte() * (256*256*256)) + this.read_int24(data);
|
86
90
|
};
|
87
91
|
|
88
|
-
|
92
|
+
DivineHelper.prototype.read_sint32 = function (data) {
|
93
|
+
// return (data.getbyte() << 24) | this.read_int24(data); // See notes about numbers above
|
94
|
+
var num = (data.getbyte() * (256*256*256)) + this.read_int24(data);
|
95
|
+
if (num > (Math.pow(2, 32 - 1) -1) ){
|
96
|
+
return num - Math.pow(2, 32);
|
97
|
+
}
|
98
|
+
return num;
|
99
|
+
};
|
100
|
+
|
101
|
+
DivineHelper.prototype.read_sint64 = function (data) {
|
102
|
+
var part1 = this.read_int32(data).toString(2); // read first part of 32 bit number
|
103
|
+
var part2 = this.read_int32(data).toString(2); // read second part of 32 bit.
|
104
|
+
if (part1.length < 32){ // deal with positive number
|
105
|
+
part2 = Array(32 - part2.length + 1).join("0") + part2;
|
106
|
+
return parseInt((part1 + part2), 2);
|
107
|
+
}else{ // deal with negative number
|
108
|
+
part1 = part1.substr(11,part1.length);
|
109
|
+
part2 = Array(32 - part2.length + 1).join("0") + part2;
|
110
|
+
var binStr = part1 + part2;
|
111
|
+
binStr = binStr.replace(/1/g,'f').replace(/0/g,'1').replace(/f/g,'0');
|
112
|
+
val = parseInt(binStr, 2) + 1;
|
113
|
+
return val * -1;
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
DivineHelper.prototype.read_binary = function (data) {
|
89
118
|
return data.read(this.read_int32(data));
|
90
119
|
};
|
91
120
|
|
92
|
-
|
121
|
+
DivineHelper.prototype.read_short_binary = function (data) {
|
93
122
|
return data.read(this.read_int8(data));
|
94
123
|
};
|
95
124
|
|
96
|
-
|
125
|
+
DivineHelper.prototype.read_ip_number = function (data) {
|
97
126
|
var ip_array = this.read_short_binary(data);
|
98
127
|
if(ip_array.length == 4){
|
99
128
|
return this.read_ipv4_number(ip_array);
|
@@ -102,7 +131,7 @@ BabelHelper.prototype.read_ip_number = function (data) {
|
|
102
131
|
}
|
103
132
|
};
|
104
133
|
|
105
|
-
|
134
|
+
DivineHelper.prototype.read_ipv4_number = function (ip_array) {
|
106
135
|
ip = "";
|
107
136
|
for (i = 0, len = ip_array.length; i < len; i++) {
|
108
137
|
b = ip_array[i];
|
@@ -113,7 +142,7 @@ BabelHelper.prototype.read_ipv4_number = function (ip_array) {
|
|
113
142
|
}
|
114
143
|
return ip;
|
115
144
|
};
|
116
|
-
|
145
|
+
DivineHelper.prototype.read_ipv6_number = function (ip_array) {
|
117
146
|
var ip = "";
|
118
147
|
var part1, part2;
|
119
148
|
for (i = 0, len = ip_array.length; i < len; i+=2) {
|
@@ -128,11 +157,11 @@ BabelHelper.prototype.read_ipv6_number = function (ip_array) {
|
|
128
157
|
return ip;
|
129
158
|
};
|
130
159
|
|
131
|
-
|
160
|
+
DivineHelper.prototype.read_string = function (data) {
|
132
161
|
return this.decode_utf8(data.read(this.read_int16(data)))
|
133
162
|
};
|
134
163
|
|
135
|
-
|
164
|
+
DivineHelper.prototype.write_int8 = function (v, out) {
|
136
165
|
if (v > 0xFF) // Max 255
|
137
166
|
this.raise_error("Too large int8 number: " + v);
|
138
167
|
if(v < 0)
|
@@ -140,7 +169,7 @@ BabelHelper.prototype.write_int8 = function (v, out) {
|
|
140
169
|
out.writeByte(v);
|
141
170
|
}
|
142
171
|
|
143
|
-
|
172
|
+
DivineHelper.prototype.write_int16 = function (v, out) {
|
144
173
|
if (v > 0xFFFF) // Max 65.535
|
145
174
|
this.raise_error("Too large int16 number: " + v);
|
146
175
|
if(v < 0)
|
@@ -149,7 +178,7 @@ BabelHelper.prototype.write_int16 = function (v, out) {
|
|
149
178
|
this.write_int8(v & 0xFF, out);
|
150
179
|
}
|
151
180
|
|
152
|
-
|
181
|
+
DivineHelper.prototype.write_int24 = function (v, out) {
|
153
182
|
if (v > 0xFFFFFF) // Max 16.777.215
|
154
183
|
this.raise_error("Too large int24 number: " + v);
|
155
184
|
if (v < 0) // In Case added to JavaScript declaration
|
@@ -158,7 +187,7 @@ BabelHelper.prototype.write_int24 = function (v, out) {
|
|
158
187
|
this.write_int16(v & 0xFFFF, out);
|
159
188
|
}
|
160
189
|
|
161
|
-
|
190
|
+
DivineHelper.prototype.write_int32 = function (v, out) {
|
162
191
|
if (v > 0xFFFFFFFF) // Max 4.294.967.295
|
163
192
|
this.raise_error("Too large int32 number: " + v);
|
164
193
|
if(v < 0)
|
@@ -167,18 +196,52 @@ BabelHelper.prototype.write_int32 = function (v, out) {
|
|
167
196
|
this.write_int24(v & 0xFFFFFF, out);
|
168
197
|
}
|
169
198
|
|
170
|
-
|
199
|
+
DivineHelper.prototype.write_sint32 = function (v, out) {
|
200
|
+
var max = Math.pow(2, 32 - 1) - 1;
|
201
|
+
var min = Math.pow(2, 32 - 1) - Math.pow(2, 32);
|
202
|
+
if (v > max) // Max 2.147.483.647
|
203
|
+
this.raise_error("Too large sInt32 number: " + v + ", Max = " + max);
|
204
|
+
if(v < min) // Min -2.147.483.648
|
205
|
+
this.raise_error("Too small sInt32 number: " + v + ", Min = " + min);
|
206
|
+
this.write_int8(v >> 24 & 0xFF, out);
|
207
|
+
this.write_int24(v & 0xFFFFFF, out);
|
208
|
+
}
|
209
|
+
|
210
|
+
DivineHelper.prototype.write_sint64 = function (v, out) {
|
211
|
+
var max = Math.pow(2, 53) - 1;
|
212
|
+
var min = -Math.pow(2, 53);
|
213
|
+
if (v > max) // Max 9,007,199,254,740,991
|
214
|
+
this.raise_error("Too large sInt64 number: " + v + ", Max = " + max);
|
215
|
+
if (v < min) // Min -9,007,199,254,740,992
|
216
|
+
this.raise_error("Too small sInt64 number: " + v + ", Min = " + min);
|
217
|
+
|
218
|
+
binStr = v.toString(2);
|
219
|
+
if (v < 0){
|
220
|
+
invBinStr = binStr.replace('-','').replace(/1/g,'f').replace(/0/g,'1').replace(/f/g,'0');
|
221
|
+
invBinStr = (parseInt(invBinStr, 2) + 1).toString(2);
|
222
|
+
binStr = Array(binStr.length - invBinStr.length).join("0") + invBinStr;
|
223
|
+
binStr = Array(64 - binStr.length + 1).join("1") + binStr;
|
224
|
+
}else{
|
225
|
+
binStr = Array(64 - binStr.length + 1).join("0") + binStr;
|
226
|
+
}
|
227
|
+
part1 = binStr.substr(0, binStr.length - 32);
|
228
|
+
part2 = binStr.substr(binStr.length - 32, binStr.length);
|
229
|
+
this.write_int32(parseInt(part1, 2), out);
|
230
|
+
this.write_int32(parseInt(part2, 2), out);
|
231
|
+
}
|
232
|
+
|
233
|
+
DivineHelper.prototype.write_bool = function (v, out) {
|
171
234
|
this.write_int8(v ? 1 : 0, out)
|
172
235
|
}
|
173
236
|
|
174
|
-
|
237
|
+
DivineHelper.prototype.write_string = function (v, out) {
|
175
238
|
var s = this.encode_utf8(v);
|
176
239
|
if (s.length > 0xFFFF) this.raise_error("Too large string: " + s.length + " bytes");
|
177
240
|
this.write_int16(s.length, out);
|
178
241
|
out.write(s);
|
179
242
|
}
|
180
243
|
|
181
|
-
|
244
|
+
DivineHelper.prototype.write_binary = function (v, out) {
|
182
245
|
if ((v instanceof Array) || (v instanceof Uint8Array)) {
|
183
246
|
if (v.length > 0xFFFFFFFF) this.raise_error("Too large binary: " + v.length + " (" + v.constructor.name + ")");
|
184
247
|
this.write_int32(v.length, out)
|
@@ -194,7 +257,7 @@ BabelHelper.prototype.write_binary = function (v, out) {
|
|
194
257
|
}
|
195
258
|
}
|
196
259
|
|
197
|
-
|
260
|
+
DivineHelper.prototype.write_16_binary = function (v, out) {
|
198
261
|
if ((v instanceof Array) || (v instanceof Uint8Array)) {
|
199
262
|
if (v.length > 0xFF) this.raise_error("Too large 16 binary: " + v.length*2 + " (" + v.constructor.name + ")");
|
200
263
|
this.write_int8(v.length * 2, out)
|
@@ -209,7 +272,7 @@ BabelHelper.prototype.write_16_binary = function (v, out) {
|
|
209
272
|
}
|
210
273
|
}
|
211
274
|
|
212
|
-
|
275
|
+
DivineHelper.prototype.write_short_binary = function (v, out) {
|
213
276
|
if ((v instanceof Array) || (v instanceof Uint8Array)) {
|
214
277
|
if (v.length > 0xFF) this.raise_error("Too large binary: " + v.length + " (" + v.constructor.name + ")");
|
215
278
|
this.write_int8(v.length, out)
|
@@ -225,7 +288,7 @@ BabelHelper.prototype.write_short_binary = function (v, out) {
|
|
225
288
|
}
|
226
289
|
}
|
227
290
|
|
228
|
-
|
291
|
+
DivineHelper.prototype.write_ip_number = function (v, out) {
|
229
292
|
if ((v instanceof Array) || (v instanceof Uint8Array)){
|
230
293
|
if(v.length == 4){
|
231
294
|
this.write_ipv4_number(v, out);
|
@@ -243,7 +306,7 @@ BabelHelper.prototype.write_ip_number = function (v, out) {
|
|
243
306
|
}
|
244
307
|
}
|
245
308
|
|
246
|
-
|
309
|
+
DivineHelper.prototype.write_ipv4_number = function (v, out) {
|
247
310
|
if ((v instanceof Array) || (v instanceof Uint8Array)) {
|
248
311
|
if (v.length != 4 && v.length != 0) this.raise_error("Unknown IP v4 number " + v);
|
249
312
|
this.write_short_binary(v, out)
|
@@ -258,7 +321,7 @@ BabelHelper.prototype.write_ipv4_number = function (v, out) {
|
|
258
321
|
}
|
259
322
|
};
|
260
323
|
|
261
|
-
|
324
|
+
DivineHelper.prototype.write_ipv6_number = function (v, out) {
|
262
325
|
if ((v instanceof Array) || (v instanceof Uint8Array)) {
|
263
326
|
this.write_16_binary(v, out)
|
264
327
|
} else if (v.constructor == String) {
|
@@ -270,7 +333,7 @@ BabelHelper.prototype.write_ipv6_number = function (v, out) {
|
|
270
333
|
v = v.replace(/ /g, "");
|
271
334
|
ss = v.split(":").map(function (t){
|
272
335
|
if (t.length > 4)
|
273
|
-
new
|
336
|
+
new DivineHelper().raise_error("Unknown IP Group number '" + t + "'");
|
274
337
|
if (t.length == 0)
|
275
338
|
t = "0";
|
276
339
|
return parseInt(t, 16);
|
@@ -288,7 +351,7 @@ BabelHelper.prototype.write_ipv6_number = function (v, out) {
|
|
288
351
|
}
|
289
352
|
}
|
290
353
|
|
291
|
-
|
354
|
+
DivineHelper.prototype.encode_utf8 = function (str) {
|
292
355
|
var utf8 = [];
|
293
356
|
var chr, next_chr;
|
294
357
|
var x, y, z;
|
@@ -331,7 +394,7 @@ BabelHelper.prototype.encode_utf8 = function (str) {
|
|
331
394
|
return utf8;
|
332
395
|
}
|
333
396
|
|
334
|
-
|
397
|
+
DivineHelper.prototype.decode_utf8 = function (utf8_data) {
|
335
398
|
var str = "";
|
336
399
|
var chr, b2, b3, b4;
|
337
400
|
for (var i = 0; i < utf8_data.length; i++) {
|
@@ -385,56 +448,103 @@ BabelHelper.prototype.decode_utf8 = function (utf8_data) {
|
|
385
448
|
return str;
|
386
449
|
}
|
387
450
|
|
388
|
-
|
451
|
+
DivineHelper.prototype.raise_error = function (msg) {
|
389
452
|
throw "[" + this.constructor.name + "] " + msg;
|
390
453
|
}
|
391
454
|
EOS
|
392
455
|
end
|
393
456
|
|
394
|
-
def
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
}
|
428
|
-
|
457
|
+
def javascript_class_template(sh)
|
458
|
+
code = [
|
459
|
+
"",
|
460
|
+
"// ------------------------------------------------------------ #{sh.name}",
|
461
|
+
"function #{sh.name}() {",
|
462
|
+
:indent,
|
463
|
+
"DivineHelper.call(this);",
|
464
|
+
"",
|
465
|
+
# PROPERTIES
|
466
|
+
"this.struct_version = #{sh.latest_version};",
|
467
|
+
sh.field_names.map do |fn|
|
468
|
+
f = sh.field(fn).last
|
469
|
+
"this.#{f.name} = #{javascript_get_empty_declaration(f)};"
|
470
|
+
end,
|
471
|
+
:deindent,
|
472
|
+
"}", "",
|
473
|
+
|
474
|
+
"// Inherit DivineHelper",
|
475
|
+
"#{sh.name}.prototype = new DivineHelper();", "",
|
476
|
+
|
477
|
+
"// Correct the constructor pointer because it points to DivineHelper",
|
478
|
+
"#{sh.name}.prototype.constructor = #{sh.name};", "",
|
479
|
+
|
480
|
+
# SERiALIZE INTERNAL
|
481
|
+
"// Serialize",
|
482
|
+
"#{sh.name}.prototype.serialize_internal = function(out) {",
|
483
|
+
:indent,
|
484
|
+
"this.write_int8(this.struct_version, out);",
|
485
|
+
sh.structs.map do |s|
|
486
|
+
[
|
487
|
+
"if(this.struct_version == #{s.version}) {",
|
488
|
+
:indent,
|
489
|
+
s.simple_fields.map do |f|
|
490
|
+
"this.write_#{f.type}(this.#{f.name}, out);"
|
491
|
+
end,
|
492
|
+
s.complex_fields.map do |f|
|
493
|
+
[
|
494
|
+
"", "// Serialize #{f.type} '#{f.name}'",
|
495
|
+
$debug_javascript ? "console.log(\"Serialize '#{field.name}'\");" : nil,
|
496
|
+
javascript_serialize_internal("this.#{f.name}", f.referenced_types)
|
497
|
+
]
|
498
|
+
end,
|
499
|
+
"return;",
|
500
|
+
:deindent,
|
501
|
+
"}", ""
|
502
|
+
]
|
503
|
+
end, "",
|
504
|
+
"throw \"Unsupported version \" + this.struct_version + \" for type '#{sh.name}'\";",
|
505
|
+
:deindent,
|
506
|
+
"}", "",
|
507
|
+
|
508
|
+
# DESERIALIZE
|
509
|
+
"// Deserialize",
|
510
|
+
"#{sh.name}.prototype.deserialize = function (data) {",
|
511
|
+
:indent,
|
512
|
+
"this.struct_version = this.read_int8(data);",
|
513
|
+
sh.structs.map do |s|
|
514
|
+
[
|
515
|
+
"if(this.struct_version == #{s.version}) {",
|
516
|
+
:indent,
|
517
|
+
s.simple_fields.map do |f|
|
518
|
+
"this.#{f.name} = this.read_#{f.type}(data);"
|
519
|
+
end,
|
520
|
+
s.complex_fields.map do |f|
|
521
|
+
[
|
522
|
+
"", "// Read #{f.type} '#{f.name}'",
|
523
|
+
$debug_javascript ? "console.log(\"Deserialize '#{field.name}'\");" : nil,
|
524
|
+
javascript_deserialize_internal("this.#{f.name}", f.referenced_types)
|
525
|
+
]
|
526
|
+
end,
|
527
|
+
"return;",
|
528
|
+
:deindent,
|
529
|
+
"}"
|
530
|
+
]
|
531
|
+
end, "",
|
532
|
+
"throw \"Unsupported version \" + this.struct_version + \" for type '#{sh.name}'\";",
|
533
|
+
:deindent,
|
534
|
+
"}"
|
535
|
+
]
|
536
|
+
|
537
|
+
format_src(0, 3, code)
|
429
538
|
end
|
430
539
|
|
540
|
+
|
431
541
|
def javascript_get_empty_declaration(field)
|
432
542
|
case field.type
|
433
543
|
when :list, :binary, :short_binary
|
434
544
|
"[]"
|
435
545
|
when :map
|
436
546
|
"{}"
|
437
|
-
when :int8, :int16, :int32
|
547
|
+
when :int8, :int16, :int32, :sint32, :sint64
|
438
548
|
"0"
|
439
549
|
when :string, :ip_number
|
440
550
|
"\"\""
|
@@ -443,16 +553,6 @@ EOS2
|
|
443
553
|
end
|
444
554
|
end
|
445
555
|
|
446
|
-
def javascript_serialize_complex(field)
|
447
|
-
types = field.referenced_types
|
448
|
-
as = [
|
449
|
-
"// Serialize #{field.type} '#{field.name}'",
|
450
|
-
$debug_javascript ? "console.log(\"Serialize '#{field.name}'\");" : nil,
|
451
|
-
javascript_serialize_internal("this.#{field.name}", types)
|
452
|
-
]
|
453
|
-
format_src(4, 4, as)
|
454
|
-
end
|
455
|
-
|
456
556
|
def javascript_serialize_internal(var, types)
|
457
557
|
if types.respond_to? :first
|
458
558
|
case types.first
|
@@ -500,16 +600,6 @@ EOS2
|
|
500
600
|
end
|
501
601
|
end
|
502
602
|
|
503
|
-
def javascript_deserialize_complex(field)
|
504
|
-
types = field.referenced_types
|
505
|
-
as = [
|
506
|
-
"// Deserialize #{field.type} '#{field.name}'",
|
507
|
-
$debug_javascript ? "console.log(\"Deserialize '#{field.name}'\");" : nil,
|
508
|
-
javascript_deserialize_internal("this.#{field.name}", types)
|
509
|
-
]
|
510
|
-
format_src(4, 4, as)
|
511
|
-
end
|
512
|
-
|
513
603
|
def javascript_deserialize_internal(var, types)
|
514
604
|
if types.respond_to? :first
|
515
605
|
case types.first
|
@@ -569,16 +659,14 @@ EOS2
|
|
569
659
|
|
570
660
|
class JavascriptGenerator < JavascriptHelperMethods
|
571
661
|
def generate_code(structs, opts)
|
572
|
-
pp opts
|
573
662
|
$debug_javascript = true if opts[:debug]
|
574
663
|
base_template = Erubis::Eruby.new(javascript_base_class_template_str)
|
575
|
-
class_template = Erubis::Eruby.new(javascript_class_template_str)
|
576
664
|
keys = structs.keys.sort
|
577
665
|
src = keys.map do |k|
|
578
666
|
ss = structs[k]
|
579
|
-
#
|
580
|
-
|
581
|
-
|
667
|
+
# Check different aspects the the structs
|
668
|
+
vss = sanity_check(ss)
|
669
|
+
javascript_class_template(StructHandler.new(vss))
|
582
670
|
end
|
583
671
|
|
584
672
|
# User defined super class?
|
@@ -588,7 +676,7 @@ EOS2
|
|
588
676
|
end
|
589
677
|
|
590
678
|
def javascript_get_begin_module(opts)
|
591
|
-
|
679
|
+
"#{get_header_comment}\n\n"
|
592
680
|
end
|
593
681
|
|
594
682
|
def javascript_get_end_module(opts)
|