OLD | NEW |
| (Empty) |
1 {%- macro set_default(module, kind, value, depth) -%} | |
2 {#--- Strings ---#} | |
3 {%- if kind|is_string_kind -%} | |
4 {{caller(value|expression_to_text(module))}} | |
5 {#--- Arrays ---#} | |
6 {%- elif kind|is_array_kind %} | |
7 {%- set _ = value|verify_token_type("ARRAY") %} | |
8 { | |
9 var tmp{{depth}} = []; | |
10 {%- for element in value[1] %} | |
11 {%- filter indent(2) %} | |
12 {%- call(result) set_default(module, kind.kind, element, depth+1) %} | |
13 tmp{{depth}}[{{loop.index0}}] = {{result}}; | |
14 {%- endcall %} | |
15 {%- endfilter %} | |
16 {%- endfor -%} | |
17 {{caller("tmp" ~ depth)|indent(2)}} | |
18 } | |
19 {#--- Objects ---#} | |
20 {%- elif kind|is_object_kind %} | |
21 {%- set _ = value|verify_token_type("OBJECT") %} | |
22 { | |
23 var tmp{{depth}} = new {{kind|js_type}}(); | |
24 {%- set struct = kinds[kind.spec] %} | |
25 {%- for element in value[1] %} | |
26 {#- Use struct.packed_fields to order struct values by ordinal number #} | |
27 {%- set subfield = struct.fields[loop.index0] %} | |
28 {%- filter indent(2) %} | |
29 {%- call(result) set_default(module, subfield.kind, element, depth+1) %} | |
30 tmp{{depth}}.{{subfield.name}} = {{result}}; | |
31 {%- endcall %} | |
32 {%- endfilter %} | |
33 {%- endfor -%} | |
34 {{caller("tmp" ~ depth)|indent(2)}} | |
35 } | |
36 {#--- POD types ---#} | |
37 {%- else -%} | |
38 {{caller(value|expression_to_text(module))}} | |
39 {%- endif %} | |
40 {%- endmacro %} | |
41 | |
42 {#--- Begin #} | |
43 {#--- Enums. We must define these before the constructor because they | |
44 may be used there. Later, we alias these to be class static variables. #} | |
45 {%- from "enum_definition.tmpl" import enum_def %} | |
46 {% for enum in struct.enums %} | |
47 var {{enum_def("%s_%s"|format(struct.name, enum.name), enum, module)}} | |
48 {% endfor %} | |
49 | |
50 {#--- Constructor #} | |
51 function {{struct.name}}() { | |
52 {%- for packed_field in struct.packed.packed_fields %} | |
53 {%- if packed_field.field.default %} | |
54 {%- filter indent(4) %} | |
55 {%- call(result) set_default(module, packed_field.field.kind, packed_field.f
ield.default, 0) %} | |
56 this.{{packed_field.field.name}} = {{result}}; | |
57 {%- endcall %} | |
58 {%- endfilter %} | |
59 {%- else %} | |
60 this.{{packed_field.field.name}} = {{packed_field.field|default_value}}; | |
61 {%- endif %} | |
62 {%- endfor %} | |
63 } | |
64 | |
65 {#--- Alias any Struct_Enum enums to Struct.Enum #} | |
66 {% for enum in struct.enums %} | |
67 {{struct.name}}.{{enum.name}} = {{struct.name}}_{{enum.name}}; | |
68 {%- endfor %} | |
69 | |
70 {#--- Encoding and decoding #} | |
71 | |
72 {{struct.name}}.encodedSize = codec.kStructHeaderSize + {{struct.packed|payloa
d_size}}; | |
73 | |
74 {{struct.name}}.decode = function(decoder) { | |
75 var packed; | |
76 var val = new {{struct.name}}(); | |
77 var numberOfBytes = decoder.read32(); | |
78 var numberOfFields = decoder.read32(); | |
79 {%- for byte in struct.bytes %} | |
80 {%- if byte.packed_fields|length > 1 %} | |
81 packed = decoder.read8(); | |
82 {%- for packed_field in byte.packed_fields %} | |
83 val.{{packed_field.field.name}} = (packed >> {{packed_field.bit}}) & 1 ? tru
e : false; | |
84 {%- endfor %} | |
85 {%- else %} | |
86 {%- for packed_field in byte.packed_fields %} | |
87 val.{{packed_field.field.name}} = decoder.{{packed_field.field.kind|decode_s
nippet}}; | |
88 {%- endfor %} | |
89 {%- endif %} | |
90 {%- if byte.is_padding %} | |
91 decoder.skip(1); | |
92 {%- endif %} | |
93 {%- endfor %} | |
94 return val; | |
95 }; | |
96 | |
97 {{struct.name}}.encode = function(encoder, val) { | |
98 var packed; | |
99 encoder.write32({{struct.name}}.encodedSize); | |
100 encoder.write32({{struct.packed.packed_fields|length}}); | |
101 | |
102 {%- for byte in struct.bytes %} | |
103 {%- if byte.packed_fields|length > 1 %} | |
104 packed = 0; | |
105 {%- for packed_field in byte.packed_fields %} | |
106 packed |= (val.{{packed_field.field.name}} & 1) << {{packed_field.bit}} | |
107 {%- endfor %} | |
108 encoder.write8(packed); | |
109 {%- else %} | |
110 {%- for packed_field in byte.packed_fields %} | |
111 encoder.{{packed_field.field.kind|encode_snippet}}val.{{packed_field.field.n
ame}}); | |
112 {%- endfor %} | |
113 {%- endif %} | |
114 {%- if byte.is_padding %} | |
115 encoder.skip(1); | |
116 {%- endif %} | |
117 {%- endfor %} | |
118 }; | |
OLD | NEW |