diff --git a/compiler/2014/Python_CodeGen.jrag b/compiler/2014/Python_CodeGen.jrag index 17203b88ea5c2c0e833c791f4036189f16bf8b46..c454f92bdfaa4ecb26d76d22c54e887df695a390 100644 --- a/compiler/2014/Python_CodeGen.jrag +++ b/compiler/2014/Python_CodeGen.jrag @@ -91,13 +91,13 @@ aspect Python_CodeGen { //} //env.unindent(); //env.println("]"); - env.println("sample = ["); + env.println("sample = tuple(["); env.indent(); for (int i = 0 ; i < getNumDecl() ; i++) { getDecl(i).Python_genSampleListEntry(env); } env.unindent(); - env.println("]"); + env.println("])"); } } @@ -211,7 +211,7 @@ aspect PythonTypes { } public void SampleDecl.Python_genSampleListEntry(Python_env env) { - env.println("('" + getName() + "', " + getName() + ".signature),"); + env.println(getName()+ ","); } public String Exp.Python_getValue() { diff --git a/lib/python/labcomm/LabComm.py b/lib/python/labcomm/LabComm.py index 57f70f453f2582b0c6c9b9d9588df2eb50a6f84b..039d10bab682f826078fd13f2d1f2b43f620e3ad 100644 --- a/lib/python/labcomm/LabComm.py +++ b/lib/python/labcomm/LabComm.py @@ -219,10 +219,16 @@ class length_encoder: def indent(i, s): return ("\n%s" % (" " * i)).join(s.split("\n")) +# +# Base type for all decl's +# +class type_decl(object): + pass + # # Primitive types # -class primitive(object): +class primitive(type_decl): def decode_decl(self, decoder): return self @@ -383,7 +389,7 @@ class SAMPLE(primitive): # # Aggregate types # -class sample_def_or_ref(object): +class sample_def_or_ref(type_decl): def __init__(self, name=None, decl=None): self.name = name self.decl = decl @@ -460,7 +466,7 @@ class sample_ref(sample_def_or_ref): def add_index(self, decoder, index, decl): decoder.add_ref(decl, index) -class array(object): +class array(type_decl): def __init__(self, indices, decl): self.indices = tuple(indices) self.decl = decl @@ -587,7 +593,7 @@ class array(object): return "labcomm.array(%s,\n %s)" % ( self.indices, indent(4, self.decl.__repr__())) -class struct: +class struct(type_decl): def __init__(self, field): self.field = tuple(field) @@ -759,6 +765,8 @@ class Encoder(Codec): self.writer.write(packer.pack(format, *args)) def add_decl(self, decl, index=0): + if not isinstance(decl, type_decl): + decl = decl.signature if index == 0: self.writer.mark_begin(decl, None) if super(Encoder, self).add_decl(decl, index): @@ -766,6 +774,8 @@ class Encoder(Codec): self.writer.mark_end(decl, None) def add_ref(self, decl, index=0): + if not isinstance(decl, type_decl): + decl = decl.signature ref = sample_ref(name=decl.name, decl=decl.decl, sample=decl) if index == 0: self.writer.mark_begin(decl, None) @@ -777,6 +787,8 @@ class Encoder(Codec): if decl == None: name = self.type_to_name[object.__class__] decl = self.name_to_decl[name] + if not isinstance(decl, type_decl): + decl = decl.signature self.writer.mark_begin(decl, object) self.encode_type_number(decl) with length_encoder(self) as e: diff --git a/test/test_encoder_decoder.py b/test/test_encoder_decoder.py index 7f0fb8baedb2afcc0f81e6f09cda443d1e509dd6..08a0c968d532ac92df59b48968126775a725959c 100755 --- a/test/test_encoder_decoder.py +++ b/test/test_encoder_decoder.py @@ -37,7 +37,7 @@ def get_signatures(path): with fp as fp: m = imp.load_module('signatures', fp, pathname, description) pass - return m.sample + return map(lambda s: s.signature, m.sample) class Test: @@ -117,7 +117,7 @@ class Test: return ['string', u'sträng' ] elif decl.__class__ == labcomm.SAMPLE: - return [ s for n,s in self.signatures ] + return self.signatures print>>sys.stderr, decl raise Exception("unhandled decl %s" % decl.__class__) @@ -154,14 +154,14 @@ class Test: decoder = threading.Thread(target=self.decode, args=(p.stdout,)) decoder.start() encoder = labcomm.Encoder(labcomm.StreamWriter(p.stdin)) - for name,signature in self.signatures: + for signature in self.signatures: encoder.add_decl(signature) pass - if self.uses_refs([ s for n,s in self.signatures ]): - for name,signature in self.signatures: + if self.uses_refs(self.signatures): + for signature in self.signatures: encoder.add_ref(signature) - for name,signature in self.signatures: - print>>sys.stderr, "Checking", name, + for signature in self.signatures: + print>>sys.stderr, "Checking", signature.name, for decl,value in self.generate(signature): sys.stderr.write('.') #print name,decl,value,value.__class__