From 566e9ca8df4e93183bdc1be72fb8c80034dc15a0 Mon Sep 17 00:00:00 2001 From: Sven Gestegard Robertz <sven.robertz@cs.lth.se> Date: Fri, 6 Dec 2013 00:05:12 +0100 Subject: [PATCH] hacked dynamic test to handle user types --- compiler/Java_CodeGen.jrag | 21 ++++++++++- examples/dynamic/handlers2.txt | 2 +- examples/dynamic/simple.lc | 6 ++- examples/dynamic/test/DynamicPart.java | 45 ++++++++++++---------- examples/dynamic/test/StaticDecoder.java | 3 +- examples/dynamic/test/StaticEncoder.java | 3 +- examples/dynamic/test/TestLabcommGen.java | 46 ++++++++++++++--------- 7 files changed, 83 insertions(+), 43 deletions(-) diff --git a/compiler/Java_CodeGen.jrag b/compiler/Java_CodeGen.jrag index e1a6ec4..b0ff598 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 efa3f75..be5e7f1 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 915cb44..abdf856 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 7489d4c..9768f00 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 b3d74ed..c33dd9e 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 697f339..9f39fdd 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 2679c8f..9cc4eb8 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) */ -- GitLab