From 1a5a858030235b9205ee413603f43385431dcfab Mon Sep 17 00:00:00 2001
From: Anders Blomdell <anders.blomdell@control.lth.se>
Date: Thu, 26 Feb 2015 17:41:18 +0100
Subject: [PATCH] Typedefs for python

---
 compiler/2014/Python_CodeGen.jrag | 21 ++++++++++-----------
 lib/python/labcomm/LabComm.py     | 20 +++++++++++++++-----
 lib/python/labcomm/__init__.py    |  1 +
 test/test_encoder_decoder.py      |  9 +++++++--
 4 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/compiler/2014/Python_CodeGen.jrag b/compiler/2014/Python_CodeGen.jrag
index c454f92..68b9b95 100644
--- a/compiler/2014/Python_CodeGen.jrag
+++ b/compiler/2014/Python_CodeGen.jrag
@@ -84,13 +84,13 @@ aspect Python_CodeGen {
     env.println("import StringIO");
     env.println();
     Python_genTypes(env);
-    //env.println("typedef = [");
-    //env.indent();
-    //for (int i = 0 ; i < getNumDecl() ; i++) {
-    //  getDecl(i).Python_genTypedefListEntry(env);
-    //}
-    //env.unindent();
-    //env.println("]");
+    env.println("typedef = tuple([");
+    env.indent();
+    for (int i = 0 ; i < getNumDecl() ; i++) {
+      getDecl(i).Python_genTypedefListEntry(env);
+    }
+    env.unindent();
+    env.println("])");
     env.println("sample = tuple([");
     env.indent();
     for (int i = 0 ; i < getNumDecl() ; i++) {
@@ -117,7 +117,6 @@ aspect PythonTypes {
   }
 
   public void TypeDecl.Python_genSignature(Python_env env) {
-/*
     env.println("class " + getName() + "(object):");
     env.indent();
     env.println("signature = labcomm.typedef('" + getName() + "',");
@@ -127,7 +126,6 @@ aspect PythonTypes {
     env.println(")");
     env.unindent();
     env.println();
-*/
   }
 
   public void SampleDecl.Python_genSignature(Python_env env) {
@@ -143,7 +141,8 @@ aspect PythonTypes {
   }
 
   public void UserType.Python_genSignature(Python_env env) {
-    lookupType(getName()).getType().Python_genSignature(env);
+    env.println(getName() + ".signature");
+    // lookupType(getName()).getType().Python_genSignature(env);
   }
 
   public void Type.Python_genSignature(Python_env env) {
@@ -204,7 +203,7 @@ aspect PythonTypes {
   }
 
   public void TypeDecl.Python_genTypedefListEntry(Python_env env) {
-    env.println("('" + getName() + "', " + getName() + ".signature),");
+    env.println(getName() + ",");
   }
 
   public void Decl.Python_genSampleListEntry(Python_env env) {
diff --git a/lib/python/labcomm/LabComm.py b/lib/python/labcomm/LabComm.py
index 039d10b..208b92f 100644
--- a/lib/python/labcomm/LabComm.py
+++ b/lib/python/labcomm/LabComm.py
@@ -389,7 +389,7 @@ class SAMPLE(primitive):
 #
 # Aggregate types
 #
-class sample_def_or_ref(type_decl):
+class sampledef_or_sampleref_or_typedef(type_decl):
     def __init__(self, name=None, decl=None):
         self.name = name
         self.decl = decl
@@ -402,8 +402,8 @@ class sample_def_or_ref(type_decl):
             with length_encoder(e1) as e2:
                 self.decl.encode_decl(e2)
 
-    def encode(self, encoder, object):
-        self.decl.encode(encoder, object)
+    def encode(self, encoder, value):
+        self.decl.encode(encoder, value)
 
     def decode_decl(self, decoder):
         index = decoder.decode_type_number()
@@ -438,7 +438,7 @@ class sample_def_or_ref(type_decl):
     def __repr__(self):
         return "%s('%s', %s)" % (self.type_name, self.name, self.decl)
 
-class sample_def(sample_def_or_ref):
+class sample_def(sampledef_or_sampleref_or_typedef):
     type_index = i_SAMPLE_DEF
     type_name = 'sample'
 
@@ -448,7 +448,7 @@ class sample_def(sample_def_or_ref):
     def add_index(self, decoder, index, decl):
         decoder.add_decl(decl, index)
     
-class sample_ref(sample_def_or_ref):
+class sample_ref(sampledef_or_sampleref_or_typedef):
     type_index = i_SAMPLE_REF
     type_name = 'sample_ref'
     
@@ -466,6 +466,16 @@ class sample_ref(sample_def_or_ref):
     def add_index(self, decoder, index, decl):
         decoder.add_ref(decl, index)
 
+class typedef(sampledef_or_sampleref_or_typedef):
+    type_index = i_TYPE_DEF
+    type_name = 'typedef'
+
+    def encode_decl(self, encoder):
+        self.decl.encode_decl(encoder)
+
+    def encode(self, encoder, value):
+        self.decl.encode(encoder, value)
+
 class array(type_decl):
     def __init__(self, indices, decl):
         self.indices = tuple(indices)
diff --git a/lib/python/labcomm/__init__.py b/lib/python/labcomm/__init__.py
index 0c95e1d..fb2c085 100644
--- a/lib/python/labcomm/__init__.py
+++ b/lib/python/labcomm/__init__.py
@@ -9,6 +9,7 @@ Encoder = labcomm.LabComm.Encoder
 sample = labcomm.LabComm.sample_def
 sample_def = labcomm.LabComm.sample_def
 sample_ref = labcomm.LabComm.sample_ref
+typedef = labcomm.LabComm.typedef
 
 array = labcomm.LabComm.array
 struct = labcomm.LabComm.struct
diff --git a/test/test_encoder_decoder.py b/test/test_encoder_decoder.py
index 08a0c96..29960cb 100755
--- a/test/test_encoder_decoder.py
+++ b/test/test_encoder_decoder.py
@@ -53,6 +53,12 @@ class Test:
                 result.append((decl, values))
             return result
     
+        elif decl.__class__ == labcomm.typedef:
+            result = []
+            for values in self.generate(decl.decl):
+                result.append(values)
+            return result
+
         elif decl.__class__ == labcomm.struct:
             result = []
             if len(decl.field) == 0:
@@ -164,7 +170,6 @@ class Test:
             print>>sys.stderr, "Checking", signature.name,
             for decl,value in self.generate(signature):
                 sys.stderr.write('.')
-                #print name,decl,value,value.__class__
                 self.next.acquire()
                 self.received_value = None
                 self.received_decl = None
@@ -176,7 +181,7 @@ class Test:
                     self.failed = True
                 elif value != self.received_value:
                     print>>sys.stderr, "Coding error"
-                    print>>sys.stderr,value == self.received_value
+                    print>>sys.stderr, value == self.received_value
                     print>>sys.stderr, "Got:     ", self.received_value 
                     print>>sys.stderr, "         ", self.received_decl 
                     print>>sys.stderr, "Expected:", value
-- 
GitLab