Index: mojo/nacl/sfi/nacl_bindings_generator/generate_nacl_bindings.py |
diff --git a/mojo/nacl/sfi/nacl_bindings_generator/generate_nacl_bindings.py b/mojo/nacl/sfi/nacl_bindings_generator/generate_nacl_bindings.py |
index de62359864a74c5761d5835157febec73ccaf867..00198269d88f5acaa413924bfb262db774c746b3 100755 |
--- a/mojo/nacl/sfi/nacl_bindings_generator/generate_nacl_bindings.py |
+++ b/mojo/nacl/sfi/nacl_bindings_generator/generate_nacl_bindings.py |
@@ -277,6 +277,7 @@ class PointerInOutImpl(ParamImpl): |
else: |
code << 'CopyOutPointer(nap, %s_value, %s_ptr);' % (name, name) |
+ |
class ArrayImpl(ParamImpl): |
def DeclareVars(self, code): |
code << '%s %s;' % (self.param.param_type, self.param.name) |
@@ -312,6 +313,24 @@ class ExtensibleStructInputImpl(ParamImpl): |
return self.param.name |
+# We can handle extensible out structs just like we handle output arrays, except |
+# that the (input buffer) size is always in bytes. |
+class ExtensibleStructOutputImpl(ParamImpl): |
+ def DeclareVars(self, code): |
+ code << '%s %s;' % (self.param.param_type, self.param.name) |
+ |
+ def ConvertParam(self): |
+ p = self.param |
+ return ('ConvertArray(nap, params[%d], %s, %s, %s, &%s)' % |
+ (p.uid + 1, p.size + '_value', '1', CBool(p.is_optional), p.name)) |
+ |
+ def CallParam(self): |
+ return self.param.name |
+ |
+ def IsArray(self): |
+ return True |
+ |
+ |
def ImplForParam(p): |
if p.IsScalar(): |
if p.is_output: |
@@ -338,6 +357,8 @@ def ImplForParam(p): |
elif p.is_struct: |
if p.is_input and not p.is_output and p.is_extensible: |
return ExtensibleStructInputImpl(p) |
+ if p.is_output and not p.is_input and p.is_extensible: |
+ return ExtensibleStructOutputImpl(p) |
if not p.is_input and p.is_output and not p.is_extensible: |
return ScalarOutputImpl(p) |
assert False, p.name |