| 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 |