diff options
author | Rafael H. Schloming <rhs@apache.org> | 2008-05-15 17:52:22 +0000 |
---|---|---|
committer | Rafael H. Schloming <rhs@apache.org> | 2008-05-15 17:52:22 +0000 |
commit | 08351607dda4b0b40abd944b3d0844d51775fc0a (patch) | |
tree | abf66a44146f69133ffd65ab180eaddac127dba0 /java/common | |
parent | 36a62d9a903fa9eb219f87067fe6e9a223c0230b (diff) | |
download | qpid-python-08351607dda4b0b40abd944b3d0844d51775fc0a.tar.gz |
QPID-1062: phase 1 of improvements to 0-10 encode/decode; this inlines the read/write method of structs into generated code resulting in roughly a 2x improvement
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@656760 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/common')
-rw-r--r-- | java/common/Composite.tpl | 64 | ||||
-rw-r--r-- | java/common/genutil.py | 23 | ||||
-rw-r--r-- | java/common/src/main/java/org/apache/qpidity/transport/Struct.java | 74 |
3 files changed, 77 insertions, 84 deletions
diff --git a/java/common/Composite.tpl b/java/common/Composite.tpl index 4172ffdefc..4e1a54de81 100644 --- a/java/common/Composite.tpl +++ b/java/common/Composite.tpl @@ -170,4 +170,66 @@ for f in fields: }); } """) -}} +} + + public void write(Encoder enc) + { +${ +flag_count = 8*int(pack) +reserved_count = flag_count - len(fields) + +if pack > 0: + for f in fields: + if f.type == "boolean": + out(" enc.writeBit(this.$(f.name));\n") + else: + out(" enc.writeBit(this.has_$(f.name));\n") + for i in range(reserved_count): + out(" enc.writeBit(false);\n") + +for f in fields: + if f.type == "boolean": + continue + if pack > 0: + out(" if (this.has_$(f.name))\n ") + pre = "" + post = "" + if f.type_node.name == "struct": + pre = "%s.TYPE, " % cname(f.type_node) + elif f.type_node.name == "domain": + post = ".getValue()" + out(" enc.write$(f.coder)($(pre)this.$(f.name)$(post));\n") +} + } + + public void read(Decoder dec) + { +${ +if pack > 0: + for f in fields: + if f.type == "boolean": + out(" this.$(f.name) = dec.readBit();\n") + else: + out(" this.has_$(f.name) = dec.readBit();\n") + for i in range(reserved_count): + out(" dec.readBit();\n") + +for f in fields: + if f.type == "boolean": + continue + if pack > 0: + out(" if (this.has_$(f.name))\n ") + pre = "" + post = "" + arg = "" + if f.type_node.name == "struct": + pre = "(%s)" % cname(f.type_node) + arg = "%s.TYPE" % cname(f.type_node) + elif f.type_node.name == "domain": + pre = "%s.get(" % cname(f.type_node) + post = ")" + out(" this.$(f.name) = $(pre)dec.read$(f.coder)($(arg))$(post);\n") +} + } + +} diff --git a/java/common/genutil.py b/java/common/genutil.py index 5206b50bbd..4aba529182 100644 --- a/java/common/genutil.py +++ b/java/common/genutil.py @@ -147,20 +147,21 @@ class Field: def __init__(self, index, nd): self.index = index self.name = camel(1, nd["@name"]) - type_node = resolve_type(nd) - tname = cname(type_node) - if type_node.name == "struct": + self.type_node = resolve_type(nd) + tname = cname(self.type_node) + if self.type_node.name == "struct": self.read = "(%s) dec.readStruct(%s.TYPE)" % (tname, tname) self.write = "enc.writeStruct(%s.TYPE, check(struct).%s)" % (tname, self.name) - elif type_node.name == "domain": - coder = camel(0, resolve_type(type_node)["@name"]) - self.read = "%s.get(dec.read%s())" % (tname, coder) - self.write = "enc.write%s(check(struct).%s.getValue())" % (coder, self.name) + self.coder = "Struct" + elif self.type_node.name == "domain": + self.coder = camel(0, resolve_type(self.type_node)["@name"]) + self.read = "%s.get(dec.read%s())" % (tname, self.coder) + self.write = "enc.write%s(check(struct).%s.getValue())" % (self.coder, self.name) else: - coder = camel(0, type_node["@name"]) - self.read = "dec.read%s()" % coder - self.write = "enc.write%s(check(struct).%s)" % (coder, self.name) - self.type = jtype(type_node) + self.coder = camel(0, self.type_node["@name"]) + self.read = "dec.read%s()" % self.coder + self.write = "enc.write%s(check(struct).%s)" % (self.coder, self.name) + self.type = jtype(self.type_node) self.default = DEFAULTS.get(self.type, "null") self.has = camel(1, "has", self.name) self.get = camel(1, "get", self.name) diff --git a/java/common/src/main/java/org/apache/qpidity/transport/Struct.java b/java/common/src/main/java/org/apache/qpidity/transport/Struct.java index f901f9e840..9146f41535 100644 --- a/java/common/src/main/java/org/apache/qpidity/transport/Struct.java +++ b/java/common/src/main/java/org/apache/qpidity/transport/Struct.java @@ -108,79 +108,9 @@ public abstract class Struct implements Encodable return getFlagCount() - getFields().size(); } - public final void read(Decoder dec) - { - List<Field<?,?>> fields = getFields(); - - assert fields.size() <= getFlagCount(); - - if (packed()) - { - for (Field<?,?> f : fields) - { - if (isBit(f)) - { - f.has(this, true); - f.read(dec, this); - } - else - { - f.has(this, dec.readBit()); - } - } - - for (int i = 0; i < getReservedFlagCount(); i++) - { - if (dec.readBit()) - { - throw new IllegalStateException("reserved flag true"); - } - } - } - - for (Field<?,?> f : fields) - { - if (encoded(f)) - { - f.read(dec, this); - } - } - } - - public final void write(Encoder enc) - { - List<Field<?,?>> fields = getFields(); + public abstract void read(Decoder dec); - assert fields.size() <= getFlagCount(); - - if (packed()) - { - for (Field<?,?> f : fields) - { - if (isBit(f)) - { - f.write(enc, this); - } - else - { - enc.writeBit(f.has(this)); - } - } - - for (int i = 0; i < getReservedFlagCount(); i++) - { - enc.writeBit(false); - } - } - - for (Field<?,?> f : fields) - { - if (encoded(f)) - { - f.write(enc, this); - } - } - } + public abstract void write(Encoder enc); public String toString() { |