divine 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|