commit 6d4f1c42d72b881ea5b676291059d962ec9157a2 Author: Nick Mathewson nickm@torproject.org Date: Wed Sep 14 16:39:05 2016 -0400
Add const accessor functions taking const pointers. --- lib/trunnel/CodeGen.py | 51 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-)
diff --git a/lib/trunnel/CodeGen.py b/lib/trunnel/CodeGen.py index 69ba2e3..78a8991 100644 --- a/lib/trunnel/CodeGen.py +++ b/lib/trunnel/CodeGen.py @@ -1189,6 +1189,7 @@ class AccessorFnGenerator(CodeGenerator): """For a struct field 'FIELD' in a structure called 'TYPE', we generate these functions: TYPE_get_FIELD(x) + TYPE_getconst_FIELD(x) TYPE_set_FIELD(x, v) TYPE_set0_FIELD(x, v) The 'get' function returns the current value of the field in a @@ -1206,6 +1207,13 @@ class AccessorFnGenerator(CodeGenerator): self.w("{\n" " return inp->%s;\n" "}\n" % sms.c_name) + self.docstring("As %s_get_%s, but take and return a const pointer" + %(st,nm)) + self.declaration("const %s"%tp, + "%s_getconst_%s(const %s_t *inp)" % (st, nm, st)) + self.w("{\n" + " return %s_get_%s((%s_t*) inp);\n" + "}\n" %(st, nm, st))
self.docstring("Set the value of the %s field of the %s_t in 'inp' to " "'val'. Free the old value if any. Steals the reference" @@ -1236,8 +1244,10 @@ class AccessorFnGenerator(CodeGenerator): """For a fixed-length array field 'FIELD' in a structure called 'TYPE', we generate these functions: TYPE_get_FIELD(x, index) + TYPE_getconst_FIELD(x, index) TYPE_getlen_FIELD(x) TYPE_getarray_FIELD(x) + TYPE_getconstarray_FIELD(x) TYPE_set_FIELD(x, index, v) TYPE_set0_FIELD(x, index, v)
@@ -1255,10 +1265,12 @@ class AccessorFnGenerator(CodeGenerator): """ st = self.structName nm = sfa.c_fn_name + extraconst = "" if str(sfa.basetype) == 'char': elttype = 'char' elif type(sfa.basetype) == str: elttype = "struct %s_st *" % sfa.basetype + extraconst = " const " else: elttype = "uint%d_t" % sfa.basetype.width
@@ -1276,13 +1288,21 @@ class AccessorFnGenerator(CodeGenerator): self.docstring("""Return the element at position 'idx' of the fixed array field %s of the %s_t in 'inp'.""" % (nm, st)) - self.declaration(elttype, '%s_get_%s(const %s_t *inp, size_t idx)' + self.declaration(elttype, '%s_get_%s(%s_t *inp, size_t idx)' % (st, nm, st)) self.w("{\n" " trunnel_assert(idx < %s);\n" " return inp->%s[idx];\n" "}\n\n" % (sfa.width, sfa.c_name))
+ self.docstring("As %s_get_%s, but take and return a const pointer" + %(st,nm)) + self.declaration(extraconst+elttype, + "%s_getconst_%s(const %s_t *inp, size_t idx)" % (st, nm, st)) + self.w("{\n" + " return %s_get_%s((%s_t*)inp, idx);\n" + "}\n" %(st, nm, st)) + freestr = "" if type(sfa.basetype) == str: freestr = " Free the previous value, if any." @@ -1321,6 +1341,14 @@ class AccessorFnGenerator(CodeGenerator): " return inp->%s;\n" "}\n") % (sfa.c_name))
+ self.docstring("As %s_get_%s, but take and return a const pointer" + %(st,nm)) + self.declaration("const %s %s *"%(elttype,extraconst), + "%s_getconstarray_%s(const %s_t *inp)" % (st, nm, st)) + self.w("{\n" + " return (const %s %s *)%s_getarray_%s((%s_t*)inp);\n" + "}\n" %(elttype, extraconst, st, nm, st)) + def visitSMLenConstrained(self, sml): sml.visitChildren(self)
@@ -1339,8 +1367,10 @@ class AccessorFnGenerator(CodeGenerator): """For a variable-length array field 'FIELD' in a structure called 'TYPE', we generate these functions: TYPE_get_FIELD(x, index) + TYPE_getconst_FIELD(x, index) TYPE_getlen_FIELD(x) TYPE_getarray_FIELD(x) + TYPE_getconstarray_FIELD(x) TYPE_set_FIELD(x, index, v) TYPE_set0_FIELD(x, index, v)
@@ -1361,8 +1391,10 @@ class AccessorFnGenerator(CodeGenerator):
st = self.structName nm = sva.c_fn_name + extraconst = "" if type(sva.basetype) == str: elttype = "struct %s_st *" % sva.basetype + extraconst = " const " elif str(sva.basetype) == 'char': elttype = 'char' else: @@ -1391,6 +1423,14 @@ class AccessorFnGenerator(CodeGenerator): " return TRUNNEL_DYNARRAY_GET(&inp->%s, idx);\n" "}\n\n" % nm)
+ self.docstring("As %s_get_%s, but take and return a const pointer" + %(st,nm)) + self.declaration(extraconst+elttype, + "%s_getconst_%s(const %s_t *inp, size_t idx)" % (st, nm, st)) + self.w("{\n" + " return %s_get_%s((%s_t*)inp, idx);\n" + "}\n" %(st, nm, st)) + freestr = "" if type(sva.basetype) == str: freestr = " Free the previous value, if any." @@ -1448,6 +1488,13 @@ class AccessorFnGenerator(CodeGenerator): self.w(("{\n" " return inp->%s.elts_;\n" "}\n") % (sva.c_name)) + self.docstring("As %s_get_%s, but take and return a const pointer" + %(st,nm)) + self.declaration("const %s %s *"%(elttype,extraconst), + "%s_getconstarray_%s(const %s_t *inp)" % (st, nm, st)) + self.w("{\n" + " return (const %s %s *)%s_getarray_%s((%s_t*)inp);\n" + "}\n" %(elttype, extraconst, st, nm, st))
if type(sva.basetype) == str: fill = "Fill extra elements with NULL; free removed elements." @@ -1571,7 +1618,7 @@ class AccessorFnGenerator(CodeGenerator):
self.docstring( "Return the value of the %s field of the %s_t in 'inp'" % (nm, st)) - self.declaration("const char *", "%s_get_%s(%s_t *inp)" % (st, nm, st)) + self.declaration("const char *", "%s_get_%s(const %s_t *inp)" % (st, nm, st)) self.w("{\n" " return inp->%s;\n" "}\n" % sms.c_name)