diff --git a/compiler/Java_CodeGen.jrag b/compiler/Java_CodeGen.jrag index e1a6ec47aee7454b6b1fce64e8d193439bfe2cf1..b0ff598c1d49d4442ebc25eae8b982de1d380495 100644 --- a/compiler/Java_CodeGen.jrag +++ b/compiler/Java_CodeGen.jrag @@ -346,6 +346,21 @@ aspect Java_Class { } } +// TODO: ? +// Code snippet for making samples of user types extend their type +// currently commented out. Is this a good idea? +// +// syn String Type.getTypeName(); +// eq Type.getTypeName() = getClass().getName(); +// eq PrimType.getTypeName() = getName(); +// eq UserType.getTypeName() = getName(); + +// syn boolean Type.isUserType(); +// eq Type.isUserType() = false; +// eq UserType.isUserType() = true; +// +// plus use some lines down + public void SampleDecl.Java_emitClass(Java_env env, String pack) { env.println("/* "); pp(env.getPrintStream()); @@ -362,7 +377,11 @@ aspect Java_Class { env.println("import se.lth.control.labcomm.LabCommHandler;"); env.println("import se.lth.control.labcomm.LabCommSample;"); env.println(); - env.println("public class " + getName() + " implements LabCommSample {"); + env.print("public class " + getName()); +// if(getType().isUserType()) { +// env.print(" extends "+getType().getTypeName()); +// } + env.println(" implements LabCommSample {"); env.println(); env.indent(); getType().Java_emitInstance(env); diff --git a/examples/dynamic/handlers2.txt b/examples/dynamic/handlers2.txt index efa3f75597929363ff3a64d2f75059b2ddcd40a7..be5e7f1a9b2962579b708b5eb9794c5279a2dca1 100644 --- a/examples/dynamic/handlers2.txt +++ b/examples/dynamic/handlers2.txt @@ -1,4 +1,4 @@ -foo:handler(foo value) { +foo:handler(foo_t value) { test.HandlerContext ctx = (test.HandlerContext)context; System.out.println("foo handler from handlers2.txt"); System.out.println("using context "+ctx.str); diff --git a/examples/dynamic/simple.lc b/examples/dynamic/simple.lc index 915cb44852c18396f0f5570bd873ac9584abc9d5..abdf856e6c1fa4b3969d7a2ff0b871961682b26c 100644 --- a/examples/dynamic/simple.lc +++ b/examples/dynamic/simple.lc @@ -1,8 +1,10 @@ -sample struct { +typedef struct { int x; int y; int z; -} foo; +} foo_t; + +sample foo_t foo; sample int bar; diff --git a/examples/dynamic/test/DynamicPart.java b/examples/dynamic/test/DynamicPart.java index 7489d4c1c02f092603ee88516b30250733fa1b3d..9768f00191a6199b2b4b70f96a7df6c40b37d2ac 100644 --- a/examples/dynamic/test/DynamicPart.java +++ b/examples/dynamic/test/DynamicPart.java @@ -29,6 +29,7 @@ import beaver.Parser.Exception; public class DynamicPart { + private static final String TYPE_NAME_FOO = "foo_t"; private static final String SAMPLE_NAME_FOO = "foo"; private static final String SAMPLE_NAME_BAR = "bar"; @@ -223,12 +224,15 @@ public class DynamicPart { while(i.hasNext()){ final String sampleName = i.next(); final String src = genCode.get(sampleName); - handlerClass.append(sampleName+".Handler"); - if(i.hasNext()) { - handlerClass.append(", "); + String handleM = handlers.get(sampleName); + if(handleM != null) { + handlerClass.append(sampleName+".Handler"); + if(i.hasNext()) { + handlerClass.append(", "); + } + handlerMethods.append(handleM); + handlerMethods.append("\n"); } - handlerMethods.append(handlers.get(sampleName)); - handlerMethods.append("\n"); // System.out.println("***"+sampleName+"\n"+src); irc.compile(sampleName, src); // while iterating, compile the labcomm generated code } @@ -298,18 +302,19 @@ public class DynamicPart { */ private void encodeTest(InRAMCompiler irc, HandlerContext ctxt, String tmpFile) { try { + Class ft = irc.load(TYPE_NAME_FOO); Class fc = irc.load(SAMPLE_NAME_FOO); Class bc = irc.load(SAMPLE_NAME_BAR); /* create sample class and instance objects */ - Object f = fc.newInstance(); + Object fv = ft.newInstance(); - Field x = fc.getDeclaredField("x"); - Field y = fc.getDeclaredField("y"); - Field z = fc.getDeclaredField("z"); - x.setInt(f, ctxt.x); - y.setInt(f, ctxt.y); - z.setInt(f, ctxt.z); + Field x = ft.getField("x"); + Field y = ft.getField("y"); + Field z = ft.getField("z"); + x.setInt(fv, ctxt.x); + y.setInt(fv, ctxt.y); + z.setInt(fv, ctxt.z); FileOutputStream out = new FileOutputStream(tmpFile); @@ -319,8 +324,8 @@ public class DynamicPart { Method regFoo = fc.getDeclaredMethod("register", LabCommEncoder.class); regFoo.invoke(fc, enc); - Method doEncodeFoo = fc.getDeclaredMethod("encode", LabCommEncoder.class, fc); - doEncodeFoo.invoke(fc, enc, f); + Method doEncodeFoo = fc.getDeclaredMethod("encode", LabCommEncoder.class, ft); + doEncodeFoo.invoke(fc, enc, fv); /* register and send bar (NB! uses primitive type int) */ Method regBar = bc.getDeclaredMethod("register", LabCommEncoder.class); @@ -343,17 +348,17 @@ public class DynamicPart { Constructor hcc = hc.getDeclaredConstructor(Object.class); // Object h = hc.newInstance(); Object h = hcc.newInstance(new HandlerContext()); - Class fc = irc.load(SAMPLE_NAME_FOO); - Object f = fc.newInstance(); - Field x = fc.getDeclaredField("x"); - Field y = fc.getDeclaredField("y"); - Field z = fc.getDeclaredField("z"); + Class ft = irc.load(TYPE_NAME_FOO); + Object f = ft.newInstance(); + Field x = ft.getDeclaredField("x"); + Field y = ft.getDeclaredField("y"); + Field z = ft.getDeclaredField("z"); x.setInt(f, 10); y.setInt(f, 11); z.setInt(f, 12); Method m; try { - m = hc.getDeclaredMethod("handle_"+SAMPLE_NAME_FOO, fc); + m = hc.getDeclaredMethod("handle_"+SAMPLE_NAME_FOO, ft); m.invoke(h, f); } catch (SecurityException e) { // TODO Auto-generated catch block diff --git a/examples/dynamic/test/StaticDecoder.java b/examples/dynamic/test/StaticDecoder.java index b3d74edf4c407397f2aae315b1899303ad27d6f9..c33dd9e9510b5761e232775a62a96608e6f0940a 100644 --- a/examples/dynamic/test/StaticDecoder.java +++ b/examples/dynamic/test/StaticDecoder.java @@ -1,5 +1,6 @@ package test; +import gen.foo_t; import gen.foo; import gen.bar; @@ -31,7 +32,7 @@ public class StaticDecoder implements foo.Handler, bar.Handler } - public void handle_foo(foo d) throws java.io.IOException { + public void handle_foo(foo_t d) throws java.io.IOException { System.out.println("Got foo, x="+d.x+", y="+d.y+", z="+d.z); } diff --git a/examples/dynamic/test/StaticEncoder.java b/examples/dynamic/test/StaticEncoder.java index 697f339e8335de34a4aef9f6bbdc3928d2c207f2..9f39fdd72ee02d5a9f66c775d7a89f886796851b 100644 --- a/examples/dynamic/test/StaticEncoder.java +++ b/examples/dynamic/test/StaticEncoder.java @@ -4,6 +4,7 @@ import java.io.FileOutputStream; import java.io.OutputStream; import se.lth.control.labcomm.LabCommEncoderChannel; +import gen.foo_t; import gen.foo; import gen.bar; @@ -20,7 +21,7 @@ public class StaticEncoder { } public void doEncode() throws java.io.IOException { - foo f = new foo(); + foo_t f = new foo_t(); f.x = 17; f.y = 42; f.z = 37; diff --git a/examples/dynamic/test/TestLabcommGen.java b/examples/dynamic/test/TestLabcommGen.java index 2679c8f85112d85408b625cb5d4281c7831b8f8d..9cc4eb8ad097e50f0cbb88441f839dee5c830b7d 100644 --- a/examples/dynamic/test/TestLabcommGen.java +++ b/examples/dynamic/test/TestLabcommGen.java @@ -29,6 +29,7 @@ import beaver.Parser.Exception; public class TestLabcommGen { + private static final String TYPE_NAME_FOO = "foo_t"; private static final String SAMPLE_NAME_FOO = "foo"; private static final String SAMPLE_NAME_BAR = "bar"; @@ -79,7 +80,7 @@ public class TestLabcommGen { if(irc != null) { System.out.println("*** Testing instantiation and invocation of Handler "); - dummyTest(irc); + //dummyTest(irc); String tmpFile = args[2]; System.out.println("*** Testing writing and reading file "+tmpFile); @@ -226,25 +227,35 @@ public class TestLabcommGen { try { while(i.hasNext()){ final String sampleName = i.next(); + System.out.println("sample: "+sampleName); final String src = genCode.get(sampleName); - handlerClass.append(sampleName+".Handler"); - if(i.hasNext()) { - handlerClass.append(", "); + String hctmp = handlers.get(sampleName); + if(hctmp != null) { + handlerClass.append(sampleName+".Handler"); + if(i.hasNext()) { + handlerClass.append(", "); + } + handlerMethods.append(hctmp); + handlerMethods.append("\n"); } - handlerMethods.append(handlers.get(sampleName)); - handlerMethods.append("\n"); + //System.out.println("FOOOO:"+sampleName+"++++"+hctmp); + //System.out.println("GOOO: "+sampleName+"----"+handlerMethods); System.out.println("***"+sampleName+"\n"+src); irc.compile(sampleName, src); // while iterating, compile the labcomm generated code } handlerClass.append("{\n"); - handlerClass.append(handlerAttributes); - handlerClass.append(handlerConstr); - handlerClass.append(handlerConstrCtxt); - handlerClass.append(handlerMethods.toString()); + if(handlerAttributes != null) + handlerClass.append(handlerAttributes); + if(handlerConstr != null) + handlerClass.append(handlerConstr); + if(handlerConstrCtxt != null) + handlerClass.append(handlerConstrCtxt); + if(handlerMethods != null) + handlerClass.append(handlerMethods.toString()); handlerClass.append("}\n"); - System.out.println("-------------------------------------"); + System.out.println("--- generated code to compile -------"+ handlerClassName); final String handlerSrc = handlerClass.toString(); System.out.println(handlerSrc); @@ -294,7 +305,7 @@ public class TestLabcommGen { sb.append("public class gen_"+sampleName+"Handler implements "+sampleName+".Handler {\n"); sb.append(handlers.get(sampleName)); sb.append("}\n"); - System.out.println("-------------------------------------"); + System.out.println("--- foo -----------------------------"); System.out.println(sb.toString()); try { irc.compile(sampleName, src); @@ -356,15 +367,16 @@ public class TestLabcommGen { */ private static void encodeTest(InRAMCompiler irc, String tmpFile) { try { + Class ft = irc.load(TYPE_NAME_FOO); Class fc = irc.load(SAMPLE_NAME_FOO); Class bc = irc.load(SAMPLE_NAME_BAR); /* create sample class and instance objects */ - Object f = fc.newInstance(); + Object f = ft.newInstance(); - Field x = fc.getDeclaredField("x"); - Field y = fc.getDeclaredField("y"); - Field z = fc.getDeclaredField("z"); + Field x = ft.getDeclaredField("x"); + Field y = ft.getDeclaredField("y"); + Field z = ft.getDeclaredField("z"); x.setInt(f, 10); y.setInt(f, 11); z.setInt(f, 12); @@ -377,7 +389,7 @@ public class TestLabcommGen { Method regFoo = fc.getDeclaredMethod("register", LabCommEncoder.class); regFoo.invoke(fc, enc); - Method doEncodeFoo = fc.getDeclaredMethod("encode", LabCommEncoder.class, fc); + Method doEncodeFoo = fc.getDeclaredMethod("encode", LabCommEncoder.class, ft); doEncodeFoo.invoke(fc, enc, f); /* register and send bar (NB! uses primitive type int) */