summaryrefslogtreecommitdiff
path: root/java/common/genutil.py
diff options
context:
space:
mode:
authorRafael H. Schloming <rhs@apache.org>2008-06-03 17:54:45 +0000
committerRafael H. Schloming <rhs@apache.org>2008-06-03 17:54:45 +0000
commitf081132e845b3ae92aa08ef3996ec29a2f6de2ed (patch)
tree7b190b5429d1d0fd48f846f4a68f3c34fd33515d /java/common/genutil.py
parent83a3dc24856d12270c71fd56dd983769179e0727 (diff)
downloadqpid-python-f081132e845b3ae92aa08ef3996ec29a2f6de2ed.tar.gz
QPID-1062: modified generated code to keep packing flags in wire form and override commonly used size methods for improved performance
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@662849 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/common/genutil.py')
-rw-r--r--java/common/genutil.py55
1 files changed, 39 insertions, 16 deletions
diff --git a/java/common/genutil.py b/java/common/genutil.py
index dac0d65611..9636a91cc3 100644
--- a/java/common/genutil.py
+++ b/java/common/genutil.py
@@ -11,11 +11,11 @@ def dromedary(s):
def scream(*args):
return "_".join([a.replace("-", "_").upper() for a in args])
-def num(x):
+def num(x, default=None):
if x is not None and x != "":
return int(x, 0)
else:
- return None
+ return default
def klass(nd):
parent = nd.parent
@@ -53,24 +53,35 @@ def qname(nd):
else:
return name
+RESOLVED = {}
+
def resolve(node, name):
- spec = root(node)
- cls = klass(node)
- if cls:
- for nd in cls.query["#tag"]:
- if nd["@name"] == name:
+ key = (node, name)
+ if RESOLVED.has_key(key):
+ return RESOLVED[key]
+ else:
+ spec = root(node)
+ cls = klass(node)
+ if cls:
+ for nd in cls.query["#tag"]:
+ if nd["@name"] == name:
+ RESOLVED[key] = nd
+ return nd
+ for nd in spec.query["amqp/#tag"] + spec.query["amqp/class/#tag"]:
+ if name == qname(nd):
+ RESOLVED[key] = nd
return nd
- for nd in spec.query["amqp/#tag"] + spec.query["amqp/class/#tag"]:
- if name == qname(nd):
- return nd
- raise Exception("unresolved name: %s" % name)
+ raise Exception("unresolved name: %s" % name)
def resolve_type(nd):
- name = nd["@type"]
- type = resolve(nd, name)
- if type.name == "domain" and not type["enum"]:
- return resolve_type(type)
+ if hasattr(nd, "_resolved_type"):
+ return nd._resolved_type
else:
+ name = nd["@type"]
+ type = resolve(nd, name)
+ if type.name == "domain" and not type["enum"]:
+ type = resolve_type(type)
+ nd._resolved_type = type
return type
TYPES = {
@@ -148,6 +159,13 @@ class Field:
self.index = index
self.name = camel(1, nd["@name"])
self.type_node = resolve_type(nd)
+ if self.type_node.name == "domain":
+ self.prim_type = resolve_type(self.type_node)
+ else:
+ self.prim_type = self.type_node
+ self.variable_width = num(self.prim_type["@variable-width"], 0)
+ self.fixed_width = num(self.prim_type["@fixed-width"], 0)
+ self.empty = self.variable_width == 0 and self.fixed_width == 0 and self.prim_type.name != "struct"
tname = cname(self.type_node)
if self.type_node.name == "struct":
self.read = "(%s) dec.readStruct(%s.TYPE)" % (tname, tname)
@@ -155,7 +173,7 @@ class Field:
self.check = ""
self.coder = "Struct"
elif self.type_node.name == "domain":
- self.coder = camel(0, resolve_type(self.type_node)["@name"])
+ self.coder = camel(0, self.prim_type["@name"])
self.read = "%s.get(dec.read%s())" % (tname, self.coder)
self.write = "enc.write%s(check(struct).%s.getValue())" % (self.coder, self.name)
self.check = ""
@@ -175,6 +193,11 @@ class Field:
else:
self.option = None
+ def flag_mask(self, pack):
+ flag = pack * 8 - 8 - (self.index/8)*8 + (self.index % 8)
+ return 1 << flag
+
+
def get_fields(nd):
fields = []
index = 0