xdrgen 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +4 -0
  5. data/Guardfile +12 -0
  6. data/LICENSE.txt +202 -0
  7. data/README.md +79 -0
  8. data/Rakefile +6 -0
  9. data/bin/xdrgen +5 -0
  10. data/lib/xdrgen.rb +24 -0
  11. data/lib/xdrgen/ast.rb +81 -0
  12. data/lib/xdrgen/ast/concerns/contained.rb +32 -0
  13. data/lib/xdrgen/ast/concerns/has_children.rb +9 -0
  14. data/lib/xdrgen/ast/concerns/has_definitions.rb +90 -0
  15. data/lib/xdrgen/ast/concerns/named.rb +16 -0
  16. data/lib/xdrgen/ast/concerns/namespace.rb +7 -0
  17. data/lib/xdrgen/ast/concerns/nested_definition.rb +16 -0
  18. data/lib/xdrgen/ast/constant.rb +7 -0
  19. data/lib/xdrgen/ast/decimal_constant.rb +7 -0
  20. data/lib/xdrgen/ast/declarations/array.rb +15 -0
  21. data/lib/xdrgen/ast/declarations/base.rb +28 -0
  22. data/lib/xdrgen/ast/declarations/opaque.rb +11 -0
  23. data/lib/xdrgen/ast/declarations/optional.rb +5 -0
  24. data/lib/xdrgen/ast/declarations/simple.rb +7 -0
  25. data/lib/xdrgen/ast/declarations/string.rb +7 -0
  26. data/lib/xdrgen/ast/declarations/void.rb +7 -0
  27. data/lib/xdrgen/ast/definitions/base.rb +9 -0
  28. data/lib/xdrgen/ast/definitions/const.rb +12 -0
  29. data/lib/xdrgen/ast/definitions/enum.rb +17 -0
  30. data/lib/xdrgen/ast/definitions/enum_member.rb +44 -0
  31. data/lib/xdrgen/ast/definitions/namespace.rb +9 -0
  32. data/lib/xdrgen/ast/definitions/nested_enum.rb +7 -0
  33. data/lib/xdrgen/ast/definitions/nested_struct.rb +7 -0
  34. data/lib/xdrgen/ast/definitions/nested_union.rb +7 -0
  35. data/lib/xdrgen/ast/definitions/struct.rb +18 -0
  36. data/lib/xdrgen/ast/definitions/struct_body.rb +11 -0
  37. data/lib/xdrgen/ast/definitions/struct_member.rb +12 -0
  38. data/lib/xdrgen/ast/definitions/typedef.rb +19 -0
  39. data/lib/xdrgen/ast/definitions/union.rb +55 -0
  40. data/lib/xdrgen/ast/definitions/union_arm.rb +33 -0
  41. data/lib/xdrgen/ast/definitions/union_arm_case.rb +11 -0
  42. data/lib/xdrgen/ast/definitions/union_body.rb +22 -0
  43. data/lib/xdrgen/ast/definitions/union_default_arm.rb +19 -0
  44. data/lib/xdrgen/ast/fixed_size.rb +23 -0
  45. data/lib/xdrgen/ast/hexadecimal_constant.rb +7 -0
  46. data/lib/xdrgen/ast/identifier.rb +5 -0
  47. data/lib/xdrgen/ast/octal_constant.rb +7 -0
  48. data/lib/xdrgen/ast/top.rb +5 -0
  49. data/lib/xdrgen/ast/typespecs/base.rb +27 -0
  50. data/lib/xdrgen/ast/typespecs/bool.rb +5 -0
  51. data/lib/xdrgen/ast/typespecs/double.rb +5 -0
  52. data/lib/xdrgen/ast/typespecs/float.rb +5 -0
  53. data/lib/xdrgen/ast/typespecs/hyper.rb +6 -0
  54. data/lib/xdrgen/ast/typespecs/int.rb +6 -0
  55. data/lib/xdrgen/ast/typespecs/opaque.rb +10 -0
  56. data/lib/xdrgen/ast/typespecs/quadruple.rb +5 -0
  57. data/lib/xdrgen/ast/typespecs/simple.rb +14 -0
  58. data/lib/xdrgen/ast/typespecs/string.rb +9 -0
  59. data/lib/xdrgen/ast/typespecs/unsigned_hyper.rb +5 -0
  60. data/lib/xdrgen/ast/typespecs/unsigned_int.rb +5 -0
  61. data/lib/xdrgen/ast/var_size.rb +26 -0
  62. data/lib/xdrgen/ast/whitespace.rb +5 -0
  63. data/lib/xdrgen/cli.rb +31 -0
  64. data/lib/xdrgen/compilation.rb +31 -0
  65. data/lib/xdrgen/generators.rb +16 -0
  66. data/lib/xdrgen/generators/base.rb +11 -0
  67. data/lib/xdrgen/generators/elixir.rb +260 -0
  68. data/lib/xdrgen/generators/go.rb +578 -0
  69. data/lib/xdrgen/generators/java.rb +810 -0
  70. data/lib/xdrgen/generators/java/XdrDataInputStream.erb +122 -0
  71. data/lib/xdrgen/generators/java/XdrDataOutputStream.erb +96 -0
  72. data/lib/xdrgen/generators/java/XdrElement.erb +10 -0
  73. data/lib/xdrgen/generators/java/XdrString.erb +58 -0
  74. data/lib/xdrgen/generators/javascript.rb +248 -0
  75. data/lib/xdrgen/generators/ruby.rb +283 -0
  76. data/lib/xdrgen/grammar/base.treetop +71 -0
  77. data/lib/xdrgen/grammar/comments.treetop +15 -0
  78. data/lib/xdrgen/grammar/const.treetop +8 -0
  79. data/lib/xdrgen/grammar/declaration.treetop +99 -0
  80. data/lib/xdrgen/grammar/enum.treetop +46 -0
  81. data/lib/xdrgen/grammar/main.treetop +30 -0
  82. data/lib/xdrgen/grammar/namespace.treetop +12 -0
  83. data/lib/xdrgen/grammar/struct.treetop +32 -0
  84. data/lib/xdrgen/grammar/typedef.treetop +12 -0
  85. data/lib/xdrgen/grammar/union.treetop +63 -0
  86. data/lib/xdrgen/output.rb +37 -0
  87. data/lib/xdrgen/output_file.rb +87 -0
  88. data/lib/xdrgen/parser.rb +40 -0
  89. data/lib/xdrgen/version.rb +3 -0
  90. data/spec/fixtures/generator/block_comments.x +14 -0
  91. data/spec/fixtures/generator/const.x +4 -0
  92. data/spec/fixtures/generator/enum.x +36 -0
  93. data/spec/fixtures/generator/nesting.x +24 -0
  94. data/spec/fixtures/generator/optional.x +8 -0
  95. data/spec/fixtures/generator/struct.x +10 -0
  96. data/spec/fixtures/generator/test.x +77 -0
  97. data/spec/fixtures/generator/union.x +28 -0
  98. data/spec/fixtures/parser/block_comments.x +14 -0
  99. data/spec/fixtures/parser/const.x +1 -0
  100. data/spec/fixtures/parser/enum.x +35 -0
  101. data/spec/fixtures/parser/nesting.x +26 -0
  102. data/spec/fixtures/parser/optional.x +8 -0
  103. data/spec/fixtures/parser/struct.x +8 -0
  104. data/spec/fixtures/parser/test.x +77 -0
  105. data/spec/fixtures/parser/union.x +10 -0
  106. data/spec/lib/xdrgen/generator_spec.rb +30 -0
  107. data/spec/lib/xdrgen/output_file_spec.rb +33 -0
  108. data/spec/lib/xdrgen/parser_spec.rb +27 -0
  109. data/spec/spec_helper.rb +13 -0
  110. data/spec/support/fixtures.rb +27 -0
  111. data/xdrgen.gemspec +32 -0
  112. metadata +301 -0
