Index: mojo/nacl/generator/interface_dsl.py |
diff --git a/mojo/nacl/generator/interface_dsl.py b/mojo/nacl/generator/interface_dsl.py |
index dfc85aa3914d7d7f85ac56bd9dcd4f96d22eaf18..193cdf2a25110c763d3c5a4c93b54fbd1fc19ee2 100644 |
--- a/mojo/nacl/generator/interface_dsl.py |
+++ b/mojo/nacl/generator/interface_dsl.py |
@@ -42,7 +42,7 @@ class Function(object): |
def Finalize(self): |
self.result_param = Param(self, len(self.params), 'result') |
- self.result_param.Out(self.return_type) |
+ self.result_param.Out(self.return_type).AlwaysWritten() |
class Param(object): |
def __init__(self, parent, uid, name, param_type=None): |
@@ -56,7 +56,9 @@ class Param(object): |
self.is_output = False |
self.is_array = False |
self.is_struct = False |
+ self.is_extensible = False |
self.is_optional = False |
+ self.is_always_written = False |
def GetSizeParam(self): |
assert self.size |
@@ -76,11 +78,16 @@ class Param(object): |
self.is_array = True |
return self |
- def InStruct(self, ty): |
+ # An "extensible" struct is one where we don't know the exact size - rather |
+ # the first 4 bytes of the struct declare the length of the struct. This |
+ # allows forwards and backwards compatibility with additive changes to the |
+ # structure definition. |
+ def InExtensibleStruct(self, ty): |
self.base_type = ty |
self.param_type = 'const struct ' + ty + '*' |
self.is_input = True |
self.is_struct = True |
+ self.is_extensible = True |
return self |
def InOut(self, ty): |
@@ -104,11 +111,26 @@ class Param(object): |
self.is_output = True |
return self |
+ # The size of the struct is fixed by the API, it cannot be extended. |
+ def OutFixedStruct(self, ty): |
+ self.base_type = ty |
+ self.param_type = 'struct ' + ty + '*' |
+ self.is_output = True |
+ self.is_struct = True |
+ self.is_extensible = False |
+ return self |
+ |
+ # Declares that it is valid to pass a null pointer. |
def Optional(self): |
assert not self.IsPassedByValue() |
self.is_optional = True |
return self |
+ def AlwaysWritten(self): |
+ assert self.is_output, self |
+ self.is_always_written = True |
+ return self |
+ |
def IsScalar(self): |
return not self.is_array and not self.is_struct |