@@ -0,0 +1,122 @@
1
+ package <%= @namespace %>;
2
+
3
+ import java.io.DataInputStream;
4
+ import java.io.IOException;
5
+ import java.io.InputStream;
6
+ import java.nio.charset.Charset;
7
+
8
+ public class XdrDataInputStream extends DataInputStream {
9
+
10
+ // The underlying input stream
11
+ private final XdrInputStream mIn;
12
+
13
+ /**
14
+ * Creates a XdrDataInputStream that uses the specified
15
+ * underlying InputStream.
16
+ *
17
+ * @param in the specified input stream
18
+ */
19
+ public XdrDataInputStream(InputStream in) {
20
+ super(new XdrInputStream(in));
21
+ mIn = (XdrInputStream) super.in;
22
+ }
23
+
24
+ public int[] readIntArray() throws IOException {
25
+ int l = readInt();
26
+ return readIntArray(l);
27
+ }
28
+
29
+ private int[] readIntArray(int l) throws IOException {
30
+ int[] arr = new int[l];
31
+ for (int i = 0; i < l; i++) {
32
+ arr[i] = readInt();
33
+ }
34
+ return arr;
35
+ }
36
+
37
+ public float[] readFloatArray() throws IOException {
38
+ int l = readInt();
39
+ return readFloatArray(l);
40
+ }
41
+
42
+ private float[] readFloatArray(int l) throws IOException {
43
+ float[] arr = new float[l];
44
+ for (int i = 0; i < l; i++) {
45
+ arr[i] = readFloat();
46
+ }
47
+ return arr;
48
+ }
49
+
50
+ public double[] readDoubleArray() throws IOException {
51
+ int l = readInt();
52
+ return readDoubleArray(l);
53
+ }
54
+
55
+ private double[] readDoubleArray(int l) throws IOException {
56
+ double[] arr = new double[l];
57
+ for (int i = 0; i < l; i++) {
58
+ arr[i] = readDouble();
59
+ }
60
+ return arr;
61
+ }
62
+
63
+ @Override
64
+ public int read() throws IOException {
65
+ return super.read();
66
+ }
67
+
68
+ /**
69
+ * Need to provide a custom impl of InputStream as DataInputStream's read methods
70
+ * are final and we need to keep track of the count for padding purposes.
71
+ */
72
+ private static final class XdrInputStream extends InputStream {
73
+
74
+ // The underlying input stream
75
+ private final InputStream mIn;
76
+
77
+ // The amount of bytes read so far.
78
+ private int mCount;
79
+
80
+ public XdrInputStream(InputStream in) {
81
+ mIn = in;
82
+ mCount = 0;
83
+ }
84
+
85
+ @Override
86
+ public int read() throws IOException {
87
+ int read = mIn.read();
88
+ if (read >= 0) {
89
+ mCount++;
90
+ }
91
+ return read;
92
+ }
93
+
94
+ @Override
95
+ public int read(byte[] b) throws IOException {
96
+ return read(b, 0, b.length);
97
+ }
98
+
99
+ @Override
100
+ public int read(byte[] b, int off, int len) throws IOException {
101
+ int read = mIn.read(b, off, len);
102
+ mCount += read;
103
+ pad();
104
+ return read;
105
+ }
106
+
107
+ public void pad() throws IOException {
108
+ int pad = 0;
109
+ int mod = mCount % 4;
110
+ if (mod > 0) {
111
+ pad = 4-mod;
112
+ }
113
+
114
+ while (pad-- > 0) {
115
+ int b = read();
116
+ if (b != 0) {
117
+ throw new IOException("non-zero padding");
118
+ }
119
+ }
120
+ }
121
+ }
122
+ }
@@ -0,0 +1,96 @@
1
+ package <%= @namespace %>;
2
+
3
+ import java.io.DataOutputStream;
4
+ import java.io.IOException;
5
+ import java.io.OutputStream;
6
+ import java.nio.charset.Charset;
7
+
8
+ public class XdrDataOutputStream extends DataOutputStream {
9
+
10
+ private final XdrOutputStream mOut;
11
+
12
+ public XdrDataOutputStream(OutputStream out) {
13
+ super(new XdrOutputStream(out));
14
+ mOut = (XdrOutputStream) super.out;
15
+ }
16
+
17
+ public void writeIntArray(int[] a) throws IOException {
18
+ writeInt(a.length);
19
+ writeIntArray(a, a.length);
20
+ }
21
+
22
+ private void writeIntArray(int[] a, int l) throws IOException {
23
+ for (int i = 0; i < l; i++) {
24
+ writeInt(a[i]);
25
+ }
26
+ }
27
+
28
+ public void writeFloatArray(float[] a) throws IOException {
29
+ writeInt(a.length);
30
+ writeFloatArray(a, a.length);
31
+ }
32
+
33
+ private void writeFloatArray(float[] a, int l) throws IOException {
34
+ for (int i = 0; i < l; i++) {
35
+ writeFloat(a[i]);
36
+ }
37
+ }
38
+
39
+ public void writeDoubleArray(double[] a) throws IOException {
40
+ writeInt(a.length);
41
+ writeDoubleArray(a, a.length);
42
+ }
43
+
44
+ private void writeDoubleArray(double[] a, int l) throws IOException {
45
+ for (int i = 0; i < l; i++) {
46
+ writeDouble(a[i]);
47
+ }
48
+ }
49
+
50
+ private static final class XdrOutputStream extends OutputStream {
51
+
52
+ private final OutputStream mOut;
53
+
54
+ // Number of bytes written
55
+ private int mCount;
56
+
57
+ public XdrOutputStream(OutputStream out) {
58
+ mOut = out;
59
+ mCount = 0;
60
+ }
61
+
62
+ @Override
63
+ public void write(int b) throws IOException {
64
+ mOut.write(b);
65
+ // https://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html#write(int):
66
+ // > The byte to be written is the eight low-order bits of the argument b.
67
+ // > The 24 high-order bits of b are ignored.
68
+ mCount++;
69
+ }
70
+
71
+ @Override
72
+ public void write(byte[] b) throws IOException {
73
+ // https://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html#write(byte[]):
74
+ // > The general contract for write(b) is that it should have exactly the same effect
75
+ // > as the call write(b, 0, b.length).
76
+ write(b, 0, b.length);
77
+ }
78
+
79
+ public void write(byte[] b, int offset, int length) throws IOException {
80
+ mOut.write(b, offset, length);
81
+ mCount += length;
82
+ pad();
83
+ }
84
+
85
+ public void pad() throws IOException {
86
+ int pad = 0;
87
+ int mod = mCount % 4;
88
+ if (mod > 0) {
89
+ pad = 4-mod;
90
+ }
91
+ while (pad-- > 0) {
92
+ write(0);
93
+ }
94
+ }
95
+ }
96
+ }
@@ -0,0 +1,10 @@
1
+ package <%= @namespace %>;
2
+
3
+ import java.io.IOException;
4
+
5
+ /**
6
+ * Common parent interface for all generated classes.
7
+ */
8
+ interface XdrElement {
9
+ void encode(XdrDataOutputStream stream) throws IOException;
10
+ }
@@ -0,0 +1,58 @@
1
+ package <%= @namespace %>;
2
+
3
+ import java.io.IOException;
4
+ import java.io.InvalidClassException;
5
+ import java.nio.charset.Charset;
6
+ import java.util.Arrays;
7
+
8
+ public class XdrString implements XdrElement {
9
+ private byte[] bytes;
10
+
11
+ public XdrString(byte[] bytes) {
12
+ this.bytes = bytes;
13
+ }
14
+
15
+ public XdrString(String text) {
16
+ this.bytes = text.getBytes(Charset.forName("UTF-8"));
17
+ }
18
+
19
+ @Override
20
+ public void encode(XdrDataOutputStream stream) throws IOException {
21
+ stream.writeInt(this.bytes.length);
22
+ stream.write(this.bytes, 0, this.bytes.length);
23
+ }
24
+
25
+ public static XdrString decode(XdrDataInputStream stream, int maxSize) throws IOException {
26
+ int size = stream.readInt();
27
+ if (size > maxSize) {
28
+ throw new InvalidClassException("String length "+size+" exceeds max size "+maxSize);
29
+ }
30
+ byte[] bytes = new byte[size];
31
+ stream.read(bytes);
32
+ return new XdrString(bytes);
33
+ }
34
+
35
+ public byte[] getBytes() {
36
+ return this.bytes;
37
+ }
38
+
39
+ @Override
40
+ public int hashCode() {
41
+ return Arrays.hashCode(this.bytes);
42
+ }
43
+
44
+ @Override
45
+ public boolean equals(Object object) {
46
+ if (object == null || !(object instanceof XdrString)) {
47
+ return false;
48
+ }
49
+
50
+ XdrString other = (XdrString) object;
51
+ return Arrays.equals(this.bytes, other.bytes);
52
+ }
53
+
54
+ @Override
55
+ public String toString() {
56
+ return new String(bytes, Charset.forName("UTF-8"));
57
+ }
58
+ }
@@ -0,0 +1,248 @@
1
+ module Xdrgen
2
+ module Generators
3
+
4
+ class Javascript < Xdrgen::Generators::Base
5
+ MAX_INT = (2**31) - 1
6
+ def generate
7
+ path = "#{@namespace}_generated.js"
8
+ out = @output.open(path)
9
+
10
+ render_top_matter out
11
+ render_define_block(out) do
12
+ render_definitions(out, @top)
13
+ end
14
+ end
15
+
16
+ private
17
+ def render_definitions(out, node)
18
+ node.definitions.each{|n| render_definition out, n }
19
+ node.namespaces.each{|n| render_definitions out, n }
20
+ end
21
+
22
+ def render_nested_definitions(out, defn)
23
+ return unless defn.respond_to? :nested_definitions
24
+ defn.nested_definitions.each{|ndefn| render_definition out, ndefn}
25
+ end
26
+
27
+ def render_definition(out, defn)
28
+ render_nested_definitions(out, defn)
29
+ render_source_comment(out, defn)
30
+
31
+ case defn
32
+ when AST::Definitions::Struct ;
33
+ render_struct out, defn
34
+ when AST::Definitions::Enum ;
35
+ render_enum out, defn
36
+ when AST::Definitions::Union ;
37
+ render_union out, defn
38
+ when AST::Definitions::Typedef ;
39
+ render_typedef out, defn
40
+ when AST::Definitions::Const ;
41
+ render_const out, defn
42
+ end
43
+
44
+ out.break
45
+ end
46
+
47
+ def render_source_comment(out, defn)
48
+ return if defn.is_a?(AST::Definitions::Namespace)
49
+
50
+ out.puts <<-EOS.strip_heredoc
51
+ // === xdr source ============================================================
52
+ //
53
+ EOS
54
+
55
+ out.puts "// " + defn.text_value.split("\n").join("\n// ")
56
+
57
+ out.puts <<-EOS.strip_heredoc
58
+ //
59
+ // ===========================================================================
60
+ EOS
61
+ end
62
+
63
+
64
+ def render_top_matter(out)
65
+ out.puts <<-EOS.strip_heredoc
66
+ // Automatically generated on #{Time.now.iso8601}
67
+ // DO NOT EDIT or your changes may be overwritten
68
+
69
+ /* jshint maxstatements:2147483647 */
70
+ /* jshint esnext:true */
71
+
72
+ import * as XDR from 'js-xdr';
73
+
74
+ EOS
75
+ out.break
76
+ end
77
+
78
+ def render_define_block(out)
79
+ out.puts "var types = XDR.config(xdr => {"
80
+ yield
81
+ ensure
82
+ out.puts "});"
83
+ out.puts "export default types;"
84
+ out.break
85
+ end
86
+
87
+
88
+ def render_typedef(out, typedef)
89
+ out.puts "xdr.typedef(\"#{name typedef}\", #{reference typedef.declaration.type});"
90
+ end
91
+
92
+ def render_const(out, const)
93
+ out.puts "xdr.const(\"#{const_name const}\", #{const.value});"
94
+ end
95
+
96
+ def render_struct(out, struct)
97
+ out.puts "xdr.struct(\"#{name struct}\", ["
98
+ out.indent do
99
+ struct.members.each do |m|
100
+ out.puts "[\"#{member_name m}\", #{reference m.type}],"
101
+ end
102
+ end
103
+ out.puts "]);"
104
+ end
105
+
106
+ def render_enum(out, enum)
107
+ out.puts "xdr.enum(\"#{name enum}\", {"
108
+
109
+ out.indent do
110
+ enum.members.each do |m|
111
+ out.puts "#{member_name m}: #{m.value},"
112
+ end
113
+ end
114
+
115
+ out.puts "});"
116
+ end
117
+
118
+ def render_union(out, union)
119
+ out.puts "xdr.union(\"#{name union}\", {"
120
+ out.indent do
121
+ out.puts "switchOn: #{reference union.discriminant.type},"
122
+ out.puts "switchName: \"#{member_name union.discriminant}\","
123
+ out.puts "switches: ["
124
+
125
+ out.indent do
126
+ union.normal_arms.each do |arm|
127
+ arm_name = arm.void? ? "xdr.void()" : "\"#{member_name(arm)}\""
128
+
129
+ arm.cases.each do |acase|
130
+ switch = if acase.value.is_a?(AST::Identifier)
131
+ if union.discriminant.type.is_a?(AST::Typespecs::Int)
132
+ member = union.resolved_case(acase)
133
+ "#{member.value}"
134
+ else
135
+ '"' + member_name(acase.value) + '"'
136
+ end
137
+ else
138
+ acase.value.text_value
139
+ end
140
+
141
+ out.puts "[#{switch}, #{arm_name}],"
142
+ end
143
+ end
144
+ end
145
+
146
+ out.puts "],"
147
+ out.puts "arms: {"
148
+
149
+ out.indent do
150
+ union.arms.each do |arm|
151
+ next if arm.void?
152
+ out.puts "#{member_name arm}: #{reference arm.type},"
153
+ end
154
+ end
155
+
156
+ out.puts "},"
157
+
158
+ if union.default_arm.present?
159
+ arm = union.default_arm
160
+ arm_name = arm.void? ? "xdr.void()" : member_name(arm)
161
+ out.puts "defaultArm: #{arm_name},"
162
+ end
163
+
164
+ end
165
+ out.puts "});"
166
+ end
167
+
168
+ private
169
+ def name(named)
170
+ parent = name named.parent_defn if named.is_a?(AST::Concerns::NestedDefinition)
171
+
172
+ # NOTE: classify will strip plurality, so we restore it if necessary
173
+ plural = named.name.pluralize == named.name
174
+ base = named.name.underscore.classify
175
+ result = plural ? base.pluralize : base
176
+
177
+ "#{parent}#{result}"
178
+ end
179
+
180
+ def const_name(named)
181
+ # NOTE: classify will strip plurality, so we restore it if necessary
182
+ plural = named.name.pluralize == named.name
183
+ base = named.name.underscore.upcase
184
+ plural ? base.pluralize : base
185
+ end
186
+
187
+ def member_name(member)
188
+ name(member).camelize(:lower)
189
+ end
190
+
191
+ def reference(type)
192
+ baseReference = case type
193
+ when AST::Typespecs::Bool
194
+ "xdr.bool()"
195
+ when AST::Typespecs::Double
196
+ "xdr.double()"
197
+ when AST::Typespecs::Float
198
+ "xdr.float()"
199
+ when AST::Typespecs::Hyper
200
+ "xdr.hyper()"
201
+ when AST::Typespecs::Int
202
+ "xdr.int()"
203
+ when AST::Typespecs::Opaque
204
+ if type.fixed?
205
+ "xdr.opaque(#{type.size})"
206
+ else
207
+ "xdr.varOpaque(#{type.size})"
208
+ end
209
+ when AST::Typespecs::Quadruple
210
+ raise "no quadruple support for javascript"
211
+ when AST::Typespecs::String
212
+ "xdr.string(#{type.size})"
213
+ when AST::Typespecs::UnsignedHyper
214
+ "xdr.uhyper()"
215
+ when AST::Typespecs::UnsignedInt
216
+ "xdr.uint()"
217
+ when AST::Typespecs::Simple
218
+ "xdr.lookup(\"#{name type}\")"
219
+ when AST::Definitions::Base
220
+ "xdr.lookup(\"#{name type}\")"
221
+ when AST::Concerns::NestedDefinition
222
+ "xdr.lookup(\"#{name type}\")"
223
+ else
224
+ raise "Unknown reference type: #{type.class.name}, #{type.class.ancestors}"
225
+ end
226
+
227
+ case type.sub_type
228
+ when :simple
229
+ baseReference
230
+ when :optional
231
+ "xdr.option(#{baseReference})"
232
+ when :array
233
+ is_named, size = type.array_size
234
+ size = is_named ? "xdr.lookup(\"#{size}\")" : size
235
+ "xdr.array(#{baseReference}, #{size})"
236
+ when :var_array
237
+ is_named, size = type.array_size
238
+ size = is_named ? "xdr.lookup(\"#{size}\")" : (size || MAX_INT)
239
+ "xdr.varArray(#{baseReference}, #{size})"
240
+ else
241
+ raise "Unknown sub_type: #{type.sub_type}"
242
+ end
243
+
244
+ end
245
+
246
+ end
247
+ end
248
+ end