From 0e0bb195d8e865418823c424e90b145ad40efa72 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 29 Apr 2017 09:50:09 +0100 Subject: [PATCH 001/433] Minor. --- .../src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr | 3 +++ modules/demos/scrib/fase16/src/fase16/adder/Adder.scr | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/core/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr b/modules/core/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr index 0fd3110f7..075473d87 100644 --- a/modules/core/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr +++ b/modules/core/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr @@ -1,3 +1,6 @@ +//$ bin/scribblec.sh modules/core/src/test/scrib/demo/supplierinfo/SupplierInfoNoFair.scr -umodelpng PartnershipSupplier test.png + + module src.SupplierInfoNoFair; diff --git a/modules/demos/scrib/fase16/src/fase16/adder/Adder.scr b/modules/demos/scrib/fase16/src/fase16/adder/Adder.scr index e992adf78..d3285be70 100644 --- a/modules/demos/scrib/fase16/src/fase16/adder/Adder.scr +++ b/modules/demos/scrib/fase16/src/fase16/adder/Adder.scr @@ -1,5 +1,5 @@ //$ bin/scribblec.sh -ip modules/demos/scrib/fase16/src -d modules/demos/scrib/fase16/src modules/demos/scrib/fase16/src/fase16/adder/Adder.scr -api Adder C -//$ javadoc -cp modules/core/target/classes';'modules/demos/target/classes modules/demos/scrib/fase16/src/fase16/adder/*.java -subpackages fase16.adder.Adder.Adder -d modules/demos/scrib/fase16/javadoc/adder +//$ javadoc -cp modules/core/target/classes';'modules/demos/target/classes';'modules/demos/scrib/fase16/src/ modules/demos/scrib/fase16/src/fase16/adder/Adder/Adder/*.java -subpackages fase16.adder.Adder.Adder -d modules/demos/scrib/fase16/javadoc/adder module fase16.adder.Adder; From 93b8d7873552df12f6eedebc27b44a84f397016d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 May 2017 17:45:59 +0100 Subject: [PATCH 002/433] Adding Go API generation. --- .../java/org/scribble/cli/CommandLine.java | 23 ++++++ .../scribble/cli/CommandLineArgParser.java | 7 ++ .../codegen/statetype/STAPIBuilder.java | 74 +++++++++++++++++++ .../scribble/codegen/statetype/STAction.java | 64 ++++++++++++++++ .../codegen/statetype/STActionBuilder.java | 30 ++++++++ .../codegen/statetype/STEndStateBuilder.java | 17 +++++ .../statetype/STOutputStateBuilder.java | 49 ++++++++++++ .../statetype/STReceiveActionBuilder.java | 6 ++ .../statetype/STReceiveStateBuilder.java | 36 +++++++++ .../statetype/STSendActionBuilder.java | 6 ++ .../scribble/codegen/statetype/STState.java | 65 ++++++++++++++++ .../codegen/statetype/STStateBuilder.java | 14 ++++ .../codegen/statetype/go/GSTAPIBuilder.java | 32 ++++++++ .../statetype/go/GSTEndStateBuilder.java | 25 +++++++ .../statetype/go/GSTOutputStateBuilder.java | 28 +++++++ .../statetype/go/GSTReceiveActionBuilder.java | 37 ++++++++++ .../statetype/go/GSTReceiveStateBuilder.java | 20 +++++ .../statetype/go/GSTSendActionBuilder.java | 35 +++++++++ .../src/main/java/org/scribble/main/Job.java | 11 +++ modules/core/src/test/scrib/tmp/Test.scr | 13 +--- 20 files changed, 582 insertions(+), 10 deletions(-) create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STAction.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveActionBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STSendActionBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STState.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java diff --git a/modules/cli/src/main/java/org/scribble/cli/CommandLine.java b/modules/cli/src/main/java/org/scribble/cli/CommandLine.java index 588668cf8..cc8a151af 100644 --- a/modules/cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/modules/cli/src/main/java/org/scribble/cli/CommandLine.java @@ -66,6 +66,8 @@ protected enum ArgFlag API_GEN, SESS_API_GEN, SCHAN_API_GEN, + + GO_API_GEN } private final Map args; // Maps each flag to list of associated argument values @@ -202,6 +204,11 @@ public void run() throws ScribbleException, CommandLineException, ScribParserExc { outputEndpointApi(job); } + + if (this.args.containsKey(ArgFlag.GO_API_GEN)) + { + outputGoApi(job); + } } catch (ScribbleException e) // Wouldn't need to do this if not Runnable (so maybe change) { @@ -331,6 +338,22 @@ private static SGraph getSGraph(Job job, GProtocolName fullname, boolean fair) t return model; } + + private void outputGoApi(Job job) throws ScribbleException, CommandLineException + { + JobContext jcontext = job.getContext(); + String[] args = this.args.get(ArgFlag.GO_API_GEN); + for (int i = 0; i < args.length; i += 2) + { + GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); + Role role = checkRoleArg(jcontext, fullname, args[i+1]); + Map goClasses = job.generateGoApi(fullname, role); + //Map goClasses = job.generateStateChannelApi(fullname, role, this.args.containsKey(ArgFlag.SCHAN_API_SUBTYPES)); + outputClasses(goClasses); + } + } + + private void outputEndpointApi(Job job) throws ScribbleException, CommandLineException { JobContext jcontext = job.getContext(); diff --git a/modules/cli/src/main/java/org/scribble/cli/CommandLineArgParser.java b/modules/cli/src/main/java/org/scribble/cli/CommandLineArgParser.java index 4e85ac082..282050116 100644 --- a/modules/cli/src/main/java/org/scribble/cli/CommandLineArgParser.java +++ b/modules/cli/src/main/java/org/scribble/cli/CommandLineArgParser.java @@ -43,6 +43,8 @@ public class CommandLineArgParser public static final String API_GEN_FLAG = "-api"; public static final String SESSION_API_GEN_FLAG = "-sessapi"; public static final String STATECHAN_API_GEN_FLAG = "-chanapi"; + + public static final String GO_API_GEN_FLAG = "-goapi"; private static final Map UNIQUE_FLAGS = new HashMap<>(); { @@ -79,6 +81,8 @@ public class CommandLineArgParser CommandLineArgParser.NON_UNIQUE_FLAGS.put(CommandLineArgParser.API_GEN_FLAG, CommandLine.ArgFlag.API_GEN); CommandLineArgParser.NON_UNIQUE_FLAGS.put(CommandLineArgParser.SESSION_API_GEN_FLAG, CommandLine.ArgFlag.SESS_API_GEN); CommandLineArgParser.NON_UNIQUE_FLAGS.put(CommandLineArgParser.STATECHAN_API_GEN_FLAG, CommandLine.ArgFlag.SCHAN_API_GEN); + + CommandLineArgParser.NON_UNIQUE_FLAGS.put(CommandLineArgParser.GO_API_GEN_FLAG, CommandLine.ArgFlag.GO_API_GEN); } private static final Map FLAGS = new HashMap<>(); @@ -203,6 +207,9 @@ private int parseFlag(int i) throws CommandLineException case CommandLineArgParser.UNFAIR_EFSM_FLAG: case CommandLineArgParser.API_GEN_FLAG: case CommandLineArgParser.STATECHAN_API_GEN_FLAG: + + case CommandLineArgParser.GO_API_GEN_FLAG: + { return parseProtoAndRoleArgs(flag, i); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java new file mode 100644 index 000000000..56d6a8488 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java @@ -0,0 +1,74 @@ +package org.scribble.codegen.statetype; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.scribble.model.MState; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; +import org.scribble.sesstype.name.GProtocolName; +import org.scribble.sesstype.name.Role; + +public abstract class STAPIBuilder +{ + public final GProtocolName gpn; + public final Role role; + + public final EGraph graph; + + private final STOutputStateBuilder ob; + private final STReceiveStateBuilder rb; + private final STEndStateBuilder eb; + + private Map names = new HashMap<>(); + + protected STAPIBuilder(GProtocolName gpn, Role role, EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, STEndStateBuilder eb) + { + this.gpn = gpn; + this.role = role; + this.graph = graph; + this.ob = ob; + this.rb = rb; + this.eb = eb; + } + + //public Map build() + public Map build() + { + Map api = new HashMap<>(); + Set states = new HashSet<>(); + states.add(this.graph.init); + states.addAll(MState.getReachableStates(this.graph.init)); + for (EState s : states) + { + switch (s.getStateKind()) + { + case ACCEPT: throw new RuntimeException("TODO"); + case OUTPUT: api.put(getFilePath(s), this.ob.build(this, s)); break; + case POLY_INPUT: throw new RuntimeException("TODO"); + case TERMINAL: api.put(getFilePath(s), this.eb.build(this, s)); break; + case UNARY_INPUT: api.put(getFilePath(s), this.rb.build(this, s)); break; + case WRAP_SERVER: throw new RuntimeException("TODO"); + default: throw new RuntimeException("Shouldn't get in here: " + s); + } + } + return api; + } + + public abstract String getFilePath(EState s); + + public String getSTStateName(EState s) + { + String name = this.names.get(s.id); + if (name == null) + { + name = makeSTStateName(s); + this.names.put(s.id, name); + } + return name; + } + + protected abstract String makeSTStateName(EState s); +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STAction.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STAction.java new file mode 100644 index 000000000..eeaa7b2a9 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STAction.java @@ -0,0 +1,64 @@ +package org.scribble.codegen.statetype; + +import java.util.List; + +import org.scribble.model.endpoint.actions.EAction; + +// Target method signature +public abstract class STAction +{ + //public final String name; // State type op name + //public final String target; // Target method name + public final EAction act; + + public STAction(EAction act)//, String ret) + { + //this.name = name; + this.act = act; + } + + /*private static List getArgs(EAction send) + { + List args = new LinkedList<>(); + args.add(send.obj.toString()); + args.add(send.mid.toString()); + send.payload.elems.stream().forEach((e) -> args.add(e.toString())); + return args; + }*/ + + public abstract String makeName(); + + public abstract List makeArgs(); + + public abstract String makeBody(); + + //public abstract > String makeRet(S curr, S succ); + public abstract String makeRet(STState curr, STState succ); + + /*@Override + public int hashCode() + { + int hash = 79; + hash = 31 * hash + this.name.hashCode(); + hash = 31 * hash + this.act.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof STAction)) + { + return false; + } + STAction a = (STAction) o; + return a.canEqual(this) && + this.name.equals(a.name) && this.act.equals(a.act);// && this.ret.equals(a.ret); + } + + public abstract boolean canEqual(Object o);*/ +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java new file mode 100644 index 000000000..ac4f20d13 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -0,0 +1,30 @@ +package org.scribble.codegen.statetype; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public abstract class STActionBuilder +{ + public abstract String getSTActionName(STAPIBuilder api, EAction a); + public abstract String buildArgs(EAction a); + public abstract String buildBody(STAPIBuilder api, EAction a, EState succ); + + public String buildReturn(STAPIBuilder api, EState succ) + { + return api.getSTStateName(succ); + } + + public String build(STAPIBuilder api, EState curr, EAction a) + { + EState succ = curr.getSuccessor(a); + return + "func (" + api.getSTStateName(curr) + ") " + getSTActionName(api, a) + "(" + + IntStream.range(0, a.payload.elems.size()).mapToObj(i -> "arg" + i + a.payload.elems.get(i)).collect(Collectors.joining(", ")) + + ") " + buildReturn(api, succ) + "{" + + "\n" + buildBody(api, a, succ) + + "\n}"; + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java new file mode 100644 index 000000000..1998630cb --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java @@ -0,0 +1,17 @@ +package org.scribble.codegen.statetype; + +import org.scribble.model.endpoint.EState; + +public abstract class STEndStateBuilder extends STStateBuilder +{ + public STEndStateBuilder() + { + + } + + @Override + public String build(STAPIBuilder api, EState s) + { + return getPreamble(api, s); + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java new file mode 100644 index 000000000..c44d0c732 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java @@ -0,0 +1,49 @@ +package org.scribble.codegen.statetype; + +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.endpoint.actions.EConnect; +import org.scribble.model.endpoint.actions.EDisconnect; +import org.scribble.model.endpoint.actions.ESend; + +public abstract class STOutputStateBuilder extends STStateBuilder +{ + protected final STSendActionBuilder sb; + + public STOutputStateBuilder(STSendActionBuilder sb) + { + this.sb = sb; + } + + @Override + public String build(STAPIBuilder api, EState s) + { + String out = getPreamble(api, s); + /*"package " + getPackage(gpn) + + "\n" + + "type " + getSTStateName(gpn, role, s) + " struct{}";*/ + + for (EAction a : s.getActions()) + { + out += "\n\n"; + if (a instanceof ESend) // FIXME: factor out action kind + { + out += this.sb.build(api, s, a); + } + else if (a instanceof EConnect) + { + throw new RuntimeException("TODO: " + a); + } + else if (a instanceof EDisconnect) + { + throw new RuntimeException("TODO: " + a); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + + return out; + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveActionBuilder.java new file mode 100644 index 000000000..832459de9 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveActionBuilder.java @@ -0,0 +1,6 @@ +package org.scribble.codegen.statetype; + +public abstract class STReceiveActionBuilder extends STActionBuilder +{ + +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java new file mode 100644 index 000000000..dd9858ef3 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java @@ -0,0 +1,36 @@ +package org.scribble.codegen.statetype; + +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.endpoint.actions.EReceive; + +public abstract class STReceiveStateBuilder extends STStateBuilder +{ + protected final STReceiveActionBuilder rb; + + public STReceiveStateBuilder(STReceiveActionBuilder rb) + { + this.rb = rb; + } + + @Override + public String build(STAPIBuilder api, EState s) + { + String out = getPreamble(api, s); + + for (EAction a : s.getActions()) + { + out += "\n\n"; + if (a instanceof EReceive) // FIXME: factor out action kind + { + out += this.rb.build(api, s, a); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + + return out; + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STSendActionBuilder.java new file mode 100644 index 000000000..5c84e8557 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STSendActionBuilder.java @@ -0,0 +1,6 @@ +package org.scribble.codegen.statetype; + +public abstract class STSendActionBuilder extends STActionBuilder +{ + +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STState.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STState.java new file mode 100644 index 000000000..c01cdc971 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STState.java @@ -0,0 +1,65 @@ +package org.scribble.codegen.statetype; + +import org.scribble.model.endpoint.EState; + +// Named state +// Directly maps each method signature to one state +public abstract class STState//> +{ + public final EState state; + + //public final String name; // State type name (typestate state) -- used as object id + //public final String type; // Fully-qualified host type name + + //public STState(String name, String type, Map actions) + public STState(EState state) + { + checkAPIGenConditions(state); + + this.state = state; + //this.name = name; + //this.type = type; + } + + private static void checkAPIGenConditions(EState state) + { + // TODO: e.g., determinstic + } + + public abstract String makeName(); + + public abstract String makeType(); + + /*public Map getActions() + { + return actions; + }*/ + + /*@Override + public int hashCode() + { + int hash = 83; + hash = 31 * hash + this.state.hashCode(); + //hash = 31 * hash + this.name.hashCode(); + hash = 31 * hash + this.type.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof STState)) + { + return false; + } + STState s = (STState) o; + //return s.canEqual(this) && this.name.equals(s.name); + return s.canEqual(this) && this.state.equals(s.state) && this.type.equals(s.type); + } + + protected abstract boolean canEqual(Object o);*/ +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java new file mode 100644 index 000000000..efd71ec42 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java @@ -0,0 +1,14 @@ +package org.scribble.codegen.statetype; + +import org.scribble.model.endpoint.EState; + +public abstract class STStateBuilder +{ + public String getPackage(STAPIBuilder api) + { + return api.gpn.toString(); + } + + public abstract String getPreamble(STAPIBuilder api, EState s); + public abstract String build(STAPIBuilder api, EState s); +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java new file mode 100644 index 000000000..c0019a06a --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java @@ -0,0 +1,32 @@ +package org.scribble.codegen.statetype.go; + +import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; +import org.scribble.sesstype.name.GProtocolName; +import org.scribble.sesstype.name.Role; + +public class GSTAPIBuilder extends STAPIBuilder +{ + private int counter = 1; + + public GSTAPIBuilder(GProtocolName gpn, Role role, EGraph graph) + { + super(gpn, role, graph, + new GSTOutputStateBuilder(new GSTSendActionBuilder()), + new GSTReceiveStateBuilder(new GSTReceiveActionBuilder()), + new GSTEndStateBuilder()); + } + + @Override + protected String makeSTStateName(EState s) + { + return s.isTerminal() ? "EndSocket" : this.gpn.getSimpleName() + "_" + role + "_" + this.counter++; + } + + @Override + public String getFilePath(EState s) + { + return this.gpn.toString().replaceAll("\\.", "/") + "/" + makeSTStateName(s) + ".go"; + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java new file mode 100644 index 000000000..bf0ce7294 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java @@ -0,0 +1,25 @@ +package org.scribble.codegen.statetype.go; + +import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STEndStateBuilder; +import org.scribble.model.endpoint.EState; + +public class GSTEndStateBuilder extends STEndStateBuilder +{ + public GSTEndStateBuilder() + { + + } + + @Override + public String build(STAPIBuilder api, EState s) + { + return getPreamble(api, s); + } + + @Override + public String getPreamble(STAPIBuilder api, EState s) + { + return GSTOutputStateBuilder.getPremable1(getPackage(api), api.getSTStateName(s)); + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java new file mode 100644 index 000000000..72761c7bd --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java @@ -0,0 +1,28 @@ +package org.scribble.codegen.statetype.go; + +import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STOutputStateBuilder; +import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.model.endpoint.EState; + +public class GSTOutputStateBuilder extends STOutputStateBuilder +{ + public GSTOutputStateBuilder(STSendActionBuilder sb) + { + super(sb); + } + + protected static String getPremable1(String pack, String statename) + { + return + "package " + pack + + "\n" + + "type " + statename + " struct{}"; + } + + @Override + public String getPreamble(STAPIBuilder api, EState s) + { + return getPremable1(getPackage(api), api.getSTStateName(s)); + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java new file mode 100644 index 000000000..1152a9ae7 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -0,0 +1,37 @@ +package org.scribble.codegen.statetype.go; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STReceiveActionBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class GSTReceiveActionBuilder extends STReceiveActionBuilder +{ + + @Override + public String getSTActionName(STAPIBuilder api, EAction a) + { + return "Recv_" + api.role + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> "arg" + i + " *" + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STAPIBuilder api, EAction a, EState succ) + { + return + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> "val" + i + " := <-role" + api.role + "," + a.peer + + "\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" + ).collect(Collectors.joining("\n")) + + "return " + buildReturn(api, succ); + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java new file mode 100644 index 000000000..964386804 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java @@ -0,0 +1,20 @@ +package org.scribble.codegen.statetype.go; + +import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STReceiveActionBuilder; +import org.scribble.codegen.statetype.STReceiveStateBuilder; +import org.scribble.model.endpoint.EState; + +public class GSTReceiveStateBuilder extends STReceiveStateBuilder +{ + public GSTReceiveStateBuilder(STReceiveActionBuilder rb) + { + super(rb); + } + + @Override + public String getPreamble(STAPIBuilder api, EState s) + { + return GSTOutputStateBuilder.getPremable1(getPackage(api), api.getSTStateName(s)); + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java new file mode 100644 index 000000000..8d8e955c0 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -0,0 +1,35 @@ +package org.scribble.codegen.statetype.go; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class GSTSendActionBuilder extends STSendActionBuilder +{ + + @Override + public String getSTActionName(STAPIBuilder api, EAction a) + { + return "Send_" + api.role + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> "arg" + i + " " + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STAPIBuilder api, EAction a, EState succ) + { + return + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> "role" + api.role + "," + a.peer + " <- arg" + i).collect(Collectors.joining("\n")) + + "return " + buildReturn(api, succ); + } +} diff --git a/modules/core/src/main/java/org/scribble/main/Job.java b/modules/core/src/main/java/org/scribble/main/Job.java index 7a3928f34..facbc865b 100644 --- a/modules/core/src/main/java/org/scribble/main/Job.java +++ b/modules/core/src/main/java/org/scribble/main/Job.java @@ -11,6 +11,7 @@ import org.scribble.codegen.java.endpointapi.SessionApiGenerator; import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; import org.scribble.codegen.java.endpointapi.ioifaces.IOInterfacesGenerator; +import org.scribble.codegen.statetype.go.GSTAPIBuilder; import org.scribble.del.local.LProtocolDeclDel; import org.scribble.sesstype.name.GProtocolName; import org.scribble.sesstype.name.LProtocolName; @@ -157,6 +158,16 @@ public Map generateSessionApi(GProtocolName fullname) throws Scr Map map = sg.generateApi(); // filepath -> class source return map; } + + + public Map generateGoApi(GProtocolName fullname, Role self) throws ScribbleException + { + debugPrintPass("Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); + GSTAPIBuilder apigen = new GSTAPIBuilder(fullname, self, this.jcontext.getEGraph(fullname, self)); + Map api = apigen.build(); // filepath -> source + return api; + } + // FIXME: refactor an EndpointApiGenerator -- ? public Map generateStateChannelApi(GProtocolName fullname, Role self, boolean subtypes) throws ScribbleException diff --git a/modules/core/src/test/scrib/tmp/Test.scr b/modules/core/src/test/scrib/tmp/Test.scr index 77fe5fc6c..23652c68b 100644 --- a/modules/core/src/test/scrib/tmp/Test.scr +++ b/modules/core/src/test/scrib/tmp/Test.scr @@ -34,17 +34,10 @@ module Test; -explicit global protocol Proto1(role A, role B) +global protocol Proto1(role A, role B) { - choice at A - { - 1() connect A to B; - } - or - { - 2() connect A to B; - } - 2() connect A to B; + 1() from A to B; + 2() from B to A; } From 0cc26b132ee5883fd62fff57096d9ad417ba1642 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 May 2017 18:33:47 +0100 Subject: [PATCH 003/433] Adding Go API generation. --- .../codegen/statetype/STAPIBuilder.java | 16 ++++- .../codegen/statetype/STActionBuilder.java | 2 +- .../codegen/statetype/STStateBuilder.java | 5 -- .../codegen/statetype/go/GSTAPIBuilder.java | 67 ++++++++++++++++++- .../statetype/go/GSTEndStateBuilder.java | 2 +- .../statetype/go/GSTOutputStateBuilder.java | 2 +- .../statetype/go/GSTReceiveActionBuilder.java | 5 +- .../statetype/go/GSTReceiveStateBuilder.java | 2 +- .../statetype/go/GSTSendActionBuilder.java | 5 +- .../src/main/java/org/scribble/main/Job.java | 3 +- 10 files changed, 90 insertions(+), 19 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java index 56d6a8488..c1f40b8f4 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.Set; +import org.scribble.main.Job; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; @@ -13,6 +14,8 @@ public abstract class STAPIBuilder { + protected final Job job; + public final GProtocolName gpn; public final Role role; @@ -24,8 +27,9 @@ public abstract class STAPIBuilder private Map names = new HashMap<>(); - protected STAPIBuilder(GProtocolName gpn, Role role, EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, STEndStateBuilder eb) + protected STAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, STEndStateBuilder eb) { + this.job = job; this.gpn = gpn; this.role = role; this.graph = graph; @@ -34,8 +38,9 @@ protected STAPIBuilder(GProtocolName gpn, Role role, EGraph graph, STOutputState this.eb = eb; } - //public Map build() - public Map build() + public abstract Map buildSessionAPI(); // filepath -> source // FIXME: factor out + + public Map build() // filepath -> source { Map api = new HashMap<>(); Set states = new HashSet<>(); @@ -58,6 +63,11 @@ public Map build() } public abstract String getFilePath(EState s); + + public String getPackage() + { + return this.gpn.toString(); + } public String getSTStateName(EState s) { diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index ac4f20d13..bb4669de4 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -23,7 +23,7 @@ public String build(STAPIBuilder api, EState curr, EAction a) return "func (" + api.getSTStateName(curr) + ") " + getSTActionName(api, a) + "(" + IntStream.range(0, a.payload.elems.size()).mapToObj(i -> "arg" + i + a.payload.elems.get(i)).collect(Collectors.joining(", ")) - + ") " + buildReturn(api, succ) + "{" + + ") " + buildReturn(api, succ) + " {" + "\n" + buildBody(api, a, succ) + "\n}"; } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java index efd71ec42..d17cdaf90 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java @@ -4,11 +4,6 @@ public abstract class STStateBuilder { - public String getPackage(STAPIBuilder api) - { - return api.gpn.toString(); - } - public abstract String getPreamble(STAPIBuilder api, EState s); public abstract String build(STAPIBuilder api, EState s); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java index c0019a06a..78667e9f8 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java @@ -1,6 +1,12 @@ package org.scribble.codegen.statetype.go; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.main.Job; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; import org.scribble.sesstype.name.GProtocolName; @@ -10,9 +16,9 @@ public class GSTAPIBuilder extends STAPIBuilder { private int counter = 1; - public GSTAPIBuilder(GProtocolName gpn, Role role, EGraph graph) + public GSTAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) { - super(gpn, role, graph, + super(job, gpn, role, graph, new GSTOutputStateBuilder(new GSTSendActionBuilder()), new GSTReceiveStateBuilder(new GSTReceiveActionBuilder()), new GSTEndStateBuilder()); @@ -29,4 +35,61 @@ public String getFilePath(EState s) { return this.gpn.toString().replaceAll("\\.", "/") + "/" + makeSTStateName(s) + ".go"; } + + @Override + public Map buildSessionAPI() + { + Map res = new HashMap<>(); + List roles = this.job.getContext().getModule(this.gpn.getPrefix()).getProtocolDecl(this.gpn.getSimpleName()).header.roledecls.getRoles(); + + // endpoints + String endpoints = + "package " + getPackage() + "\n" + + roles.stream().map(r -> + "type endpoint" + r + " struct {\n" + + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + " chan T").collect(Collectors.joining("\n")) + "\n" + + "}\n" + + "\n" + + "func (ep endpoint" + r + ") Close() error {\n" + + roles.stream().filter(rr -> rr.toString().compareTo(r.toString()) > 0).map(rr -> "close(ep" + "." + rr).collect(Collectors.joining("\n")) + + "return nil\n" + + "}\n" + + "\n" + + "var role" + r + " endpoint" + r + ).collect(Collectors.joining("\n\n")); + res.put(this.gpn.toString().replaceAll("\\.", "/") + "/endpoints.go", endpoints); + + // roles + for (Role r : roles) + { + String init = getSTStateName(this.graph.init); + String role = + "package " + getPackage() + "\n" + + "\n" + + "import \"io\"\n" + + "\n" + + "func New" + r + "(" + + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + " chan T").collect(Collectors.joining(", ")) + + ") (" + init + ", io.Closer) {\n" + + "role" + r + " = endpoint" + r + "{\n" + + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + ": " + rr).collect(Collectors.joining(",\n")) + "\n" + + "}\n" + + "return " + init + "{}, role" + r; + res.put(this.gpn.toString().replaceAll("\\.", "/") + "/role_" + r + ".go", role); + } + + // labels + String labels = + "package " + getPackage() + "\n"; + res.put(this.gpn.toString().replaceAll("\\.", "/") + "/types.go", labels); + + // types + String types = + "package " + getPackage() + "\n" + + "\n" + + "type T interface {}"; + res.put(this.gpn.toString().replaceAll("\\.", "/") + "/types.go", types); + + return res; + } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java index bf0ce7294..79e4fac94 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java @@ -20,6 +20,6 @@ public String build(STAPIBuilder api, EState s) @Override public String getPreamble(STAPIBuilder api, EState s) { - return GSTOutputStateBuilder.getPremable1(getPackage(api), api.getSTStateName(s)); + return GSTOutputStateBuilder.getPremable1(api.getPackage(), api.getSTStateName(s)); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java index 72761c7bd..ef11ae4e6 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java @@ -23,6 +23,6 @@ protected static String getPremable1(String pack, String statename) @Override public String getPreamble(STAPIBuilder api, EState s) { - return getPremable1(getPackage(api), api.getSTStateName(s)); + return getPremable1(api.getPackage(), api.getSTStateName(s)); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java index 1152a9ae7..95b3eb902 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -28,8 +28,9 @@ public String buildArgs(EAction a) public String buildBody(STAPIBuilder api, EAction a, EState succ) { return - IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "val" + i + " := <-role" + api.role + "," + a.peer + "val op := <-role" + api.role + "." + a.peer + "\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> "val" + i + " := <-role" + api.role + "." + a.peer + "\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" ).collect(Collectors.joining("\n")) + "return " + buildReturn(api, succ); diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java index 964386804..2f3cb33df 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java @@ -15,6 +15,6 @@ public GSTReceiveStateBuilder(STReceiveActionBuilder rb) @Override public String getPreamble(STAPIBuilder api, EState s) { - return GSTOutputStateBuilder.getPremable1(getPackage(api), api.getSTStateName(s)); + return GSTOutputStateBuilder.getPremable1(api.getPackage(), api.getSTStateName(s)); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index 8d8e955c0..dd185672a 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -28,8 +28,9 @@ public String buildArgs(EAction a) public String buildBody(STAPIBuilder api, EAction a, EState succ) { return - IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "role" + api.role + "," + a.peer + " <- arg" + i).collect(Collectors.joining("\n")) + "role" + api.role + "." + a.peer + "<-" + a.mid + "\n" // FIXME: op type + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> "role" + api.role + "." + a.peer + " <- arg" + i).collect(Collectors.joining("\n")) + "return " + buildReturn(api, succ); } } diff --git a/modules/core/src/main/java/org/scribble/main/Job.java b/modules/core/src/main/java/org/scribble/main/Job.java index facbc865b..a6ad3ca10 100644 --- a/modules/core/src/main/java/org/scribble/main/Job.java +++ b/modules/core/src/main/java/org/scribble/main/Job.java @@ -163,8 +163,9 @@ public Map generateSessionApi(GProtocolName fullname) throws Scr public Map generateGoApi(GProtocolName fullname, Role self) throws ScribbleException { debugPrintPass("Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); - GSTAPIBuilder apigen = new GSTAPIBuilder(fullname, self, this.jcontext.getEGraph(fullname, self)); + GSTAPIBuilder apigen = new GSTAPIBuilder(this, fullname, self, this.jcontext.getEGraph(fullname, self)); Map api = apigen.build(); // filepath -> source + api.putAll(apigen.buildSessionAPI()); return api; } From 2e5b53bf55913a8e8086df02d700c66d18063cce Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 May 2017 19:47:29 +0100 Subject: [PATCH 004/433] Added initial go API test. --- .../codegen/statetype/STAPIBuilder.java | 6 +- .../codegen/statetype/STActionBuilder.java | 5 +- .../codegen/statetype/go/GSTAPIBuilder.java | 17 ++++-- .../statetype/go/GSTReceiveActionBuilder.java | 9 +-- .../statetype/go/GSTSendActionBuilder.java | 8 +-- modules/core/src/test/go/tmp/Test.scr | 18 ++++++ modules/core/src/test/go/tmp/main.go | 58 +++++++++++++++++++ modules/core/src/test/scrib/tmp/Test.scr | 3 +- 8 files changed, 102 insertions(+), 22 deletions(-) create mode 100755 modules/core/src/test/go/tmp/Test.scr create mode 100755 modules/core/src/test/go/tmp/main.go diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java index c1f40b8f4..94870ed5e 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java @@ -64,10 +64,7 @@ public Map build() // filepath -> source public abstract String getFilePath(EState s); - public String getPackage() - { - return this.gpn.toString(); - } + public abstract String getPackage(); public String getSTStateName(EState s) { @@ -80,5 +77,6 @@ public String getSTStateName(EState s) return name; } + // Should only be called from getSTStateName protected abstract String makeSTStateName(EState s); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index bb4669de4..3f41fa6b3 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -1,8 +1,5 @@ package org.scribble.codegen.statetype; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -22,7 +19,7 @@ public String build(STAPIBuilder api, EState curr, EAction a) EState succ = curr.getSuccessor(a); return "func (" + api.getSTStateName(curr) + ") " + getSTActionName(api, a) + "(" - + IntStream.range(0, a.payload.elems.size()).mapToObj(i -> "arg" + i + a.payload.elems.get(i)).collect(Collectors.joining(", ")) + + buildArgs(a) + ") " + buildReturn(api, succ) + " {" + "\n" + buildBody(api, a, succ) + "\n}"; diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java index 78667e9f8..9627adab4 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java @@ -23,6 +23,12 @@ public GSTAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) new GSTReceiveStateBuilder(new GSTReceiveActionBuilder()), new GSTEndStateBuilder()); } + + @Override + public String getPackage() + { + return this.gpn.getSimpleName().toString(); + } @Override protected String makeSTStateName(EState s) @@ -33,7 +39,7 @@ protected String makeSTStateName(EState s) @Override public String getFilePath(EState s) { - return this.gpn.toString().replaceAll("\\.", "/") + "/" + makeSTStateName(s) + ".go"; + return this.gpn.toString().replaceAll("\\.", "/") + "/" + getSTStateName(s) + ".go"; } @Override @@ -51,7 +57,7 @@ public Map buildSessionAPI() + "}\n" + "\n" + "func (ep endpoint" + r + ") Close() error {\n" - + roles.stream().filter(rr -> rr.toString().compareTo(r.toString()) > 0).map(rr -> "close(ep" + "." + rr).collect(Collectors.joining("\n")) + + roles.stream().filter(rr -> rr.toString().compareTo(r.toString()) > 0).map(rr -> "close(ep" + "." + rr + ")").collect(Collectors.joining("\n")) + "\n" + "return nil\n" + "}\n" + "\n" @@ -62,7 +68,7 @@ public Map buildSessionAPI() // roles for (Role r : roles) { - String init = getSTStateName(this.graph.init); + String init = this.gpn.getSimpleName() + "_" + r + "_" + 1; // FIXME: factor out naming scheme String role = "package " + getPackage() + "\n" + "\n" @@ -72,9 +78,10 @@ public Map buildSessionAPI() + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + " chan T").collect(Collectors.joining(", ")) + ") (" + init + ", io.Closer) {\n" + "role" + r + " = endpoint" + r + "{\n" - + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + ": " + rr).collect(Collectors.joining(",\n")) + "\n" + + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + ": " + rr).collect(Collectors.joining(",\n")) + ",\n" + "}\n" - + "return " + init + "{}, role" + r; + + "return " + init + "{}, role" + r + "\n" + + "}"; res.put(this.gpn.toString().replaceAll("\\.", "/") + "/role_" + r + ".go", role); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java index 95b3eb902..dc9e47377 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -14,7 +14,7 @@ public class GSTReceiveActionBuilder extends STReceiveActionBuilder @Override public String getSTActionName(STAPIBuilder api, EAction a) { - return "Recv_" + api.role + "_" + a.mid; + return "Recv_" + a.peer + "_" + a.mid; } @Override @@ -28,11 +28,12 @@ public String buildArgs(EAction a) public String buildBody(STAPIBuilder api, EAction a, EState succ) { return - "val op := <-role" + api.role + "." + a.peer + "\n" + //"op := + "<-role" + api.role + "." + a.peer + "\n" + IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> "val" + i + " := <-role" + api.role + "." + a.peer + "\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" - ).collect(Collectors.joining("\n")) - + "return " + buildReturn(api, succ); + ).collect(Collectors.joining("\n")) + "\n" + + "return " + buildReturn(api, succ) + "{}"; } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index dd185672a..dd38467e8 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -14,7 +14,7 @@ public class GSTSendActionBuilder extends STSendActionBuilder @Override public String getSTActionName(STAPIBuilder api, EAction a) { - return "Send_" + api.role + "_" + a.mid; + return "Send_" + a.peer + "_" + a.mid; } @Override @@ -28,9 +28,9 @@ public String buildArgs(EAction a) public String buildBody(STAPIBuilder api, EAction a, EState succ) { return - "role" + api.role + "." + a.peer + "<-" + a.mid + "\n" // FIXME: op type + "role" + api.role + "." + a.peer + "<- \"" + a.mid + "\"\n" // FIXME: op type + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "role" + api.role + "." + a.peer + " <- arg" + i).collect(Collectors.joining("\n")) - + "return " + buildReturn(api, succ); + .mapToObj(i -> "role" + api.role + "." + a.peer + "<- arg" + i).collect(Collectors.joining("\n")) + "\n" + + "return " + buildReturn(api, succ) + "{}"; } } diff --git a/modules/core/src/test/go/tmp/Test.scr b/modules/core/src/test/go/tmp/Test.scr new file mode 100755 index 000000000..b2082ceb6 --- /dev/null +++ b/modules/core/src/test/go/tmp/Test.scr @@ -0,0 +1,18 @@ +//Raymond@HZHL3 ~/code/scribble-java/scribble-java +//$ bin/scribblec.sh -ip modules/core/src/test/go/ -d modules/core/src/test/go modules/core/src/test/go/tmp/Test.scr -goapi Proto1 A + + +//http://sandbox.kidstrythisathome.com/erdos/ + + +module tmp.Test; + + +type "int" from "..." as int; + + +global protocol Proto1(role A, role B) +{ + 1(int) from A to B; + 2(int) from B to A; +} diff --git a/modules/core/src/test/go/tmp/main.go b/modules/core/src/test/go/tmp/main.go new file mode 100755 index 000000000..bb022b83d --- /dev/null +++ b/modules/core/src/test/go/tmp/main.go @@ -0,0 +1,58 @@ +//$ go build +//$ ./tmp.exe + + +package main; + + +import ( + "log" + "sync" + + "./Test/Proto1" +) + + +var ( + barrier = new(sync.WaitGroup) +) + + +func main() { + log.Println("chan transport") + barrier.Add(2) + + AB := make(chan Proto1.T) + + go RunA(AB) + go RunB(AB) + + barrier.Wait() +} + +func RunA(AB chan Proto1.T) { + log.Println("A: start") + defer barrier.Done() + + A, endA := Proto1.NewA(AB) + defer endA.Close() + var y int + + A.Send_B_1(1234).Recv_B_2(&y) + + log.Println("A: received form B:", y) +} + + +func RunB(BA chan Proto1.T) { + log.Println("B: start") + defer barrier.Done() + + B, endB := Proto1.NewB(BA) + defer endB.Close() + var x int + + B.Recv_A_1(&x).Send_A_2(x * 2) + + log.Println("B: received from A:", x) +} \ No newline at end of file diff --git a/modules/core/src/test/scrib/tmp/Test.scr b/modules/core/src/test/scrib/tmp/Test.scr index 23652c68b..958fb2ae6 100644 --- a/modules/core/src/test/scrib/tmp/Test.scr +++ b/modules/core/src/test/scrib/tmp/Test.scr @@ -9,7 +9,8 @@ //http://sandbox.kidstrythisathome.com/erdos/ -module Test; +module Test; // N.B. not using tmp.Test for this module + // replace a lot of FACTORY name calls by clone // -minlts states IDs don't match validation output From d39fc95290cb23a39475ee983cf1d916b722c02a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 19 May 2017 22:23:44 +0100 Subject: [PATCH 005/433] Minor to go API test. --- modules/core/src/test/go/{ => scrib}/tmp/Test.scr | 6 ++++-- modules/core/src/test/go/{ => scrib}/tmp/main.go | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) rename modules/core/src/test/go/{ => scrib}/tmp/Test.scr (52%) rename modules/core/src/test/go/{ => scrib}/tmp/main.go (77%) diff --git a/modules/core/src/test/go/tmp/Test.scr b/modules/core/src/test/go/scrib/tmp/Test.scr similarity index 52% rename from modules/core/src/test/go/tmp/Test.scr rename to modules/core/src/test/go/scrib/tmp/Test.scr index b2082ceb6..3f66b1583 100755 --- a/modules/core/src/test/go/tmp/Test.scr +++ b/modules/core/src/test/go/scrib/tmp/Test.scr @@ -1,11 +1,13 @@ //Raymond@HZHL3 ~/code/scribble-java/scribble-java -//$ bin/scribblec.sh -ip modules/core/src/test/go/ -d modules/core/src/test/go modules/core/src/test/go/tmp/Test.scr -goapi Proto1 A +//$ bin/scribblec.sh -ip modules/core/src/test/go/ -d modules/core/src/test/go modules/core/src/test/go/scrib/tmp/Test.scr -goapi Proto1 A + +//$ bin/scribblec.sh -ip modules/core/src/test/go/ -d ../scribble-go-output/src modules/core/src/test/go/scrib/tmp/Test.scr -goapi Proto1 A //http://sandbox.kidstrythisathome.com/erdos/ -module tmp.Test; +module scrib.tmp.Test; type "int" from "..." as int; diff --git a/modules/core/src/test/go/tmp/main.go b/modules/core/src/test/go/scrib/tmp/main.go similarity index 77% rename from modules/core/src/test/go/tmp/main.go rename to modules/core/src/test/go/scrib/tmp/main.go index bb022b83d..67583b33f 100755 --- a/modules/core/src/test/go/tmp/main.go +++ b/modules/core/src/test/go/scrib/tmp/main.go @@ -1,3 +1,4 @@ +//$Raymond@HZHL3 ~/code/scribble-neon/github-rhu1-go/scribble-java/modules/core/src/test/go/scrib/tmp //$ go build //$ ./tmp.exe @@ -9,7 +10,7 @@ import ( "log" "sync" - "./Test/Proto1" + "scrib/tmp/Test/Proto1" ) @@ -38,6 +39,8 @@ func RunA(AB chan Proto1.T) { defer endA.Close() var y int + A.Sen + A.Send_B_1(1234).Recv_B_2(&y) log.Println("A: received form B:", y) From cea43d70a2d54f194f47203a827211ace23f03da Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 May 2017 02:38:13 +0100 Subject: [PATCH 006/433] Minor. --- modules/core/src/test/go/scrib/tmp/Test.scr | 20 ------- modules/core/src/test/go/scrib/tmp/main.go | 61 --------------------- 2 files changed, 81 deletions(-) delete mode 100755 modules/core/src/test/go/scrib/tmp/Test.scr delete mode 100755 modules/core/src/test/go/scrib/tmp/main.go diff --git a/modules/core/src/test/go/scrib/tmp/Test.scr b/modules/core/src/test/go/scrib/tmp/Test.scr deleted file mode 100755 index 3f66b1583..000000000 --- a/modules/core/src/test/go/scrib/tmp/Test.scr +++ /dev/null @@ -1,20 +0,0 @@ -//Raymond@HZHL3 ~/code/scribble-java/scribble-java -//$ bin/scribblec.sh -ip modules/core/src/test/go/ -d modules/core/src/test/go modules/core/src/test/go/scrib/tmp/Test.scr -goapi Proto1 A - -//$ bin/scribblec.sh -ip modules/core/src/test/go/ -d ../scribble-go-output/src modules/core/src/test/go/scrib/tmp/Test.scr -goapi Proto1 A - - -//http://sandbox.kidstrythisathome.com/erdos/ - - -module scrib.tmp.Test; - - -type "int" from "..." as int; - - -global protocol Proto1(role A, role B) -{ - 1(int) from A to B; - 2(int) from B to A; -} diff --git a/modules/core/src/test/go/scrib/tmp/main.go b/modules/core/src/test/go/scrib/tmp/main.go deleted file mode 100755 index 67583b33f..000000000 --- a/modules/core/src/test/go/scrib/tmp/main.go +++ /dev/null @@ -1,61 +0,0 @@ -//$Raymond@HZHL3 ~/code/scribble-neon/github-rhu1-go/scribble-java/modules/core/src/test/go/scrib/tmp -//$ go build -//$ ./tmp.exe - - -package main; - - -import ( - "log" - "sync" - - "scrib/tmp/Test/Proto1" -) - - -var ( - barrier = new(sync.WaitGroup) -) - - -func main() { - log.Println("chan transport") - barrier.Add(2) - - AB := make(chan Proto1.T) - - go RunA(AB) - go RunB(AB) - - barrier.Wait() -} - -func RunA(AB chan Proto1.T) { - log.Println("A: start") - defer barrier.Done() - - A, endA := Proto1.NewA(AB) - defer endA.Close() - var y int - - A.Sen - - A.Send_B_1(1234).Recv_B_2(&y) - - log.Println("A: received form B:", y) -} - - -func RunB(BA chan Proto1.T) { - log.Println("B: start") - defer barrier.Done() - - B, endB := Proto1.NewB(BA) - defer endB.Close() - var x int - - B.Recv_A_1(&x).Send_A_2(x * 2) - - log.Println("B: received from A:", x) -} \ No newline at end of file From b2df2a4422ed22f395f71f79d70363f6c11f83b6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 May 2017 04:15:32 +0100 Subject: [PATCH 007/433] Adding Go branch API generation. --- .../codegen/statetype/STAPIBuilder.java | 23 +++++++--- .../codegen/statetype/STActionBuilder.java | 15 ++++--- .../statetype/STBranchActionBuilder.java | 6 +++ .../statetype/STBranchStateBuilder.java | 24 ++++++++++ .../statetype/STCaseActionBuilder.java | 6 +++ .../codegen/statetype/STCaseBuilder.java | 36 +++++++++++++++ .../statetype/STReceiveStateBuilder.java | 18 +++----- .../codegen/statetype/go/GSTAPIBuilder.java | 41 +++++++++++++++-- .../statetype/go/GSTBranchActionBuilder.java | 45 +++++++++++++++++++ .../statetype/go/GSTBranchStateBuilder.java | 31 +++++++++++++ .../statetype/go/GSTCaseActionBuilder.java | 44 ++++++++++++++++++ .../codegen/statetype/go/GSTCaseBuilder.java | 30 +++++++++++++ .../statetype/go/GSTEndStateBuilder.java | 2 +- .../statetype/go/GSTOutputStateBuilder.java | 13 ++++-- .../statetype/go/GSTReceiveActionBuilder.java | 4 +- .../statetype/go/GSTReceiveStateBuilder.java | 2 +- .../statetype/go/GSTSendActionBuilder.java | 4 +- 17 files changed, 308 insertions(+), 36 deletions(-) create mode 100755 modules/core/src/main/java/org/scribble/codegen/statetype/STBranchActionBuilder.java create mode 100755 modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java create mode 100755 modules/core/src/main/java/org/scribble/codegen/statetype/STCaseActionBuilder.java create mode 100755 modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java create mode 100755 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java create mode 100755 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java create mode 100755 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java create mode 100755 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java index 94870ed5e..8e688e2e9 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java @@ -23,18 +23,24 @@ public abstract class STAPIBuilder private final STOutputStateBuilder ob; private final STReceiveStateBuilder rb; + private final STBranchStateBuilder bb; + private final STCaseBuilder cb; private final STEndStateBuilder eb; private Map names = new HashMap<>(); - protected STAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, STEndStateBuilder eb) + protected STAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph, + STOutputStateBuilder ob, STReceiveStateBuilder rb, STBranchStateBuilder bb, STCaseBuilder cb, STEndStateBuilder eb) { this.job = job; this.gpn = gpn; this.role = role; this.graph = graph; + this.ob = ob; this.rb = rb; + this.bb = bb; + this.cb = cb; this.eb = eb; } @@ -51,10 +57,15 @@ public Map build() // filepath -> source switch (s.getStateKind()) { case ACCEPT: throw new RuntimeException("TODO"); - case OUTPUT: api.put(getFilePath(s), this.ob.build(this, s)); break; - case POLY_INPUT: throw new RuntimeException("TODO"); - case TERMINAL: api.put(getFilePath(s), this.eb.build(this, s)); break; - case UNARY_INPUT: api.put(getFilePath(s), this.rb.build(this, s)); break; + case OUTPUT: api.put(getFilePath(getSTStateName(s)), this.ob.build(this, s)); break; + case POLY_INPUT: + { + api.put(getFilePath(getSTStateName(s)), this.bb.build(this, s)); + api.put(getFilePath(getSTStateName(s) + "_Cases"), this.cb.build(this, s)); // FIXME: factor out + break; + } + case TERMINAL: api.put(getFilePath(getSTStateName(s)), this.eb.build(this, s)); break; + case UNARY_INPUT: api.put(getFilePath(getSTStateName(s)), this.rb.build(this, s)); break; case WRAP_SERVER: throw new RuntimeException("TODO"); default: throw new RuntimeException("Shouldn't get in here: " + s); } @@ -62,7 +73,7 @@ public Map build() // filepath -> source return api; } - public abstract String getFilePath(EState s); + public abstract String getFilePath(String name); public abstract String getPackage(); diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index 3f41fa6b3..0f1504ecc 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -7,9 +7,9 @@ public abstract class STActionBuilder { public abstract String getSTActionName(STAPIBuilder api, EAction a); public abstract String buildArgs(EAction a); - public abstract String buildBody(STAPIBuilder api, EAction a, EState succ); + public abstract String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ); - public String buildReturn(STAPIBuilder api, EState succ) + public String buildReturn(EState curr, STAPIBuilder api, EState succ) { return api.getSTStateName(succ); } @@ -18,10 +18,15 @@ public String build(STAPIBuilder api, EState curr, EAction a) { EState succ = curr.getSuccessor(a); return - "func (" + api.getSTStateName(curr) + ") " + getSTActionName(api, a) + "(" + "func (" + getType(api, curr, a) + ") " + getSTActionName(api, a) + "(" + buildArgs(a) - + ") " + buildReturn(api, succ) + " {" - + "\n" + buildBody(api, a, succ) + + ") " + buildReturn(curr, api, succ) + " {" + + "\n" + buildBody(api, curr, a, succ) + "\n}"; } + + protected String getType(STAPIBuilder api, EState curr, EAction a) + { + return api.getSTStateName(curr); + } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchActionBuilder.java new file mode 100755 index 000000000..80319e54f --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchActionBuilder.java @@ -0,0 +1,6 @@ +package org.scribble.codegen.statetype; + +public abstract class STBranchActionBuilder extends STActionBuilder +{ + +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java new file mode 100755 index 000000000..2fa096d5f --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java @@ -0,0 +1,24 @@ +package org.scribble.codegen.statetype; + +import org.scribble.model.endpoint.EState; + +public abstract class STBranchStateBuilder extends STStateBuilder +{ + protected final STBranchActionBuilder bb; + + public STBranchStateBuilder(STBranchActionBuilder bb) + { + this.bb = bb; + } + + @Override + public String build(STAPIBuilder api, EState s) + { + String out = getPreamble(api, s); + + out += "\n\n"; + out += this.bb.build(api, s, s.getActions().get(1)); // Getting 1 checks non-unary + + return out; + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseActionBuilder.java new file mode 100755 index 000000000..c4c2140ee --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseActionBuilder.java @@ -0,0 +1,6 @@ +package org.scribble.codegen.statetype; + +public abstract class STCaseActionBuilder extends STActionBuilder +{ + +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java new file mode 100755 index 000000000..5cb31877c --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java @@ -0,0 +1,36 @@ +package org.scribble.codegen.statetype; + +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.endpoint.actions.EReceive; + +public abstract class STCaseBuilder extends STStateBuilder // Is a distinct type but not a state -- OK for now +{ + protected final STCaseActionBuilder cb; + + public STCaseBuilder(STCaseActionBuilder cb) + { + this.cb = cb; + } + + @Override + public String build(STAPIBuilder api, EState s) + { + String out = getPreamble(api, s); + + for (EAction a : s.getActions()) + { + out += "\n\n"; + if (a instanceof EReceive) // FIXME: factor out action kind + { + out += this.cb.build(api, s, a); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + + return out; + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java index dd9858ef3..53b5a0f30 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java @@ -1,8 +1,9 @@ package org.scribble.codegen.statetype; +import java.util.List; + import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.model.endpoint.actions.EReceive; public abstract class STReceiveStateBuilder extends STStateBuilder { @@ -18,18 +19,13 @@ public String build(STAPIBuilder api, EState s) { String out = getPreamble(api, s); - for (EAction a : s.getActions()) + List as = s.getActions(); + if (as.size() > 1) { - out += "\n\n"; - if (a instanceof EReceive) // FIXME: factor out action kind - { - out += this.rb.build(api, s, a); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + a); - } + throw new RuntimeException("Shouldn't get in here: " + as); } + out += "\n\n"; + out += this.rb.build(api, s, as.get(0)); return out; } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java index 9627adab4..29882b772 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java @@ -3,14 +3,23 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; +import org.scribble.ast.Module; +import org.scribble.ast.ProtocolDecl; import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.del.ModuleDel; import org.scribble.main.Job; +import org.scribble.main.RuntimeScribbleException; +import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; +import org.scribble.sesstype.kind.Global; import org.scribble.sesstype.name.GProtocolName; +import org.scribble.sesstype.name.MessageId; import org.scribble.sesstype.name.Role; +import org.scribble.visit.util.MessageIdCollector; public class GSTAPIBuilder extends STAPIBuilder { @@ -21,6 +30,8 @@ public GSTAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) super(job, gpn, role, graph, new GSTOutputStateBuilder(new GSTSendActionBuilder()), new GSTReceiveStateBuilder(new GSTReceiveActionBuilder()), + new GSTBranchStateBuilder(new GSTBranchActionBuilder()), + new GSTCaseBuilder(new GSTCaseActionBuilder()), new GSTEndStateBuilder()); } @@ -37,16 +48,31 @@ protected String makeSTStateName(EState s) } @Override - public String getFilePath(EState s) + public String getFilePath(String name) { - return this.gpn.toString().replaceAll("\\.", "/") + "/" + getSTStateName(s) + ".go"; + return this.gpn.toString().replaceAll("\\.", "/") + "/" + name + ".go"; } @Override public Map buildSessionAPI() { + Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); + GProtocolName simpname = this.gpn.getSimpleName(); + ProtocolDecl gpd = mod.getProtocolDecl(simpname); + MessageIdCollector coll = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); + try + { + gpd.accept(coll); + } + catch (ScribbleException e) + { + throw new RuntimeScribbleException(e); + } + + List roles = gpd.header.roledecls.getRoles(); + Set> mids = coll.getNames(); + Map res = new HashMap<>(); - List roles = this.job.getContext().getModule(this.gpn.getPrefix()).getProtocolDecl(this.gpn.getSimpleName()).header.roledecls.getRoles(); // endpoints String endpoints = @@ -88,7 +114,14 @@ public Map buildSessionAPI() // labels String labels = "package " + getPackage() + "\n"; - res.put(this.gpn.toString().replaceAll("\\.", "/") + "/types.go", labels); + /*for (MessageId mid : mids) + { + labels += + "\ntype op" + mid + " string\n" + + "\n" + + "const " + mid + " op" + mid + " = \"" + mid + "\"\n"; + }*/ + res.put(this.gpn.toString().replaceAll("\\.", "/") + "/labels.go", labels); // types String types = diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java new file mode 100755 index 000000000..20d45327b --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -0,0 +1,45 @@ +package org.scribble.codegen.statetype.go; + +import java.util.stream.Collectors; + +import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STBranchActionBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class GSTBranchActionBuilder extends STBranchActionBuilder +{ + + @Override + public String getSTActionName(STAPIBuilder api, EAction a) + { + return "Branch_" + a.peer; + } + + @Override + public String buildArgs(EAction a) + { + return ""; + } + + @Override + public String buildReturn(EState curr, STAPIBuilder api, EState succ) + { + return api.getSTStateName(curr) + "_Cases"; // FIXME: factor out + } + + @Override + public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) + { + return + "tmp := <-role" + api.role + "." + a.peer + "\n" + + "op := tmp.(" + api.getSTStateName(curr) + "_Enum)\n" // FIXME: factor out + + "switch op {\n" + + curr.getActions().stream().map(x -> + "case " + x.mid + ":\n" + + "return " + x.mid +"_{}\n" + ).collect(Collectors.joining("")) + + "}\n" + + "return nil"; // FIXME: panic instead + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java new file mode 100755 index 000000000..40844ad6d --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java @@ -0,0 +1,31 @@ +package org.scribble.codegen.statetype.go; + +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STBranchStateBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class GSTBranchStateBuilder extends STBranchStateBuilder +{ + public GSTBranchStateBuilder(GSTBranchActionBuilder bb) + { + super(bb); + } + + @Override + public String getPreamble(STAPIBuilder api, EState s) + { + List as = s.getActions(); + return GSTOutputStateBuilder.getPremable1(api, s) + + "\n" + + " type " + api.getSTStateName(s) + "_Enum int\n" + + "\n" + + "const (\n" + + as.get(0).mid.toString() + " " + api.getSTStateName(s) + "_Enum = iota \n" + + as.subList(1, as.size()).stream().map(a -> a.mid.toString()).collect(Collectors.joining("\n")) + "\n" + + ")"; + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java new file mode 100755 index 000000000..6143505a5 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java @@ -0,0 +1,44 @@ +package org.scribble.codegen.statetype.go; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STCaseActionBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class GSTCaseActionBuilder extends STCaseActionBuilder +{ + + @Override + public String getSTActionName(STAPIBuilder api, EAction a) + { + return "Recv_" + a.peer + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> "arg" + i + " *" + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) + { + return + "<-role" + api.role + "." + a.peer + "\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> "val" + i + " := <-role" + api.role + "." + a.peer + + "\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" + ).collect(Collectors.joining("\n")) + "\n" + + "return " + buildReturn(null, api, succ) + "{}"; + } + + @Override + protected String getType(STAPIBuilder api, EState curr, EAction a) + { + return a.mid + "_"; // FIXME: factor out + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java new file mode 100755 index 000000000..3965e891c --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -0,0 +1,30 @@ +package org.scribble.codegen.statetype.go; + +import java.util.stream.Collectors; + +import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STCaseBuilder; +import org.scribble.model.endpoint.EState; + +public class GSTCaseBuilder extends STCaseBuilder +{ + public GSTCaseBuilder(GSTCaseActionBuilder cb) + { + super(cb); + } + + @Override + public String getPreamble(STAPIBuilder api, EState s) + { + return GSTOutputStateBuilder.getPackageDecl(api) + "\n" + + "\n" + + "type " + api.getSTStateName(s) + "_Cases interface {\n" + + api.getSTStateName(s) + "_Case()\n" // FIXME: factor out + + "}\n" + + s.getActions().stream().map(a -> + "\ntype " + a.mid + "_ struct{}\n" // FIXME: factor out + + "\n" + + "func (" + a.mid + "_ " + ") " + api.getSTStateName(s) + "_Case() {}\n" // FIXME: factor out + ).collect(Collectors.joining("")) + "\n"; + } +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java index 79e4fac94..51495dc77 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java @@ -20,6 +20,6 @@ public String build(STAPIBuilder api, EState s) @Override public String getPreamble(STAPIBuilder api, EState s) { - return GSTOutputStateBuilder.getPremable1(api.getPackage(), api.getSTStateName(s)); + return GSTOutputStateBuilder.getPremable1(api, s); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java index ef11ae4e6..5b1128502 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java @@ -12,17 +12,22 @@ public GSTOutputStateBuilder(STSendActionBuilder sb) super(sb); } - protected static String getPremable1(String pack, String statename) + protected static String getPackageDecl(STAPIBuilder api) + { + return "package " + api.getPackage(); + } + + protected static String getPremable1(STAPIBuilder api, EState s) { return - "package " + pack + getPackageDecl(api) + "\n" + "\n" - + "type " + statename + " struct{}"; + + "type " + api.getSTStateName(s) + " struct{}"; } @Override public String getPreamble(STAPIBuilder api, EState s) { - return getPremable1(api.getPackage(), api.getSTStateName(s)); + return getPremable1(api, s); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java index dc9e47377..c1756608e 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -25,7 +25,7 @@ public String buildArgs(EAction a) } @Override - public String buildBody(STAPIBuilder api, EAction a, EState succ) + public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) { return //"op := @@ -34,6 +34,6 @@ public String buildBody(STAPIBuilder api, EAction a, EState succ) .mapToObj(i -> "val" + i + " := <-role" + api.role + "." + a.peer + "\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" ).collect(Collectors.joining("\n")) + "\n" - + "return " + buildReturn(api, succ) + "{}"; + + "return " + buildReturn(null, api, succ) + "{}"; } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java index 2f3cb33df..9e2513f1a 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java @@ -15,6 +15,6 @@ public GSTReceiveStateBuilder(STReceiveActionBuilder rb) @Override public String getPreamble(STAPIBuilder api, EState s) { - return GSTOutputStateBuilder.getPremable1(api.getPackage(), api.getSTStateName(s)); + return GSTOutputStateBuilder.getPremable1(api, s); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index dd38467e8..ab85a2b88 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -25,12 +25,12 @@ public String buildArgs(EAction a) } @Override - public String buildBody(STAPIBuilder api, EAction a, EState succ) + public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) { return "role" + api.role + "." + a.peer + "<- \"" + a.mid + "\"\n" // FIXME: op type + IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> "role" + api.role + "." + a.peer + "<- arg" + i).collect(Collectors.joining("\n")) + "\n" - + "return " + buildReturn(api, succ) + "{}"; + + "return " + buildReturn(null, api, succ) + "{}"; } } From 2a7a3a925feccd87fcfc190fd7f73808eca2310e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 May 2017 04:37:32 +0100 Subject: [PATCH 008/433] Continued on Go branch API. --- .../statetype/go/GSTBranchActionBuilder.java | 6 +++--- .../codegen/statetype/go/GSTBranchStateBuilder.java | 5 +++-- .../codegen/statetype/go/GSTCaseActionBuilder.java | 5 ++--- .../codegen/statetype/go/GSTCaseBuilder.java | 13 ++++++++++--- .../codegen/statetype/go/GSTSendActionBuilder.java | 2 +- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index 20d45327b..874b6d737 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -25,7 +25,7 @@ public String buildArgs(EAction a) @Override public String buildReturn(EState curr, STAPIBuilder api, EState succ) { - return api.getSTStateName(curr) + "_Cases"; // FIXME: factor out + return api.getSTStateName(curr) + "_Cases"; // FIXME: factor out with case builder } @Override @@ -33,11 +33,11 @@ public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) { return "tmp := <-role" + api.role + "." + a.peer + "\n" - + "op := tmp.(" + api.getSTStateName(curr) + "_Enum)\n" // FIXME: factor out + + "op := tmp.(" + api.getSTStateName(curr) + "_Enum)\n" // FIXME: factor out with branch state builder + "switch op {\n" + curr.getActions().stream().map(x -> "case " + x.mid + ":\n" - + "return " + x.mid +"_{}\n" + + "return " + GSTCaseBuilder.getOpTypeName(x.mid) +"{}\n" // FIXME: factor out ).collect(Collectors.joining("")) + "}\n" + "return nil"; // FIXME: panic instead diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java index 40844ad6d..ad00d3a84 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java @@ -18,13 +18,14 @@ public GSTBranchStateBuilder(GSTBranchActionBuilder bb) @Override public String getPreamble(STAPIBuilder api, EState s) { + String ename = api.getSTStateName(s) + "_Enum"; // FIXME: factor out with branch action builder List as = s.getActions(); return GSTOutputStateBuilder.getPremable1(api, s) + "\n" - + " type " + api.getSTStateName(s) + "_Enum int\n" + + " type " + ename + " int\n" + "\n" + "const (\n" - + as.get(0).mid.toString() + " " + api.getSTStateName(s) + "_Enum = iota \n" + + as.get(0).mid.toString() + " " + ename + " = iota \n" + as.subList(1, as.size()).stream().map(a -> a.mid.toString()).collect(Collectors.joining("\n")) + "\n" + ")"; } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java index 6143505a5..6f33fc36d 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java @@ -28,8 +28,7 @@ public String buildArgs(EAction a) public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) { return - "<-role" + api.role + "." + a.peer + "\n" - + IntStream.range(0, a.payload.elems.size()) + IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> "val" + i + " := <-role" + api.role + "." + a.peer + "\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" ).collect(Collectors.joining("\n")) + "\n" @@ -39,6 +38,6 @@ public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) @Override protected String getType(STAPIBuilder api, EState curr, EAction a) { - return a.mid + "_"; // FIXME: factor out + return GSTCaseBuilder.getOpTypeName(a.mid); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java index 3965e891c..a8949633a 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -5,6 +5,7 @@ import org.scribble.codegen.statetype.STAPIBuilder; import org.scribble.codegen.statetype.STCaseBuilder; import org.scribble.model.endpoint.EState; +import org.scribble.sesstype.name.MessageId; public class GSTCaseBuilder extends STCaseBuilder { @@ -16,15 +17,21 @@ public GSTCaseBuilder(GSTCaseActionBuilder cb) @Override public String getPreamble(STAPIBuilder api, EState s) { + String casefunc = api.getSTStateName(s) + "_Case"; // FIXME: factor out with branch action builder return GSTOutputStateBuilder.getPackageDecl(api) + "\n" + "\n" + "type " + api.getSTStateName(s) + "_Cases interface {\n" - + api.getSTStateName(s) + "_Case()\n" // FIXME: factor out + + casefunc + "()\n" + "}\n" + s.getActions().stream().map(a -> - "\ntype " + a.mid + "_ struct{}\n" // FIXME: factor out + "\ntype " + getOpTypeName(a.mid) + " struct{}\n" + "\n" - + "func (" + a.mid + "_ " + ") " + api.getSTStateName(s) + "_Case() {}\n" // FIXME: factor out + + "func (" + getOpTypeName(a.mid) + ") " + casefunc + "() {}\n" ).collect(Collectors.joining("")) + "\n"; } + + protected static String getOpTypeName(MessageId mid) + { + return mid.toString().toUpperCase() + "_"; // FIXME: maybe need more mangling? + } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index ab85a2b88..623387ab8 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -28,7 +28,7 @@ public String buildArgs(EAction a) public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) { return - "role" + api.role + "." + a.peer + "<- \"" + a.mid + "\"\n" // FIXME: op type + "role" + api.role + "." + a.peer + "<- " + a.mid + "\n" // FIXME: op type + IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> "role" + api.role + "." + a.peer + "<- arg" + i).collect(Collectors.joining("\n")) + "\n" + "return " + buildReturn(null, api, succ) + "{}"; From 327c308b6fab4d8e27c345608da1289d5336ba37 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 May 2017 05:00:13 +0100 Subject: [PATCH 009/433] Minor. --- .../codegen/statetype/STAPIBuilder.java | 2 +- .../scribble/codegen/statetype/STAction.java | 64 ------------------ .../scribble/codegen/statetype/STState.java | 65 ------------------- .../codegen/statetype/go/GSTAPIBuilder.java | 4 +- 4 files changed, 3 insertions(+), 132 deletions(-) delete mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STAction.java delete mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STState.java diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java index 8e688e2e9..cc7291fe6 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java @@ -64,7 +64,7 @@ public Map build() // filepath -> source api.put(getFilePath(getSTStateName(s) + "_Cases"), this.cb.build(this, s)); // FIXME: factor out break; } - case TERMINAL: api.put(getFilePath(getSTStateName(s)), this.eb.build(this, s)); break; + case TERMINAL: api.put(getFilePath(getSTStateName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket case UNARY_INPUT: api.put(getFilePath(getSTStateName(s)), this.rb.build(this, s)); break; case WRAP_SERVER: throw new RuntimeException("TODO"); default: throw new RuntimeException("Shouldn't get in here: " + s); diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STAction.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STAction.java deleted file mode 100644 index eeaa7b2a9..000000000 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STAction.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.scribble.codegen.statetype; - -import java.util.List; - -import org.scribble.model.endpoint.actions.EAction; - -// Target method signature -public abstract class STAction -{ - //public final String name; // State type op name - //public final String target; // Target method name - public final EAction act; - - public STAction(EAction act)//, String ret) - { - //this.name = name; - this.act = act; - } - - /*private static List getArgs(EAction send) - { - List args = new LinkedList<>(); - args.add(send.obj.toString()); - args.add(send.mid.toString()); - send.payload.elems.stream().forEach((e) -> args.add(e.toString())); - return args; - }*/ - - public abstract String makeName(); - - public abstract List makeArgs(); - - public abstract String makeBody(); - - //public abstract > String makeRet(S curr, S succ); - public abstract String makeRet(STState curr, STState succ); - - /*@Override - public int hashCode() - { - int hash = 79; - hash = 31 * hash + this.name.hashCode(); - hash = 31 * hash + this.act.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof STAction)) - { - return false; - } - STAction a = (STAction) o; - return a.canEqual(this) && - this.name.equals(a.name) && this.act.equals(a.act);// && this.ret.equals(a.ret); - } - - public abstract boolean canEqual(Object o);*/ -} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STState.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STState.java deleted file mode 100644 index c01cdc971..000000000 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STState.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.scribble.codegen.statetype; - -import org.scribble.model.endpoint.EState; - -// Named state -// Directly maps each method signature to one state -public abstract class STState//> -{ - public final EState state; - - //public final String name; // State type name (typestate state) -- used as object id - //public final String type; // Fully-qualified host type name - - //public STState(String name, String type, Map actions) - public STState(EState state) - { - checkAPIGenConditions(state); - - this.state = state; - //this.name = name; - //this.type = type; - } - - private static void checkAPIGenConditions(EState state) - { - // TODO: e.g., determinstic - } - - public abstract String makeName(); - - public abstract String makeType(); - - /*public Map getActions() - { - return actions; - }*/ - - /*@Override - public int hashCode() - { - int hash = 83; - hash = 31 * hash + this.state.hashCode(); - //hash = 31 * hash + this.name.hashCode(); - hash = 31 * hash + this.type.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof STState)) - { - return false; - } - STState s = (STState) o; - //return s.canEqual(this) && this.name.equals(s.name); - return s.canEqual(this) && this.state.equals(s.state) && this.type.equals(s.type); - } - - protected abstract boolean canEqual(Object o);*/ -} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java index 29882b772..ee712d8b5 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java @@ -48,9 +48,9 @@ protected String makeSTStateName(EState s) } @Override - public String getFilePath(String name) + public String getFilePath(String filename) { - return this.gpn.toString().replaceAll("\\.", "/") + "/" + name + ".go"; + return this.gpn.toString().replaceAll("\\.", "/") + "/" + filename + ".go"; } @Override From fdc41d7f7e8231c5ebef1e90b809e3705d8a9fd0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 May 2017 05:02:12 +0100 Subject: [PATCH 010/433] Minor. --- .../java/org/scribble/codegen/statetype/STActionBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index 0f1504ecc..ceb0f8a8e 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -21,8 +21,8 @@ public String build(STAPIBuilder api, EState curr, EAction a) "func (" + getType(api, curr, a) + ") " + getSTActionName(api, a) + "(" + buildArgs(a) + ") " + buildReturn(curr, api, succ) + " {" - + "\n" + buildBody(api, curr, a, succ) - + "\n}"; + + "\n" + buildBody(api, curr, a, succ) + + "\n}"; } protected String getType(STAPIBuilder api, EState curr, EAction a) From a15f07f8e15b83cde62a52aa5ffc8f4aa28cca01 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 May 2017 05:27:41 +0100 Subject: [PATCH 011/433] Minor refactoring. --- .../codegen/statetype/STActionBuilder.java | 22 +++++------- .../statetype/STBranchStateBuilder.java | 4 +-- .../codegen/statetype/STCaseBuilder.java | 4 +-- .../codegen/statetype/STEndStateBuilder.java | 4 +-- .../statetype/STOutputStateBuilder.java | 4 +-- .../statetype/STReceiveStateBuilder.java | 4 +-- .../codegen/statetype/STStateBuilder.java | 9 ----- ...uilder.java => STStateChanAPIBuilder.java} | 19 +++++----- .../codegen/statetype/STStateChanBuilder.java | 9 +++++ .../statetype/go/GSTBranchActionBuilder.java | 12 +++---- .../statetype/go/GSTBranchStateBuilder.java | 10 +++--- .../statetype/go/GSTCaseActionBuilder.java | 8 ++--- .../codegen/statetype/go/GSTCaseBuilder.java | 10 +++--- .../statetype/go/GSTEndStateBuilder.java | 8 ++--- .../statetype/go/GSTOutputStateBuilder.java | 19 ++-------- .../statetype/go/GSTReceiveActionBuilder.java | 6 ++-- .../statetype/go/GSTReceiveStateBuilder.java | 6 ++-- .../statetype/go/GSTSendActionBuilder.java | 6 ++-- ...ilder.java => GSTStateChanAPIBuilder.java} | 35 ++++++++++++++++--- .../src/main/java/org/scribble/main/Job.java | 4 +-- 20 files changed, 107 insertions(+), 96 deletions(-) delete mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java rename modules/core/src/main/java/org/scribble/codegen/statetype/{STAPIBuilder.java => STStateChanAPIBuilder.java} (67%) create mode 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java rename modules/core/src/main/java/org/scribble/codegen/statetype/go/{GSTAPIBuilder.java => GSTStateChanAPIBuilder.java} (74%) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index ceb0f8a8e..08361b9e3 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -5,28 +5,22 @@ public abstract class STActionBuilder { - public abstract String getSTActionName(STAPIBuilder api, EAction a); + public abstract String getSTActionName(STStateChanAPIBuilder api, EAction a); public abstract String buildArgs(EAction a); - public abstract String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ); + public abstract String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ); - public String buildReturn(EState curr, STAPIBuilder api, EState succ) + public String buildReturn(EState curr, STStateChanAPIBuilder api, EState succ) { - return api.getSTStateName(succ); + return api.getStateChanName(succ); } - public String build(STAPIBuilder api, EState curr, EAction a) + public String build(STStateChanAPIBuilder api, EState curr, EAction a) { - EState succ = curr.getSuccessor(a); - return - "func (" + getType(api, curr, a) + ") " + getSTActionName(api, a) + "(" - + buildArgs(a) - + ") " + buildReturn(curr, api, succ) + " {" - + "\n" + buildBody(api, curr, a, succ) - + "\n}"; + return api.buildAction(this, curr, a); // Because action builder hierarchy not suitable (extended by action kinds, not by target language) } - protected String getType(STAPIBuilder api, EState curr, EAction a) + public String getStateChanType(STStateChanAPIBuilder api, EState curr, EAction a) { - return api.getSTStateName(curr); + return api.getStateChanName(curr); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java index 2fa096d5f..6b15261ca 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java @@ -2,7 +2,7 @@ import org.scribble.model.endpoint.EState; -public abstract class STBranchStateBuilder extends STStateBuilder +public abstract class STBranchStateBuilder extends STStateChanBuilder { protected final STBranchActionBuilder bb; @@ -12,7 +12,7 @@ public STBranchStateBuilder(STBranchActionBuilder bb) } @Override - public String build(STAPIBuilder api, EState s) + public String build(STStateChanAPIBuilder api, EState s) { String out = getPreamble(api, s); diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java index 5cb31877c..b0ca72252 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java @@ -4,7 +4,7 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.endpoint.actions.EReceive; -public abstract class STCaseBuilder extends STStateBuilder // Is a distinct type but not a state -- OK for now +public abstract class STCaseBuilder extends STStateChanBuilder // Is a distinct type but not a state -- OK for now { protected final STCaseActionBuilder cb; @@ -14,7 +14,7 @@ public STCaseBuilder(STCaseActionBuilder cb) } @Override - public String build(STAPIBuilder api, EState s) + public String build(STStateChanAPIBuilder api, EState s) { String out = getPreamble(api, s); diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java index 1998630cb..2210fc207 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java @@ -2,7 +2,7 @@ import org.scribble.model.endpoint.EState; -public abstract class STEndStateBuilder extends STStateBuilder +public abstract class STEndStateBuilder extends STStateChanBuilder { public STEndStateBuilder() { @@ -10,7 +10,7 @@ public STEndStateBuilder() } @Override - public String build(STAPIBuilder api, EState s) + public String build(STStateChanAPIBuilder api, EState s) { return getPreamble(api, s); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java index c44d0c732..675420f5f 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java @@ -6,7 +6,7 @@ import org.scribble.model.endpoint.actions.EDisconnect; import org.scribble.model.endpoint.actions.ESend; -public abstract class STOutputStateBuilder extends STStateBuilder +public abstract class STOutputStateBuilder extends STStateChanBuilder { protected final STSendActionBuilder sb; @@ -16,7 +16,7 @@ public STOutputStateBuilder(STSendActionBuilder sb) } @Override - public String build(STAPIBuilder api, EState s) + public String build(STStateChanAPIBuilder api, EState s) { String out = getPreamble(api, s); /*"package " + getPackage(gpn) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java index 53b5a0f30..46d5854b8 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java @@ -5,7 +5,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -public abstract class STReceiveStateBuilder extends STStateBuilder +public abstract class STReceiveStateBuilder extends STStateChanBuilder { protected final STReceiveActionBuilder rb; @@ -15,7 +15,7 @@ public STReceiveStateBuilder(STReceiveActionBuilder rb) } @Override - public String build(STAPIBuilder api, EState s) + public String build(STStateChanAPIBuilder api, EState s) { String out = getPreamble(api, s); diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java deleted file mode 100644 index d17cdaf90..000000000 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateBuilder.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.scribble.codegen.statetype; - -import org.scribble.model.endpoint.EState; - -public abstract class STStateBuilder -{ - public abstract String getPreamble(STAPIBuilder api, EState s); - public abstract String build(STAPIBuilder api, EState s); -} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java similarity index 67% rename from modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java rename to modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index cc7291fe6..281ed2fb8 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -9,10 +9,11 @@ import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; import org.scribble.sesstype.name.GProtocolName; import org.scribble.sesstype.name.Role; -public abstract class STAPIBuilder +public abstract class STStateChanAPIBuilder { protected final Job job; @@ -29,7 +30,7 @@ public abstract class STAPIBuilder private Map names = new HashMap<>(); - protected STAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph, + protected STStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, STBranchStateBuilder bb, STCaseBuilder cb, STEndStateBuilder eb) { this.job = job; @@ -57,15 +58,15 @@ public Map build() // filepath -> source switch (s.getStateKind()) { case ACCEPT: throw new RuntimeException("TODO"); - case OUTPUT: api.put(getFilePath(getSTStateName(s)), this.ob.build(this, s)); break; + case OUTPUT: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; // FIXME: use buildAction directly case POLY_INPUT: { - api.put(getFilePath(getSTStateName(s)), this.bb.build(this, s)); - api.put(getFilePath(getSTStateName(s) + "_Cases"), this.cb.build(this, s)); // FIXME: factor out + api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + api.put(getFilePath(getStateChanName(s) + "_Cases"), this.cb.build(this, s)); // FIXME: factor out break; } - case TERMINAL: api.put(getFilePath(getSTStateName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket - case UNARY_INPUT: api.put(getFilePath(getSTStateName(s)), this.rb.build(this, s)); break; + case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket + case UNARY_INPUT: api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); break; case WRAP_SERVER: throw new RuntimeException("TODO"); default: throw new RuntimeException("Shouldn't get in here: " + s); } @@ -77,7 +78,7 @@ public Map build() // filepath -> source public abstract String getPackage(); - public String getSTStateName(EState s) + public String getStateChanName(EState s) { String name = this.names.get(s.id); if (name == null) @@ -90,4 +91,6 @@ public String getSTStateName(EState s) // Should only be called from getSTStateName protected abstract String makeSTStateName(EState s); + + public abstract String buildAction(STActionBuilder ab, EState curr, EAction a); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java new file mode 100644 index 000000000..bfc53cf05 --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java @@ -0,0 +1,9 @@ +package org.scribble.codegen.statetype; + +import org.scribble.model.endpoint.EState; + +public abstract class STStateChanBuilder +{ + public abstract String getPreamble(STStateChanAPIBuilder api, EState s); + public abstract String build(STStateChanAPIBuilder api, EState s); +} diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index 874b6d737..6c37f968c 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -2,7 +2,7 @@ import java.util.stream.Collectors; -import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STBranchActionBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -11,7 +11,7 @@ public class GSTBranchActionBuilder extends STBranchActionBuilder { @Override - public String getSTActionName(STAPIBuilder api, EAction a) + public String getSTActionName(STStateChanAPIBuilder api, EAction a) { return "Branch_" + a.peer; } @@ -23,17 +23,17 @@ public String buildArgs(EAction a) } @Override - public String buildReturn(EState curr, STAPIBuilder api, EState succ) + public String buildReturn(EState curr, STStateChanAPIBuilder api, EState succ) { - return api.getSTStateName(curr) + "_Cases"; // FIXME: factor out with case builder + return api.getStateChanName(curr) + "_Cases"; // FIXME: factor out with case builder } @Override - public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { return "tmp := <-role" + api.role + "." + a.peer + "\n" - + "op := tmp.(" + api.getSTStateName(curr) + "_Enum)\n" // FIXME: factor out with branch state builder + + "op := tmp.(" + api.getStateChanName(curr) + "_Enum)\n" // FIXME: factor out with branch state builder + "switch op {\n" + curr.getActions().stream().map(x -> "case " + x.mid + ":\n" diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java index ad00d3a84..aeeed315c 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java @@ -3,7 +3,7 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -16,13 +16,13 @@ public GSTBranchStateBuilder(GSTBranchActionBuilder bb) } @Override - public String getPreamble(STAPIBuilder api, EState s) + public String getPreamble(STStateChanAPIBuilder api, EState s) { - String ename = api.getSTStateName(s) + "_Enum"; // FIXME: factor out with branch action builder + String ename = api.getStateChanName(s) + "_Enum"; // FIXME: factor out with branch action builder List as = s.getActions(); - return GSTOutputStateBuilder.getPremable1(api, s) + return GSTStateChanAPIBuilder.getStateChanPremable(api, s) + "\n" + "\n" - + " type " + ename + " int\n" + + "type " + ename + " int\n" + "\n" + "const (\n" + as.get(0).mid.toString() + " " + ename + " = iota \n" diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java index 6f33fc36d..6df5072ae 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java @@ -3,7 +3,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STCaseActionBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -12,7 +12,7 @@ public class GSTCaseActionBuilder extends STCaseActionBuilder { @Override - public String getSTActionName(STAPIBuilder api, EAction a) + public String getSTActionName(STStateChanAPIBuilder api, EAction a) { return "Recv_" + a.peer + "_" + a.mid; } @@ -25,7 +25,7 @@ public String buildArgs(EAction a) } @Override - public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { return IntStream.range(0, a.payload.elems.size()) @@ -36,7 +36,7 @@ public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) } @Override - protected String getType(STAPIBuilder api, EState curr, EAction a) + public String getStateChanType(STStateChanAPIBuilder api, EState curr, EAction a) { return GSTCaseBuilder.getOpTypeName(a.mid); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java index a8949633a..25771f480 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -2,7 +2,7 @@ import java.util.stream.Collectors; -import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STCaseBuilder; import org.scribble.model.endpoint.EState; import org.scribble.sesstype.name.MessageId; @@ -15,12 +15,12 @@ public GSTCaseBuilder(GSTCaseActionBuilder cb) } @Override - public String getPreamble(STAPIBuilder api, EState s) + public String getPreamble(STStateChanAPIBuilder api, EState s) { - String casefunc = api.getSTStateName(s) + "_Case"; // FIXME: factor out with branch action builder - return GSTOutputStateBuilder.getPackageDecl(api) + "\n" + String casefunc = api.getStateChanName(s) + "_Case"; // FIXME: factor out with branch action builder + return GSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + "\n" - + "type " + api.getSTStateName(s) + "_Cases interface {\n" + + "type " + api.getStateChanName(s) + "_Cases interface {\n" + casefunc + "()\n" + "}\n" + s.getActions().stream().map(a -> diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java index 51495dc77..4a8924bbe 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java @@ -1,6 +1,6 @@ package org.scribble.codegen.statetype.go; -import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STEndStateBuilder; import org.scribble.model.endpoint.EState; @@ -12,14 +12,14 @@ public GSTEndStateBuilder() } @Override - public String build(STAPIBuilder api, EState s) + public String build(STStateChanAPIBuilder api, EState s) { return getPreamble(api, s); } @Override - public String getPreamble(STAPIBuilder api, EState s) + public String getPreamble(STStateChanAPIBuilder api, EState s) { - return GSTOutputStateBuilder.getPremable1(api, s); + return GSTStateChanAPIBuilder.getStateChanPremable(api, s); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java index 5b1128502..ac7e8bc2c 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTOutputStateBuilder.java @@ -1,6 +1,6 @@ package org.scribble.codegen.statetype.go; -import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STOutputStateBuilder; import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.model.endpoint.EState; @@ -12,22 +12,9 @@ public GSTOutputStateBuilder(STSendActionBuilder sb) super(sb); } - protected static String getPackageDecl(STAPIBuilder api) - { - return "package " + api.getPackage(); - } - - protected static String getPremable1(STAPIBuilder api, EState s) - { - return - getPackageDecl(api) + "\n" - + "\n" - + "type " + api.getSTStateName(s) + " struct{}"; - } - @Override - public String getPreamble(STAPIBuilder api, EState s) + public String getPreamble(STStateChanAPIBuilder api, EState s) { - return getPremable1(api, s); + return GSTStateChanAPIBuilder.getStateChanPremable(api, s); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java index c1756608e..92799a8e4 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -3,7 +3,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -12,7 +12,7 @@ public class GSTReceiveActionBuilder extends STReceiveActionBuilder { @Override - public String getSTActionName(STAPIBuilder api, EAction a) + public String getSTActionName(STStateChanAPIBuilder api, EAction a) { return "Recv_" + a.peer + "_" + a.mid; } @@ -25,7 +25,7 @@ public String buildArgs(EAction a) } @Override - public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { return //"op := diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java index 9e2513f1a..73c02e01d 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java @@ -1,6 +1,6 @@ package org.scribble.codegen.statetype.go; -import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STReceiveStateBuilder; import org.scribble.model.endpoint.EState; @@ -13,8 +13,8 @@ public GSTReceiveStateBuilder(STReceiveActionBuilder rb) } @Override - public String getPreamble(STAPIBuilder api, EState s) + public String getPreamble(STStateChanAPIBuilder api, EState s) { - return GSTOutputStateBuilder.getPremable1(api, s); + return GSTStateChanAPIBuilder.getStateChanPremable(api, s); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index 623387ab8..7e4e88220 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -3,7 +3,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -12,7 +12,7 @@ public class GSTSendActionBuilder extends STSendActionBuilder { @Override - public String getSTActionName(STAPIBuilder api, EAction a) + public String getSTActionName(STStateChanAPIBuilder api, EAction a) { return "Send_" + a.peer + "_" + a.mid; } @@ -25,7 +25,7 @@ public String buildArgs(EAction a) } @Override - public String buildBody(STAPIBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { return "role" + api.role + "." + a.peer + "<- " + a.mid + "\n" // FIXME: op type diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java similarity index 74% rename from modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java rename to modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index ee712d8b5..b34ec376f 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -8,24 +8,26 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.codegen.statetype.STAPIBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.del.ModuleDel; import org.scribble.main.Job; import org.scribble.main.RuntimeScribbleException; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; import org.scribble.sesstype.kind.Global; import org.scribble.sesstype.name.GProtocolName; import org.scribble.sesstype.name.MessageId; import org.scribble.sesstype.name.Role; import org.scribble.visit.util.MessageIdCollector; -public class GSTAPIBuilder extends STAPIBuilder +public class GSTStateChanAPIBuilder extends STStateChanAPIBuilder { private int counter = 1; - public GSTAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) + public GSTStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) { super(job, gpn, role, graph, new GSTOutputStateBuilder(new GSTSendActionBuilder()), @@ -54,7 +56,7 @@ public String getFilePath(String filename) } @Override - public Map buildSessionAPI() + public Map buildSessionAPI() // FIXME: factor out { Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); @@ -132,4 +134,29 @@ public Map buildSessionAPI() return res; } + + protected static String getPackageDecl(STStateChanAPIBuilder api) + { + return "package " + api.getPackage(); + } + + protected static String getStateChanPremable(STStateChanAPIBuilder api, EState s) + { + return + GSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + + "\n" + + "type " + api.getStateChanName(s) + " struct{}"; + } + + @Override + public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here because action builder hierarchy not suitable (extended by action kind, not by target language) + { + EState succ = curr.getSuccessor(a); + return + "func (" + ab.getStateChanType(this, curr, a) + ") " + ab.getSTActionName(this, a) + "(" + + ab.buildArgs(a) + + ") " + ab.buildReturn(curr, this, succ) + " {" + + "\n" + ab.buildBody(this, curr, a, succ) + + "\n}"; + } } diff --git a/modules/core/src/main/java/org/scribble/main/Job.java b/modules/core/src/main/java/org/scribble/main/Job.java index a6ad3ca10..340f11d80 100644 --- a/modules/core/src/main/java/org/scribble/main/Job.java +++ b/modules/core/src/main/java/org/scribble/main/Job.java @@ -11,7 +11,7 @@ import org.scribble.codegen.java.endpointapi.SessionApiGenerator; import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; import org.scribble.codegen.java.endpointapi.ioifaces.IOInterfacesGenerator; -import org.scribble.codegen.statetype.go.GSTAPIBuilder; +import org.scribble.codegen.statetype.go.GSTStateChanAPIBuilder; import org.scribble.del.local.LProtocolDeclDel; import org.scribble.sesstype.name.GProtocolName; import org.scribble.sesstype.name.LProtocolName; @@ -163,7 +163,7 @@ public Map generateSessionApi(GProtocolName fullname) throws Scr public Map generateGoApi(GProtocolName fullname, Role self) throws ScribbleException { debugPrintPass("Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); - GSTAPIBuilder apigen = new GSTAPIBuilder(this, fullname, self, this.jcontext.getEGraph(fullname, self)); + GSTStateChanAPIBuilder apigen = new GSTStateChanAPIBuilder(this, fullname, self, this.jcontext.getEGraph(fullname, self)); Map api = apigen.build(); // filepath -> source api.putAll(apigen.buildSessionAPI()); return api; From 83d2a7fcea72e3d210262d2ff629c2623f15a405 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 May 2017 05:45:22 +0100 Subject: [PATCH 012/433] Minor refactoring. --- .../statetype/STStateChanAPIBuilder.java | 17 +++++++++++------ .../statetype/go/GSTBranchStateBuilder.java | 2 +- .../statetype/go/GSTReceiveStateBuilder.java | 3 ++- .../statetype/go/GSTSendActionBuilder.java | 2 +- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index 281ed2fb8..7ed66c5ed 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -22,11 +22,11 @@ public abstract class STStateChanAPIBuilder public final EGraph graph; - private final STOutputStateBuilder ob; - private final STReceiveStateBuilder rb; - private final STBranchStateBuilder bb; - private final STCaseBuilder cb; - private final STEndStateBuilder eb; + public final STOutputStateBuilder ob; + public final STReceiveStateBuilder rb; + public final STBranchStateBuilder bb; + public final STCaseBuilder cb; + public final STEndStateBuilder eb; private Map names = new HashMap<>(); @@ -66,7 +66,12 @@ public Map build() // filepath -> source break; } case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket - case UNARY_INPUT: api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); break; + case UNARY_INPUT: + { + api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); + //api.put(getFilePath(getStateChanName(s) + "_Cases"), this.cb.build(this, s)); // FIXME: factor out + break; + } case WRAP_SERVER: throw new RuntimeException("TODO"); default: throw new RuntimeException("Shouldn't get in here: " + s); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java index aeeed315c..0dfca9f74 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java @@ -25,7 +25,7 @@ public String getPreamble(STStateChanAPIBuilder api, EState s) + "type " + ename + " int\n" + "\n" + "const (\n" - + as.get(0).mid.toString() + " " + ename + " = iota \n" + + as.get(0).mid.toString() + " " + ename + " = iota \n" // FIXME: factor out with send action builder (and use lower+_) + as.subList(1, as.size()).stream().map(a -> a.mid.toString()).collect(Collectors.joining("\n")) + "\n" + ")"; } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java index 73c02e01d..1eb50ddfb 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveStateBuilder.java @@ -15,6 +15,7 @@ public GSTReceiveStateBuilder(STReceiveActionBuilder rb) @Override public String getPreamble(STStateChanAPIBuilder api, EState s) { - return GSTStateChanAPIBuilder.getStateChanPremable(api, s); + //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); + return api.bb.getPreamble(api, s); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index 7e4e88220..72c0b06b7 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -28,7 +28,7 @@ public String buildArgs(EAction a) public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { return - "role" + api.role + "." + a.peer + "<- " + a.mid + "\n" // FIXME: op type + "role" + api.role + "." + a.peer + "<- " + a.mid + "\n" // FIXME: factor out with branch state builder (and use lower+_) + IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> "role" + api.role + "." + a.peer + "<- arg" + i).collect(Collectors.joining("\n")) + "\n" + "return " + buildReturn(null, api, succ) + "{}"; From d999df2ca476956859f5fd09ca8aab1bc4bdea4d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 May 2017 05:49:06 +0100 Subject: [PATCH 013/433] Minor. --- .../org/scribble/codegen/statetype/go/GSTCaseBuilder.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java index 25771f480..b9cf2cf41 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -22,12 +22,12 @@ public String getPreamble(STStateChanAPIBuilder api, EState s) + "\n" + "type " + api.getStateChanName(s) + "_Cases interface {\n" + casefunc + "()\n" - + "}\n" + + "}" + s.getActions().stream().map(a -> - "\ntype " + getOpTypeName(a.mid) + " struct{}\n" + "\n\ntype " + getOpTypeName(a.mid) + " struct{}\n" + "\n" - + "func (" + getOpTypeName(a.mid) + ") " + casefunc + "() {}\n" - ).collect(Collectors.joining("")) + "\n"; + + "func (" + getOpTypeName(a.mid) + ") " + casefunc + "() {}" + ).collect(Collectors.joining("")); } protected static String getOpTypeName(MessageId mid) From 4d34ac234b880cd78d4f9bd0ebec9eb5a83abddf Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 May 2017 16:28:23 +0100 Subject: [PATCH 014/433] Tidying. --- .../statetype/STStateChanAPIBuilder.java | 2 ++ .../statetype/go/GSTBranchActionBuilder.java | 8 ++--- .../statetype/go/GSTBranchStateBuilder.java | 17 ++++++++-- .../statetype/go/GSTCaseActionBuilder.java | 8 ++--- .../codegen/statetype/go/GSTCaseBuilder.java | 33 ++++++++++++++++--- .../statetype/go/GSTSendActionBuilder.java | 5 +-- .../statetype/go/GSTStateChanAPIBuilder.java | 6 ++++ 7 files changed, 61 insertions(+), 18 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index 7ed66c5ed..94c4fc79c 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -98,4 +98,6 @@ public String getStateChanName(EState s) protected abstract String makeSTStateName(EState s); public abstract String buildAction(STActionBuilder ab, EState curr, EAction a); + + public abstract String getChannelName(EAction a); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index 6c37f968c..21b012609 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -32,12 +32,12 @@ public String buildReturn(EState curr, STStateChanAPIBuilder api, EState succ) public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { return - "tmp := <-role" + api.role + "." + a.peer + "\n" - + "op := tmp.(" + api.getStateChanName(curr) + "_Enum)\n" // FIXME: factor out with branch state builder + "tmp := <-" + api.getChannelName(a) + "\n" + + "op := tmp.(" + GSTBranchStateBuilder.getBranchEnumType(api, curr) + ")\n" + "switch op {\n" + curr.getActions().stream().map(x -> - "case " + x.mid + ":\n" - + "return " + GSTCaseBuilder.getOpTypeName(x.mid) +"{}\n" // FIXME: factor out + "case " + GSTBranchStateBuilder.getBranchEnumValue(x.mid) + ":\n" + + "return " + GSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{}\n" // FIXME: factor out ).collect(Collectors.joining("")) + "}\n" + "return nil"; // FIXME: panic instead diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java index 0dfca9f74..432be7cf6 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java @@ -7,6 +7,7 @@ import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.sesstype.name.MessageId; public class GSTBranchStateBuilder extends STBranchStateBuilder { @@ -18,15 +19,25 @@ public GSTBranchStateBuilder(GSTBranchActionBuilder bb) @Override public String getPreamble(STStateChanAPIBuilder api, EState s) { - String ename = api.getStateChanName(s) + "_Enum"; // FIXME: factor out with branch action builder + String ename = getBranchEnumType(api, s); List as = s.getActions(); return GSTStateChanAPIBuilder.getStateChanPremable(api, s) + "\n" + "\n" + "type " + ename + " int\n" + "\n" + "const (\n" - + as.get(0).mid.toString() + " " + ename + " = iota \n" // FIXME: factor out with send action builder (and use lower+_) - + as.subList(1, as.size()).stream().map(a -> a.mid.toString()).collect(Collectors.joining("\n")) + "\n" + + getBranchEnumValue(as.get(0).mid) + " " + ename + " = iota \n" + + as.subList(1, as.size()).stream().map(a -> getBranchEnumValue(a.mid)).collect(Collectors.joining("\n")) + "\n" + ")"; } + + protected static String getBranchEnumType(STStateChanAPIBuilder api, EState s) + { + return api.getStateChanName(s) + "_Enum"; + } + + protected static String getBranchEnumValue(MessageId mid) + { + return "_" + mid; + } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java index 6df5072ae..b0b64f731 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java @@ -29,15 +29,15 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "val" + i + " := <-role" + api.role + "." + a.peer - + "\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" + .mapToObj(i -> "val" + i + " := <-" + api.getChannelName(a) + "\n" + + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" ).collect(Collectors.joining("\n")) + "\n" - + "return " + buildReturn(null, api, succ) + "{}"; + + "return " + buildReturn(curr, api, succ) + "{}"; } @Override public String getStateChanType(STStateChanAPIBuilder api, EState curr, EAction a) { - return GSTCaseBuilder.getOpTypeName(a.mid); + return GSTCaseBuilder.getOpTypeName(api, curr, a.mid); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java index b9cf2cf41..9b97a3446 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -1,9 +1,12 @@ package org.scribble.codegen.statetype.go; +import java.util.HashMap; +import java.util.Map; import java.util.stream.Collectors; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STCaseBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.main.RuntimeScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.sesstype.name.MessageId; @@ -24,14 +27,34 @@ public String getPreamble(STStateChanAPIBuilder api, EState s) + casefunc + "()\n" + "}" + s.getActions().stream().map(a -> - "\n\ntype " + getOpTypeName(a.mid) + " struct{}\n" + "\n\ntype " + getOpTypeName(api, s, a.mid) + " struct{}\n" + "\n" - + "func (" + getOpTypeName(a.mid) + ") " + casefunc + "() {}" + + "func (" + getOpTypeName(api, s, a.mid) + ") " + casefunc + "() {}" ).collect(Collectors.joining("")); } - protected static String getOpTypeName(MessageId mid) + private static Map seen = new HashMap<>(); // FIXME HACK + + protected static String getOpTypeName(STStateChanAPIBuilder api, EState s, MessageId mid) { - return mid.toString().toUpperCase() + "_"; // FIXME: maybe need more mangling? + String op = mid.toString(); + char c = op.charAt(0); + if (c < 'A' || c > 'Z') + { + throw new RuntimeScribbleException("[go-api-gen] Message op should start with a captial letter, not: " + c); // FIXME: + } + if (GSTCaseBuilder.seen.containsKey(op)) + { + if (GSTCaseBuilder.seen.get(op) != s.id) + { + String n = api.getStateChanName(s); // HACK + op = op + "_" + n.substring(n.lastIndexOf('_') + 1); + } + } + else + { + GSTCaseBuilder.seen.put(op, s.id); + } + return op; } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index 72c0b06b7..54501acb0 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -27,10 +27,11 @@ public String buildArgs(EAction a) @Override public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { + String chan = api.getChannelName(a); return - "role" + api.role + "." + a.peer + "<- " + a.mid + "\n" // FIXME: factor out with branch state builder (and use lower+_) + chan + "<- " + GSTBranchStateBuilder.getBranchEnumValue(a.mid) + "\n" + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "role" + api.role + "." + a.peer + "<- arg" + i).collect(Collectors.joining("\n")) + "\n" + .mapToObj(i -> chan + "<- arg" + i).collect(Collectors.joining("\n")) + "\n" + "return " + buildReturn(null, api, succ) + "{}"; } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index b34ec376f..25f62f5d0 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -159,4 +159,10 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b + "\n" + ab.buildBody(this, curr, a, succ) + "\n}"; } + + @Override + public String getChannelName(EAction a) + { + return "role" + this.role + "." + a.peer; + } } From 2de984ff3c6b699a281a62d8b8a1f65a27adbfe1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 00:32:51 +0100 Subject: [PATCH 015/433] Refactoring to use Scribble Go runtime libs. --- .../codegen/statetype/STActionBuilder.java | 7 +- .../statetype/STStateChanAPIBuilder.java | 2 +- .../statetype/go/GSTBranchActionBuilder.java | 2 +- .../statetype/go/GSTCaseActionBuilder.java | 4 +- .../statetype/go/GSTReceiveActionBuilder.java | 11 ++-- .../statetype/go/GSTSendActionBuilder.java | 10 +-- .../statetype/go/GSTStateChanAPIBuilder.java | 65 +++++++++++++++---- 7 files changed, 75 insertions(+), 26 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index 08361b9e3..f834f7c05 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -9,10 +9,15 @@ public abstract class STActionBuilder public abstract String buildArgs(EAction a); public abstract String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ); - public String buildReturn(EState curr, STStateChanAPIBuilder api, EState succ) + public String getReturnType(EState curr, STStateChanAPIBuilder api, EState succ) { return api.getStateChanName(succ); } + + public String buildReturn(EState curr, STStateChanAPIBuilder api, EState succ) + { + return "return " + getReturnType(curr, api, succ) + "{ ep: s.ep }"; + } public String build(STStateChanAPIBuilder api, EState curr, EAction a) { diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index 94c4fc79c..4a2520017 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -99,5 +99,5 @@ public String getStateChanName(EState s) public abstract String buildAction(STActionBuilder ab, EState curr, EAction a); - public abstract String getChannelName(EAction a); + public abstract String getChannelName(STStateChanAPIBuilder api, EAction a); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index 21b012609..a9c2ebafd 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -23,7 +23,7 @@ public String buildArgs(EAction a) } @Override - public String buildReturn(EState curr, STStateChanAPIBuilder api, EState succ) + public String getReturnType(EState curr, STStateChanAPIBuilder api, EState succ) { return api.getStateChanName(curr) + "_Cases"; // FIXME: factor out with case builder } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java index b0b64f731..a2c5f0459 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java @@ -29,10 +29,10 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "val" + i + " := <-" + api.getChannelName(a) + "\n" + .mapToObj(i -> "val" + i + " := <-" + api.getChannelName(api, a) + "\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" ).collect(Collectors.joining("\n")) + "\n" - + "return " + buildReturn(curr, api, succ) + "{}"; + + "return " + getReturnType(curr, api, succ) + "{}"; } @Override diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java index 92799a8e4..f303c9a0e 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -27,13 +27,16 @@ public String buildArgs(EAction a) @Override public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { + String chan = api.getChannelName(api, a); return //"op := - "<-role" + api.role + "." + a.peer + "\n" + //"<-" + chan + "\n" + chan + ".Read()\n" + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "val" + i + " := <-role" + api.role + "." + a.peer - + "\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" + //.mapToObj(i -> "val" + i + " := <-" + chan + "\n" + .mapToObj(i -> "val" + i + " := " + chan + ".Read()\n" + + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" ).collect(Collectors.joining("\n")) + "\n" - + "return " + buildReturn(null, api, succ) + "{}"; + + buildReturn(curr, api, succ); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index 54501acb0..c258b231a 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -27,11 +27,13 @@ public String buildArgs(EAction a) @Override public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { - String chan = api.getChannelName(a); + String chan = api.getChannelName(api, a); return - chan + "<- " + GSTBranchStateBuilder.getBranchEnumValue(a.mid) + "\n" + //chan + "<- " + GSTBranchStateBuilder.getBranchEnumValue(a.mid) + "\n" + chan + ".Write(" + GSTBranchStateBuilder.getBranchEnumValue(a.mid) + ")\n" + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> chan + "<- arg" + i).collect(Collectors.joining("\n")) + "\n" - + "return " + buildReturn(null, api, succ) + "{}"; + //.mapToObj(i -> chan + "<- arg" + i).collect(Collectors.joining("\n")) + "\n" + .mapToObj(i -> chan + ".Write(arg" + i + ")").collect(Collectors.joining("\n")) + "\n" + + buildReturn(curr, api, succ); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index 25f62f5d0..4d85f78b4 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -4,12 +4,13 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collector; import java.util.stream.Collectors; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STActionBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.del.ModuleDel; import org.scribble.main.Job; import org.scribble.main.RuntimeScribbleException; @@ -75,8 +76,9 @@ public Map buildSessionAPI() // FIXME: factor out Set> mids = coll.getNames(); Map res = new HashMap<>(); + String dir = this.gpn.toString().replaceAll("\\.", "/") + "/"; - // endpoints + /*// endpoints String endpoints = "package " + getPackage() + "\n" + roles.stream().map(r -> @@ -91,10 +93,29 @@ public Map buildSessionAPI() // FIXME: factor out + "\n" + "var role" + r + " endpoint" + r ).collect(Collectors.joining("\n\n")); - res.put(this.gpn.toString().replaceAll("\\.", "/") + "/endpoints.go", endpoints); + res.put(dir + "endpoints.go", endpoints);*/ // roles - for (Role r : roles) + String sessclass = + "package " + getPackage() + "\n" // FIXME: factor out + + "\n" + + roles.stream().map(r -> + "type " + r + " struct { }\n" + + "\n" + + "func (" + r +") IsRole() bool {\n" + + "return true\n" + + "}" + ).collect(Collectors.joining("\n\n")) + "\n" + + "\n" + + "type " + simpname + " struct {\n" + + roles.stream().map(r -> r + " " + r).collect(Collectors.joining("\n")) + "\n" + + "}\n" + + "\n" + + "func New" + simpname + "() *" + simpname + "{\n" + + "return &" + simpname + "{ " + roles.stream().map(r -> r + ": " + r + "{}").collect(Collectors.joining(", ")) + " }\n" + + "}"; + res.put(dir + simpname + ".go", sessclass); + /*for (Role r : roles) { String init = this.gpn.getSimpleName() + "_" + r + "_" + 1; // FIXME: factor out naming scheme String role = @@ -110,7 +131,7 @@ public Map buildSessionAPI() // FIXME: factor out + "}\n" + "return " + init + "{}, role" + r + "\n" + "}"; - res.put(this.gpn.toString().replaceAll("\\.", "/") + "/role_" + r + ".go", role); + res.put(dir + "role_" + r + ".go", role); } // labels @@ -122,7 +143,7 @@ public Map buildSessionAPI() // FIXME: factor out "\ntype op" + mid + " string\n" + "\n" + "const " + mid + " op" + mid + " = \"" + mid + "\"\n"; - }*/ + }* / res.put(this.gpn.toString().replaceAll("\\.", "/") + "/labels.go", labels); // types @@ -130,7 +151,7 @@ public Map buildSessionAPI() // FIXME: factor out "package " + getPackage() + "\n" + "\n" + "type T interface {}"; - res.put(this.gpn.toString().replaceAll("\\.", "/") + "/types.go", types); + res.put(dir + "types.go", types);*/ return res; } @@ -142,10 +163,26 @@ protected static String getPackageDecl(STStateChanAPIBuilder api) protected static String getStateChanPremable(STStateChanAPIBuilder api, EState s) { - return + String tname = api.getStateChanName(s); + String res = GSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + "\n" - + "type " + api.getStateChanName(s) + " struct{}"; + + "import \"org/scribble/runtime/net\"\n" + + "\n" + + "type " + tname + " struct{\n" + + "ep *net.MPSTEndpoint\n" // FIXME: factor out + + "}"; + + if (s.id == api.graph.init.id) + { + res += + "\n\n" + + "func New" + tname + "(ep *net.MPSTEndpoint) *" + tname + " {\n" // FIXME: factor out + + "return &" + tname + " { ep: ep }\n" + + "}"; + } + + return res; } @Override @@ -153,16 +190,18 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b { EState succ = curr.getSuccessor(a); return - "func (" + ab.getStateChanType(this, curr, a) + ") " + ab.getSTActionName(this, a) + "(" + "func (s " + ab.getStateChanType(this, curr, a) + ") " + ab.getSTActionName(this, a) + "(" + ab.buildArgs(a) - + ") " + ab.buildReturn(curr, this, succ) + " {" + + ") " + ab.getReturnType(curr, this, succ) + " {" + "\n" + ab.buildBody(this, curr, a, succ) + "\n}"; } @Override - public String getChannelName(EAction a) + public String getChannelName(STStateChanAPIBuilder api, EAction a) { - return "role" + this.role + "." + a.peer; + return + //"role" + this.role + "." + a.peer; + "s.ep.Chans[s.ep.Proto.(" + api.gpn.getSimpleName() + ")." + a.peer + "]"; } } From 68b21d3e0bf6f453b8f8547398d4afc15273eb6b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 01:38:59 +0100 Subject: [PATCH 016/433] Added runtime linearity checks to Go API gen. --- .../codegen/statetype/STActionBuilder.java | 11 ++++++++++- .../statetype/go/GSTBranchActionBuilder.java | 2 +- .../statetype/go/GSTStateChanAPIBuilder.java | 16 +++++++++------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index f834f7c05..ba1792284 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -16,7 +16,16 @@ public String getReturnType(EState curr, STStateChanAPIBuilder api, EState succ) public String buildReturn(EState curr, STStateChanAPIBuilder api, EState succ) { - return "return " + getReturnType(curr, api, succ) + "{ ep: s.ep }"; + String res = ""; + + if (succ.isTerminal()) + { + res += "s.ep.Done = true\n"; + } + + res += "return " + getReturnType(curr, api, succ) + "{ ep: s.ep, state: &net.LinearResource {} }"; // FIXME: EndSocket LinearResource special case + + return res; } public String build(STStateChanAPIBuilder api, EState curr, EAction a) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index a9c2ebafd..12267ea6e 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -32,7 +32,7 @@ public String getReturnType(EState curr, STStateChanAPIBuilder api, EState succ) public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { return - "tmp := <-" + api.getChannelName(a) + "\n" + "tmp := <-" + api.getChannelName(api, a) + "\n" + "op := tmp.(" + GSTBranchStateBuilder.getBranchEnumType(api, curr) + ")\n" + "switch op {\n" + curr.getActions().stream().map(x -> diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index 4d85f78b4..27d99fb75 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -102,13 +102,13 @@ public Map buildSessionAPI() // FIXME: factor out + roles.stream().map(r -> "type " + r + " struct { }\n" + "\n" - + "func (" + r +") IsRole() bool {\n" - + "return true\n" + + "func (" + r +") GetRoleName() string {\n" + + "return \"" + r + "\"\n" + "}" ).collect(Collectors.joining("\n\n")) + "\n" + "\n" + "type " + simpname + " struct {\n" - + roles.stream().map(r -> r + " " + r).collect(Collectors.joining("\n")) + "\n" + + roles.stream().map(r -> r + " " + r).collect(Collectors.joining("\n")) + "\n" // FIXME: role constants should be pointers? + "}\n" + "\n" + "func New" + simpname + "() *" + simpname + "{\n" @@ -171,6 +171,7 @@ protected static String getStateChanPremable(STStateChanAPIBuilder api, EState s + "\n" + "type " + tname + " struct{\n" + "ep *net.MPSTEndpoint\n" // FIXME: factor out + + "state *net.LinearResource\n" // FIXME: EndSocket special case? // FIXME: only seems to work as a pointer (something to do with method calls via value recievers? is it copying the value before calling the function?) + "}"; if (s.id == api.graph.init.id) @@ -178,7 +179,7 @@ protected static String getStateChanPremable(STStateChanAPIBuilder api, EState s res += "\n\n" + "func New" + tname + "(ep *net.MPSTEndpoint) *" + tname + " {\n" // FIXME: factor out - + "return &" + tname + " { ep: ep }\n" + + "return &" + tname + " { ep: ep, state: &net.LinearResource { } }\n" + "}"; } @@ -192,9 +193,10 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b return "func (s " + ab.getStateChanType(this, curr, a) + ") " + ab.getSTActionName(this, a) + "(" + ab.buildArgs(a) - + ") " + ab.getReturnType(curr, this, succ) + " {" - + "\n" + ab.buildBody(this, curr, a, succ) - + "\n}"; + + ") " + ab.getReturnType(curr, this, succ) + " {\n" + + "s.state.Use()\n" + + ab.buildBody(this, curr, a, succ) + "\n" + + "}"; } @Override From 51c0d5c522c1ed9a6b85690e7d061ff47a24116c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 02:02:32 +0100 Subject: [PATCH 017/433] Continued. --- .../codegen/statetype/go/GSTBranchActionBuilder.java | 4 ++-- .../codegen/statetype/go/GSTCaseActionBuilder.java | 4 ++-- .../org/scribble/codegen/statetype/go/GSTCaseBuilder.java | 7 ++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index 12267ea6e..e1e923a94 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -32,12 +32,12 @@ public String getReturnType(EState curr, STStateChanAPIBuilder api, EState succ) public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { return - "tmp := <-" + api.getChannelName(api, a) + "\n" + "tmp := " + api.getChannelName(api, a) + ".Read()\n" + "op := tmp.(" + GSTBranchStateBuilder.getBranchEnumType(api, curr) + ")\n" + "switch op {\n" + curr.getActions().stream().map(x -> "case " + GSTBranchStateBuilder.getBranchEnumValue(x.mid) + ":\n" - + "return " + GSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{}\n" // FIXME: factor out + + "return " + GSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{ ep: s.ep, state: &net.LinearResource {} }\n" // FIXME: factor out ).collect(Collectors.joining("")) + "}\n" + "return nil"; // FIXME: panic instead diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java index a2c5f0459..e14b549ce 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java @@ -29,10 +29,10 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "val" + i + " := <-" + api.getChannelName(api, a) + "\n" + .mapToObj(i -> "val" + i + " := " + api.getChannelName(api, a) + ".Read()\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" ).collect(Collectors.joining("\n")) + "\n" - + "return " + getReturnType(curr, api, succ) + "{}"; + + buildReturn(curr, api, succ); } @Override diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java index 9b97a3446..72a8b910f 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -22,12 +22,17 @@ public String getPreamble(STStateChanAPIBuilder api, EState s) { String casefunc = api.getStateChanName(s) + "_Case"; // FIXME: factor out with branch action builder return GSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + + "\n" + + "import \"org/scribble/runtime/net\"\n" // Some parts duplicated from GSTStateChanAPIBuilder + "\n" + "type " + api.getStateChanName(s) + "_Cases interface {\n" + casefunc + "()\n" + "}" + s.getActions().stream().map(a -> - "\n\ntype " + getOpTypeName(api, s, a.mid) + " struct{}\n" + "\n\ntype " + getOpTypeName(api, s, a.mid) + " struct{\n" + + "ep *net.MPSTEndpoint\n" // FIXME: factor out + + "state *net.LinearResource\n" // FIXME: EndSocket special case? // FIXME: only seems to work as a pointer (something to do with method calls via value recievers? is it copying the value before calling the function?) + + "}\n" + "\n" + "func (" + getOpTypeName(api, s, a.mid) + ") " + casefunc + "() {}" ).collect(Collectors.joining("")); From 7745273ab960beda92dcbde446f2aac1ca48fdf5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 02:33:16 +0100 Subject: [PATCH 018/433] Continued. --- .../statetype/go/GSTBranchStateBuilder.java | 14 +++---- .../statetype/go/GSTStateChanAPIBuilder.java | 37 ++++++++++++++----- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java index 432be7cf6..1107f8e61 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java @@ -1,12 +1,8 @@ package org.scribble.codegen.statetype.go; -import java.util.List; -import java.util.stream.Collectors; - -import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.codegen.statetype.STBranchStateBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; import org.scribble.sesstype.name.MessageId; public class GSTBranchStateBuilder extends STBranchStateBuilder @@ -19,16 +15,16 @@ public GSTBranchStateBuilder(GSTBranchActionBuilder bb) @Override public String getPreamble(STStateChanAPIBuilder api, EState s) { - String ename = getBranchEnumType(api, s); - List as = s.getActions(); - return GSTStateChanAPIBuilder.getStateChanPremable(api, s) + "\n" + /*String ename = getBranchEnumType(api, s); + List as = s.getActions();*/ + return GSTStateChanAPIBuilder.getStateChanPremable(api, s) /*+ "\n" + "\n" + "type " + ename + " int\n" + "\n" + "const (\n" + getBranchEnumValue(as.get(0).mid) + " " + ename + " = iota \n" + as.subList(1, as.size()).stream().map(a -> getBranchEnumValue(a.mid)).collect(Collectors.joining("\n")) + "\n" - + ")"; + + ")"*/; } protected static String getBranchEnumType(STStateChanAPIBuilder api, EState s) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index 27d99fb75..2f5e4d78f 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -1,28 +1,26 @@ package org.scribble.codegen.statetype.go; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collector; +import java.util.function.Predicate; import java.util.stream.Collectors; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanAPIBuilder; -import org.scribble.del.ModuleDel; import org.scribble.main.Job; -import org.scribble.main.RuntimeScribbleException; -import org.scribble.main.ScribbleException; +import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; import org.scribble.sesstype.kind.Global; import org.scribble.sesstype.name.GProtocolName; -import org.scribble.sesstype.name.MessageId; import org.scribble.sesstype.name.Role; -import org.scribble.visit.util.MessageIdCollector; public class GSTStateChanAPIBuilder extends STStateChanAPIBuilder { @@ -62,7 +60,7 @@ public Map buildSessionAPI() // FIXME: factor out Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); GProtocolName simpname = this.gpn.getSimpleName(); ProtocolDecl gpd = mod.getProtocolDecl(simpname); - MessageIdCollector coll = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); + /*MessageIdCollector coll = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); try { gpd.accept(coll); @@ -70,10 +68,17 @@ public Map buildSessionAPI() // FIXME: factor out catch (ScribbleException e) { throw new RuntimeScribbleException(e); - } + }*/ List roles = gpd.header.roledecls.getRoles(); - Set> mids = coll.getNames(); + //Set> mids = coll.getNames(); + Set instates = new HashSet<>(); + Predicate f = (s) -> s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT; + if (f.test(this.graph.init)) + { + instates.add(this.graph.init); + } + instates.addAll(MState.getReachableStates(this.graph.init).stream().filter(f).collect(Collectors.toSet())); Map res = new HashMap<>(); String dir = this.gpn.toString().replaceAll("\\.", "/") + "/"; @@ -114,6 +119,20 @@ public Map buildSessionAPI() // FIXME: factor out + "func New" + simpname + "() *" + simpname + "{\n" + "return &" + simpname + "{ " + roles.stream().map(r -> r + ": " + r + "{}").collect(Collectors.joining(", ")) + " }\n" + "}"; + + for (EState s : instates) + { + String ename = GSTBranchStateBuilder.getBranchEnumType(this, s); + List as = s.getActions(); + sessclass += + "\n\ntype " + ename + " int\n" + + "\n" + + "const (\n" + + GSTBranchStateBuilder.getBranchEnumValue(as.get(0).mid) + " " + ename + " = iota \n" + + as.subList(1, as.size()).stream().map(a -> GSTBranchStateBuilder.getBranchEnumValue(a.mid)).collect(Collectors.joining("\n")) + "\n" + + ")"; + } + res.put(dir + simpname + ".go", sessclass); /*for (Role r : roles) { From 6a5b8d0e54007bf86d2406bfd52914fc52fd54c5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 03:12:15 +0100 Subject: [PATCH 019/433] Continued. --- .../codegen/statetype/STActionBuilder.java | 4 +- .../statetype/STStateChanAPIBuilder.java | 2 +- .../statetype/go/GSTBranchActionBuilder.java | 16 +++++++- .../statetype/go/GSTStateChanAPIBuilder.java | 38 +++++++++---------- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index ba1792284..1bce2ea2a 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -9,7 +9,7 @@ public abstract class STActionBuilder public abstract String buildArgs(EAction a); public abstract String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ); - public String getReturnType(EState curr, STStateChanAPIBuilder api, EState succ) + public String getReturnType(STStateChanAPIBuilder api, EState curr, EState succ) { return api.getStateChanName(succ); } @@ -23,7 +23,7 @@ public String buildReturn(EState curr, STStateChanAPIBuilder api, EState succ) res += "s.ep.Done = true\n"; } - res += "return " + getReturnType(curr, api, succ) + "{ ep: s.ep, state: &net.LinearResource {} }"; // FIXME: EndSocket LinearResource special case + res += "return &" + getReturnType(api, curr, succ) + "{ ep: s.ep, state: &net.LinearResource {} }"; // FIXME: EndSocket LinearResource special case return res; } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index 4a2520017..c1200f125 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -58,7 +58,7 @@ public Map build() // filepath -> source switch (s.getStateKind()) { case ACCEPT: throw new RuntimeException("TODO"); - case OUTPUT: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; // FIXME: use buildAction directly + case OUTPUT: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; case POLY_INPUT: { api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index e1e923a94..69876e819 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -9,6 +9,19 @@ public class GSTBranchActionBuilder extends STBranchActionBuilder { + @Override + public String build(STStateChanAPIBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return + { + EState succ = curr.getSuccessor(a); + return + "func (s " + getStateChanType(api, curr, a) + ") " + getSTActionName(api, a) + "(" + + buildArgs(a) + //+ ") *" + getReturnType(api, curr, succ) + " {\n" // HACK: no *return (unlike all other state chans) + + ") " + getReturnType(api, curr, succ) + " {\n" + + "s.state.Use()\n" + + buildBody(api, curr, a, succ) + "\n" + + "}"; + } @Override public String getSTActionName(STStateChanAPIBuilder api, EAction a) @@ -23,7 +36,7 @@ public String buildArgs(EAction a) } @Override - public String getReturnType(EState curr, STStateChanAPIBuilder api, EState succ) + public String getReturnType(STStateChanAPIBuilder api, EState curr, EState succ) { return api.getStateChanName(curr) + "_Cases"; // FIXME: factor out with case builder } @@ -42,4 +55,5 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat + "}\n" + "return nil"; // FIXME: panic instead } + } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index 2f5e4d78f..ce9b9b936 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -119,20 +119,6 @@ public Map buildSessionAPI() // FIXME: factor out + "func New" + simpname + "() *" + simpname + "{\n" + "return &" + simpname + "{ " + roles.stream().map(r -> r + ": " + r + "{}").collect(Collectors.joining(", ")) + " }\n" + "}"; - - for (EState s : instates) - { - String ename = GSTBranchStateBuilder.getBranchEnumType(this, s); - List as = s.getActions(); - sessclass += - "\n\ntype " + ename + " int\n" - + "\n" - + "const (\n" - + GSTBranchStateBuilder.getBranchEnumValue(as.get(0).mid) + " " + ename + " = iota \n" - + as.subList(1, as.size()).stream().map(a -> GSTBranchStateBuilder.getBranchEnumValue(a.mid)).collect(Collectors.joining("\n")) + "\n" - + ")"; - } - res.put(dir + simpname + ".go", sessclass); /*for (Role r : roles) { @@ -151,10 +137,24 @@ public Map buildSessionAPI() // FIXME: factor out + "return " + init + "{}, role" + r + "\n" + "}"; res.put(dir + "role_" + r + ".go", role); - } + }*/ // labels String labels = + "package " + getPackage(); // FIXME: factor out + for (EState s : instates) + { + String ename = GSTBranchStateBuilder.getBranchEnumType(this, s); + List as = s.getActions(); + labels += + "\n\ntype " + ename + " int\n" + + "\n" + + "const (\n" + + GSTBranchStateBuilder.getBranchEnumValue(as.get(0).mid) + " " + ename + " = iota \n" + + as.subList(1, as.size()).stream().map(a -> GSTBranchStateBuilder.getBranchEnumValue(a.mid)).collect(Collectors.joining("\n")) + "\n" + + ")"; + } + /*String labels = "package " + getPackage() + "\n"; /*for (MessageId mid : mids) { @@ -162,10 +162,10 @@ public Map buildSessionAPI() // FIXME: factor out "\ntype op" + mid + " string\n" + "\n" + "const " + mid + " op" + mid + " = \"" + mid + "\"\n"; - }* / - res.put(this.gpn.toString().replaceAll("\\.", "/") + "/labels.go", labels); + }*/ + res.put(dir + "labels_" + this.role + ".go", labels); - // types + /*// types String types = "package " + getPackage() + "\n" + "\n" @@ -212,7 +212,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b return "func (s " + ab.getStateChanType(this, curr, a) + ") " + ab.getSTActionName(this, a) + "(" + ab.buildArgs(a) - + ") " + ab.getReturnType(curr, this, succ) + " {\n" + + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + "s.state.Use()\n" + ab.buildBody(this, curr, a, succ) + "\n" + "}"; From da927a37a2dff59b7d11df70487518d2e2acd9a3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 04:17:37 +0100 Subject: [PATCH 020/433] Continued. --- .../codegen/statetype/go/GSTBranchActionBuilder.java | 8 ++++---- .../codegen/statetype/go/GSTStateChanAPIBuilder.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index 69876e819..d8727a388 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -10,11 +10,11 @@ public class GSTBranchActionBuilder extends STBranchActionBuilder { @Override - public String build(STStateChanAPIBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return + public String build(STStateChanAPIBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out { - EState succ = curr.getSuccessor(a); + EState succ = curr.getSuccessor(a); return - "func (s " + getStateChanType(api, curr, a) + ") " + getSTActionName(api, a) + "(" + "func (s *" + getStateChanType(api, curr, a) + ") " + getSTActionName(api, a) + "(" + buildArgs(a) //+ ") *" + getReturnType(api, curr, succ) + " {\n" // HACK: no *return (unlike all other state chans) + ") " + getReturnType(api, curr, succ) + " {\n" @@ -50,7 +50,7 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat + "switch op {\n" + curr.getActions().stream().map(x -> "case " + GSTBranchStateBuilder.getBranchEnumValue(x.mid) + ":\n" - + "return " + GSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{ ep: s.ep, state: &net.LinearResource {} }\n" // FIXME: factor out + + "return &" + GSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{ ep: s.ep, state: &net.LinearResource {} }\n" // FIXME: factor out ).collect(Collectors.joining("")) + "}\n" + "return nil"; // FIXME: panic instead diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index ce9b9b936..f5c56f0f8 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -210,7 +210,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b { EState succ = curr.getSuccessor(a); return - "func (s " + ab.getStateChanType(this, curr, a) + ") " + ab.getSTActionName(this, a) + "(" + "func (s *" + ab.getStateChanType(this, curr, a) + ") " + ab.getSTActionName(this, a) + "(" + ab.buildArgs(a) + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + "s.state.Use()\n" From e728a2ddc4b0f58d29dd32c9d9fcc9029bccf035 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 11:46:55 +0100 Subject: [PATCH 021/433] Fixed non-initial state channel constructor privacy. --- .../codegen/statetype/STActionBuilder.java | 2 +- .../scribble/codegen/statetype/STCaseBuilder.java | 2 ++ .../codegen/statetype/STStateChanAPIBuilder.java | 2 +- .../statetype/go/GSTBranchActionBuilder.java | 6 +++--- .../statetype/go/GSTCaseActionBuilder.java | 2 +- .../codegen/statetype/go/GSTCaseBuilder.java | 15 +++++++++++++-- .../statetype/go/GSTReceiveActionBuilder.java | 2 +- .../statetype/go/GSTSendActionBuilder.java | 2 +- .../statetype/go/GSTStateChanAPIBuilder.java | 13 +++++++++++-- 9 files changed, 34 insertions(+), 12 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index 1bce2ea2a..fe300fcb3 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -5,7 +5,7 @@ public abstract class STActionBuilder { - public abstract String getSTActionName(STStateChanAPIBuilder api, EAction a); + public abstract String getActionName(STStateChanAPIBuilder api, EAction a); public abstract String buildArgs(EAction a); public abstract String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ); diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java index b0ca72252..f5edaed00 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java @@ -33,4 +33,6 @@ public String build(STStateChanAPIBuilder api, EState s) return out; } + + public abstract String getCaseStateChanName(STStateChanAPIBuilder api, EState s); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index c1200f125..2b091c0ca 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -62,7 +62,7 @@ public Map build() // filepath -> source case POLY_INPUT: { api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); - api.put(getFilePath(getStateChanName(s) + "_Cases"), this.cb.build(this, s)); // FIXME: factor out + api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out break; } case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index d8727a388..5a1687a60 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -14,7 +14,7 @@ public String build(STStateChanAPIBuilder api, EState curr, EAction a) // FIXME { EState succ = curr.getSuccessor(a); return - "func (s *" + getStateChanType(api, curr, a) + ") " + getSTActionName(api, a) + "(" + "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + buildArgs(a) //+ ") *" + getReturnType(api, curr, succ) + " {\n" // HACK: no *return (unlike all other state chans) + ") " + getReturnType(api, curr, succ) + " {\n" @@ -24,7 +24,7 @@ public String build(STStateChanAPIBuilder api, EState curr, EAction a) // FIXME } @Override - public String getSTActionName(STStateChanAPIBuilder api, EAction a) + public String getActionName(STStateChanAPIBuilder api, EAction a) { return "Branch_" + a.peer; } @@ -38,7 +38,7 @@ public String buildArgs(EAction a) @Override public String getReturnType(STStateChanAPIBuilder api, EState curr, EState succ) { - return api.getStateChanName(curr) + "_Cases"; // FIXME: factor out with case builder + return api.cb.getCaseStateChanName(api, curr); } @Override diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java index e14b549ce..e643c24f3 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java @@ -12,7 +12,7 @@ public class GSTCaseActionBuilder extends STCaseActionBuilder { @Override - public String getSTActionName(STStateChanAPIBuilder api, EAction a) + public String getActionName(STStateChanAPIBuilder api, EAction a) { return "Recv_" + a.peer + "_" + a.mid; } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java index 72a8b910f..7a7f8ff74 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -17,15 +17,26 @@ public GSTCaseBuilder(GSTCaseActionBuilder cb) super(cb); } + protected static String getCaseActionName(STStateChanAPIBuilder api, EState s) + { + return api.getStateChanName(s) + "_Case"; + } + + @Override + public String getCaseStateChanName(STStateChanAPIBuilder api, EState s) + { + return "_" + api.getStateChanName(s) + "_Cases"; // Cannot be the initial state channel + } + @Override public String getPreamble(STStateChanAPIBuilder api, EState s) { - String casefunc = api.getStateChanName(s) + "_Case"; // FIXME: factor out with branch action builder + String casefunc = getCaseActionName(api, s); return GSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + "\n" + "import \"org/scribble/runtime/net\"\n" // Some parts duplicated from GSTStateChanAPIBuilder + "\n" - + "type " + api.getStateChanName(s) + "_Cases interface {\n" + + "type " + getCaseStateChanName(api, s) + " interface {\n" + casefunc + "()\n" + "}" + s.getActions().stream().map(a -> diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java index f303c9a0e..454524750 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -12,7 +12,7 @@ public class GSTReceiveActionBuilder extends STReceiveActionBuilder { @Override - public String getSTActionName(STStateChanAPIBuilder api, EAction a) + public String getActionName(STStateChanAPIBuilder api, EAction a) { return "Recv_" + a.peer + "_" + a.mid; } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index c258b231a..fb8f16136 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -12,7 +12,7 @@ public class GSTSendActionBuilder extends STSendActionBuilder { @Override - public String getSTActionName(STStateChanAPIBuilder api, EAction a) + public String getActionName(STStateChanAPIBuilder api, EAction a) { return "Send_" + a.peer + "_" + a.mid; } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index f5c56f0f8..4cca2948d 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -45,12 +45,21 @@ public String getPackage() @Override protected String makeSTStateName(EState s) { - return s.isTerminal() ? "EndSocket" : this.gpn.getSimpleName() + "_" + role + "_" + this.counter++; + if (s.isTerminal()) + { + return "EndSocket"; + } + String name = this.gpn.getSimpleName() + "_" + role + "_" + this.counter++; + return (s.id == this.graph.init.id) ? name : "_" + name; } @Override public String getFilePath(String filename) { + if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go + { + filename = "$" + filename.substring(1); + } return this.gpn.toString().replaceAll("\\.", "/") + "/" + filename + ".go"; } @@ -210,7 +219,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b { EState succ = curr.getSuccessor(a); return - "func (s *" + ab.getStateChanType(this, curr, a) + ") " + ab.getSTActionName(this, a) + "(" + "func (s *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(a) + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + "s.state.Use()\n" From 16a4c063b15189c2fd890be623ea41c515bb4551 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 15:59:11 +0100 Subject: [PATCH 022/433] Removed LinearResource from EndSocket. --- .../codegen/statetype/STActionBuilder.java | 13 ++----------- .../statetype/STStateChanAPIBuilder.java | 2 ++ .../statetype/go/GSTCaseActionBuilder.java | 2 +- .../statetype/go/GSTEndStateBuilder.java | 12 +++++++++++- .../statetype/go/GSTReceiveActionBuilder.java | 8 ++++---- .../statetype/go/GSTSendActionBuilder.java | 2 +- .../statetype/go/GSTStateChanAPIBuilder.java | 19 +++++++++++++++++++ 7 files changed, 40 insertions(+), 18 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index fe300fcb3..1d6810944 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -14,18 +14,9 @@ public String getReturnType(STStateChanAPIBuilder api, EState curr, EState succ) return api.getStateChanName(succ); } - public String buildReturn(EState curr, STStateChanAPIBuilder api, EState succ) + public String buildReturn(STStateChanAPIBuilder api, EState curr, EState succ) { - String res = ""; - - if (succ.isTerminal()) - { - res += "s.ep.Done = true\n"; - } - - res += "return &" + getReturnType(api, curr, succ) + "{ ep: s.ep, state: &net.LinearResource {} }"; // FIXME: EndSocket LinearResource special case - - return res; + return api.buildActionReturn(this, curr, succ); } public String build(STStateChanAPIBuilder api, EState curr, EAction a) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index 2b091c0ca..f92aad158 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -100,4 +100,6 @@ public String getStateChanName(EState s) public abstract String buildAction(STActionBuilder ab, EState curr, EAction a); public abstract String getChannelName(STStateChanAPIBuilder api, EAction a); + + public abstract String buildActionReturn(STActionBuilder ab, EState curr, EState succ); // FIXME: refactor action builders as interfaces and use generic parameter for kind } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java index e643c24f3..db104f10e 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java @@ -32,7 +32,7 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat .mapToObj(i -> "val" + i + " := " + api.getChannelName(api, a) + ".Read()\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" ).collect(Collectors.joining("\n")) + "\n" - + buildReturn(curr, api, succ); + + buildReturn(api, curr, succ); } @Override diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java index 4a8924bbe..0b5055ae7 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTEndStateBuilder.java @@ -20,6 +20,16 @@ public String build(STStateChanAPIBuilder api, EState s) @Override public String getPreamble(STStateChanAPIBuilder api, EState s) { - return GSTStateChanAPIBuilder.getStateChanPremable(api, s); + //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); + String tname = api.getStateChanName(s); + String res = + GSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + + "\n" + + "import \"org/scribble/runtime/net\"\n" + + "\n" + + "type " + tname + " struct{\n" + + "ep *net.MPSTEndpoint\n" // FIXME: factor out + + "}"; + return res; // No LinearResource } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java index 454524750..2cf605f07 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -31,12 +31,12 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat return //"op := //"<-" + chan + "\n" - chan + ".Read()\n" + chan + ".Read()" + IntStream.range(0, a.payload.elems.size()) //.mapToObj(i -> "val" + i + " := <-" + chan + "\n" - .mapToObj(i -> "val" + i + " := " + chan + ".Read()\n" + .mapToObj(i -> "\n\nval" + i + " := " + chan + ".Read()\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" - ).collect(Collectors.joining("\n")) + "\n" - + buildReturn(curr, api, succ); + ).collect(Collectors.joining("")) + + "\n" + buildReturn(api, curr, succ); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index fb8f16136..3b8d4ebb8 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -34,6 +34,6 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat + IntStream.range(0, a.payload.elems.size()) //.mapToObj(i -> chan + "<- arg" + i).collect(Collectors.joining("\n")) + "\n" .mapToObj(i -> chan + ".Write(arg" + i + ")").collect(Collectors.joining("\n")) + "\n" - + buildReturn(curr, api, succ); + + buildReturn(api, curr, succ); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index 4cca2948d..8717ed88d 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -234,4 +234,23 @@ public String getChannelName(STStateChanAPIBuilder api, EAction a) //"role" + this.role + "." + a.peer; "s.ep.Chans[s.ep.Proto.(" + api.gpn.getSimpleName() + ")." + a.peer + "]"; } + + @Override + public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) // FIXME: refactor action builders as interfaces and use generic parameter for kind + { + String res = ""; + + if (succ.isTerminal()) + { + res += "s.ep.Done = true\n"; + } + res += "return &" + ab.getReturnType(this, curr, succ) + "{ ep: s.ep"; + if (!succ.isTerminal()) + { + res += ", state: &net.LinearResource {}"; // FIXME: EndSocket LinearResource special case + } + res += " }"; + + return res; + } } From d7aa057b1ea7b08e7b28bb28edce90f139057855 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 16:00:51 +0100 Subject: [PATCH 023/433] Renamed EndState and made private. --- .../scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index 8717ed88d..f837fd4f9 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -47,7 +47,7 @@ protected String makeSTStateName(EState s) { if (s.isTerminal()) { - return "EndSocket"; + return "_EndState"; } String name = this.gpn.getSimpleName() + "_" + role + "_" + this.counter++; return (s.id == this.graph.init.id) ? name : "_" + name; From daf896c2e0a7c08e7da5a4b88871ed97573291c0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 16:42:38 +0100 Subject: [PATCH 024/433] Fixed Go API gen singleton role types. --- .../statetype/go/GSTStateChanAPIBuilder.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index f837fd4f9..a558011c4 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -114,19 +114,28 @@ public Map buildSessionAPI() // FIXME: factor out "package " + getPackage() + "\n" // FIXME: factor out + "\n" + roles.stream().map(r -> - "type " + r + " struct { }\n" + "type _" + r + " struct { }\n" + "\n" - + "func (" + r +") GetRoleName() string {\n" + + "func (*_" + r +") GetRoleName() string {\n" + "return \"" + r + "\"\n" + + "}\n" + + "\n" + + "var __" + r + " *_" + r + "\n" + + "\n" + + "func new" + r + "() *_" + r + " {" // FIXME: not concurrent + + "if __" + r + " == nil {\n" + + "__"+ r + " = &_" + r + "{}\n" + + "}\n" + + "return __" + r + "\n" + "}" ).collect(Collectors.joining("\n\n")) + "\n" + "\n" + "type " + simpname + " struct {\n" - + roles.stream().map(r -> r + " " + r).collect(Collectors.joining("\n")) + "\n" // FIXME: role constants should be pointers? + + roles.stream().map(r -> r + " *_" + r).collect(Collectors.joining("\n")) + "\n" // FIXME: role constants should be pointers? + "}\n" + "\n" + "func New" + simpname + "() *" + simpname + "{\n" - + "return &" + simpname + "{ " + roles.stream().map(r -> r + ": " + r + "{}").collect(Collectors.joining(", ")) + " }\n" + + "return &" + simpname + "{ " + roles.stream().map(r -> "new" + r + "()").collect(Collectors.joining(", ")) + " }\n" + "}"; res.put(dir + simpname + ".go", sessclass); /*for (Role r : roles) @@ -232,7 +241,7 @@ public String getChannelName(STStateChanAPIBuilder api, EAction a) { return //"role" + this.role + "." + a.peer; - "s.ep.Chans[s.ep.Proto.(" + api.gpn.getSimpleName() + ")." + a.peer + "]"; + "s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; } @Override From ba87b80e81dbc81c1896826a097c7f36e26c4388 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 17:00:07 +0100 Subject: [PATCH 025/433] Separated Go Session API gen. --- .../statetype/STStateChanAPIBuilder.java | 4 +- .../codegen/statetype/go/GSTCaseBuilder.java | 6 +- .../statetype/go/GSTStateChanAPIBuilder.java | 137 +----------------- .../src/main/java/org/scribble/main/Job.java | 2 +- 4 files changed, 7 insertions(+), 142 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index f92aad158..bda831cfc 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -15,11 +15,10 @@ public abstract class STStateChanAPIBuilder { - protected final Job job; + public final Job job; public final GProtocolName gpn; public final Role role; - public final EGraph graph; public final STOutputStateBuilder ob; @@ -34,6 +33,7 @@ protected STStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph gr STOutputStateBuilder ob, STReceiveStateBuilder rb, STBranchStateBuilder bb, STCaseBuilder cb, STEndStateBuilder eb) { this.job = job; + this.gpn = gpn; this.role = role; this.graph = graph; diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java index 7a7f8ff74..29c4a10c0 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -31,13 +31,13 @@ public String getCaseStateChanName(STStateChanAPIBuilder api, EState s) @Override public String getPreamble(STStateChanAPIBuilder api, EState s) { - String casefunc = getCaseActionName(api, s); + String casename = getCaseActionName(api, s); return GSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + "\n" + "import \"org/scribble/runtime/net\"\n" // Some parts duplicated from GSTStateChanAPIBuilder + "\n" + "type " + getCaseStateChanName(api, s) + " interface {\n" - + casefunc + "()\n" + + casename + "()\n" + "}" + s.getActions().stream().map(a -> "\n\ntype " + getOpTypeName(api, s, a.mid) + " struct{\n" @@ -45,7 +45,7 @@ public String getPreamble(STStateChanAPIBuilder api, EState s) + "state *net.LinearResource\n" // FIXME: EndSocket special case? // FIXME: only seems to work as a pointer (something to do with method calls via value recievers? is it copying the value before calling the function?) + "}\n" + "\n" - + "func (" + getOpTypeName(api, s, a.mid) + ") " + casefunc + "() {}" + + "func (*" + getOpTypeName(api, s, a.mid) + ") " + casename + "() {}" ).collect(Collectors.joining("")); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index a558011c4..bddd8b098 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -1,24 +1,13 @@ package org.scribble.codegen.statetype.go; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import org.scribble.ast.Module; -import org.scribble.ast.ProtocolDecl; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.main.Job; -import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.sesstype.kind.Global; import org.scribble.sesstype.name.GProtocolName; import org.scribble.sesstype.name.Role; @@ -66,131 +55,7 @@ public String getFilePath(String filename) @Override public Map buildSessionAPI() // FIXME: factor out { - Module mod = this.job.getContext().getModule(this.gpn.getPrefix()); - GProtocolName simpname = this.gpn.getSimpleName(); - ProtocolDecl gpd = mod.getProtocolDecl(simpname); - /*MessageIdCollector coll = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); - try - { - gpd.accept(coll); - } - catch (ScribbleException e) - { - throw new RuntimeScribbleException(e); - }*/ - - List roles = gpd.header.roledecls.getRoles(); - //Set> mids = coll.getNames(); - Set instates = new HashSet<>(); - Predicate f = (s) -> s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT; - if (f.test(this.graph.init)) - { - instates.add(this.graph.init); - } - instates.addAll(MState.getReachableStates(this.graph.init).stream().filter(f).collect(Collectors.toSet())); - - Map res = new HashMap<>(); - String dir = this.gpn.toString().replaceAll("\\.", "/") + "/"; - - /*// endpoints - String endpoints = - "package " + getPackage() + "\n" - + roles.stream().map(r -> - "type endpoint" + r + " struct {\n" - + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + " chan T").collect(Collectors.joining("\n")) + "\n" - + "}\n" - + "\n" - + "func (ep endpoint" + r + ") Close() error {\n" - + roles.stream().filter(rr -> rr.toString().compareTo(r.toString()) > 0).map(rr -> "close(ep" + "." + rr + ")").collect(Collectors.joining("\n")) + "\n" - + "return nil\n" - + "}\n" - + "\n" - + "var role" + r + " endpoint" + r - ).collect(Collectors.joining("\n\n")); - res.put(dir + "endpoints.go", endpoints);*/ - - // roles - String sessclass = - "package " + getPackage() + "\n" // FIXME: factor out - + "\n" - + roles.stream().map(r -> - "type _" + r + " struct { }\n" - + "\n" - + "func (*_" + r +") GetRoleName() string {\n" - + "return \"" + r + "\"\n" - + "}\n" - + "\n" - + "var __" + r + " *_" + r + "\n" - + "\n" - + "func new" + r + "() *_" + r + " {" // FIXME: not concurrent - + "if __" + r + " == nil {\n" - + "__"+ r + " = &_" + r + "{}\n" - + "}\n" - + "return __" + r + "\n" - + "}" - ).collect(Collectors.joining("\n\n")) + "\n" - + "\n" - + "type " + simpname + " struct {\n" - + roles.stream().map(r -> r + " *_" + r).collect(Collectors.joining("\n")) + "\n" // FIXME: role constants should be pointers? - + "}\n" - + "\n" - + "func New" + simpname + "() *" + simpname + "{\n" - + "return &" + simpname + "{ " + roles.stream().map(r -> "new" + r + "()").collect(Collectors.joining(", ")) + " }\n" - + "}"; - res.put(dir + simpname + ".go", sessclass); - /*for (Role r : roles) - { - String init = this.gpn.getSimpleName() + "_" + r + "_" + 1; // FIXME: factor out naming scheme - String role = - "package " + getPackage() + "\n" - + "\n" - + "import \"io\"\n" - + "\n" - + "func New" + r + "(" - + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + " chan T").collect(Collectors.joining(", ")) - + ") (" + init + ", io.Closer) {\n" - + "role" + r + " = endpoint" + r + "{\n" - + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + ": " + rr).collect(Collectors.joining(",\n")) + ",\n" - + "}\n" - + "return " + init + "{}, role" + r + "\n" - + "}"; - res.put(dir + "role_" + r + ".go", role); - }*/ - - // labels - String labels = - "package " + getPackage(); // FIXME: factor out - for (EState s : instates) - { - String ename = GSTBranchStateBuilder.getBranchEnumType(this, s); - List as = s.getActions(); - labels += - "\n\ntype " + ename + " int\n" - + "\n" - + "const (\n" - + GSTBranchStateBuilder.getBranchEnumValue(as.get(0).mid) + " " + ename + " = iota \n" - + as.subList(1, as.size()).stream().map(a -> GSTBranchStateBuilder.getBranchEnumValue(a.mid)).collect(Collectors.joining("\n")) + "\n" - + ")"; - } - /*String labels = - "package " + getPackage() + "\n"; - /*for (MessageId mid : mids) - { - labels += - "\ntype op" + mid + " string\n" - + "\n" - + "const " + mid + " op" + mid + " = \"" + mid + "\"\n"; - }*/ - res.put(dir + "labels_" + this.role + ".go", labels); - - /*// types - String types = - "package " + getPackage() + "\n" - + "\n" - + "type T interface {}"; - res.put(dir + "types.go", types);*/ - - return res; + return new GSTSessionAPIBuilder(this).buildSessionAPI(); } protected static String getPackageDecl(STStateChanAPIBuilder api) diff --git a/modules/core/src/main/java/org/scribble/main/Job.java b/modules/core/src/main/java/org/scribble/main/Job.java index 340f11d80..cf6abca33 100644 --- a/modules/core/src/main/java/org/scribble/main/Job.java +++ b/modules/core/src/main/java/org/scribble/main/Job.java @@ -165,7 +165,7 @@ public Map generateGoApi(GProtocolName fullname, Role self) thro debugPrintPass("Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); GSTStateChanAPIBuilder apigen = new GSTStateChanAPIBuilder(this, fullname, self, this.jcontext.getEGraph(fullname, self)); Map api = apigen.build(); // filepath -> source - api.putAll(apigen.buildSessionAPI()); + api.putAll(apigen.buildSessionAPI()); // FIXME: factor better with STStateChanAPIBuilder return api; } From 7cdc9daf13b8a986214283ae7c48db3c7f5eacb6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 17:15:21 +0100 Subject: [PATCH 026/433] Added missing file. --- .../statetype/go/GSTSessionAPIBuilder.java | 159 ++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100755 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java new file mode 100755 index 000000000..74733b9ee --- /dev/null +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java @@ -0,0 +1,159 @@ +package org.scribble.codegen.statetype.go; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.scribble.ast.Module; +import org.scribble.ast.ProtocolDecl; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.EStateKind; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.sesstype.kind.Global; +import org.scribble.sesstype.name.GProtocolName; +import org.scribble.sesstype.name.Role; + +public class GSTSessionAPIBuilder +{ + private GSTStateChanAPIBuilder api; + + public GSTSessionAPIBuilder(GSTStateChanAPIBuilder api) + { + this.api = api; + } + + //@Override + public Map buildSessionAPI() // FIXME: factor out + { + Module mod = api.job.getContext().getModule(api.gpn.getPrefix()); + GProtocolName simpname = api.gpn.getSimpleName(); + ProtocolDecl gpd = mod.getProtocolDecl(simpname); + /*MessageIdCollector coll = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); + try + { + gpd.accept(coll); + } + catch (ScribbleException e) + { + throw new RuntimeScribbleException(e); + }*/ + + List roles = gpd.header.roledecls.getRoles(); + //Set> mids = coll.getNames(); + Set instates = new HashSet<>(); + Predicate f = (s) -> s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT; + if (f.test(api.graph.init)) + { + instates.add(api.graph.init); + } + instates.addAll(MState.getReachableStates(api.graph.init).stream().filter(f).collect(Collectors.toSet())); + + Map res = new HashMap<>(); + String dir = api.gpn.toString().replaceAll("\\.", "/") + "/"; + + /*// endpoints + String endpoints = + "package " + getPackage() + "\n" + + roles.stream().map(r -> + "type endpoint" + r + " struct {\n" + + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + " chan T").collect(Collectors.joining("\n")) + "\n" + + "}\n" + + "\n" + + "func (ep endpoint" + r + ") Close() error {\n" + + roles.stream().filter(rr -> rr.toString().compareTo(r.toString()) > 0).map(rr -> "close(ep" + "." + rr + ")").collect(Collectors.joining("\n")) + "\n" + + "return nil\n" + + "}\n" + + "\n" + + "var role" + r + " endpoint" + r + ).collect(Collectors.joining("\n\n")); + res.put(dir + "endpoints.go", endpoints);*/ + + // roles + String sessclass = + "package " + api.getPackage() + "\n" // FIXME: factor out + + "\n" + + roles.stream().map(r -> + "type _" + r + " struct { }\n" + + "\n" + + "func (*_" + r +") GetRoleName() string {\n" + + "return \"" + r + "\"\n" + + "}\n" + + "\n" + + "var __" + r + " *_" + r + "\n" + + "\n" + + "func new" + r + "() *_" + r + " {\n" // FIXME: not concurrent + + "if __" + r + " == nil {\n" + + "__"+ r + " = &_" + r + "{}\n" + + "}\n" + + "return __" + r + "\n" + + "}" + ).collect(Collectors.joining("\n\n")) + "\n" + + "\n" + + "type " + simpname + " struct {\n" + + roles.stream().map(r -> r + " *_" + r).collect(Collectors.joining("\n")) + "\n" // FIXME: role constants should be pointers? + + "}\n" + + "\n" + + "func New" + simpname + "() *" + simpname + "{\n" + + "return &" + simpname + "{ " + roles.stream().map(r -> "new" + r + "()").collect(Collectors.joining(", ")) + " }\n" + + "}"; + res.put(dir + simpname + ".go", sessclass); + /*for (Role r : roles) + { + String init = this.gpn.getSimpleName() + "_" + r + "_" + 1; // FIXME: factor out naming scheme + String role = + "package " + getPackage() + "\n" + + "\n" + + "import \"io\"\n" + + "\n" + + "func New" + r + "(" + + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + " chan T").collect(Collectors.joining(", ")) + + ") (" + init + ", io.Closer) {\n" + + "role" + r + " = endpoint" + r + "{\n" + + roles.stream().filter(rr -> !rr.equals(r)).map(rr -> rr + ": " + rr).collect(Collectors.joining(",\n")) + ",\n" + + "}\n" + + "return " + init + "{}, role" + r + "\n" + + "}"; + res.put(dir + "role_" + r + ".go", role); + }*/ + + // labels + String labels = + "package " + api.getPackage(); // FIXME: factor out + for (EState s : instates) + { + String ename = GSTBranchStateBuilder.getBranchEnumType(this.api, s); + List as = s.getActions(); + labels += + "\n\ntype " + ename + " int\n" + + "\n" + + "const (\n" + + GSTBranchStateBuilder.getBranchEnumValue(as.get(0).mid) + " " + ename + " = iota \n" + + as.subList(1, as.size()).stream().map(a -> GSTBranchStateBuilder.getBranchEnumValue(a.mid)).collect(Collectors.joining("\n")) + "\n" + + ")"; + } + /*String labels = + "package " + getPackage() + "\n"; + /*for (MessageId mid : mids) + { + labels += + "\ntype op" + mid + " string\n" + + "\n" + + "const " + mid + " op" + mid + " = \"" + mid + "\"\n"; + }*/ + res.put(dir + "labels_" + api.role + ".go", labels); + + /*// types + String types = + "package " + getPackage() + "\n" + + "\n" + + "type T interface {}"; + res.put(dir + "types.go", types);*/ + + return res; + } +} From 9816b9ef8615b31695ee8751d7d5b338c746627a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 17:25:23 +0100 Subject: [PATCH 027/433] Simplified Go API gen for message ops to strings. --- .../codegen/statetype/go/GSTBranchActionBuilder.java | 9 +++++---- .../codegen/statetype/go/GSTReceiveActionBuilder.java | 2 -- .../codegen/statetype/go/GSTSendActionBuilder.java | 5 ++--- .../codegen/statetype/go/GSTSessionAPIBuilder.java | 6 +++--- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index 5a1687a60..af035d3cd 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -16,8 +16,7 @@ public String build(STStateChanAPIBuilder api, EState curr, EAction a) // FIXME return "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + buildArgs(a) - //+ ") *" + getReturnType(api, curr, succ) + " {\n" // HACK: no *return (unlike all other state chans) - + ") " + getReturnType(api, curr, succ) + " {\n" + + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: Return type is interface, so no need for *return (unlike other state chans) + "s.state.Use()\n" + buildBody(api, curr, a, succ) + "\n" + "}"; @@ -46,10 +45,12 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat { return "tmp := " + api.getChannelName(api, a) + ".Read()\n" - + "op := tmp.(" + GSTBranchStateBuilder.getBranchEnumType(api, curr) + ")\n" + //+ "op := tmp.(" + GSTBranchStateBuilder.getBranchEnumType(api, curr) + ")\n" + + "op := tmp.(string)\n" + "switch op {\n" + curr.getActions().stream().map(x -> - "case " + GSTBranchStateBuilder.getBranchEnumValue(x.mid) + ":\n" + //"case " + GSTBranchStateBuilder.getBranchEnumValue(x.mid) + ":\n" + "case \"" + x.mid + "\":\n" + "return &" + GSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{ ep: s.ep, state: &net.LinearResource {} }\n" // FIXME: factor out ).collect(Collectors.joining("")) + "}\n" diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java index 2cf605f07..6fc0e14bf 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -30,10 +30,8 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat String chan = api.getChannelName(api, a); return //"op := - //"<-" + chan + "\n" chan + ".Read()" + IntStream.range(0, a.payload.elems.size()) - //.mapToObj(i -> "val" + i + " := <-" + chan + "\n" .mapToObj(i -> "\n\nval" + i + " := " + chan + ".Read()\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" ).collect(Collectors.joining("")) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index 3b8d4ebb8..8d1667eff 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -29,10 +29,9 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat { String chan = api.getChannelName(api, a); return - //chan + "<- " + GSTBranchStateBuilder.getBranchEnumValue(a.mid) + "\n" - chan + ".Write(" + GSTBranchStateBuilder.getBranchEnumValue(a.mid) + ")\n" + //chan + ".Write(" + GSTBranchStateBuilder.getBranchEnumValue(a.mid) + ")\n" + chan + ".Write(\"" + a.mid + "\")\n" + IntStream.range(0, a.payload.elems.size()) - //.mapToObj(i -> chan + "<- arg" + i).collect(Collectors.joining("\n")) + "\n" .mapToObj(i -> chan + ".Write(arg" + i + ")").collect(Collectors.joining("\n")) + "\n" + buildReturn(api, curr, succ); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java index 74733b9ee..9273bf82b 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java @@ -122,7 +122,7 @@ public Map buildSessionAPI() // FIXME: factor out }*/ // labels - String labels = + /*String labels = "package " + api.getPackage(); // FIXME: factor out for (EState s : instates) { @@ -135,7 +135,7 @@ public Map buildSessionAPI() // FIXME: factor out + GSTBranchStateBuilder.getBranchEnumValue(as.get(0).mid) + " " + ename + " = iota \n" + as.subList(1, as.size()).stream().map(a -> GSTBranchStateBuilder.getBranchEnumValue(a.mid)).collect(Collectors.joining("\n")) + "\n" + ")"; - } + }*/ /*String labels = "package " + getPackage() + "\n"; /*for (MessageId mid : mids) @@ -145,7 +145,7 @@ public Map buildSessionAPI() // FIXME: factor out + "\n" + "const " + mid + " op" + mid + " = \"" + mid + "\"\n"; }*/ - res.put(dir + "labels_" + api.role + ".go", labels); + //res.put(dir + "labels_" + api.role + ".go", labels); /*// types String types = From 3a29b5b9c578bee3a6b47e6c185d7c55c440d0dd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 20:51:19 +0100 Subject: [PATCH 028/433] Continued. --- .../scribble/codegen/statetype/go/GSTBranchStateBuilder.java | 5 ++--- .../org/scribble/codegen/statetype/go/GSTCaseBuilder.java | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java index 1107f8e61..23d80b639 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java @@ -3,7 +3,6 @@ import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.model.endpoint.EState; -import org.scribble.sesstype.name.MessageId; public class GSTBranchStateBuilder extends STBranchStateBuilder { @@ -27,7 +26,7 @@ public String getPreamble(STStateChanAPIBuilder api, EState s) + ")"*/; } - protected static String getBranchEnumType(STStateChanAPIBuilder api, EState s) + /*protected static String getBranchEnumType(STStateChanAPIBuilder api, EState s) { return api.getStateChanName(s) + "_Enum"; } @@ -35,5 +34,5 @@ protected static String getBranchEnumType(STStateChanAPIBuilder api, EState s) protected static String getBranchEnumValue(MessageId mid) { return "_" + mid; - } + }*/ } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java index 29c4a10c0..9232a87fb 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -25,7 +25,8 @@ protected static String getCaseActionName(STStateChanAPIBuilder api, EState s) @Override public String getCaseStateChanName(STStateChanAPIBuilder api, EState s) { - return "_" + api.getStateChanName(s) + "_Cases"; // Cannot be the initial state channel + String name = api.getStateChanName(s) + "_Cases"; + return ((s.id == api.graph.init.id) ? "_" : "") + name; // Case state channel itself cannot be the initial state chan } @Override From d1031836d5bd4a9a2426b4bd5065ae8c5486de53 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 21:21:10 +0100 Subject: [PATCH 029/433] Made Go API gen state channels public again. --- .../org/scribble/codegen/statetype/go/GSTCaseBuilder.java | 4 +++- .../scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java index 9232a87fb..fda8020a1 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -26,7 +26,9 @@ protected static String getCaseActionName(STStateChanAPIBuilder api, EState s) public String getCaseStateChanName(STStateChanAPIBuilder api, EState s) { String name = api.getStateChanName(s) + "_Cases"; - return ((s.id == api.graph.init.id) ? "_" : "") + name; // Case state channel itself cannot be the initial state chan + // Should be "private" or not, corresponding to GSTStateChanAPIBuilder.makeSTStateName + //return ((s.id == api.graph.init.id) ? "_" : "") + name; // Case state channel itself cannot be the initial state chan + return name; } @Override diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index bddd8b098..70b19c975 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -39,7 +39,8 @@ protected String makeSTStateName(EState s) return "_EndState"; } String name = this.gpn.getSimpleName() + "_" + role + "_" + this.counter++; - return (s.id == this.graph.init.id) ? name : "_" + name; + //return (s.id == this.graph.init.id) ? name : "_" + name; // For "private" non-initial state channels + return name; } @Override From 1913d24ad846a050b41800bb76e1f458857b3b15 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 21 May 2017 22:41:19 +0100 Subject: [PATCH 030/433] Added protocol and role specific endpoints to Go API gen. --- .../statetype/go/GSTSessionAPIBuilder.java | 17 ++++++++++++++++- .../statetype/go/GSTStateChanAPIBuilder.java | 4 ++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java index 9273bf82b..0404d6690 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java @@ -13,7 +13,6 @@ import org.scribble.model.MState; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; -import org.scribble.model.endpoint.actions.EAction; import org.scribble.sesstype.kind.Global; import org.scribble.sesstype.name.GProtocolName; import org.scribble.sesstype.name.Role; @@ -77,6 +76,8 @@ public Map buildSessionAPI() // FIXME: factor out String sessclass = "package " + api.getPackage() + "\n" // FIXME: factor out + "\n" + + "import \"org/scribble/runtime/net\"\n" + + "\n" + roles.stream().map(r -> "type _" + r + " struct { }\n" + "\n" @@ -101,6 +102,20 @@ public Map buildSessionAPI() // FIXME: factor out + "func New" + simpname + "() *" + simpname + "{\n" + "return &" + simpname + "{ " + roles.stream().map(r -> "new" + r + "()").collect(Collectors.joining(", ")) + " }\n" + "}"; + + // Specific endpoints + sessclass += + roles.stream().map(r -> + "\n\n" + + "type _Endpoint_" + simpname + "_" + r + " struct {\n" // FIXME: factor out + + r + " *net.MPSTEndpoint\n" // FIXME: factor out + + "}\n" + + "\n" + + "func NewEndpoint" + simpname + "_" + r + "(P *" + simpname + ") *_Endpoint_" + simpname + "_" + r + "{\n" // FIXME: factor out + + "return &_Endpoint_" + simpname + "_" + r + " { " + r + ": net.NewMPSTEndpoint(P, P." + r + ") }\n" // FIXME: factor out + + "}" + ).collect(Collectors.joining("")); + res.put(dir + simpname + ".go", sessclass); /*for (Role r : roles) { diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index 70b19c975..80e3cafdb 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -81,8 +81,8 @@ protected static String getStateChanPremable(STStateChanAPIBuilder api, EState s { res += "\n\n" - + "func New" + tname + "(ep *net.MPSTEndpoint) *" + tname + " {\n" // FIXME: factor out - + "return &" + tname + " { ep: ep, state: &net.LinearResource { } }\n" + + "func New" + tname + "(ep *_Endpoint_" + api.gpn.getSimpleName() + "_" + api.role + ") *" + tname + " {\n" // FIXME: factor out + + "return &" + tname + " { ep: ep." + api.role + ", state: &net.LinearResource { } }\n" + "}"; } From 7839f6572529703557a8893aab0daaa2dbba1942 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 May 2017 00:18:57 +0100 Subject: [PATCH 031/433] Continued. --- .../scribble/codegen/statetype/go/GSTSessionAPIBuilder.java | 2 +- .../codegen/statetype/go/GSTStateChanAPIBuilder.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java index 0404d6690..f0a08491e 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java @@ -103,7 +103,7 @@ public Map buildSessionAPI() // FIXME: factor out + "return &" + simpname + "{ " + roles.stream().map(r -> "new" + r + "()").collect(Collectors.joining(", ")) + " }\n" + "}"; - // Specific endpoints + // Protocol and role specific endpoints sessclass += roles.stream().map(r -> "\n\n" diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index 80e3cafdb..1bc166a2b 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -107,7 +107,8 @@ public String getChannelName(STStateChanAPIBuilder api, EAction a) { return //"role" + this.role + "." + a.peer; - "s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; + //"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; + "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; } @Override @@ -117,7 +118,7 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) / if (succ.isTerminal()) { - res += "s.ep.Done = true\n"; + res += "s.ep.SetDone()\n"; } res += "return &" + ab.getReturnType(this, curr, succ) + "{ ep: s.ep"; if (!succ.isTerminal()) From a7ee3cf9140af6ae5c01ba0586600ad0255ef47c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 May 2017 00:44:59 +0100 Subject: [PATCH 032/433] Continued. --- .../codegen/statetype/go/GSTBranchActionBuilder.java | 1 + .../scribble/codegen/statetype/go/GSTSessionAPIBuilder.java | 6 +++--- .../codegen/statetype/go/GSTStateChanAPIBuilder.java | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index af035d3cd..a1b400f6a 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -53,6 +53,7 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat "case \"" + x.mid + "\":\n" + "return &" + GSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{ ep: s.ep, state: &net.LinearResource {} }\n" // FIXME: factor out ).collect(Collectors.joining("")) + + "default: panic(\"Shouldn't get in here: \" + op)\n" + "}\n" + "return nil"; // FIXME: panic instead } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java index f0a08491e..a1d9fef0b 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java @@ -107,12 +107,12 @@ public Map buildSessionAPI() // FIXME: factor out sessclass += roles.stream().map(r -> "\n\n" - + "type _Endpoint_" + simpname + "_" + r + " struct {\n" // FIXME: factor out + + "type _Endpoint" + simpname + "_" + r + " struct {\n" // FIXME: factor out + r + " *net.MPSTEndpoint\n" // FIXME: factor out + "}\n" + "\n" - + "func NewEndpoint" + simpname + "_" + r + "(P *" + simpname + ") *_Endpoint_" + simpname + "_" + r + "{\n" // FIXME: factor out - + "return &_Endpoint_" + simpname + "_" + r + " { " + r + ": net.NewMPSTEndpoint(P, P." + r + ") }\n" // FIXME: factor out + + "func NewEndpoint" + simpname + "_" + r + "(P *" + simpname + ") *_Endpoint" + simpname + "_" + r + "{\n" // FIXME: factor out + + "return &_Endpoint" + simpname + "_" + r + " { " + r + ": net.NewMPSTEndpoint(P, P." + r + ") }\n" // FIXME: factor out + "}" ).collect(Collectors.joining("")); diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index 1bc166a2b..50c5049c0 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -81,7 +81,8 @@ protected static String getStateChanPremable(STStateChanAPIBuilder api, EState s { res += "\n\n" - + "func New" + tname + "(ep *_Endpoint_" + api.gpn.getSimpleName() + "_" + api.role + ") *" + tname + " {\n" // FIXME: factor out + + "func New" + tname + "(ep *_Endpoint" + api.gpn.getSimpleName() + "_" + api.role + ") *" + tname + " {\n" // FIXME: factor out + + "ep." + api.role + ".SetInit()\n" + "return &" + tname + " { ep: ep." + api.role + ", state: &net.LinearResource { } }\n" + "}"; } From b3eeb64ffddf29f8d3386397dbe60aebad729a96 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 May 2017 01:51:28 +0100 Subject: [PATCH 033/433] Fix to Go API case state naming. --- .../org/scribble/codegen/statetype/STStateChanAPIBuilder.java | 4 ++-- .../scribble/codegen/statetype/go/GSTBranchActionBuilder.java | 1 - .../org/scribble/codegen/statetype/go/GSTCaseBuilder.java | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index bda831cfc..01fe83827 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -1,7 +1,7 @@ package org.scribble.codegen.statetype; import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; @@ -50,7 +50,7 @@ protected STStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph gr public Map build() // filepath -> source { Map api = new HashMap<>(); - Set states = new HashSet<>(); + Set states = new LinkedHashSet<>(); states.add(this.graph.init); states.addAll(MState.getReachableStates(this.graph.init)); for (EState s : states) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index a1b400f6a..db964b479 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -57,5 +57,4 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat + "}\n" + "return nil"; // FIXME: panic instead } - } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java index fda8020a1..439e7cc4f 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java @@ -60,14 +60,14 @@ protected static String getOpTypeName(STStateChanAPIBuilder api, EState s, Messa char c = op.charAt(0); if (c < 'A' || c > 'Z') { - throw new RuntimeScribbleException("[go-api-gen] Message op should start with a captial letter, not: " + c); // FIXME: + throw new RuntimeScribbleException("[go-api-gen] Branch message op should start with a capital letter: " + op); // FIXME: } if (GSTCaseBuilder.seen.containsKey(op)) { if (GSTCaseBuilder.seen.get(op) != s.id) { String n = api.getStateChanName(s); // HACK - op = op + "_" + n.substring(n.lastIndexOf('_') + 1); + op = op + "_" + api.role + "_" + n.substring(n.lastIndexOf('_') + 1); } } else From 94317a347954536d2c7615e6c9404c1ad897e12f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 May 2017 17:34:06 +0100 Subject: [PATCH 034/433] Added errors to Go API gen. --- .../statetype/go/GSTBranchActionBuilder.java | 6 +++++- .../statetype/go/GSTCaseActionBuilder.java | 11 ++++++++--- .../statetype/go/GSTReceiveActionBuilder.java | 15 ++++++++++----- .../statetype/go/GSTSendActionBuilder.java | 13 +++++++++---- .../statetype/go/GSTStateChanAPIBuilder.java | 6 +++--- 5 files changed, 35 insertions(+), 16 deletions(-) diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java index db964b479..691fb2c3b 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java @@ -44,8 +44,12 @@ public String getReturnType(STStateChanAPIBuilder api, EState curr, EState succ) public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { return - "tmp := " + api.getChannelName(api, a) + ".Read()\n" + //"tmp := " + api.getChannelName(api, a) + ".Read()\n" + "tmp := s.ep.Read(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")\n" //+ "op := tmp.(" + GSTBranchStateBuilder.getBranchEnumType(api, curr) + ")\n" + + "if s.ep.Err != nil {\n" + + "return nil\n" + + "}\n" + "op := tmp.(string)\n" + "switch op {\n" + curr.getActions().stream().map(x -> diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java index db104f10e..209f69b23 100755 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java @@ -29,9 +29,14 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "val" + i + " := " + api.getChannelName(api, a) + ".Read()\n" - + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" - ).collect(Collectors.joining("\n")) + "\n" + .mapToObj(i -> + //"val" + i + " := " + api.getChannelName(api, a) + ".Read()\n" + "val" + i + " := s.ep.Read(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")\n" + + "if s.ep.Err != nil {\n" + + "return nil\n" + + "}\n" + + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" + ).collect(Collectors.joining("\n")) + "\n" + buildReturn(api, curr, succ); } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java index 6fc0e14bf..24870512d 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -27,14 +27,19 @@ public String buildArgs(EAction a) @Override public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { - String chan = api.getChannelName(api, a); + //String chan = api.getChannelName(api, a); return //"op := - chan + ".Read()" + //chan + ".Read()" + "s.ep.Read(s.ep.Proto.(*" + api.gpn.getSimpleName() +")." + a.peer + ")" + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "\n\nval" + i + " := " + chan + ".Read()\n" + //.mapToObj(i -> "\n\nval" + i + " := " + chan + ".Read()\n" + .mapToObj(i -> "\n\nval" + i + " := s.ep.Read(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")."+ a.peer + ")\n" + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" - ).collect(Collectors.joining("")) - + "\n" + buildReturn(api, curr, succ); + ).collect(Collectors.joining("")) + "\n" + + "if s.ep.Err != nil {\n" + + "return nil\n" + + "}\n" + + buildReturn(api, curr, succ); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java index 8d1667eff..3d313d919 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSendActionBuilder.java @@ -27,12 +27,17 @@ public String buildArgs(EAction a) @Override public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) { - String chan = api.getChannelName(api, a); + //String chan = api.getChannelName(api, a); return - //chan + ".Write(" + GSTBranchStateBuilder.getBranchEnumValue(a.mid) + ")\n" - chan + ".Write(\"" + a.mid + "\")\n" + ////chan + ".Write(" + GSTBranchStateBuilder.getBranchEnumValue(a.mid) + ")\n" + //chan + ".Write(\"" + a.mid + "\")\n" + "s.ep.Write(s.ep.Proto.(*" + api.gpn.getSimpleName() +")." + a.peer + ", \"" + a.mid + "\")\n" + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> chan + ".Write(arg" + i + ")").collect(Collectors.joining("\n")) + "\n" + //.mapToObj(i -> chan + ".Write(arg" + i + ")").collect(Collectors.joining("\n")) + "\n" + .mapToObj(i -> "s.ep.Write(s.ep.Proto.(*" + api.gpn.getSimpleName() +")." + a.peer + ", arg" + i + ")").collect(Collectors.joining("\n")) + "\n" + + "if s.ep.Err != nil {\n" + + "return nil" + + "}\n" + buildReturn(api, curr, succ); } } diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java index 50c5049c0..bebadae03 100644 --- a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -107,9 +107,9 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b public String getChannelName(STStateChanAPIBuilder api, EAction a) { return - //"role" + this.role + "." + a.peer; - //"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; - "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; + ////"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; + //"s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; + null; } @Override From ecfd3652f848d6184d4fb6330a28f2c307712367 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 19 Jun 2017 18:21:12 +0100 Subject: [PATCH 035/433] Fixed permissions. --- .../codegen/statetype/STBranchActionBuilder.java | 0 .../codegen/statetype/STBranchStateBuilder.java | 0 .../codegen/statetype/STCaseActionBuilder.java | 0 .../scribble/codegen/statetype/STCaseBuilder.java | 0 .../statetype/go/GSTBranchActionBuilder.java | 0 .../codegen/statetype/go/GSTBranchStateBuilder.java | 0 .../codegen/statetype/go/GSTCaseActionBuilder.java | 0 .../codegen/statetype/go/GSTCaseBuilder.java | 0 .../codegen/statetype/go/GSTSessionAPIBuilder.java | 0 modules/parser/lib/antlr-3.5.2-complete.jar | Bin 10 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STBranchActionBuilder.java mode change 100755 => 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java mode change 100755 => 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STCaseActionBuilder.java mode change 100755 => 100644 modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java mode change 100755 => 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java mode change 100755 => 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java mode change 100755 => 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java mode change 100755 => 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java mode change 100755 => 100644 modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java mode change 100755 => 100644 modules/parser/lib/antlr-3.5.2-complete.jar diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchActionBuilder.java old mode 100755 new mode 100644 diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java old mode 100755 new mode 100644 diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseActionBuilder.java old mode 100755 new mode 100644 diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java old mode 100755 new mode 100644 diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchActionBuilder.java old mode 100755 new mode 100644 diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTBranchStateBuilder.java old mode 100755 new mode 100644 diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseActionBuilder.java old mode 100755 new mode 100644 diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTCaseBuilder.java old mode 100755 new mode 100644 diff --git a/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java b/modules/core/src/main/java/org/scribble/codegen/statetype/go/GSTSessionAPIBuilder.java old mode 100755 new mode 100644 diff --git a/modules/parser/lib/antlr-3.5.2-complete.jar b/modules/parser/lib/antlr-3.5.2-complete.jar old mode 100755 new mode 100644 From 22160d5af26f1192fab7a98c99018c9cc505ffd8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 27 Jun 2017 16:31:56 +0100 Subject: [PATCH 036/433] Added missing file headers. --- .../statetype/go/GSTBranchActionBuilder.java | 13 +++++++++++++ .../codegen/statetype/go/GSTBranchStateBuilder.java | 13 +++++++++++++ .../codegen/statetype/go/GSTCaseActionBuilder.java | 13 +++++++++++++ .../ext/go/codegen/statetype/go/GSTCaseBuilder.java | 13 +++++++++++++ .../go/codegen/statetype/go/GSTEndStateBuilder.java | 13 +++++++++++++ .../codegen/statetype/go/GSTOutputStateBuilder.java | 13 +++++++++++++ .../statetype/go/GSTReceiveActionBuilder.java | 13 +++++++++++++ .../statetype/go/GSTReceiveStateBuilder.java | 13 +++++++++++++ .../codegen/statetype/go/GSTSendActionBuilder.java | 13 +++++++++++++ .../codegen/statetype/go/GSTSessionAPIBuilder.java | 13 +++++++++++++ .../statetype/go/GSTStateChanAPIBuilder.java | 13 +++++++++++++ 11 files changed, 143 insertions(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchActionBuilder.java index 25120a5e9..14b3c1e11 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchActionBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import java.util.stream.Collectors; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchStateBuilder.java index bdef7d66f..3e1b8f927 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchStateBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import org.scribble.codegen.statetype.STBranchStateBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseActionBuilder.java index e827e1b9a..83a7a5c05 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseActionBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import java.util.stream.Collectors; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseBuilder.java index e06dbb629..1b2f60ee7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import java.util.HashMap; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTEndStateBuilder.java index 1343d6f83..42d422134 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTEndStateBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import org.scribble.codegen.statetype.STStateChanAPIBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTOutputStateBuilder.java index de1dc70b7..78ec61b42 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTOutputStateBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import org.scribble.codegen.statetype.STStateChanAPIBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveActionBuilder.java index 5addba173..9d03262f6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveActionBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import java.util.stream.Collectors; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveStateBuilder.java index 7f6ae4dcb..a4a1bec78 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveStateBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import org.scribble.codegen.statetype.STStateChanAPIBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSendActionBuilder.java index 06d3eb6a4..33e840300 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSendActionBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import java.util.stream.Collectors; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSessionAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSessionAPIBuilder.java index 01e62f554..271d4ba0a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSessionAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSessionAPIBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import java.util.HashMap; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTStateChanAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTStateChanAPIBuilder.java index 262711c00..c726e532f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTStateChanAPIBuilder.java @@ -1,3 +1,16 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ package org.scribble.ext.go.codegen.statetype.go; import java.util.Map; From 3c16b122b9d1c7619e2d3763d599a510d6f4dda2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 29 Jun 2017 16:15:21 +0100 Subject: [PATCH 037/433] Tidied up some (core) pom issues. Renamed Go API gen classes. --- pom.xml | 9 +-- .../java/org/scribble/cli/CLArgParser.java | 3 +- .../java/org/scribble/cli/CommandLine.java | 1 + scribble-demos/pom.xml | 55 +++++++++---------- scribble-dist/pom.xml | 4 ++ .../scribble/ext/go/cli/GoCLArgParser.java | 5 +- .../scribble/ext/go/cli/GoCommandLine.java | 3 +- .../statetype/go/GoEndpointApiGenerator.java | 2 +- ...lder.java => GoSTBranchActionBuilder.java} | 4 +- ...ilder.java => GoSTBranchStateBuilder.java} | 6 +- ...uilder.java => GoSTCaseActionBuilder.java} | 4 +- ...TCaseBuilder.java => GoSTCaseBuilder.java} | 12 ++-- ...eBuilder.java => GoSTEndStateBuilder.java} | 6 +- ...ilder.java => GoSTOutputStateBuilder.java} | 6 +- ...der.java => GoSTReceiveActionBuilder.java} | 2 +- ...lder.java => GoSTReceiveStateBuilder.java} | 4 +- ...uilder.java => GoSTSendActionBuilder.java} | 2 +- ...uilder.java => GoSTSessionAPIBuilder.java} | 6 +- ...lder.java => GoSTStateChanAPIBuilder.java} | 18 +++--- 19 files changed, 79 insertions(+), 73 deletions(-) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTBranchActionBuilder.java => GoSTBranchActionBuilder.java} (90%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTBranchStateBuilder.java => GoSTBranchStateBuilder.java} (85%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTCaseActionBuilder.java => GoSTCaseActionBuilder.java} (91%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTCaseBuilder.java => GoSTCaseBuilder.java} (88%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTEndStateBuilder.java => GoSTEndStateBuilder.java} (87%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTOutputStateBuilder.java => GoSTOutputStateBuilder.java} (81%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTReceiveActionBuilder.java => GoSTReceiveActionBuilder.java} (94%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTReceiveStateBuilder.java => GoSTReceiveStateBuilder.java} (87%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTSendActionBuilder.java => GoSTSendActionBuilder.java} (94%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTSessionAPIBuilder.java => GoSTSessionAPIBuilder.java} (95%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GSTStateChanAPIBuilder.java => GoSTStateChanAPIBuilder.java} (85%) diff --git a/pom.xml b/pom.xml index dba6e2955..d1b071680 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 org.scribble parent @@ -76,8 +77,8 @@ scribble-runtime scribble-test scribble-dist - scribble-go - + scribble-demos + @@ -237,7 +238,7 @@ false checkstyle/suppressions.xml false - + diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index 8aaa21e59..75cfd3e68 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -99,7 +99,8 @@ public class CLArgParser } protected final String[] args; - protected final Map parsed = new HashMap<>(); + + private final Map parsed = new HashMap<>(); public CLArgParser(String[] args) { diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 77dac5b1d..4bc2d2db9 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -238,6 +238,7 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce } } + // FIXME: rename protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, CommandLineException { if (this.args.containsKey(CLArgFlag.SESS_API_GEN)) diff --git a/scribble-demos/pom.xml b/scribble-demos/pom.xml index e0b951651..aaac346d3 100644 --- a/scribble-demos/pom.xml +++ b/scribble-demos/pom.xml @@ -1,34 +1,31 @@ - - 4.0.0 - scribble-demos - jar - Scribble::Modules::Demos + + 4.0.0 + scribble-demos + jar + scribble-demos - - org.scribble - parent - 0.4.4-SNAPSHOT - ../pom.xml - + + org.scribble + parent + 0.4.4-SNAPSHOT + ../pom.xml + - - - org.scribble - scribble-core - - - org.scribble - scribble-parser - - - org.scribble - scribble-runtime - - - junit - junit - - + + + org.scribble + scribble-core + + + org.scribble + scribble-parser + + + org.scribble + scribble-runtime + + diff --git a/scribble-dist/pom.xml b/scribble-dist/pom.xml index 73f201594..a9e9d844a 100644 --- a/scribble-dist/pom.xml +++ b/scribble-dist/pom.xml @@ -35,6 +35,10 @@ org.scribble scribble-cli + + org.scribble + scribble-codegen + org.scribble diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java index 6813fa99e..776bdb094 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java @@ -72,7 +72,7 @@ protected int parseFlag(int i) throws CommandLineException } } - // FIXME: factor4 out + // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException { GoCLArgFlag flag = GoCLArgParser.GO_NON_UNIQUE_FLAGS.get(f); @@ -86,9 +86,10 @@ private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException return i; } + // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag private void goConcatArgs(GoCLArgFlag flag, String... toAdd) { - String[] args = this.parsed.get(flag); + String[] args = this.goParsed.get(flag); if (args == null) { args = Arrays.copyOf(toAdd, toAdd.length); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java index 203cb572a..fd804a6f2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java @@ -31,13 +31,14 @@ public class GoCommandLine extends CommandLine public GoCommandLine(String... args) throws CommandLineException { - /*super(args); + /*super(args); // No: go-args will make core arg parser throw exception -- refactor? this.goArgs = new GoCLArgParser(args).getGoArgs();*/ // FIXME: refactor GoCLArgParser p = new GoCLArgParser(args); this.args = p.getArgs(); this.goArgs = p.getGoArgs(); + // Duplicated from super if (!this.args.containsKey(CLArgFlag.MAIN_MOD) && !this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) { throw new CommandLineException("No main module has been specified\r\n"); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java index 60762dc31..d7629485a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java @@ -34,7 +34,7 @@ public GoEndpointApiGenerator(Job job) public Map generateGoApi(GProtocolName fullname, Role self) throws ScribbleException { this.job.debugPrintln("\n[Go API gen] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); - GSTStateChanAPIBuilder apigen = new GSTStateChanAPIBuilder(this.job, fullname, self, this.job.getContext().getEGraph(fullname, self)); + GoSTStateChanAPIBuilder apigen = new GoSTStateChanAPIBuilder(this.job, fullname, self, this.job.getContext().getEGraph(fullname, self)); Map api = apigen.build(); // filepath -> source api.putAll(apigen.buildSessionAPI()); // FIXME: factor better with STStateChanAPIBuilder return api; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java similarity index 90% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchActionBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java index 14b3c1e11..46d6ba454 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java @@ -20,7 +20,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -public class GSTBranchActionBuilder extends STBranchActionBuilder +public class GoSTBranchActionBuilder extends STBranchActionBuilder { @Override public String build(STStateChanAPIBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out @@ -68,7 +68,7 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat + curr.getActions().stream().map(x -> //"case " + GSTBranchStateBuilder.getBranchEnumValue(x.mid) + ":\n" "case \"" + x.mid + "\":\n" - + "return &" + GSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{ ep: s.ep, state: &net.LinearResource {} }\n" // FIXME: factor out + + "return &" + GoSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{ ep: s.ep, state: &net.LinearResource {} }\n" // FIXME: factor out ).collect(Collectors.joining("")) + "default: panic(\"Shouldn't get in here: \" + op)\n" + "}\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java similarity index 85% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchStateBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java index 3e1b8f927..c2bf20fc0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java @@ -17,9 +17,9 @@ import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.model.endpoint.EState; -public class GSTBranchStateBuilder extends STBranchStateBuilder +public class GoSTBranchStateBuilder extends STBranchStateBuilder { - public GSTBranchStateBuilder(GSTBranchActionBuilder bb) + public GoSTBranchStateBuilder(GoSTBranchActionBuilder bb) { super(bb); } @@ -29,7 +29,7 @@ public String getPreamble(STStateChanAPIBuilder api, EState s) { /*String ename = getBranchEnumType(api, s); List as = s.getActions();*/ - return GSTStateChanAPIBuilder.getStateChanPremable(api, s) /*+ "\n" + return GoSTStateChanAPIBuilder.getStateChanPremable(api, s) /*+ "\n" + "\n" + "type " + ename + " int\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java similarity index 91% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseActionBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java index 83a7a5c05..2cc369ae4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java @@ -21,7 +21,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -public class GSTCaseActionBuilder extends STCaseActionBuilder +public class GoSTCaseActionBuilder extends STCaseActionBuilder { @Override @@ -56,6 +56,6 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat @Override public String getStateChanType(STStateChanAPIBuilder api, EState curr, EAction a) { - return GSTCaseBuilder.getOpTypeName(api, curr, a.mid); + return GoSTCaseBuilder.getOpTypeName(api, curr, a.mid); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java similarity index 88% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java index 1b2f60ee7..778aaeff9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java @@ -23,9 +23,9 @@ import org.scribble.model.endpoint.EState; import org.scribble.sesstype.name.MessageId; -public class GSTCaseBuilder extends STCaseBuilder +public class GoSTCaseBuilder extends STCaseBuilder { - public GSTCaseBuilder(GSTCaseActionBuilder cb) + public GoSTCaseBuilder(GoSTCaseActionBuilder cb) { super(cb); } @@ -48,7 +48,7 @@ public String getCaseStateChanName(STStateChanAPIBuilder api, EState s) public String getPreamble(STStateChanAPIBuilder api, EState s) { String casename = getCaseActionName(api, s); - return GSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + return GoSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + "\n" + "import \"org/scribble/runtime/net\"\n" // Some parts duplicated from GSTStateChanAPIBuilder + "\n" @@ -75,9 +75,9 @@ protected static String getOpTypeName(STStateChanAPIBuilder api, EState s, Messa { throw new RuntimeScribbleException("[go-api-gen] Branch message op should start with a capital letter: " + op); // FIXME: } - if (GSTCaseBuilder.seen.containsKey(op)) + if (GoSTCaseBuilder.seen.containsKey(op)) { - if (GSTCaseBuilder.seen.get(op) != s.id) + if (GoSTCaseBuilder.seen.get(op) != s.id) { String n = api.getStateChanName(s); // HACK op = op + "_" + api.role + "_" + n.substring(n.lastIndexOf('_') + 1); @@ -85,7 +85,7 @@ protected static String getOpTypeName(STStateChanAPIBuilder api, EState s, Messa } else { - GSTCaseBuilder.seen.put(op, s.id); + GoSTCaseBuilder.seen.put(op, s.id); } return op; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java similarity index 87% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTEndStateBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java index 42d422134..e69615d68 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java @@ -17,9 +17,9 @@ import org.scribble.codegen.statetype.STEndStateBuilder; import org.scribble.model.endpoint.EState; -public class GSTEndStateBuilder extends STEndStateBuilder +public class GoSTEndStateBuilder extends STEndStateBuilder { - public GSTEndStateBuilder() + public GoSTEndStateBuilder() { } @@ -36,7 +36,7 @@ public String getPreamble(STStateChanAPIBuilder api, EState s) //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); String tname = api.getStateChanName(s); String res = - GSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + GoSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + "\n" + "import \"org/scribble/runtime/net\"\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java similarity index 81% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTOutputStateBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java index 78ec61b42..af3792dc0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java @@ -18,9 +18,9 @@ import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.model.endpoint.EState; -public class GSTOutputStateBuilder extends STOutputStateBuilder +public class GoSTOutputStateBuilder extends STOutputStateBuilder { - public GSTOutputStateBuilder(STSendActionBuilder sb) + public GoSTOutputStateBuilder(STSendActionBuilder sb) { super(sb); } @@ -28,6 +28,6 @@ public GSTOutputStateBuilder(STSendActionBuilder sb) @Override public String getPreamble(STStateChanAPIBuilder api, EState s) { - return GSTStateChanAPIBuilder.getStateChanPremable(api, s); + return GoSTStateChanAPIBuilder.getStateChanPremable(api, s); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java similarity index 94% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveActionBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java index 9d03262f6..f41386d0e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java @@ -21,7 +21,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -public class GSTReceiveActionBuilder extends STReceiveActionBuilder +public class GoSTReceiveActionBuilder extends STReceiveActionBuilder { @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java similarity index 87% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveStateBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java index a4a1bec78..71201b871 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTReceiveStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java @@ -18,9 +18,9 @@ import org.scribble.codegen.statetype.STReceiveStateBuilder; import org.scribble.model.endpoint.EState; -public class GSTReceiveStateBuilder extends STReceiveStateBuilder +public class GoSTReceiveStateBuilder extends STReceiveStateBuilder { - public GSTReceiveStateBuilder(STReceiveActionBuilder rb) + public GoSTReceiveStateBuilder(STReceiveActionBuilder rb) { super(rb); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java similarity index 94% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSendActionBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java index 33e840300..922081b67 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java @@ -21,7 +21,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -public class GSTSendActionBuilder extends STSendActionBuilder +public class GoSTSendActionBuilder extends STSendActionBuilder { @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSessionAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java similarity index 95% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSessionAPIBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java index 271d4ba0a..6eea1c8d5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTSessionAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java @@ -30,11 +30,11 @@ import org.scribble.sesstype.name.GProtocolName; import org.scribble.sesstype.name.Role; -public class GSTSessionAPIBuilder +public class GoSTSessionAPIBuilder { - private GSTStateChanAPIBuilder api; + private GoSTStateChanAPIBuilder api; - public GSTSessionAPIBuilder(GSTStateChanAPIBuilder api) + public GoSTSessionAPIBuilder(GoSTStateChanAPIBuilder api) { this.api = api; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTStateChanAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java similarity index 85% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTStateChanAPIBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java index c726e532f..2baff5f84 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GSTStateChanAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java @@ -24,18 +24,18 @@ import org.scribble.sesstype.name.GProtocolName; import org.scribble.sesstype.name.Role; -public class GSTStateChanAPIBuilder extends STStateChanAPIBuilder +public class GoSTStateChanAPIBuilder extends STStateChanAPIBuilder { private int counter = 1; - public GSTStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) + public GoSTStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) { super(job, gpn, role, graph, - new GSTOutputStateBuilder(new GSTSendActionBuilder()), - new GSTReceiveStateBuilder(new GSTReceiveActionBuilder()), - new GSTBranchStateBuilder(new GSTBranchActionBuilder()), - new GSTCaseBuilder(new GSTCaseActionBuilder()), - new GSTEndStateBuilder()); + new GoSTOutputStateBuilder(new GoSTSendActionBuilder()), + new GoSTReceiveStateBuilder(new GoSTReceiveActionBuilder()), + new GoSTBranchStateBuilder(new GoSTBranchActionBuilder()), + new GoSTCaseBuilder(new GoSTCaseActionBuilder()), + new GoSTEndStateBuilder()); } @Override @@ -69,7 +69,7 @@ public String getFilePath(String filename) @Override public Map buildSessionAPI() // FIXME: factor out { - return new GSTSessionAPIBuilder(this).buildSessionAPI(); + return new GoSTSessionAPIBuilder(this).buildSessionAPI(); } protected static String getPackageDecl(STStateChanAPIBuilder api) @@ -81,7 +81,7 @@ protected static String getStateChanPremable(STStateChanAPIBuilder api, EState s { String tname = api.getStateChanName(s); String res = - GSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + GoSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + "\n" + "import \"org/scribble/runtime/net\"\n" + "\n" From 8d8482b908b6f259c60873f27df5f4ebe19edcb6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 2 Jul 2017 17:26:37 +0100 Subject: [PATCH 038/433] Minor scribble-go pom fix. --- scribble-go/pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scribble-go/pom.xml b/scribble-go/pom.xml index ec2395efa..786b94d48 100644 --- a/scribble-go/pom.xml +++ b/scribble-go/pom.xml @@ -23,6 +23,14 @@ org.scribble scribble-cli + + org.scribble + scribble-parser + + + org.scribble + scribble-codegen + junit junit From 2523ebcbffea8807bbb8c26811a6248da3ad4678 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 12 Jul 2017 15:42:03 +0100 Subject: [PATCH 039/433] Refactored CL arg parsing. --- .../main/java/org/scribble/cli/CLArgParser.java | 8 +++++++- .../main/java/org/scribble/cli/CommandLine.java | 13 ++++++++----- .../org/scribble/ext/go/cli/GoCLArgParser.java | 3 ++- .../org/scribble/ext/go/cli/GoCommandLine.java | 16 +++++++++------- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java index 75cfd3e68..3996cd18c 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CLArgParser.java @@ -105,11 +105,17 @@ public class CLArgParser public CLArgParser(String[] args) { this.args = args; + //parseArgs(); // No: constructors should not invoke overridable methods (subclass constructor not yet called) } - public Map getArgs() throws CommandLineException + // For overriding pattern -- should be used explicitly on subclasses (cannot call overridden from constructor) + public final void parse() throws CommandLineException { parseArgs(); + } + + public final Map getArgs() throws CommandLineException + { return this.parsed; } diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 4bc2d2db9..426630a9e 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -44,17 +44,20 @@ public class CommandLine { - protected //final - Map args; // Maps each flag to list of associated argument values + protected final Map args; // Maps each flag to list of associated argument values - protected CommandLine() + //protected CommandLine(Map args) + protected CommandLine(CLArgParser p) throws CommandLineException { - + //this.args = args; + p.parse(); + this.args = p.getArgs(); } public CommandLine(String... args) throws CommandLineException { - this.args = new CLArgParser(args).getArgs(); + //this.args = new CLArgParser(args).getArgs(); + this(new CLArgParser(args)); if (!this.args.containsKey(CLArgFlag.MAIN_MOD) && !this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) { throw new CommandLineException("No main module has been specified\r\n"); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java index 776bdb094..862c6d332 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java @@ -42,8 +42,9 @@ public GoCLArgParser(String[] args) throws CommandLineException super(args); // Assigns this.args and calls parseArgs } - public Map getGoArgs() + public Map getGoArgs() throws CommandLineException { + //super.parseArgs(); // Needed return this.goParsed; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java index fd804a6f2..fa42ff4a9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java @@ -31,18 +31,20 @@ public class GoCommandLine extends CommandLine public GoCommandLine(String... args) throws CommandLineException { - /*super(args); // No: go-args will make core arg parser throw exception -- refactor? - this.goArgs = new GoCLArgParser(args).getGoArgs();*/ + //super(args); // No: new go-specific args will make core arg parser throw exception (constructors cannot call overridable methods) -- refactor? - // FIXME: refactor - GoCLArgParser p = new GoCLArgParser(args); - this.args = p.getArgs(); - this.goArgs = p.getGoArgs(); - // Duplicated from super + this(new GoCLArgParser(args)); + } + + private GoCommandLine(GoCLArgParser p) throws CommandLineException + { + super(p); // calls p.parse() + // FIXME? Duplicated from core if (!this.args.containsKey(CLArgFlag.MAIN_MOD) && !this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) { throw new CommandLineException("No main module has been specified\r\n"); } + this.goArgs = p.getGoArgs(); } @Override From 5843539f19b2abb25a2cfe64d82d86bf906ffb82 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 21 Aug 2017 20:57:33 +0100 Subject: [PATCH 040/433] Updated scribble-go according to latest master merge. --- .../main/java/org/scribble/ext/go/cli/GoCommandLine.java | 7 ++++--- .../go/codegen/statetype/go/GoEndpointApiGenerator.java | 4 ++-- .../ext/go/codegen/statetype/go/GoSTCaseBuilder.java | 2 +- .../ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java | 6 +++--- .../go/codegen/statetype/go/GoSTStateChanAPIBuilder.java | 4 ++-- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java index fa42ff4a9..ada5f18ef 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java @@ -19,11 +19,12 @@ import org.scribble.cli.CommandLine; import org.scribble.cli.CommandLineException; import org.scribble.ext.go.codegen.statetype.go.GoEndpointApiGenerator; +import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; import org.scribble.main.JobContext; import org.scribble.main.ScribbleException; -import org.scribble.sesstype.name.GProtocolName; -import org.scribble.sesstype.name.Role; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; public class GoCommandLine extends CommandLine { @@ -68,7 +69,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co } } - public static void main(String[] args) throws CommandLineException, ScribbleException + public static void main(String[] args) throws CommandLineException, AntlrSourceException { new GoCommandLine(args).run(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java index d7629485a..55c637863 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java @@ -18,8 +18,8 @@ import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; import org.scribble.main.Job; import org.scribble.main.ScribbleException; -import org.scribble.sesstype.name.GProtocolName; -import org.scribble.sesstype.name.Role; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; public class GoEndpointApiGenerator { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java index 778aaeff9..2932ccb10 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java @@ -21,7 +21,7 @@ import org.scribble.codegen.statetype.STStateChanAPIBuilder; import org.scribble.main.RuntimeScribbleException; import org.scribble.model.endpoint.EState; -import org.scribble.sesstype.name.MessageId; +import org.scribble.type.name.MessageId; public class GoSTCaseBuilder extends STCaseBuilder { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java index 6eea1c8d5..7af2bb555 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java @@ -26,9 +26,9 @@ import org.scribble.model.MState; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; -import org.scribble.sesstype.kind.Global; -import org.scribble.sesstype.name.GProtocolName; -import org.scribble.sesstype.name.Role; +import org.scribble.type.kind.Global; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; public class GoSTSessionAPIBuilder { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java index 2baff5f84..06cb92377 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java @@ -21,8 +21,8 @@ import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.sesstype.name.GProtocolName; -import org.scribble.sesstype.name.Role; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; public class GoSTStateChanAPIBuilder extends STStateChanAPIBuilder { From 8c2fd6cd3fe06aee442b4e03e6d0189d16b90de5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 22 Aug 2017 15:43:47 +0100 Subject: [PATCH 041/433] Deleted deprecated files. --- .../main/java/org/scribble/sesstype/Arg.java | 22 --- .../java/org/scribble/sesstype/Message.java | 26 ---- .../org/scribble/sesstype/MessageSig.java | 73 ---------- .../java/org/scribble/sesstype/Payload.java | 81 ----------- .../scribble/sesstype/SessionTypeFactory.java | 60 -------- .../org/scribble/sesstype/SubprotocolSig.java | 77 ---------- .../scribble/sesstype/kind/AbstractKind.java | 34 ----- .../org/scribble/sesstype/kind/AmbigKind.java | 51 ------- .../scribble/sesstype/kind/DataTypeKind.java | 50 ------- .../org/scribble/sesstype/kind/Global.java | 50 ------- .../scribble/sesstype/kind/ImportKind.java | 20 --- .../java/org/scribble/sesstype/kind/Kind.java | 27 ---- .../org/scribble/sesstype/kind/Local.java | 50 ------- .../scribble/sesstype/kind/MessageIdKind.java | 20 --- .../scribble/sesstype/kind/ModuleKind.java | 50 ------- .../sesstype/kind/ModuleMemberKind.java | 20 --- .../sesstype/kind/NonProtocolKind.java | 20 --- .../sesstype/kind/NonRoleArgKind.java | 22 --- .../sesstype/kind/NonRoleParamKind.java | 21 --- .../org/scribble/sesstype/kind/OpKind.java | 54 ------- .../scribble/sesstype/kind/PackageKind.java | 50 ------- .../org/scribble/sesstype/kind/ParamKind.java | 20 --- .../sesstype/kind/PayloadTypeKind.java | 21 --- .../scribble/sesstype/kind/ProtocolKind.java | 19 --- .../scribble/sesstype/kind/RecVarKind.java | 50 ------- .../org/scribble/sesstype/kind/RoleKind.java | 50 ------- .../org/scribble/sesstype/kind/ScopeKind.java | 50 ------- .../org/scribble/sesstype/kind/SigKind.java | 53 ------- .../scribble/sesstype/name/AbstractName.java | 132 ------------------ .../org/scribble/sesstype/name/AmbigName.java | 64 --------- .../org/scribble/sesstype/name/DataType.java | 78 ----------- .../sesstype/name/GDelegationType.java | 97 ------------- .../scribble/sesstype/name/GProtocolName.java | 66 --------- .../scribble/sesstype/name/LProtocolName.java | 72 ---------- .../scribble/sesstype/name/MemberName.java | 44 ------ .../org/scribble/sesstype/name/MessageId.java | 30 ---- .../sesstype/name/MessageSigName.java | 86 ------------ .../scribble/sesstype/name/ModuleName.java | 108 -------------- .../java/org/scribble/sesstype/name/Name.java | 44 ------ .../org/scribble/sesstype/name/Named.java | 22 --- .../java/org/scribble/sesstype/name/Op.java | 67 --------- .../scribble/sesstype/name/PackageName.java | 68 --------- .../sesstype/name/PayloadElemType.java | 36 ----- .../scribble/sesstype/name/PayloadType.java | 36 ----- .../scribble/sesstype/name/ProtocolName.java | 36 ----- .../scribble/sesstype/name/QualifiedName.java | 44 ------ .../org/scribble/sesstype/name/RecVar.java | 59 -------- .../java/org/scribble/sesstype/name/Role.java | 62 -------- .../org/scribble/sesstype/name/Scope.java | 89 ------------ 49 files changed, 2481 deletions(-) delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/Arg.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/Message.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/MessageSig.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/Payload.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/SessionTypeFactory.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/SubprotocolSig.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/AbstractKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/AmbigKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/DataTypeKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/Global.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/ImportKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/Kind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/Local.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/MessageIdKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/ModuleKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/ModuleMemberKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/NonProtocolKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/NonRoleArgKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/NonRoleParamKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/OpKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/PackageKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/ParamKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/PayloadTypeKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/ProtocolKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/RecVarKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/RoleKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/ScopeKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/kind/SigKind.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/AbstractName.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/AmbigName.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/DataType.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/GDelegationType.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/GProtocolName.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/LProtocolName.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/MemberName.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/MessageId.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/MessageSigName.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/ModuleName.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/Name.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/Named.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/Op.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/PackageName.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/PayloadElemType.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/PayloadType.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/ProtocolName.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/QualifiedName.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/RecVar.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/Role.java delete mode 100644 scribble-core/src/main/java/org/scribble/sesstype/name/Scope.java diff --git a/scribble-core/src/main/java/org/scribble/sesstype/Arg.java b/scribble-core/src/main/java/org/scribble/sesstype/Arg.java deleted file mode 100644 index 20830210d..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/Arg.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype; - -import org.scribble.sesstype.kind.NonRoleArgKind; - -// A subprotocol argument (DoArgNode): SigKind or PayloadTypeKind -public interface Arg -{ - NonRoleArgKind getKind(); -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/Message.java b/scribble-core/src/main/java/org/scribble/sesstype/Message.java deleted file mode 100644 index e6c33dbef..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/Message.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype; - -import org.scribble.sesstype.kind.MessageIdKind; -import org.scribble.sesstype.kind.SigKind; -import org.scribble.sesstype.name.MessageId; - - - -// A sig kind name: MessageSignature value (or parameter) -public interface Message extends Arg -{ - MessageId getId(); -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/MessageSig.java b/scribble-core/src/main/java/org/scribble/sesstype/MessageSig.java deleted file mode 100644 index f54990e5a..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/MessageSig.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype; - -import org.scribble.sesstype.kind.OpKind; -import org.scribble.sesstype.kind.SigKind; -import org.scribble.sesstype.name.MessageId; -import org.scribble.sesstype.name.Op; - -public class MessageSig implements Message -{ - public final Op op; - public final Payload payload; - - public MessageSig(Op op, Payload payload) - { - this.op = op; - this.payload = payload; - } - - @Override - public SigKind getKind() - { - return SigKind.KIND; - } - - @Override - public MessageId getId() - { - return this.op; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof MessageSig)) - { - return false; - } - MessageSig sig = (MessageSig) o; - return this.op.equals(sig.op) && this.payload.equals(sig.payload); - } - - @Override - public int hashCode() - { - int hash = 3187; - hash = 31 * hash + this.op.hashCode(); - hash = 31 * hash + this.payload.hashCode(); - return hash; - } - - @Override - public String toString() - { - return this.op.toString() + this.payload.toString(); - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/Payload.java b/scribble-core/src/main/java/org/scribble/sesstype/Payload.java deleted file mode 100644 index 77cc6de32..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/Payload.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype; - -import java.util.Collections; -import java.util.List; - -import org.scribble.sesstype.kind.Kind; -import org.scribble.sesstype.kind.PayloadTypeKind; -import org.scribble.sesstype.name.PayloadElemType; - -public class Payload -{ - public static final Payload EMPTY_PAYLOAD = new Payload(Collections.emptyList()); - - public final List> elems; - - public Payload(List> payload) - { - this.elems = payload; - } - - public boolean isEmpty() - { - return this.elems.isEmpty(); - } - - @Override - public int hashCode() - { - int hash = 577; - hash = 31 * hash + this.elems.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof Payload)) - { - return false; - } - return this.elems.equals(((Payload) o).elems); - } - - @Override - public String toString() - { - if (this.elems.isEmpty()) - { - return "()"; - } - String payload = "(" + this.elems.get(0); - for (PayloadElemType pt : this.elems.subList(1, this.elems.size())) - { - payload+= ", " + pt; - } - return payload + ")"; - } - - /*@Override - public boolean isParameter() - { - return false; - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/SessionTypeFactory.java b/scribble-core/src/main/java/org/scribble/sesstype/SessionTypeFactory.java deleted file mode 100644 index 68c620de8..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/SessionTypeFactory.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype; - -import java.util.Arrays; - -import org.scribble.sesstype.name.GProtocolName; -import org.scribble.sesstype.name.ModuleName; -import org.scribble.sesstype.name.PackageName; - -@Deprecated -public class SessionTypeFactory -{ - public SessionTypeFactory() - { - - } - - /*public static ModuleName parseModuleName(String name) - { - String[] elems = name.split("\\."); - return new ModuleName(elems); - }*/ - - // From fullname - public static GProtocolName parseGlobalProtocolName(String name) - { - String[] elems = name.split("\\."); - if (elems.length < 2) - { - throw new RuntimeException("Bad protocol full name: " + name); - } - String membname = elems[elems.length - 1]; - ModuleName modname = new ModuleName(elems[elems.length - 2]); - if (elems.length > 2) - { - PackageName packname = new PackageName(Arrays.copyOfRange(elems, 0, elems.length - 2)); - modname = new ModuleName(packname, modname); - } - GProtocolName gpn = new GProtocolName(membname); - return new GProtocolName(modname, gpn); - } - - /*public static Scope parseScope(String name) - { - String[] elems = name.split("\\."); - return new Scope(elems); - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/SubprotocolSig.java b/scribble-core/src/main/java/org/scribble/sesstype/SubprotocolSig.java deleted file mode 100644 index f9d994782..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/SubprotocolSig.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype; - -import java.util.LinkedList; -import java.util.List; - -import org.scribble.sesstype.kind.Kind; -import org.scribble.sesstype.kind.NonRoleArgKind; -import org.scribble.sesstype.kind.ProtocolKind; -import org.scribble.sesstype.name.ProtocolName; -import org.scribble.sesstype.name.Role; - -public class SubprotocolSig -{ - public ProtocolName fmn; - //public Scope scope; - public List roles; - public List> args; - - //public SubprotocolSignature(ProtocolName fmn, Scope scope, List roles, List> args) - public SubprotocolSig(ProtocolName fmn, List roles, List> args) - { - this.fmn = fmn; - //this.scope = scope; - this.roles = new LinkedList<>(roles); - this.args = new LinkedList<>(args); - } - - @Override - public int hashCode() - { - int hash = 1093; - hash = 31 * hash + this.fmn.hashCode(); - //hash = 31 * hash + this.scope.hashCode(); - hash = 31 * hash + this.roles.hashCode(); - hash = 31 * hash + this.args.hashCode(); - return hash; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - //if (o == null || this.getClass() != o.getClass()) - if (!(o instanceof SubprotocolSig)) - { - return false; - } - SubprotocolSig subsig = (SubprotocolSig) o; - return this.fmn.equals(subsig.fmn) //&& this.scope.equals(subsig.scope) - && this.roles.equals(subsig.roles) && this.args.equals(subsig.args); - } - - @Override - public String toString() - { - String args = this.args.toString(); - String roles = this.roles.toString(); - return //this.scope + ":" + - this.fmn + "<" + args.substring(1, args.length() - 1) + ">(" + roles.substring(1, roles.length() - 1) + ")"; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/AbstractKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/AbstractKind.java deleted file mode 100644 index 8f8f7a9e3..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/AbstractKind.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -public abstract class AbstractKind implements Kind -{ - public AbstractKind() - { - - } - - @Override - public abstract boolean equals(Object o); - - public abstract boolean canEqual(Object o); // Not really needed due to singleton pattern - - @Override - public String toString() - { - String s = this.getClass().toString(); - return s.substring("class org.sribble.sesstype.kind.".length() + 1, s.length()); - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/AmbigKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/AmbigKind.java deleted file mode 100644 index e21abf6cb..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/AmbigKind.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - - -public class AmbigKind extends AbstractKind implements NonRoleArgKind//, PayloadTypeKind -{ - public static final AmbigKind KIND = new AmbigKind(); - - protected AmbigKind() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof AmbigKind)) - { - return false; - } - return ((AmbigKind) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof AmbigKind; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/DataTypeKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/DataTypeKind.java deleted file mode 100644 index 89ac37885..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/DataTypeKind.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -public class DataTypeKind extends AbstractKind implements PayloadTypeKind, ImportKind, ModuleMemberKind -{ - public static final DataTypeKind KIND = new DataTypeKind(); - - protected DataTypeKind() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof DataTypeKind)) - { - return false; - } - return ((DataTypeKind) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof DataTypeKind; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/Global.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/Global.java deleted file mode 100644 index 3a9af8bd0..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/Global.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -public class Global extends AbstractKind implements ProtocolKind -{ - public static final Global KIND = new Global(); - - protected Global() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof Global)) - { - return false; - } - return ((Global) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof Global; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/ImportKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/ImportKind.java deleted file mode 100644 index 043af163d..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/ImportKind.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - - -public interface ImportKind extends Kind -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/Kind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/Kind.java deleted file mode 100644 index c94bd1ecb..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/Kind.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -import org.scribble.sesstype.name.Name; - -public interface Kind -{ - public static Name castName(K kind, Name name) - { - kind.getClass().cast(name.getKind()); - @SuppressWarnings("unchecked") - Name tmp = (Name) name; - return tmp; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/Local.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/Local.java deleted file mode 100644 index 462dde490..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/Local.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -public class Local extends AbstractKind implements ProtocolKind, PayloadTypeKind -{ - public static final Local KIND = new Local(); - - protected Local() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof Local)) - { - return false; - } - return ((Local) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof Local; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/MessageIdKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/MessageIdKind.java deleted file mode 100644 index f0f6f6692..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/MessageIdKind.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - - -public interface MessageIdKind extends Kind -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/ModuleKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/ModuleKind.java deleted file mode 100644 index 2c8606426..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/ModuleKind.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -public class ModuleKind extends AbstractKind implements ImportKind -{ - public static final ModuleKind KIND = new ModuleKind(); - - protected ModuleKind() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof ModuleKind)) - { - return false; - } - return ((ModuleKind) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof ModuleKind; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/ModuleMemberKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/ModuleMemberKind.java deleted file mode 100644 index 967c5b115..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/ModuleMemberKind.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - - -public interface ModuleMemberKind extends Kind -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/NonProtocolKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/NonProtocolKind.java deleted file mode 100644 index 291e6abd3..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/NonProtocolKind.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - - -public interface NonProtocolKind extends Kind -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/NonRoleArgKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/NonRoleArgKind.java deleted file mode 100644 index 84a42a6dd..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/NonRoleArgKind.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - - -// Following sesstype.Arg hierarchy -// Non-role args -- includes AmbigKind (cf. AntlrNonRoleArgList) -public interface NonRoleArgKind extends NonProtocolKind -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/NonRoleParamKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/NonRoleParamKind.java deleted file mode 100644 index 430729300..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/NonRoleParamKind.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - - -// Non-role params -public interface NonRoleParamKind extends NonRoleArgKind, ParamKind -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/OpKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/OpKind.java deleted file mode 100644 index 27f812a9f..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/OpKind.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -import java.io.Serializable; - -public class OpKind extends AbstractKind implements MessageIdKind, Serializable -{ - private static final long serialVersionUID = 1L; - - public static final OpKind KIND = new OpKind(); - - protected OpKind() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof OpKind)) - { - return false; - } - return ((OpKind) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof OpKind; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/PackageKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/PackageKind.java deleted file mode 100644 index 2deb817bd..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/PackageKind.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -public class PackageKind extends AbstractKind -{ - public static final PackageKind KIND = new PackageKind(); - - protected PackageKind() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof PackageKind)) - { - return false; - } - return ((PackageKind) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof PackageKind; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/ParamKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/ParamKind.java deleted file mode 100644 index 70d68aa32..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/ParamKind.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - - -public interface ParamKind extends Kind -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/PayloadTypeKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/PayloadTypeKind.java deleted file mode 100644 index 592b55ba9..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/PayloadTypeKind.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - - -// Following sesstype.Arg hierarchy -public interface PayloadTypeKind extends NonRoleParamKind //ArgKind -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/ProtocolKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/ProtocolKind.java deleted file mode 100644 index 089a7f7a8..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/ProtocolKind.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -public interface ProtocolKind extends ModuleMemberKind -{ - -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/RecVarKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/RecVarKind.java deleted file mode 100644 index 6b1777982..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/RecVarKind.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -public class RecVarKind extends AbstractKind -{ - public static final RecVarKind KIND = new RecVarKind(); - - protected RecVarKind() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof RecVarKind)) - { - return false; - } - return ((RecVarKind) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof RecVarKind; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/RoleKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/RoleKind.java deleted file mode 100644 index c90c33c0a..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/RoleKind.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -public class RoleKind extends AbstractKind implements ParamKind -{ - public static final RoleKind KIND = new RoleKind(); - - protected RoleKind() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof RoleKind)) - { - return false; - } - return ((RoleKind) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof RoleKind; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/ScopeKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/ScopeKind.java deleted file mode 100644 index 97d73fadb..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/ScopeKind.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - -public class ScopeKind extends AbstractKind -{ - public static final ScopeKind KIND = new ScopeKind(); - - protected ScopeKind() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof ScopeKind)) - { - return false; - } - return ((ScopeKind) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof ScopeKind; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/kind/SigKind.java b/scribble-core/src/main/java/org/scribble/sesstype/kind/SigKind.java deleted file mode 100644 index d874f307d..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/kind/SigKind.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.kind; - - -// Following sesstype.Arg hierarchy -public class SigKind extends AbstractKind implements NonRoleParamKind, MessageIdKind, //ArgKind - ModuleMemberKind -{ - public static final SigKind KIND = new SigKind(); - - protected SigKind() - { - - } - - @Override - public int hashCode() - { - return super.hashCode(); - } - - @Override - public boolean equals(Object o) - { - if (o == this) - { - return true; - } - if (!(o instanceof SigKind)) - { - return false; - } - return ((SigKind) o).canEqual(this); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof SigKind; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/AbstractName.java b/scribble-core/src/main/java/org/scribble/sesstype/name/AbstractName.java deleted file mode 100644 index 749b4c65a..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/AbstractName.java +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import java.io.IOException; -import java.util.Arrays; - -import org.scribble.sesstype.kind.Kind; - -public abstract class AbstractName implements Name -{ - private static final long serialVersionUID = 1L; - - private K kind; // non-final for serialization - - private String[] elems; - - protected AbstractName(K kind, String... elems) - { - this.kind = kind; - this.elems = elems; - } - - @Override - public K getKind() - { - return this.kind; - } - - @Override - public int getElementCount() - { - return this.elems.length; - } - - @Override - public boolean isEmpty() - { - return this.elems.length == 0; - } - - @Override - public boolean isPrefixed() - { - return this.elems.length > 1; - } - - @Override - public String[] getElements() - { - return Arrays.copyOf(this.elems, this.elems.length); - } - @Override - public String[] getPrefixElements() - { - return Arrays.copyOfRange(this.elems, 0, this.elems.length - 1); - } - - // Not SimpleName so that e.g. ModuleName can return a simple ModuleName - @Override - public String getLastElement() - { - return this.elems[this.elems.length - 1]; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof AbstractName)) - { - return false; - } - AbstractName n = (AbstractName) o; - return n.canEqual(this) && this.kind.equals(n.kind) && Arrays.equals(this.elems, (n.elems)); - } - - public abstract boolean canEqual(Object o); - - @Override - public int hashCode() - { - int hash = 2749; - hash = 31 * hash + this.kind.hashCode(); - hash = 31 * hash + Arrays.hashCode(this.elems); - return hash; - } - - @Override - public String toString() - { - if (isEmpty()) - { - return ""; - } - String name = this.elems[0]; - for (int i = 1; i < this.elems.length; i++) - { - name += "." + this.elems[i]; - } - return name; - } - - private void writeObject(java.io.ObjectOutputStream out) throws IOException - { - out.writeObject(this.kind); - out.writeObject(this.elems); - } - - private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException - { - @SuppressWarnings("unchecked") - K k = (K) in.readObject(); - this.kind = k; - //this.kind = readKind(); // TODO: protected abstract -- will this work? - this.elems = (String[]) in.readObject(); - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/AmbigName.java b/scribble-core/src/main/java/org/scribble/sesstype/name/AmbigName.java deleted file mode 100644 index 4b3122e1c..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/AmbigName.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.AmbigKind; - -public class AmbigName extends AbstractName -{ - private static final long serialVersionUID = 1L; - - public AmbigName(String text) - { - super(AmbigKind.KIND, text); - } - - public MessageSigName toMessageSigName() - { - return new MessageSigName(getLastElement()); - } - - public DataType toDataType() - { - return new DataType(getLastElement()); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof AmbigName)) - { - return false; - } - AmbigName n = (AmbigName) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof AmbigName; - } - - @Override - public int hashCode() - { - int hash = 2753; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/DataType.java b/scribble-core/src/main/java/org/scribble/sesstype/name/DataType.java deleted file mode 100644 index 5fb17ce4a..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/DataType.java +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.DataTypeKind; - - -// Potentially qualified/canonical payload type name; not the AST primitive identifier -public class DataType extends MemberName implements PayloadElemType -{ - private static final long serialVersionUID = 1L; - - public DataType(ModuleName modname, DataType membname) - { - super(DataTypeKind.KIND, modname, membname); - } - - public DataType(String simplename) - { - super(DataTypeKind.KIND, simplename); - } - - public boolean isDataType() - { - return true; - } - - @Override - public DataTypeKind getKind() - { - return DataTypeKind.KIND; - } - - @Override - public DataType getSimpleName() - { - return new DataType(getLastElement()); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof DataType)) - { - return false; - } - DataType n = (DataType) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof DataType; - } - - @Override - public int hashCode() - { - int hash = 2767; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/GDelegationType.java b/scribble-core/src/main/java/org/scribble/sesstype/name/GDelegationType.java deleted file mode 100644 index e24881cf5..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/GDelegationType.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import java.io.IOException; -import java.io.Serializable; - -import org.scribble.sesstype.kind.Local; - -// FIXME: factor out of name package? (and then PayloadType also needs to be moved out of name?) -public class GDelegationType implements PayloadElemType, Serializable -{ - private static final long serialVersionUID = 1L; - - private GProtocolName proto; // Cannot be final, for Serializable - private Role role; - - public GDelegationType(GProtocolName proto, Role role) - { - this.proto = proto; - this.role = role; - } - - @Override - public boolean isGDelegationType() - { - return true; - } - - public GProtocolName getGlobalProtocol() - { - return this.proto; - } - - public Role getRole() - { - return this.role; - } - - @Override - public Local getKind() - { - return Local.KIND; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof GDelegationType)) - { - return false; - } - GDelegationType them = (GDelegationType) o; - return them.canEqual(this) && this.proto.equals(them.proto) && this.role.equals(them.role); - } - - public boolean canEqual(Object o) - { - return o instanceof GDelegationType; - } - - @Override - public int hashCode() - { - int hash = 1381; - hash = 31 * this.proto.hashCode(); - hash = 31 * this.role.hashCode(); - return hash; - } - - private void writeObject(java.io.ObjectOutputStream out) throws IOException - { - out.writeObject(this.proto); - out.writeObject(this.role); - } - - private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException - { - this.proto = (GProtocolName) in.readObject(); - this.role = (Role) in.readObject(); - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/GProtocolName.java b/scribble-core/src/main/java/org/scribble/sesstype/name/GProtocolName.java deleted file mode 100644 index 09fb1f9bb..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/GProtocolName.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.Global; - - -public class GProtocolName extends ProtocolName -{ - private static final long serialVersionUID = 1L; - - public GProtocolName(ModuleName modname, ProtocolName membname) - { - super(Global.KIND, modname, membname); - } - - public GProtocolName(String simpname) - { - super(Global.KIND, simpname); - } - - @Override - public GProtocolName getSimpleName() - { - return new GProtocolName(getLastElement()); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof GProtocolName)) - { - return false; - } - GProtocolName n = (GProtocolName) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof GProtocolName; - } - - @Override - public int hashCode() - { - int hash = 2777; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/LProtocolName.java b/scribble-core/src/main/java/org/scribble/sesstype/name/LProtocolName.java deleted file mode 100644 index 6690e0996..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/LProtocolName.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.Local; - - -public class LProtocolName extends ProtocolName implements PayloadElemType //-- not needed, deleg elems currently have to be (Global@Role) -{ - private static final long serialVersionUID = 1L; - - public LProtocolName(ModuleName modname, ProtocolName membname) - { - super(Local.KIND, modname, membname); - } - - public LProtocolName(String simpname) - { - super(Local.KIND, simpname); - } - - /*@Override - public boolean isLDelegationType() - { - return true; - }*/ - - @Override - public LProtocolName getSimpleName() - { - return new LProtocolName(getLastElement()); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof LProtocolName)) - { - return false; - } - LProtocolName n = (LProtocolName) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof LProtocolName; - } - - @Override - public int hashCode() - { - int hash = 2789; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/MemberName.java b/scribble-core/src/main/java/org/scribble/sesstype/name/MemberName.java deleted file mode 100644 index e18e339c4..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/MemberName.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.Kind; - - -// Simple name or qualified name -public abstract class MemberName extends QualifiedName -{ - private static final long serialVersionUID = 1L; - - public MemberName(K kind, ModuleName modname, Name membname) - { - super(kind, compileMemberName(modname, membname)); - } - - public MemberName(K kind, String simplename) - { - super(kind, Name.compileElements(ModuleName.EMPTY_MODULENAME.getElements(), simplename)); - } - - public ModuleName getPrefix() - { - return new ModuleName(getPrefixElements()); - } - - // Similar in ModuleName - private static String[] compileMemberName(ModuleName modname, Name membname) - { - return Name.compileElements(modname.getElements(), membname.getLastElement()); - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/MessageId.java b/scribble-core/src/main/java/org/scribble/sesstype/name/MessageId.java deleted file mode 100644 index b9fcfa95c..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/MessageId.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.MessageIdKind; - - -public interface MessageId extends Name -{ - default boolean isOp() - { - return false; - } - - default boolean isMessageSigName() - { - return false; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/MessageSigName.java b/scribble-core/src/main/java/org/scribble/sesstype/name/MessageSigName.java deleted file mode 100644 index 382e66c59..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/MessageSigName.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.Message; -import org.scribble.sesstype.kind.SigKind; - - -// The name of a declared (imported) message signature member -public class MessageSigName extends MemberName implements Message, MessageId -{ - private static final long serialVersionUID = 1L; - - public MessageSigName(ModuleName modname, MessageSigName simplename) - { - super(SigKind.KIND, modname, simplename); - } - - public MessageSigName(String simplename) - { - super(SigKind.KIND, simplename); - } - - @Override - public SigKind getKind() - { - return SigKind.KIND; // Same as this.kind - } - - @Override - public MessageSigName getSimpleName() - { - return new MessageSigName(getLastElement()); - } - - @Override - public MessageId getId() - { - return this; // FIXME: should be resolved to a canonical name - } - - @Override - public boolean isMessageSigName() - { - return true; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof MessageSigName)) - { - return false; - } - MessageSigName n = (MessageSigName) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof MessageSigName; - } - - @Override - public int hashCode() - { - int hash = 2791; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/ModuleName.java b/scribble-core/src/main/java/org/scribble/sesstype/name/ModuleName.java deleted file mode 100644 index 7b8e52fbc..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/ModuleName.java +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import java.nio.file.Path; -import java.nio.file.Paths; - -import org.scribble.ast.Constants; -import org.scribble.sesstype.kind.ModuleKind; - -// General name: simple or full (a central class for value comparison) -public class ModuleName extends QualifiedName -{ - private static final long serialVersionUID = 1L; - - protected static final ModuleName EMPTY_MODULENAME = new ModuleName(); - - protected ModuleName(String... elems) - { - super(ModuleKind.KIND, elems); - } - - public ModuleName(PackageName packname, ModuleName modname) - { - super(ModuleKind.KIND, compileModuleName(packname, modname)); - } - - public ModuleName(String modname) - { - super(ModuleKind.KIND, Name.compileElements(PackageName.EMPTY_PACKAGENAME.getElements(), modname)); - } - - public Path toPath() - { - String[] elems = getElements(); - String file = elems[0]; - for (int i = 1; i < elems.length; i++) - { - file += "/" + elems[i]; - } - return Paths.get(file + "." + Constants.SCRIBBLE_FILE_EXTENSION); - } - - public boolean isSimpleName() - { - return !isPrefixed(); - } - - @Override - public ModuleName getSimpleName() - { - return new ModuleName(getLastElement()); - } - - public PackageName getPrefix() - { - return new PackageName(getPrefixElements()); - } - - public PackageName getPackageName() - { - return getPrefix(); - } - - private static String[] compileModuleName(PackageName packname, ModuleName modname) - { - return Name.compileElements(packname.getElements(), modname.getLastElement()); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof ModuleName)) - { - return false; - } - ModuleName n = (ModuleName) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof ModuleName; - } - - @Override - public int hashCode() - { - int hash = 2797; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/Name.java b/scribble-core/src/main/java/org/scribble/sesstype/name/Name.java deleted file mode 100644 index cfe84e20f..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/Name.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import java.io.Serializable; -import java.util.Arrays; - -import org.scribble.sesstype.kind.Kind; - - -public interface Name extends Serializable -{ - public K getKind(); - - public int getElementCount(); - public boolean isEmpty(); - public boolean isPrefixed(); - - public String[] getElements(); - public String[] getPrefixElements(); - public String getLastElement(); - - static String[] compileElements(String[] cn, String n) - { - if (cn.length == 0) - { - return new String[] { n }; - } - String[] elems = Arrays.copyOf(cn, cn.length + 1); - elems[elems.length - 1] = n; - return elems; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/Named.java b/scribble-core/src/main/java/org/scribble/sesstype/name/Named.java deleted file mode 100644 index 5f9045875..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/Named.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.Kind; - - -public interface Named -{ - Name toName(); -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/Op.java b/scribble-core/src/main/java/org/scribble/sesstype/name/Op.java deleted file mode 100644 index a8378853a..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/Op.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.OpKind; - -public class Op extends AbstractName implements MessageId -{ - private static final long serialVersionUID = 1L; - - public static final Op EMPTY_OPERATOR = new Op(); - - protected Op() - { - super(OpKind.KIND); - } - - public Op(String text) - { - super(OpKind.KIND, text); - } - - @Override - public boolean isOp() - { - return true; - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof Op)) - { - return false; - } - Op n = (Op) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof Op; - } - - @Override - public int hashCode() - { - int hash = 2801; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/PackageName.java b/scribble-core/src/main/java/org/scribble/sesstype/name/PackageName.java deleted file mode 100644 index 2abadb580..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/PackageName.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.PackageKind; - -public class PackageName extends QualifiedName -{ - private static final long serialVersionUID = 1L; - - public static final PackageName EMPTY_PACKAGENAME = new PackageName(); - - public PackageName(String... elems) - { - super(PackageKind.KIND, elems); - } - - @Override - public PackageName getPrefix() - { - return new PackageName(getPrefixElements()); - } - - @Override - public PackageName getSimpleName() - { - return new PackageName(getLastElement()); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof PackageName)) - { - return false; - } - PackageName n = (PackageName) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof PackageName; - } - - @Override - public int hashCode() - { - int hash = 2803; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/PayloadElemType.java b/scribble-core/src/main/java/org/scribble/sesstype/name/PayloadElemType.java deleted file mode 100644 index 16f538e5d..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/PayloadElemType.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.Arg; -import org.scribble.sesstype.kind.PayloadTypeKind; - - -public interface PayloadElemType extends Arg -{ - default boolean isDataType() - { - return false; - } - - default boolean isGDelegationType() - { - return false; - } - - /*public boolean isLDelegationType() - { - return true; - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/PayloadType.java b/scribble-core/src/main/java/org/scribble/sesstype/name/PayloadType.java deleted file mode 100644 index 570b011fc..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/PayloadType.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.Arg; -import org.scribble.sesstype.kind.PayloadTypeKind; - - -public interface PayloadType extends Arg -{ - default boolean isDataType() - { - return false; - } - - default boolean isGDelegationType() - { - return false; - } - - /*public boolean isLDelegationType() - { - return true; - }*/ -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/ProtocolName.java b/scribble-core/src/main/java/org/scribble/sesstype/name/ProtocolName.java deleted file mode 100644 index 5c53ba6b5..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/ProtocolName.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.ProtocolKind; - - -// Potentially qualified/canonical protocol name; not the AST primitive identifier -public abstract class ProtocolName extends MemberName -{ - private static final long serialVersionUID = 1L; - - public ProtocolName(K kind, ModuleName modname, ProtocolName membname) - { - super(kind, modname, membname); - } - - public ProtocolName(K kind, String simpname) - { - super(kind, simpname); - } - - @Override - public abstract ProtocolName getSimpleName(); -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/QualifiedName.java b/scribble-core/src/main/java/org/scribble/sesstype/name/QualifiedName.java deleted file mode 100644 index 7c1fd2333..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/QualifiedName.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.Kind; - - - -public abstract class QualifiedName extends AbstractName -{ - private static final long serialVersionUID = 1L; - - public QualifiedName(K kind, String... elems) - { - super(kind, elems); - } - - @Override - public boolean isEmpty() - { - return super.isEmpty(); - } - - @Override - public boolean isPrefixed() - { - return super.isPrefixed(); - } - - // Also done by Scope - public abstract Name getPrefix(); - public abstract Name getSimpleName(); -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/RecVar.java b/scribble-core/src/main/java/org/scribble/sesstype/name/RecVar.java deleted file mode 100644 index ea4061d32..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/RecVar.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.RecVarKind; - -public class RecVar extends AbstractName //implements PathElement -{ - private static final long serialVersionUID = 1L; - - protected RecVar() - { - super(RecVarKind.KIND); - } - - public RecVar(String text) - { - super(RecVarKind.KIND, text); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof RecVar)) - { - return false; - } - RecVar n = (RecVar) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof RecVar; - } - - @Override - public int hashCode() - { - int hash = 2819; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/Role.java b/scribble-core/src/main/java/org/scribble/sesstype/name/Role.java deleted file mode 100644 index ac11f9d2b..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/Role.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.RoleKind; - - -public class Role extends AbstractName -{ - public static final Role EMPTY_ROLE = new Role(); - - private static final long serialVersionUID = 1L; - - protected Role() - { - super(RoleKind.KIND); - } - - public Role(String text) - { - super(RoleKind.KIND, text); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof Role)) - { - return false; - } - Role n = (Role) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof Role; - } - - @Override - public int hashCode() - { - int hash = 2741; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-core/src/main/java/org/scribble/sesstype/name/Scope.java b/scribble-core/src/main/java/org/scribble/sesstype/name/Scope.java deleted file mode 100644 index 0c70718f8..000000000 --- a/scribble-core/src/main/java/org/scribble/sesstype/name/Scope.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.sesstype.name; - -import org.scribble.sesstype.kind.ScopeKind; - -// Should be a compound name? -public class Scope extends AbstractName -{ - private static final long serialVersionUID = 1L; - - public static final String IMPLICIT_SCOPE_PREFIX = "__scope"; - public static final Scope EMPTY_SCOPE = new Scope(); - public static final Scope ROOT_SCOPE = new Scope("__root"); - - protected Scope(String... elems) - { - super(ScopeKind.KIND, elems); - } - - public Scope(String name) - { - this(new String[] { name }); - } - - public Scope(Scope prefix, Name name) - { - this(compileScope(prefix, name)); - } - - // Also done by QualifiedName - public Scope getPrefix() - { - return new Scope(getPrefixElements()); - } - - public Scope getSimpleName() - { - return new Scope(getLastElement()); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof Scope)) - { - return false; - } - Scope n = (Scope) o; - return n.canEqual(this) && super.equals(o); - } - - public boolean canEqual(Object o) - { - return o instanceof Scope; - } - - @Override - public int hashCode() - { - int hash = 2833; - hash = 31 * super.hashCode(); - return hash; - } - - private static String[] compileScope(Scope prefix, Name name) - { - String[] tmp = prefix.getElements(); - String[] elems = new String[tmp.length + 1]; - System.arraycopy(tmp, 0, elems, 0, tmp.length); - elems[elems.length - 1] = name.toString(); - return elems; - } -} From 55ef3f8bbb39f2fc6daecb8057f21cdc3d3799a1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 22 Aug 2017 17:59:08 +0100 Subject: [PATCH 042/433] Started param extension. --- pom.xml | 5 + .../scribble/ast/global/GMessageTransfer.java | 7 - scribble-go/pom.xml | 38 + .../org/scribble/parser/antlr/ParamScribble.g | 972 ++++++++++++++++++ .../scribble/ext/go/ast/ParamAstFactory.java | 14 + .../ext/go/ast/ParamAstFactoryImpl.java | 185 ++++ .../global/ParamGCrossMessageTransfer.java | 111 ++ .../org/scribble/ext/go/cli/GoCLArgFlag.java | 20 - .../scribble/ext/go/cli/GoCLArgParser.java | 107 -- .../scribble/ext/go/cli/GoCommandLine.java | 76 -- .../scribble/ext/go/cli/ParamCLArgFlag.java | 10 + .../scribble/ext/go/cli/ParamCLArgParser.java | 138 +++ .../scribble/ext/go/cli/ParamCommandLine.java | 103 ++ .../org/scribble/ext/go/main/ParamJob.java | 65 ++ .../ext/go/main/ParamMainContext.java | 62 ++ .../scribble/ParamScribbleAntlrWrapper.java | 27 + .../src/test/scrib/param/tmp/ParamTest.scr | 19 + 17 files changed, 1749 insertions(+), 210 deletions(-) create mode 100644 scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgFlag.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/main/ParamJob.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java create mode 100644 scribble-go/src/test/scrib/param/tmp/ParamTest.scr diff --git a/pom.xml b/pom.xml index f0181a08d..3169330a9 100644 --- a/pom.xml +++ b/pom.xml @@ -84,6 +84,8 @@ scribble-test scribble-dist scribble-demos + + scribble-go @@ -285,8 +287,11 @@ bin/*.sh scribblec.sh **/*.swp + scribble-f17/**/* + scribble-go/**/* + diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java b/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java index 944f8cedc..4555cbebf 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GMessageTransfer.java @@ -103,11 +103,4 @@ public String toString() return this.msg + " " + Constants.FROM_KW + " " + this.src + " " + Constants.TO_KW + " " + getDestinations().stream().map(dest -> dest.toString()).collect(Collectors.joining(", ")) + ";"; } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GSimpleInteractionNode.super.getKind(); - }*/ } diff --git a/scribble-go/pom.xml b/scribble-go/pom.xml index 786b94d48..79db846ab 100644 --- a/scribble-go/pom.xml +++ b/scribble-go/pom.xml @@ -37,4 +37,42 @@ test + + + + + org.antlr + antlr3-maven-plugin + ${antlr.version} + + + + antlr + + + + + + + + com.mycila + license-maven-plugin + + + **/*.g + **/*.java + **/*.scr + **/IGNORE + **/*.policy + **/*.xml + **/*.html + **/stylesheet.css + **/script.js + **/package-list + **/*.txt + + + + + diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g new file mode 100644 index 000000000..113d70110 --- /dev/null +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -0,0 +1,972 @@ +//$ java -cp scribble-parser/lib/antlr-3.5.2-complete.jar org.antlr.Tool -o scribble-assertions/target/generated-sources/antlr3 scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g + +// Cygwin/Windows: +//$ java -cp scribble-parser/lib/antlr-3.5.2-complete.jar org.antlr.Tool -o scribble-go/target/generated-sources/antlr3/org/scribble/parser/antlr scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +//$ mv scribble-go/target/generated-sources/antlr3/org/scribble/parser/antlr/ParamScribble.tokens scribble-go/target/generated-sources/antlr3/ + + +grammar ParamScribble; + + +options +{ + language = Java; + output = AST; + ASTLabelType = CommonTree; + //backtrack = true; // backtracking disabled by default? Is it bad to require this option? + //memoize = true; +} + + +tokens +{ + /* + * Parser input constants (lexer output; keywords, Section 2.4) + */ + + MODULE_KW = 'module'; + IMPORT_KW = 'import'; + TYPE_KW = 'type'; + PROTOCOL_KW = 'protocol'; + GLOBAL_KW = 'global'; + LOCAL_KW = 'local'; + EXPLICIT_KW = 'explicit'; + AUX_KW = 'aux'; + ROLE_KW = 'role'; + ACCEPT_KW = 'accept'; + SELF_KW = 'self'; + SIG_KW = 'sig'; + //INSTANTIATES_KW = 'instantiates'; + AS_KW = 'as'; + + CONNECT_KW = 'connect'; + DISCONNECT_KW = 'disconnect'; + WRAP_KW = 'wrap'; + FROM_KW = 'from'; + TO_KW = 'to'; + CHOICE_KW = 'choice'; + AT_KW = 'at'; + OR_KW = 'or'; + REC_KW = 'rec'; + CONTINUE_KW = 'continue'; + //PAR_KW = 'par'; + AND_KW = 'and'; // Needed for disconnect + /*INTERRUPTIBLE_KW = 'interruptible'; + WITH_KW = 'with'; + BY_KW = 'by'; /* from for interrupts is more expected, but from is + not good for multiple roles (generally, the comma + in interrupt message list and role list looks like + "and" rather than "or") * / + THROWS_KW = 'throws'; + CATCHES_KW = 'catches';*/ + DO_KW = 'do'; + //SPAWN_KW = 'spawn'; + + + /* + * Parser output "node types" (corresponding to the various syntactic + * categories) i.e. the labels used to distinguish resulting AST nodes. + * The value of these token variables doesn't matter, only the token + * (i.e. variable) names themselves are used (for AST node root text + * field) + */ + + // Purely util constants -- not parsed as node types + + KIND_MESSAGESIGNATURE = 'KIND_MESSAGESIGNATURE'; + KIND_PAYLOADTYPE = 'KIND_PAYLOADTYPE'; + + + // "Node type" constants -- but not parsed "directly" by AntlrToScribParser + + EMPTY_ALIAS = 'EMTPY_ALIAS'; + /*EMPTY_SCOPENAME = '__empty_scopename'; + NO_SCOPE = '__no_scope';*/ + //EMPTY_PACKAGENAME = '__empty_packagebame'; + EMPTY_OPERATOR = 'EMPTY_OPERATOR'; + + //EMPTY_PARAMETERDECLLIST = '__empty_parameterdecllist'; + //EMPTY_ARGUMENTINSTANTIATIONLIST = '__empty_argumentinstantiationlist'; + /*EMPTY_LOCALTHROW = '__empty_localthrow'; + EMPTY_LOCAL_CATCHES = '__empty_local_catch';*/ + + //NAME = 'name'; + AMBIGUOUSNAME = 'AMBIGUOUSNAME'; + QUALIFIEDNAME = 'QUALIFIEDNAME'; + //PACKAGENAME = 'package-name'; + //FULLMODULENAME = 'full-module-name'; + //SIMPLEMEMBERNAME = 'simple-member-name'; + //QUALIFIEDMEMBERNAME = 'qualified-member-name'; + + MESSAGESIGNATURE = 'MESSAGESIGNATURE'; + DELEGATION = 'DELEGATION'; + + + // Parsed "directly" by AntlrToScribParser + + PAYLOAD = 'PAYLOAD'; + //PAYLOADELEMENT = 'payloadelement'; + + //MODULE = 'module'; // Probably a keyword clash + MODULE = 'MODULE'; + //PACKAGEDECL = 'package-decl'; + MODULEDECL = 'MODULEDECL'; + //IMPORTDECL = 'import-decl'; + //FROMIMPORTDECL = 'from-import-decl'; + IMPORTMODULE = 'IMPORTMODULE'; + IMPORTMEMBER = 'IMPORTMEMBER'; + PAYLOADTYPEDECL = 'PAYLOADTYPEDECL'; + MESSAGESIGNATUREDECL = 'MESSAGESIGNATUREDECL'; + ROLEDECLLIST = 'ROLEDECLLIST'; + ROLEDECL = 'ROLEDECL'; + PARAMETERDECLLIST = 'PARAMETERDECLLIST'; + PARAMETERDECL = 'PARAMETERDECL'; + ROLEINSTANTIATIONLIST = 'ROLEINSTANTIATIONLIST'; + ROLEINSTANTIATION = 'ROLEINSTANTIATION'; // FIXME: not consistent with arginstas/payloadeles + ARGUMENTINSTANTIATIONLIST = 'ARGUMENTINSTANTIATIONLIST'; + //ARGUMENTINSTANTIATION = 'argument-instantiation'; + //CONNECTDECL = 'connect-decl'; + + GLOBALPROTOCOLDECL = 'GLOBALPROTOCOLDECL'; + GLOBALPROTOCOLDECLMODS = 'GLOBALPROTOCOLDECLMODS'; + GLOBALPROTOCOLHEADER = 'GLOBALPROTOCOLHEADER'; + GLOBALPROTOCOLDEF = 'GLOBALPROTOCOLDEF'; + GLOBALPROTOCOLBLOCK = 'GLOBALPROTOCOLBLOCK'; + GLOBALINTERACTIONSEQUENCE = 'GLOBALINTERACTIONSEQUENCE'; + GLOBALMESSAGETRANSFER = 'GLOBALMESSAGETRANSFER'; + GLOBALCONNECT = 'GLOBALCONNECT'; + GLOBALDISCONNECT = 'GLOBALDISCONNECT'; + GLOBALWRAP = 'GLOBALWRAP'; + GLOBALCHOICE = 'GLOBALCHOICE'; + GLOBALRECURSION = 'GLOBALRECURSION'; + GLOBALCONTINUE = 'GLOBALCONTINUE'; + /*GLOBALPARALLEL = 'GLOBALPARALLEL'; + GLOBALINTERRUPTIBLE = 'GLOBALINTERRUPTIBLE'; + GLOBALINTERRUPT = 'GLOBALINTERRUPT';*/ + GLOBALDO = 'GLOBALDO'; + + /*LOCALPROTOCOLDECL = 'local-protocol-decl'; + LOCALROLEDECLLIST = 'local-role-decl-list'; + LOCALROLEDECL = 'local-role-decl'; + SELFDECL = 'self-decl'; + LOCALPROTOCOLDEF = 'local-protocol-def'; + LOCALPROTOCOLINSTANCE = 'local-protocol-instance'; + LOCALPROTOCOLBLOCK = 'local-protocol-block'; + LOCALINTERACTIONSEQUENCE = 'local-interaction-sequence'; + LOCALMESSAGETRANSFER = 'local-message-transfer'; + LOCALCHOICE = 'local-choice'; + LOCALRECURSION = 'local-recursion'; + LOCALCONTINUE = 'local-continue'; + LOCALPARALLEL = 'local-parallel'; + LOCALINTERRUPTIBLE = 'local-interruptible'; + LOCALINTERRUPT = 'local-interrupt'; + LOCALDO = 'local-do'; + LOCALTHROWS = 'local-throws'; + LOCALCATCHES = 'local-catches'; + LOCALSEND = 'local-send'; + LOCALRECEIVE = 'local-receive';*/ +} + + +// Has to come after tokens? +@parser::header +{ + package org.scribble.parser.antlr; + + //import org.scribble.main.RuntimeScribbleException; +} + +@lexer::header +{ + package org.scribble.parser.antlr; + + //import org.scribble.main.RuntimeScribbleException; +} + +/*// Was swallowing parser error messages +@members { + //private org.scribble.logging.IssueLogger _logger=null; + private String _document=null; + private boolean _errorOccurred=false; + + /*public void setLogger(org.scribble.logging.IssueLogger logger) { + _logger = logger; + }* / + + public void setDocument(String doc) { + _document = doc; + } + + public void emitErrorMessage(String mesg) { + /*if (_logger == null) { + super.emitErrorMessage(mesg); + } else { + _logger.error(org.scribble.parser.antlr.ANTLRMessageUtil.getMessageText(mesg), + org.scribble.parser.antlr.ANTLRMessageUtil.getProperties(mesg, _document)); + }* / + _errorOccurred = true; + } + + public boolean isErrorOccurred() { + return(_errorOccurred); + } +}*/ + +@parser::members +{ + /*@Override + public void reportError(RecognitionException e) + { + super.reportError(e); + //throw new RuntimeScribbleException(e.getMessage()); + //System.exit(1); + }*/ + + // Abort tool run on parsing errors (and display user-friendly message) -- obsoletes CommonErrorNode check? + @Override + public void displayRecognitionError(String[] tokenNames, RecognitionException e) + { + /*String hdr = getErrorHeader(e); + String msg = getErrorMessage(e, tokenNames); + //throw new RuntimeException(hdr + ":" + msg); + System.err.println(hdr + ":" + msg);*/ + super.displayRecognitionError(tokenNames, e); + System.exit(1); + } +} + +@lexer::members +{ + /*@Override + public void reportError(RecognitionException e) + { + super.reportError(e); + //throw new RuntimeScribbleException(e.getMessage()); + //System.exit(1); + }*/ + + @Override + public void displayRecognitionError(String[] tokenNames, RecognitionException e) + { + /*String hdr = getErrorHeader(e); + String msg = getErrorMessage(e, tokenNames); + //throw new RuntimeException(hdr + ":" + msg); + System.err.println(hdr + ":" + msg);*/ + super.displayRecognitionError(tokenNames, e); + System.exit(1); + } +} + + +/**************************************************************************** + * Chapter 2 Lexical Structure (Lexer rules) + ***************************************************************************/ + +/* + * Section 2.1 White space (Section 2.1) + */ + +// Not referred to explicitly, deals with whitespace implicitly (don't delete this) +WHITESPACE: + ('\t' | ' ' | '\r' | '\n'| '\u000C')+ + { + $channel = HIDDEN; + } + +; + +/** + * Section 2.2 Comments + */ +COMMENT: + '/*' .* '*/' + { + $channel=HIDDEN; + } +; + +LINE_COMMENT: + '//' ~('\n'|'\r')* '\r'? '\n' + { + $channel=HIDDEN; + } +; + +/** + * Section 2.3 Identifiers + */ +IDENTIFIER: + (LETTER | DIGIT | UNDERSCORE)* + /* Underscore currently can cause ambiguities in the API generation naming scheme + * But maybe only consecutive underscores are the problem + * -- cannot completely disallow underscores as needed for projection naming scheme + * Or disallow underscores only for role/op/messagesig names + */ +// (LETTER | DIGIT)* +; + +fragment SYMBOL: + '{' | '}' | '(' | ')' | '[' | ']' | ':' | '/' | '\\' | '.' | '\#' +| + '&' | '?' | '!' | UNDERSCORE +; + +// Comes after SYMBOL due to an ANTLR syntax highlighting issue involving +// quotes. +// Parser doesn't work without quotes here (e.g. if inlined into parser rules) +EXTIDENTIFIER: + '\"' (LETTER | DIGIT | SYMBOL)* '\"' + //(LETTER | DIGIT | SYMBOL)* +; + +fragment LETTER: + 'a'..'z' | 'A'..'Z' +; + +fragment DIGIT: + '0'..'9' +; + +fragment UNDERSCORE: + '_' +; + + +/**************************************************************************** + * Chapter 3 Syntax (Parser rules) + ***************************************************************************/ + +/* + * Section 3.1 Primitive Names + */ + +simplename: + IDENTIFIER +/*-> + ^(SIMPLENAME IDENTIFIER)*/ +; + +//annotationname: simplename; +parametername: simplename; +recursionvarname: simplename; +rolename: simplename; +scopename: simplename; + +ambiguousname: + simplename +-> + ^(AMBIGUOUSNAME simplename) +; + + +/** + * Section 3.2.1 Package, Module and Module Member Names + */ + +simplemodulename: simplename; +simplepayloadtypename: simplename; +simplemessagesignaturename: simplename; +simpleprotocolname: simplename; +simplemembername: simplename; // Only for member declarations + +qualifiedname: + IDENTIFIER ('.' IDENTIFIER)* +-> + ^(QUALIFIEDNAME IDENTIFIER+) +; + +packagename: qualifiedname; +modulename: qualifiedname; +membername: qualifiedname; + +protocolname: membername; +payloadtypename: membername; +messagesignaturename: membername; + + +/** + * Section 3.2.2 Top-level Module Structure + */ +module: + moduledecl importdecl* datatypedecl* protocoldecl* EOF +-> + ^(MODULE moduledecl importdecl* datatypedecl* protocoldecl*) +; + + +/** + * Section 3.2.3 Module Declarations + */ +moduledecl: + MODULE_KW modulename ';' +-> + ^(MODULEDECL modulename) +; + + +/** + * Section 3.3 Import Declarations + */ +importdecl: + importmodule +| + importmember +; + +importmodule: + IMPORT_KW modulename ';' +-> + ^(IMPORTMODULE modulename EMPTY_ALIAS) +| + IMPORT_KW modulename AS_KW simplemodulename ';' +-> + ^(IMPORTMODULE modulename simplemodulename) +; + +importmember: + FROM_KW modulename IMPORT_KW simplemembername ';' +-> + ^(IMPORTMEMBER modulename simplemembername EMPTY_ALIAS) +| + FROM_KW modulename IMPORT_KW simplemembername AS_KW simplemembername ';' +-> + ^(IMPORTMEMBER modulename simplemembername simplemembername) +; + + +/** + * //Section 3.4 Payload Type Declarations + * Data Declarations + */ +datatypedecl: + payloadtypedecl +| + messagesignaturedecl +; + +payloadtypedecl: + TYPE_KW '<' IDENTIFIER '>' EXTIDENTIFIER FROM_KW EXTIDENTIFIER AS_KW simplepayloadtypename ';' +-> + ^(PAYLOADTYPEDECL IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER simplepayloadtypename) +; + +messagesignaturedecl: + SIG_KW '<' IDENTIFIER '>' EXTIDENTIFIER FROM_KW EXTIDENTIFIER AS_KW simplemessagesignaturename ';' +-> + ^(MESSAGESIGNATUREDECL IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER simplemessagesignaturename) +; + + +/** + * Section 3.5 Message Signatures + */ +/*messageoperator: + IDENTIFIER +;*/ + +messagesignature: + '(' payload ')' +-> + ^(MESSAGESIGNATURE EMPTY_OPERATOR payload) +| + //messageoperator '(' payload ')' // Doesn't work (conflict with IDENTIFIER?) + IDENTIFIER '(' payload ')' +-> + ^(MESSAGESIGNATURE IDENTIFIER payload) +| + '(' ')' +-> + ^(MESSAGESIGNATURE EMPTY_OPERATOR ^(PAYLOAD)) +| + IDENTIFIER '(' ')' +-> + ^(MESSAGESIGNATURE IDENTIFIER ^(PAYLOAD)) +; + +payload: + payloadelement (',' payloadelement)* +-> + ^(PAYLOAD payloadelement+) +; + +// Payload type names need disambiguation pass (also do args) +payloadelement: +/* ambiguousname // Parser doesn't distinguish simple from qualified properly, even with backtrack +|*/ + qualifiedname // This case subsumes simple names // FIXME: ambiguousqualifiedname (or ambiguousname should just be qualified) +| + protocolname '@' rolename +-> + ^(DELEGATION rolename protocolname) +; + + +/** + * Section 3.6 Protocol Declarations + */ +protocoldecl: + globalprotocoldecl +/*| + localprotocoldecl*/ +; + + +/** + * Section 3.7 Global Protocol Declarations + */ +globalprotocoldecl: + globalprotocolheader globalprotocoldefinition +-> + ^(GLOBALPROTOCOLDECL globalprotocolheader globalprotocoldefinition) +| + globalprotocoldeclmodifiers globalprotocolheader globalprotocoldefinition // HACK: backwards compat for "implicit" connections +-> + ^(GLOBALPROTOCOLDECL globalprotocolheader globalprotocoldefinition globalprotocoldeclmodifiers) +; + +globalprotocoldeclmodifiers: + AUX_KW EXPLICIT_KW +-> + ^(GLOBALPROTOCOLDECLMODS AUX_KW EXPLICIT_KW) +| + EXPLICIT_KW +-> + ^(GLOBALPROTOCOLDECLMODS EXPLICIT_KW) +| + AUX_KW +-> + ^(GLOBALPROTOCOLDECLMODS AUX_KW) +; + +globalprotocolheader: + GLOBAL_KW PROTOCOL_KW simpleprotocolname roledecllist +-> + ^(GLOBALPROTOCOLHEADER simpleprotocolname ^(PARAMETERDECLLIST) roledecllist) +| + GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist +-> + ^(GLOBALPROTOCOLHEADER simpleprotocolname parameterdecllist roledecllist) +; + +roledecllist: + '(' roledecl (',' roledecl)* ')' +-> + ^(ROLEDECLLIST roledecl+) +; + +roledecl: + ROLE_KW rolename +-> + ^(ROLEDECL rolename) +; + +parameterdecllist: + '<' parameterdecl (',' parameterdecl)* '>' +-> + ^(PARAMETERDECLLIST parameterdecl+) +; + +parameterdecl: + TYPE_KW parametername +-> + ^(PARAMETERDECL KIND_PAYLOADTYPE parametername) +| + SIG_KW parametername +-> + ^(PARAMETERDECL KIND_MESSAGESIGNATURE parametername) +; + + +/** + * Section 3.7.1 Global Protocol Definitions + */ +globalprotocoldefinition: + globalprotocolblock +-> + ^(GLOBALPROTOCOLDEF globalprotocolblock) +; + + +/** + * Section 3.7.3 Global Interaction Sequences and Blocks + */ +globalprotocolblock: + '{' globalinteractionsequence '}' +-> + ^(GLOBALPROTOCOLBLOCK globalinteractionsequence) +/*| + '(' connectdecl ')' '{' globalinteractionsequence '}' +-> + ^(GLOBALPROTOCOLBLOCK globalinteractionsequence connectdecl)*/ +; + +globalinteractionsequence: + globalinteraction* +-> + ^(GLOBALINTERACTIONSEQUENCE globalinteraction*) +; + +globalinteraction: + globalmessagetransfer +| + globalchoice +| + globalrecursion +| + globalcontinue +| + globaldo +| + globalconnect +| + globaldisconnect +| + globalwrap +; +/*| + globalparallel +| + globalinterruptible*/ + + +/** + * Section 3.7.4 Global Message Transfer + */ +globalmessagetransfer: + message FROM_KW rolename TO_KW rolename (',' rolename )* ';' +-> + ^(GLOBALMESSAGETRANSFER message rolename rolename+) +; + +message: + messagesignature +| + ambiguousname // FIXME: qualified name +/*| + messagesignaturename // qualified messagesignaturename subsumes parametername case +| + parametername*/ +; + +globalconnect: + //message CONNECT_KW rolename TO_KW rolename + CONNECT_KW rolename TO_KW rolename ';' +-> + ^(GLOBALCONNECT rolename rolename ^(MESSAGESIGNATURE EMPTY_OPERATOR ^(PAYLOAD))) // Empty message sig duplicated from messagesignature +| + message CONNECT_KW rolename TO_KW rolename ';' +-> + ^(GLOBALCONNECT rolename rolename message) +; +/* '(' connectdecl (',' connectdecl)* ')' +-> + ^(CONNECTDECLLIST connectdecl+) +;* / + '(' connectdecl ')' +*/ + +/*connectdecl: + CONNECT_KW rolename '->>' rolename +-> + ^(CONNECTDECL rolename rolename) +;*/ + +globaldisconnect: + DISCONNECT_KW rolename AND_KW rolename ';' +-> + ^(GLOBALDISCONNECT rolename rolename ) +; + +globalwrap: + //message CONNECT_KW rolename TO_KW rolename + WRAP_KW rolename TO_KW rolename ';' +-> + ^(GLOBALWRAP rolename rolename) +; + + +/** + * Section 3.7.5 Global Choice + */ +globalchoice: + CHOICE_KW AT_KW rolename globalprotocolblock (OR_KW globalprotocolblock)* +-> + ^(GLOBALCHOICE rolename globalprotocolblock+) +; + + +/** + * Section 3.7.6 Global Recursion + */ +globalrecursion: + REC_KW recursionvarname globalprotocolblock +-> + ^(GLOBALRECURSION recursionvarname globalprotocolblock) +; + +globalcontinue: + CONTINUE_KW recursionvarname ';' +-> + ^(GLOBALCONTINUE recursionvarname) +; + + +/* + * Section 3.7.7 Global Parallel + * / +globalparallel: + PAR_KW globalprotocolblock (AND_KW globalprotocolblock)* +-> + ^(GLOBALPARALLEL globalprotocolblock+) +;*/ + + +/* + * Section 3.7.8 Global Interruptible + * / +globalinterruptible: + INTERRUPTIBLE_KW globalprotocolblock WITH_KW '{' globalinterrupt* '}' +-> + ^(GLOBALINTERRUPTIBLE EMPTY_SCOPENAME globalprotocolblock globalinterrupt*) +| + INTERRUPTIBLE_KW scopename globalprotocolblock WITH_KW '{' (globalinterrupt)* '}' +-> + ^(GLOBALINTERRUPTIBLE scopename globalprotocolblock globalinterrupt*) +; + +globalinterrupt: + message (',' message)* BY_KW rolename ';' +-> + ^(GLOBALINTERRUPT rolename message+) +;*/ + + +/** + * Section 3.7.9 Global Do + */ +globaldo: + DO_KW protocolname roleinstantiationlist ';' +-> + ^(GLOBALDO protocolname ^(ARGUMENTINSTANTIATIONLIST) roleinstantiationlist) +| + DO_KW protocolname argumentinstantiationlist roleinstantiationlist ';' +-> + ^(GLOBALDO protocolname argumentinstantiationlist roleinstantiationlist) +; + +roleinstantiationlist: + '(' roleinstantiation (',' roleinstantiation)* ')' +-> + ^(ROLEINSTANTIATIONLIST roleinstantiation+) +; + +roleinstantiation: + rolename +-> + ^(ROLEINSTANTIATION rolename) // FIXME: not consistent with arginstas/payloadeles +; + +argumentinstantiationlist: + '<' argumentinstantiation (',' argumentinstantiation)* '>' +-> + ^(ARGUMENTINSTANTIATIONLIST argumentinstantiation+) +; + +// Like PayloadElement, simple names need disambiguation +argumentinstantiation: + //message + // Grammatically same as message, but argument case can also be a payload type + messagesignature +/*| + ambiguousname // As for payloadelement: parser doesn't distinguish simple from qualified properly, even with backtrack*/ +| + qualifiedname +; + + +/* + * Section 3.8 Local Protocol Declarations + * / +localprotocoldecl: + localprotocolheader localprotocoldefinition +-> + ^(LOCALPROTOCOLDECL localprotocolheader localprotocoldefinition) +; + +localprotocolheader: + LOCAL_KW PROTOCOL_KW simpleprotocolname localroledecllist +-> + //simpleprotocolname EMPTY_PARAMETERDECLLIST localroledecllist + simpleprotocolname ^(PARAMETERDECLLIST) localroledecllist +| + LOCAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist localroledecllist +-> + simpleprotocolname parameterdecllist localroledecllist +; + +localroledecllist: + '(' localroledecl (',' localroledecl)* ')' +-> + ^(LOCALROLEDECLLIST localroledecl+) +; + +localroledecl: + roledecl +| + SELF_KW rolename +-> + ^(SELFDECL rolename) +; + + +/** + * Section 3.8.1 Local Protocol Definitions + * / +localprotocoldefinition: + localprotocolblock +-> + ^(LOCALPROTOCOLDEF localprotocolblock) +; + + +/** + * Section 3.8.3 Local Interaction Blocks and Sequences + * / +localprotocolblock: + '{' localinteractionsequence '}' +-> + ^(LOCALPROTOCOLBLOCK localinteractionsequence) +; + +localinteractionsequence: + (localinteraction)* +-> + ^(LOCALINTERACTIONSEQUENCE localinteraction*) +; + +localinteraction: + localsend +| + localreceive +| + localchoice +| + localparallel +| + localrecursion +| + localcontinue +| + localinterruptible +| + localdo +; + + +/** + * Section 3.8.4 Local Send and Receive + * / +localsend: + message TO_KW rolename (',' rolename)* ';' +-> + ^(LOCALSEND message rolename+) +; + +localreceive: + message FROM_KW IDENTIFIER ';' +-> + ^(LOCALRECEIVE message IDENTIFIER) +; + + +/** + * Section 3.8.5 Local Choice + * / +localchoice: + CHOICE_KW AT_KW rolename localprotocolblock (OR_KW localprotocolblock)* +-> + ^(LOCALCHOICE rolename localprotocolblock+) +; + + +/** + * Section 3.8.6 Local Recursion + * / +localrecursion: + REC_KW recursionvarname localprotocolblock +-> + ^(LOCALRECURSION recursionvarname localprotocolblock) +; + +localcontinue: + CONTINUE_KW recursionvarname ';' +-> + ^(LOCALCONTINUE recursionvarname) +; + + +/** + * Section 3.8.7 Local Parallel + * / +localparallel: + PAR_KW localprotocolblock (AND_KW localprotocolblock)* +-> + ^(LOCALPARALLEL localprotocolblock+) +; + + +/** + * Section 3.8.8 Local Interruptible + * / +localinterruptible: + INTERRUPTIBLE_KW scopename localprotocolblock WITH_KW '{' localcatches* '}' +-> + ^(LOCALINTERRUPTIBLE scopename localprotocolblock EMPTY_LOCALTHROW localcatches*) +| + INTERRUPTIBLE_KW scopename localprotocolblock WITH_KW '{' localthrows localcatches* '}' +-> + ^(LOCALINTERRUPTIBLE scopename localprotocolblock localthrows localcatches*) +; + +/*localthrowandorcatch: + localthrow (localcatch)* +| + (localcatch)+ +;* / + +localthrows: + THROWS_KW message (',' message)* TO_KW rolename (',' rolename)* ';' +-> + ^(LOCALTHROWS rolename+ TO_KW message+) +; + +localcatches: + CATCHES_KW message (',' message)* FROM_KW rolename ';' +-> + ^(LOCALCATCHES rolename message+) +; + + +/** + * Section 3.8.9 Local Do + * / +localdo: + DO_KW protocolname roleinstantiationlist ';' +-> + //^(LOCALDO NO_SCOPE protocolname EMPTY_ARGUMENTINSTANTIATIONLIST roleinstantiationlist) + ^(LOCALDO NO_SCOPE protocolname ^(ARGUMENTINSTANTIATIONLIST) roleinstantiationlist) +| + DO_KW protocolname argumentinstantiationlist roleinstantiationlist ';' +-> + ^(LOCALDO NO_SCOPE protocolname argumentinstantiationlist roleinstantiationlist) +| + DO_KW scopename ':' protocolname roleinstantiationlist ';' +-> + //^(LOCALDO scopename protocolname EMPTY_ARGUMENTINSTANTIATIONLIST roleinstantiationlist) + ^(LOCALDO scopename protocolname ^(ARGUMENTINSTANTIATIONLIST) roleinstantiationlist) +| + DO_KW scopename ':' protocolname argumentinstantiationlist roleinstantiationlist ';' +-> + ^(LOCALDO scopename protocolname argumentinstantiationlist roleinstantiationlist) +; +*/ diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java new file mode 100644 index 000000000..e7b92f5ec --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java @@ -0,0 +1,14 @@ +package org.scribble.ext.go.ast; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.MessageNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; + + +public interface ParamAstFactory extends AstFactory +{ + ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + int srcRangeStart, int srcRangeEnd, int destRangeStart, int destRangeEnd); +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java new file mode 100644 index 000000000..7c560a051 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -0,0 +1,185 @@ +package org.scribble.ext.go.ast; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactoryImpl; +import org.scribble.ast.MessageNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.global.GMessageTransferDel; +import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; + + +// FIXME: separate modified-del-only from new categories +public class ParamAstFactoryImpl extends AstFactoryImpl implements ParamAstFactory +{ + + // Instantiating existing node classes with new dels + + /*@Override + public GProtocolDecl GProtocolDecl(CommonTree source, List mods, GProtocolHeader header, GProtocolDef def) + { + GProtocolDecl gpd = new GProtocolDecl(source, mods, header, def); + gpd = del(gpd, new AssrtGProtocolDeclDel()); + return gpd; + } + + @Override + public GProtocolDef GProtocolDef(CommonTree source, GProtocolBlock block) + { + GProtocolDef gpd = new GProtocolDef(source, block); + gpd = del(gpd, new AssrtGProtocolDefDel()); // Uses header annot to do AssrtAnnotationChecker Def enter/exit + return gpd; + } + + @Override + public GProtocolBlock GProtocolBlock(CommonTree source, GInteractionSeq seq) + { + GProtocolBlock gpb = new GProtocolBlock(source, seq); + gpb = del(gpb, new AssrtGProtocolBlockDel()); + return gpb; + } + + @Override + public GChoice GChoice(CommonTree source, RoleNode subj, List blocks) + { + GChoice gc = new GChoice(source, subj, blocks); + gc = del(gc, new AssrtGChoiceDel()); + return gc; + } + + /*@Override + public GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) + { + GRecursion gr = new GRecursion(source, recvar, block); + gr = del(gr, new AssrtGRecursionDel()); + return gr; + }* / + + @Override + public AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier) + { + AmbigNameNode ann = new AmbigNameNode(source, identifier); + ann = (AmbigNameNode) ann.del(new AssrtAmbigNameNodeDel()); + return ann; + } + + @Override + public LProjectionDecl LProjectionDecl(CommonTree source, List mods, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def) + { + LProjectionDecl lpd = new LProjectionDecl(source, mods, header, def); + lpd = del(lpd, new AssrtLProjectionDeclDel(fullname, self)); + return lpd; + } + + @Override + public LProtocolDef LProtocolDef(CommonTree source, LProtocolBlock block) + { + LProtocolDef lpd = new LProtocolDef(source, block); + lpd = del(lpd, new AssrtLProtocolDefDel()); + return lpd; + } + + + @Override + public LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests) + { + LReceive ls = new LReceive(source, src, msg, dests); // FIXME: AssrtLReceive with assertion? + ls = del(ls, new AssrtLReceiveDel()); + return ls; + } + + @Override + public LProtocolBlock LProtocolBlock(CommonTree source, LInteractionSeq seq) + { + LProtocolBlock lpb = new LProtocolBlock(source, seq); + lpb = del(lpb, new AssrtLProtocolBlockDel()); + return lpb; + } + + /* // Cf. GMessageTransfer -- empty-annotation sends still created as AssrtLSend, with null assertion -- but AssrtLSendDel still needed + * // No: not needed, because all globals made as Assrts, so projections are always Assrts + @Override + public AssrtLSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests) + { + //LSend ls = new LSend(source, src, msg, dests); + AssrtLSend ls = new AssrtLSend(source, src, msg, dests); + ls = del(ls, new AssrtLSendDel()); + return ls; + }*/ + + /*@Override + public AssrtLConnect LConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dests) + { + AssrtLConnect ls = new AssrtLConnect(source, src, msg, dests); + ls = del(ls, new AssrtLConnectDel()); + return ls; + }* / + + + // Returning new node classes in place of existing + + // Still used by parsing for empty annotation/assertion nodes -- but we return an Assrt node + // Easier to make all global as Assrt nodes, to avoid cast checks in, e.g., AssrtGProtocolDeclDel::leaveProjection (for GProtocolHeader), and so all projections will be Assrt kinds only + + @Override + public AssrtGProtocolHeader GProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) + { + // Alternative is to make parsing return all as AssrtGProtocolHeader directly + AssrtGProtocolHeader gpb = new AssrtGProtocolHeader(source, name, roledecls, paramdecls); + gpb = del(gpb, createDefaultDelegate()); // Annots handled directly by AssrtAnnotationChecker Def enter/exit + return gpb; + } + + // Same pattern as for GProtocolHeader + // Non-annotated message transfers still created as AssrtGMessageTransfer -- null assertion, but AssrtGMessageTransferDel is still needed (why?) + @Override + public AssrtGMessageTransfer GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) + { + AssrtGMessageTransfer gmt = new AssrtGMessageTransfer(source, src, msg, dests); + gmt = del(gmt, new AssrtGMessageTransferDel()); + return gmt; + } + + @Override + public AssrtGConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) // Cf. AssrtAstFactoryImpl::GMessageTransfer + { + AssrtGConnect gc = new AssrtGConnect(source, src, msg, dest); + gc = del(gc, new AssrtGConnectDel()); + return gc; + } + + @Override + public GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) + { + AssrtGRecursion gr = new AssrtGRecursion(source, recvar, block); + gr = del(gr, new AssrtGRecursionDel()); + return gr; + } + + @Override + public AssrtGContinue GContinue(CommonTree source, RecVarNode recvar) + { + AssrtGContinue gc = new AssrtGContinue(source, recvar); + gc = del(gc, new AssrtGContinueDel()); + return gc; + } + + @Override + public AssrtGDo GDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, GProtocolNameNode proto) + { + AssrtGDo gd = new AssrtGDo(source, roleinstans, arginstans, proto); + gd = del(gd, new AssrtGDoDel()); + return gd; + } + */ + + // Explicitly creating new Assrt nodes + @Override + public ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + int srcRangeStart, int srcRangeEnd, int destRangeStart, int destRangeEnd) + { + ParamGCrossMessageTransfer mt = new ParamGCrossMessageTransfer(source, src, msg, dest, + srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); + mt = del(mt, new GMessageTransferDel()); // FIXME + return mt; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java new file mode 100644 index 000000000..c73121139 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java @@ -0,0 +1,111 @@ +package org.scribble.ext.go.ast.global; + +import java.util.Arrays; +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.Constants; +import org.scribble.ast.MessageNode; +import org.scribble.ast.MessageTransfer; +import org.scribble.ast.global.GMessageTransfer; +import org.scribble.ast.local.LNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; +import org.scribble.visit.AstVisitor; + +// Subsumes scatter/gather, src/dest range length one +public class ParamGCrossMessageTransfer extends GMessageTransfer //implements ParamActionAssertNode +{ + //public final ParamAssertion ass; // null if not specified -- should be the "true" formula in principle, but not syntactically + // Duplicated in, e.g., ALSend -- could factour out to in Del, but need to consider immutable pattern + + // All >= 0; end >= start + public final int srcRangeStart; + public final int srcRangeEnd; // Inclusive + public final int destRangeStart; + public final int destRangeEnd; // Inclusive + + public ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + int srcRangeStart, int srcRangeEnd, int destRangeStart, int destRangeEnd) + { + super(source, src, msg, Arrays.asList(dest)); + this.srcRangeStart = srcRangeStart; + this.srcRangeEnd = srcRangeEnd; + this.destRangeStart = destRangeStart; + this.destRangeEnd = destRangeEnd; + } + + @Override + public LNode project(AstFactory af, Role self) + { + /*LNode proj = super.project(af, self); + if (proj instanceof LInteractionSeq) // From super, if self communication + { + throw new RuntimeException("[assrt] Self-communication not supported: " + proj); + } + else if (proj instanceof LSend) + { + LSend ls = (LSend) proj; + proj = ((ParamAstFactory) af).ParamLSend(ls.getSource(), ls.src, ls.msg, ls.getDestinations(), this.ass); + } + return proj;*/ + return super.project(af, self); // FIXME + } + + @Override + protected ParamGCrossMessageTransfer copy() + { + return new ParamGCrossMessageTransfer(this.source, this.src, this.msg, getDestinations().get(0), + this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); + } + + @Override + public ParamGCrossMessageTransfer clone(AstFactory af) + { + RoleNode src = this.src.clone(af); + MessageNode msg = this.msg.clone(af); + RoleNode dest = getDestinations().get(0).clone(af); + return ((ParamAstFactory) af).ParamGCrossMessageTransfer(this.source, src, msg, dest, + this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); + } + + @Override + public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) + { + throw new RuntimeException("[assrt] Shouldn't get in here: " + this); + } + + public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, + int srcRangeStart, int srcRangeEnd, int destRangeStart, int destRangeEnd) + { + ScribDel del = del(); + ParamGCrossMessageTransfer gmt = new ParamGCrossMessageTransfer(this.source, src, msg, dest, + srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); + gmt = (ParamGCrossMessageTransfer) gmt.del(del); + return gmt; + } + + @Override + public MessageTransfer visitChildren(AstVisitor nv) throws ScribbleException + { + RoleNode src = (RoleNode) visitChild(this.src, nv); + MessageNode msg = (MessageNode) visitChild(this.msg, nv); + RoleNode dest = (RoleNode) visitChild(getDestinations().get(0), nv); + return reconstruct(src, msg, dest, this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); + } + + @Override + public String toString() + { + return this.msg + Constants.FROM_KW + " " + + this.src + "[" + this.srcRangeStart + ".." + this.srcRangeEnd + "]" + + " " + Constants.TO_KW + " " + + getDestinations().get(0) + "[" + this.destRangeStart + ".." + this.destRangeEnd + "]" + + ";"; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgFlag.java deleted file mode 100644 index be72cd90e..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgFlag.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ext.go.cli; - -public enum GoCLArgFlag -{ - // Non-unique flags - GO_API_GEN -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java deleted file mode 100644 index 862c6d332..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ext.go.cli; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import org.scribble.cli.CLArgParser; -import org.scribble.cli.CommandLineException; - -public class GoCLArgParser extends CLArgParser -{ - // Non-unique flags - public static final String GO_API_GEN_FLAG = "-goapi"; - - private static final Map GO_NON_UNIQUE_FLAGS = new HashMap<>(); - { - GoCLArgParser.GO_NON_UNIQUE_FLAGS.put(GoCLArgParser.GO_API_GEN_FLAG, GoCLArgFlag.GO_API_GEN); - } - - private static final Map GO_FLAGS = new HashMap<>(); - { - GoCLArgParser.GO_FLAGS.putAll(GoCLArgParser.GO_NON_UNIQUE_FLAGS); - } - - private final Map goParsed = new HashMap<>(); - - public GoCLArgParser(String[] args) throws CommandLineException - { - super(args); // Assigns this.args and calls parseArgs - } - - public Map getGoArgs() throws CommandLineException - { - //super.parseArgs(); // Needed - return this.goParsed; - } - - @Override - protected boolean isFlag(String arg) - { - return GoCLArgParser.GO_FLAGS.containsKey(arg) || super.isFlag(arg); - } - - // Pre: i is the index of the current flag to parse - // Post: i is the index of the last argument parsed -- parseArgs does the index increment to the next current flag - @Override - protected int parseFlag(int i) throws CommandLineException - { - String flag = this.args[i]; - switch (flag) - { - case GoCLArgParser.GO_API_GEN_FLAG: - { - return goParseProtoAndRoleArgs(flag, i); - } - default: - { - return super.parseFlag(i); - } - } - } - - // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag - private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException - { - GoCLArgFlag flag = GoCLArgParser.GO_NON_UNIQUE_FLAGS.get(f); - if ((i + 2) >= this.args.length) - { - throw new CommandLineException("Missing protocol/role arguments"); - } - String proto = this.args[++i]; - String role = this.args[++i]; - goConcatArgs(flag, proto, role); - return i; - } - - // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag - private void goConcatArgs(GoCLArgFlag flag, String... toAdd) - { - String[] args = this.goParsed.get(flag); - if (args == null) - { - args = Arrays.copyOf(toAdd, toAdd.length); - } - else - { - String[] tmp = new String[args.length + toAdd.length]; - System.arraycopy(args, 0, tmp, 0, args.length); - System.arraycopy(toAdd, 0, tmp, args.length, toAdd.length); - args = tmp; - } - this.goParsed.put(flag, args); - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java deleted file mode 100644 index ada5f18ef..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.scribble.ext.go.cli; - -import java.util.Map; - -import org.scribble.cli.CLArgFlag; -import org.scribble.cli.CommandLine; -import org.scribble.cli.CommandLineException; -import org.scribble.ext.go.codegen.statetype.go.GoEndpointApiGenerator; -import org.scribble.main.AntlrSourceException; -import org.scribble.main.Job; -import org.scribble.main.JobContext; -import org.scribble.main.ScribbleException; -import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; - -public class GoCommandLine extends CommandLine -{ - protected final Map goArgs; // Maps each flag to list of associated argument values - - public GoCommandLine(String... args) throws CommandLineException - { - //super(args); // No: new go-specific args will make core arg parser throw exception (constructors cannot call overridable methods) -- refactor? - - this(new GoCLArgParser(args)); - } - - private GoCommandLine(GoCLArgParser p) throws CommandLineException - { - super(p); // calls p.parse() - // FIXME? Duplicated from core - if (!this.args.containsKey(CLArgFlag.MAIN_MOD) && !this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) - { - throw new CommandLineException("No main module has been specified\r\n"); - } - this.goArgs = p.getGoArgs(); - } - - @Override - protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, CommandLineException - { - if (this.goArgs.containsKey(GoCLArgFlag.GO_API_GEN)) - { - JobContext jcontext = job.getContext(); - String[] args = this.goArgs.get(GoCLArgFlag.GO_API_GEN); - for (int i = 0; i < args.length; i += 2) - { - GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); - Role role = checkRoleArg(jcontext, fullname, args[i+1]); - Map goClasses = new GoEndpointApiGenerator(job).generateGoApi(fullname, role); - outputClasses(goClasses); - } - } - else - { - super.doNonAttemptableOutputTasks(job); - } - } - - public static void main(String[] args) throws CommandLineException, AntlrSourceException - { - new GoCommandLine(args).run(); - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java new file mode 100644 index 000000000..44d5761ac --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java @@ -0,0 +1,10 @@ +package org.scribble.ext.go.cli; + +public enum ParamCLArgFlag +{ + // Unique flags + PARAM, + + // Non-unique flags + GO_API_GEN +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java new file mode 100644 index 000000000..91e1947c8 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java @@ -0,0 +1,138 @@ +package org.scribble.ext.go.cli; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.scribble.cli.CLArgParser; +import org.scribble.cli.CommandLineException; + +public class ParamCLArgParser extends CLArgParser +{ + // Unique flags + public static final String PARAM_FLAG = "-param"; + + // Non-unique flags + public static final String GO_API_GEN_FLAG = "-goapi"; + + private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); + { + ParamCLArgParser.PARAM_UNIQUE_FLAGS.put(ParamCLArgParser.PARAM_FLAG, ParamCLArgFlag.PARAM); + } + + private static final Map PARAM_NON_UNIQUE_FLAGS = new HashMap<>(); + { + ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.GO_API_GEN_FLAG, ParamCLArgFlag.GO_API_GEN); + } + + private static final Map PARAM_FLAGS = new HashMap<>(); + { + ParamCLArgParser.PARAM_FLAGS.putAll(ParamCLArgParser.PARAM_UNIQUE_FLAGS); + ParamCLArgParser.PARAM_FLAGS.putAll(ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS); + } + + private final Map paramParsed = new HashMap<>(); + + public ParamCLArgParser(String[] args) throws CommandLineException + { + super(args); // Assigns this.args and calls parseArgs + } + + public Map getParamArgs() throws CommandLineException + { + //super.parseArgs(); // Needed + return this.paramParsed; + } + + @Override + protected boolean isFlag(String arg) + { + return ParamCLArgParser.PARAM_FLAGS.containsKey(arg) || super.isFlag(arg); + } + + // Pre: i is the index of the current flag to parse + // Post: i is the index of the last argument parsed -- parseArgs does the index increment to the next current flag + @Override + protected int parseFlag(int i) throws CommandLineException + { + String flag = this.args[i]; + switch (flag) + { + // Unique flags + + case ParamCLArgParser.PARAM_FLAG: + { + return paramParseParam(i); + } + + + // Non-unique flags + + case ParamCLArgParser.GO_API_GEN_FLAG: + { + return goParseProtoAndRoleArgs(flag, i); + } + + + // Base CL + + default: + { + return super.parseFlag(i); + } + } + } + + private int paramParseParam(int i) throws CommandLineException + { + if ((i + 1) >= this.args.length) + { + throw new CommandLineException("Missing simple global protocol name argument."); + } + String proto = this.args[++i]; + paramCheckAndAddUniqueFlag(ParamCLArgParser.PARAM_FLAG, new String[] { proto }); + return i; + } + + private void paramCheckAndAddUniqueFlag(String flag, String[] args) throws CommandLineException + { + ParamCLArgFlag argFlag = ParamCLArgParser.PARAM_UNIQUE_FLAGS.get(flag); + if (this.paramParsed.containsKey(argFlag)) + { + throw new CommandLineException("Duplicate flag: " + flag); + } + this.paramParsed.put(argFlag, args); + } + + // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag + private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException + { + ParamCLArgFlag flag = ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + if ((i + 2) >= this.args.length) + { + throw new CommandLineException("Missing protocol/role arguments"); + } + String proto = this.args[++i]; + String role = this.args[++i]; + goConcatArgs(flag, proto, role); + return i; + } + + // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag + private void goConcatArgs(ParamCLArgFlag flag, String... toAdd) + { + String[] args = this.paramParsed.get(flag); + if (args == null) + { + args = Arrays.copyOf(toAdd, toAdd.length); + } + else + { + String[] tmp = new String[args.length + toAdd.length]; + System.arraycopy(args, 0, tmp, 0, args.length); + System.arraycopy(toAdd, 0, tmp, args.length, toAdd.length); + args = tmp; + } + this.paramParsed.put(flag, args); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java new file mode 100644 index 000000000..cdb1c25ef --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -0,0 +1,103 @@ +package org.scribble.ext.go.cli; + +import java.nio.file.Path; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.scribble.cli.CLArgFlag; +import org.scribble.cli.CommandLine; +import org.scribble.cli.CommandLineException; +import org.scribble.ext.go.codegen.statetype.go.GoEndpointApiGenerator; +import org.scribble.ext.go.main.ParamMainContext; +import org.scribble.main.AntlrSourceException; +import org.scribble.main.Job; +import org.scribble.main.JobContext; +import org.scribble.main.ScribbleException; +import org.scribble.main.resource.DirectoryResourceLocator; +import org.scribble.main.resource.ResourceLocator; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; +import org.scribble.util.ScribParserException; + +public class ParamCommandLine extends CommandLine +{ + protected final Map paramArgs; // Maps each flag to list of associated argument values + + public ParamCommandLine(String... args) throws CommandLineException + { + this(new ParamCLArgParser(args)); + } + + private ParamCommandLine(ParamCLArgParser p) throws CommandLineException + { + super(p); // calls p.parse() + if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) + { + // FIXME: should be fine + throw new RuntimeException("[param] Inline modules not supported:\n" + this.args.get(CLArgFlag.INLINE_MAIN_MOD)); + } + // FIXME? Duplicated from core + if (!this.args.containsKey(CLArgFlag.MAIN_MOD)) + { + throw new CommandLineException("No main module has been specified\r\n"); + } + this.paramArgs = p.getParamArgs(); + } + + @Override + protected ParamMainContext newMainContext() throws ScribParserException, ScribbleException + { + boolean debug = this.args.containsKey(CLArgFlag.VERBOSE); // TODO: factor out with CommandLine (cf. MainContext fields) + boolean useOldWF = this.args.containsKey(CLArgFlag.OLD_WF); + boolean noLiveness = this.args.containsKey(CLArgFlag.NO_LIVENESS); + boolean minEfsm = this.args.containsKey(CLArgFlag.LTSCONVERT_MIN); + boolean fair = this.args.containsKey(CLArgFlag.FAIR); + boolean noLocalChoiceSubjectCheck = this.args.containsKey(CLArgFlag.NO_LOCAL_CHOICE_SUBJECT_CHECK); + boolean noAcceptCorrelationCheck = this.args.containsKey(CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); + boolean noValidation = this.args.containsKey(CLArgFlag.NO_VALIDATION); + + List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) + ? CommandLine.parseImportPaths(this.args.get(CLArgFlag.IMPORT_PATH)[0]) + : Collections.emptyList(); + ResourceLocator locator = new DirectoryResourceLocator(impaths); + if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) + { + /*return new ParamMainContext(debug, locator, this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0], useOldWF, noLiveness, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, solver);*/ + throw new RuntimeException("[param] Shouldn't get in here:\n" + this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0]); // Checked in constructor + } + else + { + Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); + return new ParamMainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + } + } + + @Override + protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, CommandLineException + { + if (this.paramArgs.containsKey(ParamCLArgFlag.GO_API_GEN)) + { + JobContext jcontext = job.getContext(); + String[] args = this.paramArgs.get(ParamCLArgFlag.GO_API_GEN); + for (int i = 0; i < args.length; i += 2) + { + GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); + Role role = checkRoleArg(jcontext, fullname, args[i+1]); + Map goClasses = new GoEndpointApiGenerator(job).generateGoApi(fullname, role); + outputClasses(goClasses); + } + } + else + { + super.doNonAttemptableOutputTasks(job); + } + } + + public static void main(String[] args) throws CommandLineException, AntlrSourceException + { + new ParamCommandLine(args).run(); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamJob.java b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamJob.java new file mode 100644 index 000000000..cb7408098 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamJob.java @@ -0,0 +1,65 @@ +package org.scribble.ext.go.main; + +import java.util.Map; + +import org.scribble.ast.AstFactory; +import org.scribble.ast.Module; +import org.scribble.main.Job; +import org.scribble.model.endpoint.EModelFactory; +import org.scribble.model.global.SModelFactory; +import org.scribble.type.name.ModuleName; + +public class ParamJob extends Job +{ + public ParamJob(boolean debug, Map parsed, ModuleName main, + boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, + boolean noAcceptCorrelationCheck, boolean noValidation, + AstFactory af, EModelFactory ef, SModelFactory sf) + { + super(debug, parsed, main, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, af, ef, sf); + } + + /*// FIXME: move to MainContext::newJob? + @Override + public ParamEGraphBuilderUtil newEGraphBuilderUtil() + { + return new ParamEGraphBuilderUtil((ParamEModelFactory) this.ef); + } + + @Override + public void runContextBuildingPasses() throws ScribbleException + { + runVisitorPassOnAllModules(ModuleContextBuilder.class); + + runVisitorPassOnAllModules(ParamNameDisambiguator.class); // FIXME: factor out overriding pattern? + + runVisitorPassOnAllModules(ProtocolDeclContextBuilder.class); + runVisitorPassOnAllModules(DelegationProtocolRefChecker.class); + runVisitorPassOnAllModules(RoleCollector.class); + runVisitorPassOnAllModules(ProtocolDefInliner.class); + } + + @Override + public void runUnfoldingPass() throws ScribbleException + { + //runVisitorPassOnAllModules(ParamInlinedProtocolUnfolder.class); // FIXME: skipping for now + } + + @Override + protected void runProjectionUnfoldingPass() throws ScribbleException + { + //runVisitorPassOnProjectedModules(ParamInlinedProtocolUnfolder.class); // FIXME + } + + @Override + public void runWellFormednessPasses() throws ScribbleException + { + super.runWellFormednessPasses(); + + // Additional + if (!this.noValidation) + { + runVisitorPassOnAllModules(ParamAnnotationChecker.class); + } + }*/ +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java new file mode 100644 index 000000000..d9630267e --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java @@ -0,0 +1,62 @@ +package org.scribble.ext.go.main; + +import java.nio.file.Path; + +import org.scribble.ast.AstFactory; +import org.scribble.ext.go.ast.ParamAstFactoryImpl; +import org.scribble.ext.go.parser.scribble.ParamScribbleAntlrWrapper; +import org.scribble.main.MainContext; +import org.scribble.main.ScribbleException; +import org.scribble.main.resource.ResourceLocator; +import org.scribble.parser.scribble.ScribbleAntlrWrapper; +import org.scribble.util.ScribParserException; + +public class ParamMainContext extends MainContext +{ + // Load main module from file system + public ParamMainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, + boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation) + throws ScribParserException, ScribbleException + { + super(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + } + + @Override + public ParamJob newJob() + { + return new ParamJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, + this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, + this.af, this.ef, this.sf); + } + + @Override + protected ScribbleAntlrWrapper newAntlrParser() + { + return new ParamScribbleAntlrWrapper(); + } + + /*@Override + protected AntlrToScribParser newScribParser() + { + return new ParamAntlrToScribParser(); + }*/ + + protected AstFactory newAstFactory() + { + return new ParamAstFactoryImpl(); + } + + /*@Override + protected EModelFactory newEModelFactory() + { + //return new ParamEModelFactoryImpl(); + return new ParamCoreEModelFactoryImpl(); // HACK FIXME + } + + @Override + protected SModelFactory newSModelFactory() + { + //return new ParamSModelFactoryImpl(); + return new ParamCoreSModelFactoryImpl(); // HACK FIXME + }*/ +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java new file mode 100644 index 000000000..9b3505b9b --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java @@ -0,0 +1,27 @@ +package org.scribble.ext.go.parser.scribble; + +import org.antlr.runtime.ANTLRStringStream; +import org.antlr.runtime.CommonTokenStream; +import org.antlr.runtime.Lexer; +import org.antlr.runtime.RecognitionException; +import org.antlr.runtime.tree.CommonTree; +import org.scribble.parser.antlr.ParamScribbleLexer; +import org.scribble.parser.antlr.ParamScribbleParser; +import org.scribble.parser.scribble.ScribbleAntlrWrapper; + +public class ParamScribbleAntlrWrapper extends ScribbleAntlrWrapper +{ + + @Override + protected Lexer getScribbleLexer(ANTLRStringStream ass) + { + return new ParamScribbleLexer(ass); + } + + @Override + //protected Parser newScribbleParser(CommonTokenStream cts) + protected CommonTree runScribbleParser(CommonTokenStream cts) throws RecognitionException + { + return (CommonTree) new ParamScribbleParser(cts).module().getTree(); + } +} diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr new file mode 100644 index 000000000..f79246a7f --- /dev/null +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -0,0 +1,19 @@ +//Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/tmp/ParamTest.scr -V -param Proto1 + + +// http://sandbox.kidstrythisathome.com/erdos/ + + +module assrt.tmp.ParamTest; + + +//type "System.UInt32" from "..." as int; +//type "System.String" from "..." as str; + + +global protocol Proto1(role A[1..1], role B[1..1]) +{ + 1() from A to B; +} + From 55608a3708b23a37c46b1eee1f2b1159662e26ed Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 22 Aug 2017 21:02:58 +0100 Subject: [PATCH 043/433] Fixed core RoleDecl/List project bug. --- .../java/org/scribble/ast/RoleDeclList.java | 3 +- .../org/scribble/parser/antlr/ParamScribble.g | 16 +++++ .../scribble/ext/go/ast/ParamAstFactory.java | 2 + .../ext/go/ast/ParamAstFactoryImpl.java | 10 +++ .../scribble/ext/go/ast/ParamRoleDecl.java | 72 +++++++++++++++++++ .../global/ParamGCrossMessageTransfer.java | 2 +- .../ext/go/main/ParamMainContext.java | 6 +- .../scribble/ParamAntlrToScribParser.java | 35 +++++++++ .../scribble/ParamScribbleAntlrWrapper.java | 1 - .../scribble/ast/ParamAntlrRoleDecl.java | 40 +++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 1 - 11 files changed, 182 insertions(+), 6 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java b/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java index 74d273895..3382c5234 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleDeclList.java @@ -66,7 +66,8 @@ public List getRoles() @Override public RoleDeclList project(AstFactory af, Role self) { - return af.RoleDeclList(this.source, getDecls()); + //return af.RoleDeclList(this.source, getDecls()); + return af.RoleDeclList(this.source, getDecls().stream().map(rd -> rd.project(af, self)).collect(Collectors.toList())); } @Override diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 113d70110..6a5b9c354 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -165,6 +165,9 @@ tokens LOCALCATCHES = 'local-catches'; LOCALSEND = 'local-send'; LOCALRECEIVE = 'local-receive';*/ + + + PARAM_ROLEDECL = 'PARAM_ROLEDECL'; } @@ -295,6 +298,13 @@ LINE_COMMENT: /** * Section 2.3 Identifiers */ + +/* // Seems "conflict" with IDENTIFIER +number: + (DIGIT)+ +;*/ + + IDENTIFIER: (LETTER | DIGIT | UNDERSCORE)* /* Underscore currently can cause ambiguities in the API generation naming scheme @@ -558,7 +568,13 @@ roledecl: ROLE_KW rolename -> ^(ROLEDECL rolename) + +| + ROLE_KW rolename '[' simplename '..' simplename ']' +-> + ^(PARAM_ROLEDECL rolename simplename simplename) ; +// Should be "number" parameterdecllist: '<' parameterdecl (',' parameterdecl)* '>' diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java index e7b92f5ec..f98ef36fe 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java @@ -9,6 +9,8 @@ public interface ParamAstFactory extends AstFactory { + ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, int start, int end); + ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, int srcRangeStart, int srcRangeEnd, int destRangeStart, int destRangeEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index 7c560a051..f18cbe2a5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -4,6 +4,7 @@ import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.RoleDeclDel; import org.scribble.del.global.GMessageTransferDel; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; @@ -173,6 +174,15 @@ public AssrtGDo GDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList a */ // Explicitly creating new Assrt nodes + + @Override + public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, int start, int end) + { + ParamRoleDecl rd = new ParamRoleDecl(source, namenode, start, end); + rd = del(rd, new RoleDeclDel()); + return rd; + } + @Override public ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, int srcRangeStart, int srcRangeEnd, int destRangeStart, int destRangeEnd) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java new file mode 100644 index 000000000..07a9a0294 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java @@ -0,0 +1,72 @@ +package org.scribble.ext.go.ast; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.RoleDecl; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ast.name.simple.SimpleNameNode; +import org.scribble.del.ScribDel; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.RoleKind; +import org.scribble.type.name.Role; +import org.scribble.visit.AstVisitor; + +public class ParamRoleDecl extends RoleDecl +{ + public final int start; + public final int end; + + public ParamRoleDecl(CommonTree source, RoleNode name, int start, int end) + { + super(source, name); + this.start = start; + this.end = end; + } + + @Override + protected ParamRoleDecl copy() + { + return new ParamRoleDecl(this.source, (RoleNode) this.name, this.start, this.end); + } + + @Override + public ParamRoleDecl clone(AstFactory af) + { + RoleNode role = (RoleNode) this.name.clone(af); + return ((ParamAstFactory) af).ParamRoleDecl(this.source, role, this.start, this.end); + } + + @Override + public ParamRoleDecl project(AstFactory af, Role self) + { + /*Name role = this.name.toName(); + RoleNode rn = (RoleNode) af.SimpleNameNode(this.name.getSource(), RoleKind.KIND, role.toString()); + if (role.equals(self)) + { + throw new RuntimeException("[param] Shouldn't get in here: " + this); + } + return ((ParamAstFactory) af).ParamRoleDecl(this.source, rn, this.start, this.end);*/ + throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing + } + + @Override + public ParamRoleDecl reconstruct(SimpleNameNode name) + { + throw new RuntimeException("[param] Shouldn't get in here: " + this); + } + + public ParamRoleDecl reconstruct(SimpleNameNode name, int start, int end) + { + ScribDel del = del(); + ParamRoleDecl rd = new ParamRoleDecl(this.source, (RoleNode) name, start, end); + rd = (ParamRoleDecl) rd.del(del); + return rd; + } + + @Override + public ParamRoleDecl visitChildren(AstVisitor nv) throws ScribbleException + { + RoleNode name = visitChildWithClassEqualityCheck(this, (RoleNode) this.name, nv); + return reconstruct(name, this.start, this.end); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java index c73121139..d7ae286b7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java @@ -77,7 +77,7 @@ public ParamGCrossMessageTransfer clone(AstFactory af) @Override public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) { - throw new RuntimeException("[assrt] Shouldn't get in here: " + this); + throw new RuntimeException("[param] Shouldn't get in here: " + this); } public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java index d9630267e..bbbaf7e61 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java @@ -4,10 +4,12 @@ import org.scribble.ast.AstFactory; import org.scribble.ext.go.ast.ParamAstFactoryImpl; +import org.scribble.ext.go.parser.scribble.ParamAntlrToScribParser; import org.scribble.ext.go.parser.scribble.ParamScribbleAntlrWrapper; import org.scribble.main.MainContext; import org.scribble.main.ScribbleException; import org.scribble.main.resource.ResourceLocator; +import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ScribbleAntlrWrapper; import org.scribble.util.ScribParserException; @@ -35,11 +37,11 @@ protected ScribbleAntlrWrapper newAntlrParser() return new ParamScribbleAntlrWrapper(); } - /*@Override + @Override protected AntlrToScribParser newScribParser() { return new ParamAntlrToScribParser(); - }*/ + } protected AstFactory newAstFactory() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java new file mode 100644 index 000000000..281146af4 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java @@ -0,0 +1,35 @@ +package org.scribble.ext.go.parser.scribble; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.ScribNode; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.parser.scribble.ast.ParamAntlrRoleDecl; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.util.ScribParserException; + +public class ParamAntlrToScribParser extends AntlrToScribParser +{ + // FIXME: refactor constants following ScribbleAntlrConstants/AntlrToScribParserUtil? -- cannot extend existing node type enum though + public static final String PARAM_ROLEDECL_NODE_TYPE = "PARAM_ROLEDECL"; + + public ParamAntlrToScribParser() + { + + } + + @Override + public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException + { + AntlrToScribParser.checkForAntlrErrors(ct); + + ParamAstFactory aaf = (ParamAstFactory) af; + String type = ct.getToken().getText(); // Duplicated from ScribParserUtil.getAntlrNodeType // FIXME: factor out with ParamAntlrPayloadElemList.parsePayloadElem + switch (type) + { + case PARAM_ROLEDECL_NODE_TYPE: return ParamAntlrRoleDecl.parseParamRoleDecl(this, ct, aaf); + + default: return super.parse(ct, af); + } + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java index 9b3505b9b..3ddcc7af1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java @@ -19,7 +19,6 @@ protected Lexer getScribbleLexer(ANTLRStringStream ass) } @Override - //protected Parser newScribbleParser(CommonTokenStream cts) protected CommonTree runScribbleParser(CommonTokenStream cts) throws RecognitionException { return (CommonTree) new ParamScribbleParser(cts).module().getTree(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java new file mode 100644 index 000000000..a8d0bf4e4 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java @@ -0,0 +1,40 @@ +package org.scribble.ext.go.parser.scribble.ast; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.RoleDecl; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.ast.name.AntlrSimpleName; + +public class ParamAntlrRoleDecl +{ + // Same as original + public static final int NAME_CHILD_INDEX = 0; + + public static final int START_CHILD_INDEX = 1; + public static final int END_CHILD_INDEX = 2; + + public static RoleDecl parseParamRoleDecl(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) + { + RoleNode name = AntlrSimpleName.toRoleNode(getNameChild(root), af); + int start = getStartIndex(root); + int end = getEndIndex(root); + return af.ParamRoleDecl(root, name, start, end); + } + + public static CommonTree getNameChild(CommonTree root) + { + return (CommonTree) root.getChild(NAME_CHILD_INDEX); + } + + public static int getStartIndex(CommonTree root) + { + return Integer.parseInt(root.getChild(START_CHILD_INDEX).getText()); + } + + public static int getEndIndex(CommonTree root) + { + return Integer.parseInt(root.getChild(END_CHILD_INDEX).getText()); + } +} diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index f79246a7f..19989a598 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -16,4 +16,3 @@ global protocol Proto1(role A[1..1], role B[1..1]) { 1() from A to B; } - From 71d1a992eb5bc6518e112dfb1563248602a8c0fc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 22 Aug 2017 21:37:41 +0100 Subject: [PATCH 044/433] Continued adding param syntax. --- .../main/java/org/scribble/ast/RoleDecl.java | 1 + .../org/scribble/parser/antlr/ParamScribble.g | 8 ++- .../scribble/ext/go/ast/ParamRoleDecl.java | 9 +-- .../global/ParamGCrossMessageTransfer.java | 18 +---- .../scribble/ParamAntlrToScribParser.java | 6 +- .../ParamAntlrGCrossMessageTransfer.java | 72 +++++++++++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 2 +- 7 files changed, 91 insertions(+), 25 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java diff --git a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java index a1b60d183..9e8f7f6a5 100644 --- a/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java +++ b/scribble-core/src/main/java/org/scribble/ast/RoleDecl.java @@ -42,6 +42,7 @@ public RoleDecl clone(AstFactory af) } @Override + //public RoleDecl reconstruct(RoleNode name) // No: because super public RoleDecl reconstruct(SimpleNameNode name) { ScribDel del = del(); diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 6a5b9c354..7a732e7df 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -168,6 +168,7 @@ tokens PARAM_ROLEDECL = 'PARAM_ROLEDECL'; + PARAM_GLOBALCROSSMESSAGETRANSFER = 'PARAM_GLOBALCROSSMESSAGETRANSFER'; } @@ -574,7 +575,7 @@ roledecl: -> ^(PARAM_ROLEDECL rolename simplename simplename) ; -// Should be "number" +// Should be "number" -- but seems "conflict" with IDENTIFIER parameterdecllist: '<' parameterdecl (',' parameterdecl)* '>' @@ -652,6 +653,11 @@ globalmessagetransfer: message FROM_KW rolename TO_KW rolename (',' rolename )* ';' -> ^(GLOBALMESSAGETRANSFER message rolename rolename+) + +| + message FROM_KW rolename '[' simplename '..' simplename ']' TO_KW rolename '[' simplename '..' simplename ']' ';' +-> + ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename simplename simplename simplename simplename) ; message: diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java index 07a9a0294..598d2991c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java @@ -39,13 +39,8 @@ public ParamRoleDecl clone(AstFactory af) @Override public ParamRoleDecl project(AstFactory af, Role self) { - /*Name role = this.name.toName(); - RoleNode rn = (RoleNode) af.SimpleNameNode(this.name.getSource(), RoleKind.KIND, role.toString()); - if (role.equals(self)) - { - throw new RuntimeException("[param] Shouldn't get in here: " + this); - } - return ((ParamAstFactory) af).ParamRoleDecl(this.source, rn, this.start, this.end);*/ + /*RoleDecl proj = super.project(af, self); + return reconstruct((SimpleNameNode) proj.name, this.start, this.end);*/ throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java index d7ae286b7..a3012874e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java @@ -21,9 +21,7 @@ // Subsumes scatter/gather, src/dest range length one public class ParamGCrossMessageTransfer extends GMessageTransfer //implements ParamActionAssertNode { - //public final ParamAssertion ass; // null if not specified -- should be the "true" formula in principle, but not syntactically - // Duplicated in, e.g., ALSend -- could factour out to in Del, but need to consider immutable pattern - + // ParamRoleNode? -- cf. ParamRoleDecl // All >= 0; end >= start public final int srcRangeStart; public final int srcRangeEnd; // Inclusive @@ -43,18 +41,8 @@ public ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode m @Override public LNode project(AstFactory af, Role self) { - /*LNode proj = super.project(af, self); - if (proj instanceof LInteractionSeq) // From super, if self communication - { - throw new RuntimeException("[assrt] Self-communication not supported: " + proj); - } - else if (proj instanceof LSend) - { - LSend ls = (LSend) proj; - proj = ((ParamAstFactory) af).ParamLSend(ls.getSource(), ls.src, ls.msg, ls.getDestinations(), this.ass); - } - return proj;*/ - return super.project(af, self); // FIXME + //return super.project(af, self); // FIXME + throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java index 281146af4..41fa23a12 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java @@ -5,6 +5,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ext.go.ast.ParamAstFactory; import org.scribble.ext.go.parser.scribble.ast.ParamAntlrRoleDecl; +import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGCrossMessageTransfer; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.util.ScribParserException; @@ -12,6 +13,7 @@ public class ParamAntlrToScribParser extends AntlrToScribParser { // FIXME: refactor constants following ScribbleAntlrConstants/AntlrToScribParserUtil? -- cannot extend existing node type enum though public static final String PARAM_ROLEDECL_NODE_TYPE = "PARAM_ROLEDECL"; + public static final String PARAM_GLOBALCROSSMESSAGETRANSFER_NODE_TYPE = "PARAM_GLOBALCROSSMESSAGETRANSFER"; public ParamAntlrToScribParser() { @@ -27,7 +29,9 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException String type = ct.getToken().getText(); // Duplicated from ScribParserUtil.getAntlrNodeType // FIXME: factor out with ParamAntlrPayloadElemList.parsePayloadElem switch (type) { - case PARAM_ROLEDECL_NODE_TYPE: return ParamAntlrRoleDecl.parseParamRoleDecl(this, ct, aaf); + case PARAM_ROLEDECL_NODE_TYPE: return ParamAntlrRoleDecl.parseParamRoleDecl(this, ct, aaf); + case PARAM_GLOBALCROSSMESSAGETRANSFER_NODE_TYPE: + return ParamAntlrGCrossMessageTransfer.parseParamGCrossMessageTransfer(this, ct, aaf); default: return super.parse(ct, af); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java new file mode 100644 index 000000000..07f210d69 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java @@ -0,0 +1,72 @@ +package org.scribble.ext.go.parser.scribble.ast.global; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.MessageNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.ast.global.AntlrGMessageTransfer; +import org.scribble.parser.scribble.ast.name.AntlrSimpleName; +import org.scribble.util.ScribParserException; + +public class ParamAntlrGCrossMessageTransfer +{ + // Same as original + public static final int MESSAGE_CHILD_INDEX = 0; + public static final int SOURCE_CHILD_INDEX = 1; + public static final int DESTINATION_CHILD_INDEX = 2; + + public static final int SOURCE_START_CHILD_INDEX = 3; + public static final int SOURCE_END_CHILD_INDEX = 4; + public static final int DEST_START_CHILD_INDEX = 5; + public static final int DEST_END_CHILD_INDEX = 6; + + public static ParamGCrossMessageTransfer + parseParamGCrossMessageTransfer(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException + { + RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(root), af); + MessageNode msg = AntlrGMessageTransfer.parseMessage(parser, getMessageChild(root), af); + RoleNode dest = AntlrSimpleName.toRoleNode(getDestChild(root), af); + int sourceStart = getSourceStartIndex(root); + int sourceEnd = getSourceEndIndex(root); + int destStart = getDestStartIndex(root); + int destEnd = getDestEndIndex(root); + return af.ParamGCrossMessageTransfer(root, src, msg, dest, sourceStart, sourceEnd, destStart, destEnd); + } + + public static CommonTree getMessageChild(CommonTree root) + { + return (CommonTree) root.getChild(MESSAGE_CHILD_INDEX); + } + + public static CommonTree getSourceChild(CommonTree root) + { + return (CommonTree) root.getChild(SOURCE_CHILD_INDEX); + } + + public static CommonTree getDestChild(CommonTree root) + { + return (CommonTree) root.getChild(DESTINATION_CHILD_INDEX); + } + + public static int getSourceStartIndex(CommonTree root) + { + return Integer.parseInt(root.getChild(SOURCE_START_CHILD_INDEX).getText()); + } + + public static int getSourceEndIndex(CommonTree root) + { + return Integer.parseInt(root.getChild(SOURCE_END_CHILD_INDEX).getText()); + } + + public static int getDestStartIndex(CommonTree root) + { + return Integer.parseInt(root.getChild(DEST_START_CHILD_INDEX).getText()); + } + + public static int getDestEndIndex(CommonTree root) + { + return Integer.parseInt(root.getChild(DEST_END_CHILD_INDEX).getText()); + } +} diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 19989a598..cbb143eaf 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -14,5 +14,5 @@ module assrt.tmp.ParamTest; global protocol Proto1(role A[1..1], role B[1..1]) { - 1() from A to B; + 1() from A[1..1] to B[1..1]; } From d9f00303c8972a7d6c83ff65f8fa43f466b91d99 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 22 Aug 2017 23:44:38 +0100 Subject: [PATCH 045/433] Adding param-core syntax. --- .../scribble/ext/go/ast/ParamRoleDecl.java | 6 +- .../global/ParamGCrossMessageTransfer.java | 4 +- .../ext/go/core/ast/ParamCoreAstFactory.java | 103 ++++ .../ext/go/core/ast/ParamCoreChoice.java | 61 +++ .../ext/go/core/ast/ParamCoreEnd.java | 29 + .../ext/go/core/ast/ParamCoreMessage.java | 48 ++ .../ext/go/core/ast/ParamCoreRec.java | 50 ++ .../ext/go/core/ast/ParamCoreRecVar.java | 42 ++ .../go/core/ast/ParamCoreSyntaxException.java | 49 ++ .../ext/go/core/ast/ParamCoreType.java | 8 + .../scribble/ext/go/core/ast/ParamRole.java | 50 ++ .../go/core/ast/global/ParamCoreGChoice.java | 154 ++++++ .../ext/go/core/ast/global/ParamCoreGEnd.java | 45 ++ .../ParamCoreGProtocolDeclTranslator.java | 514 ++++++++++++++++++ .../ext/go/core/ast/global/ParamCoreGRec.java | 53 ++ .../go/core/ast/global/ParamCoreGRecVar.java | 46 ++ .../go/core/ast/global/ParamCoreGType.java | 14 + .../core/ast/local/ParamCoreLActionKind.java | 18 + .../go/core/ast/local/ParamCoreLChoice.java | 54 ++ .../ext/go/core/ast/local/ParamCoreLEnd.java | 36 ++ .../ext/go/core/ast/local/ParamCoreLRec.java | 41 ++ .../go/core/ast/local/ParamCoreLRecVar.java | 37 ++ .../ext/go/core/ast/local/ParamCoreLType.java | 9 + 23 files changed, 1466 insertions(+), 5 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreMessage.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreSyntaxException.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java index 598d2991c..ec836fc98 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java @@ -39,9 +39,9 @@ public ParamRoleDecl clone(AstFactory af) @Override public ParamRoleDecl project(AstFactory af, Role self) { - /*RoleDecl proj = super.project(af, self); - return reconstruct((SimpleNameNode) proj.name, this.start, this.end);*/ - throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing + RoleDecl proj = super.project(af, self); + return reconstruct((SimpleNameNode) proj.name, this.start, this.end); + //throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java index a3012874e..3c3a83527 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java @@ -41,8 +41,8 @@ public ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode m @Override public LNode project(AstFactory af, Role self) { - //return super.project(af, self); // FIXME - throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing + return super.project(af, self); // FIXME + //throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java new file mode 100644 index 000000000..c393433ad --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java @@ -0,0 +1,103 @@ +package org.scribble.ext.go.core.ast; + +import java.util.Map; + +import org.scribble.ext.go.core.ast.global.ParamCoreGChoice; +import org.scribble.ext.go.core.ast.global.ParamCoreGEnd; +import org.scribble.ext.go.core.ast.global.ParamCoreGRec; +import org.scribble.ext.go.core.ast.global.ParamCoreGRecVar; +import org.scribble.ext.go.core.ast.global.ParamCoreGType; +import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; +import org.scribble.ext.go.core.ast.local.ParamCoreLChoice; +import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; +import org.scribble.ext.go.core.ast.local.ParamCoreLRec; +import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; +import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.type.Payload; +import org.scribble.type.name.Op; +import org.scribble.type.name.RecVar; + + +public class ParamCoreAstFactory +{ + public ParamCoreAstFactory() + { + + } + + public ParamRole ParamRole(String name, int start, int end) + { + return new ParamRole(name, start, end); + } + + // Pre: not null + public ParamCoreMessage ParamCoreAction(Op op, Payload pay) + { + return new ParamCoreMessage(op, pay); + } + + public ParamCoreGChoice ParamCoreGChoice(ParamRole src, ParamRole dest, Map cases) + { + return new ParamCoreGChoice(src, dest, cases); + } + + public ParamCoreGRec ParamCoreGRec(RecVar recvar, ParamCoreGType body) + { + return new ParamCoreGRec(recvar, body); + } + + public ParamCoreGRecVar ParamCoreGRecVar(RecVar recvar) + { + return new ParamCoreGRecVar(recvar); + } + + public ParamCoreGEnd ParamCoreGEnd() + { + return ParamCoreGEnd.END; + } + + public ParamCoreLChoice ParamCoreLChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) + { + return new ParamCoreLChoice(role, kind, cases); + } + + /*public ParamCoreLSend LSend(Role self, Role peer, Op op, Payload pay) + { + return new ParamCoreLSend(self, peer, op, pay); + } + + public ParamCoreLReceive LReceive(Role self, Role peer, Op op, Payload pay) + { + return new ParamCoreLReceive(self, peer, op, pay); + } + + public ParamCoreLConnect LConnect(Role self, Role peer, Op op, Payload pay) + { + return new ParamCoreLConnect(self, peer, op, pay); + } + + public ParamCoreLAccept LAccept(Role self, Role peer, Op op, Payload pay) + { + return new ParamCoreLAccept(self, peer, op, pay); + }*/ + + /*public ParamCoreLDisconnect LDisconnect(Role self, Role peer) + { + return new ParamCoreLDisconnect(self, peer); + }*/ + + public ParamCoreLRec ParamCoreLRec(RecVar recvar, ParamCoreLType body) + { + return new ParamCoreLRec(recvar, body); + } + + public ParamCoreLRecVar ParamCoreLRecVar(RecVar recvar) + { + return new ParamCoreLRecVar(recvar); + } + + public ParamCoreLEnd ParamCoreLEnd() + { + return ParamCoreLEnd.END; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java new file mode 100644 index 000000000..b7511e70c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java @@ -0,0 +1,61 @@ +package org.scribble.ext.go.core.ast; + +import java.util.Collections; +import java.util.Map; +import java.util.stream.Collectors; + +import org.scribble.type.kind.ProtocolKind; + +public abstract class ParamCoreChoice implements ParamCoreType +{ + public final ParamRole role; + public final Map cases; + + // Pre: cases.size() > 1 + public ParamCoreChoice(ParamRole role, Map cases) + { + this.role = role; + this.cases = Collections.unmodifiableMap(cases); + } + + @Override + public int hashCode() + { + int hash = 29; + hash = 31 * hash + this.role.hashCode(); + hash = 31 * hash + this.cases.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreChoice)) + { + return false; + } + ParamCoreChoice them = (ParamCoreChoice) obj; + return them.canEquals(this) + && this.role.equals(them.role) && this.cases.equals(them.cases); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreChoice; + } + + protected String casesToString() + { + String s = this.cases.entrySet().stream() + .map(e -> e.getKey() + "." + e.getValue()).collect(Collectors.joining(", ")); + s = (this.cases.size() > 1) + ? "{ " + s + " }" + : ":" + s; + return s; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java new file mode 100644 index 000000000..ec028a89d --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java @@ -0,0 +1,29 @@ +package org.scribble.ext.go.core.ast; + + +public abstract class ParamCoreEnd implements ParamCoreType +{ + @Override + public String toString() + { + return "end"; + } + + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof ParamCoreEnd)) + { + return false; + } + return ((ParamCoreEnd) obj).canEquals(this); + } + + public abstract boolean canEquals(Object o); + + @Override + public int hashCode() + { + return 31*2447; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreMessage.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreMessage.java new file mode 100644 index 000000000..b26d6599a --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreMessage.java @@ -0,0 +1,48 @@ +package org.scribble.ext.go.core.ast; + +import org.scribble.type.Payload; +import org.scribble.type.name.Op; + + +public class ParamCoreMessage +{ + public final Op op; + public final Payload pay; + + public ParamCoreMessage(Op op, Payload pay) + { + this.op = op; + this.pay = pay; + } + + @Override + public String toString() + { + return this.op.toString() + this.pay.toString(); + } + + @Override + public int hashCode() + { + int hash = 43; + hash = 31 * hash + this.op.hashCode(); + hash = 31 * hash + this.pay.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == this) + { + return true; + } + if (!(obj instanceof ParamCoreMessage)) + { + return false; + } + ParamCoreMessage them = (ParamCoreMessage) obj; + return //them.canEquals(this) && + this.op.equals(them.op) && this.pay.equals(them.pay); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java new file mode 100644 index 000000000..c4a626e4e --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java @@ -0,0 +1,50 @@ +package org.scribble.ext.go.core.ast; + +import org.scribble.type.name.RecVar; + +public abstract class ParamCoreRec implements ParamCoreType +{ + public final RecVar recvar; // FIXME: RecVarNode? (Cf. AssrtCoreAction.op/pay) + public final B body; + + public ParamCoreRec(RecVar recvar, B body) + { + this.recvar = recvar; + this.body = body; + } + + @Override + public String toString() + { + return "mu " + this.recvar + this.body; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreRec)) + { + return false; + } + ParamCoreRec them = (ParamCoreRec) obj; + return them.canEquals(this) && this.recvar.equals(them.recvar) + && this.body.equals(them.body); // FIXME: check B kind is equal? + } + + @Override + public abstract boolean canEquals(Object o); + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + this.recvar.hashCode(); + result = prime * result + this.body.hashCode(); + return result; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java new file mode 100644 index 000000000..8f227ca55 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java @@ -0,0 +1,42 @@ +package org.scribble.ext.go.core.ast; + +import org.scribble.type.name.RecVar; + + +public abstract class ParamCoreRecVar implements ParamCoreType +{ + public final RecVar recvar; + + public ParamCoreRecVar(RecVar var) + { + this.recvar = var; + } + + @Override + public String toString() + { + return this.recvar.toString(); + } + + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof ParamCoreRecVar)) + { + return false; + } + ParamCoreRecVar them = (ParamCoreRecVar) obj; + return them.canEquals(this) && this.recvar.equals(them.recvar); + } + + @Override + public abstract boolean canEquals(Object o); + + @Override + public int hashCode() + { + int hash = 6733; + hash = 31*hash + this.recvar.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreSyntaxException.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreSyntaxException.java new file mode 100644 index 000000000..b8ac26293 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreSyntaxException.java @@ -0,0 +1,49 @@ +package org.scribble.ext.go.core.ast; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.main.AntlrSourceException; + +// For parsing errors due to core syntax restrictions (vs. "full" Scribble) -- distinction used for JUnit testing (i.e., to indicate non core syntax that are otherwise valid protocols) +// i.e., should only be thrown by AssrtCoreGProtocolDeclTranslator +// N.B. so should not be used for actual "semantic" WF errors +public class ParamCoreSyntaxException extends AntlrSourceException // N.B. not Scribble/AssrttException -- cf. AssrtCoreTestBase::tests +{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + + public ParamCoreSyntaxException(String arg0) + { + super(arg0); + // TODO Auto-generated constructor stub + } + + public ParamCoreSyntaxException(Throwable arg0) + { + super(arg0); + // TODO Auto-generated constructor stub + } + + public ParamCoreSyntaxException(String arg0, Throwable arg1) + { + super(arg0, arg1); + // TODO Auto-generated constructor stub + } + + public ParamCoreSyntaxException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) + { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } + + public ParamCoreSyntaxException(CommonTree blame, String arg0) + { + super(blame, arg0); + // TODO Auto-generated constructor stub + } + +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java new file mode 100644 index 000000000..bf915f1ff --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java @@ -0,0 +1,8 @@ +package org.scribble.ext.go.core.ast; + + +// ast here means "core syntax" of session types -- it does not link the actual Scribble source (cf. base ast classes) +public interface ParamCoreType +{ + boolean canEquals(Object o); +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java new file mode 100644 index 000000000..ddad9d9a3 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java @@ -0,0 +1,50 @@ +package org.scribble.ext.go.core.ast; + +import org.scribble.ext.go.core.ast.global.ParamCoreGChoice; + +public class ParamRole +{ + public final String name; + public final int start; + public final int end; + + public ParamRole(String name, int start, int end) + { + this.name = name; + this.start = start; + this.end = end; + } + + @Override + public int hashCode() + { + int hash = 7121; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.name.hashCode(); + hash = 31 * hash + this.start; + hash = 31 * hash + this.end; + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreGChoice)) + { + return false; + } + ParamRole them = (ParamRole) obj; + return this.name.equals(them.name) + && this.start == them.start && this.end == them.end; + } + + @Override + public String toString() + { + return this.name + "[" + this.start + ".." + this.end + "]"; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java new file mode 100644 index 000000000..e9314b5a2 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -0,0 +1,154 @@ +package org.scribble.ext.go.core.ast.global; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.scribble.ext.go.core.ast.ParamCoreMessage; +import org.scribble.ext.go.core.ast.ParamCoreAstFactory; +import org.scribble.ext.go.core.ast.ParamCoreChoice; +import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; +import org.scribble.ext.go.core.ast.ParamRole; +import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; +import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; + +public class ParamCoreGChoice extends ParamCoreChoice implements ParamCoreGType +{ + public final ParamRole src; // Singleton -- no disconnect for now + public final ParamRole dest; // this.dest == super.role -- arbitrary? + + public ParamCoreGChoice(ParamRole src, ParamRole dest, Map cases) + { + super(dest, cases); + this.src = src; + this.dest = dest; + } + + @Override + public ParamCoreLType project(ParamCoreAstFactory af, Role r) throws ParamCoreSyntaxException + { + Map projs = new HashMap<>(); + for (Entry e : this.cases.entrySet()) + { + ParamCoreMessage a = e.getKey(); + projs.put(a, e.getValue().project(af, r)); + // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) + // FIXME: receive assertion projection -- should not be the same as send? + } + + // "Simple" cases + if (this.src.equals(r) || this.dest.equals(r)) + { + ParamRole role = this.src.equals(r) ? this.dest : this.src; + ParamCoreLActionKind kind = this.src.equals(r) ? ParamCoreLActionKind.SEND : ParamCoreLActionKind.RECEIVE; + return af.ParamCoreLChoice(role, kind, projs); + } + + throw new RuntimeException("[param-core] TODO: " + this); + + /*// "Merge" + if (projs.values().stream().anyMatch(v -> (v instanceof ParamCoreLRecVar))) + { + if (projs.values().stream().anyMatch(v -> !(v instanceof ParamCoreLRecVar))) + { + throw new ParamCoreSyntaxException("[assrt-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge unguarded rec vars."); + } + + Set rvs = projs.values().stream().map(v -> ((ParamCoreLRecVar) v).recvar).collect(Collectors.toSet()); + Set> fs = projs.values().stream().map(v -> ((ParamCoreLRecVar) v).annotexprs).collect(Collectors.toSet()); // FIXME? syntactic equality of exprs + if (rvs.size() > 1 || fs.size() > 1) + { + throw new ParamCoreSyntaxException("[assrt-core] Cannot project \n" + this + "\n onto " + r + ": mixed unguarded rec vars: " + rvs); + } + + return af.ParamCoreLRecVar(rvs.iterator().next(), fs.iterator().next()); + } + + List filtered = projs.values().stream() + .filter(v -> !v.equals(ParamCoreLEnd.END)) + ////.collect(Collectors.toMap(e -> Map.Entry::getKey, e -> Map.Entry::getValue)); + //.map(v -> (ParamCoreLChoice) v) + .collect(Collectors.toList()); + + if (filtered.size() == 0) + { + return ParamCoreLEnd.END; + } + else if (filtered.size() == 1) + { + return //(ParamCoreLChoice) + filtered.iterator().next(); // RecVar disallowed above + } + + List choices = filtered.stream().map(v -> (ParamCoreLChoice) v).collect(Collectors.toList()); + + Set roles = choices.stream().map(v -> v.role).collect(Collectors.toSet()); // Subj not one of curent src/dest, must be projected inside each case to a guarded continuation + if (roles.size() > 1) + { + throw new ParamCoreSyntaxException("[assrt-core] Cannot project \n" + this + "\n onto " + r + ": mixed peer roles: " + roles); + } + Set> kinds = choices.stream().map(v -> v.kind).collect(Collectors.toSet()); // Subj not one of curent src/dest, must be projected inside each case to a guarded continuation + if (kinds.size() > 1) + { + throw new ParamCoreSyntaxException("[assrt-core] Cannot project \n" + this + "\n onto " + r + ": mixed action kinds: " + kinds); + } + + Map merged = new HashMap<>(); + choices.forEach(v -> + { + if (!v.kind.equals(ParamCoreLActionKind.RECEIVE)) + { + throw new RuntimeException("[assrt-core] Shouldn't get here: " + v); // By role-enabling? + } + v.cases.entrySet().forEach(e -> + { + ParamCoreAction k = e.getKey(); + ParamCoreLType b = e.getValue(); + if (merged.containsKey(k)) //&& !b.equals(merged.get(k))) // TODO + { + throw new RuntimeException("[assrt-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge: " + b + " and " + merged.get(k)); + } + merged.put(k, b); + }); + }); + + return af.ParamCoreLChoice(roles.iterator().next(), ParamCoreLActionKind.RECEIVE, merged);*/ + } + + @Override + public int hashCode() + { + int hash = 2339; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.src.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreGChoice)) + { + return false; + } + return super.equals(obj) && this.src.equals(((ParamCoreGChoice) obj).src); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreGChoice; + } + + @Override + public String toString() + { + return this.src.toString() + "->" + this.dest + casesToString(); // toString needed? + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java new file mode 100644 index 000000000..4d2d2ca7e --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java @@ -0,0 +1,45 @@ +package org.scribble.ext.go.core.ast.global; + +import org.scribble.ext.go.core.ast.ParamCoreAstFactory; +import org.scribble.ext.go.core.ast.ParamCoreEnd; +import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; +import org.scribble.type.name.Role; + + +public class ParamCoreGEnd extends ParamCoreEnd implements ParamCoreGType +{ + public static final ParamCoreGEnd END = new ParamCoreGEnd(); + + private ParamCoreGEnd() + { + + } + + @Override + public ParamCoreLEnd project(ParamCoreAstFactory af, Role r) + { + return af.ParamCoreLEnd(); + } + + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof ParamCoreGEnd)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreGEnd; + } + + @Override + public int hashCode() + { + return 31*2381; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java new file mode 100644 index 000000000..a7f649f5c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -0,0 +1,514 @@ +package org.scribble.ext.go.core.ast.global; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.ast.MessageNode; +import org.scribble.ast.MessageSigNode; +import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GContinue; +import org.scribble.ast.global.GInteractionNode; +import org.scribble.ast.global.GMessageTransfer; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.global.GProtocolDef; +import org.scribble.ast.global.GRecursion; +import org.scribble.ast.global.GSimpleInteractionNode; +import org.scribble.ast.name.simple.RecVarNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.global.GProtocolDefDel; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; +import org.scribble.ext.go.core.ast.ParamCoreAstFactory; +import org.scribble.ext.go.core.ast.ParamCoreMessage; +import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; +import org.scribble.ext.go.core.ast.ParamRole; +import org.scribble.main.Job; +import org.scribble.type.Payload; +import org.scribble.type.kind.RecVarKind; +import org.scribble.type.name.DataType; +import org.scribble.type.name.Op; +import org.scribble.type.name.RecVar; + +public class ParamCoreGProtocolDeclTranslator +{ + public static final DataType UNIT_DATATYPE = new DataType("_Unit"); // FIXME: move + + private final Job job; + private final ParamCoreAstFactory af; + + private static int recCounter = 1; + + private static String makeFreshRecVarName() + { + return "_X" + recCounter++; + } + + public ParamCoreGProtocolDeclTranslator(Job job, ParamCoreAstFactory af) + { + this.job = job; + this.af = af; + } + + public ParamCoreGType translate(GProtocolDecl gpd) throws ParamCoreSyntaxException + { + GProtocolDef inlined = ((GProtocolDefDel) gpd.def.del()).getInlinedProtocolDef(); + return parseSeq(inlined.getBlock().getInteractionSeq().getInteractions(), new HashMap<>(), false, false); + } + + // List because subList is useful for parsing the continuation + private ParamCoreGType parseSeq(List is, Map rvs, + boolean checkChoiceGuard, boolean checkRecGuard) throws ParamCoreSyntaxException + { + if (is.isEmpty()) + { + return this.af.ParamCoreGEnd(); + } + + GInteractionNode first = is.get(0); + if (first instanceof GSimpleInteractionNode && !(first instanceof GContinue)) + { + if (first instanceof GMessageTransfer) + { + return parseGMessageTransfer(is, rvs, (GMessageTransfer) first); + } + else + { + throw new RuntimeException("[param] Shouldn't get in here: " + first); + } + } + else + { + if (checkChoiceGuard) // No "flattening" of nested choices not allowed? + { + throw new ParamCoreSyntaxException(first.getSource(), "[param-core] Unguarded in choice case: " + first); + } + if (is.size() > 1) + { + throw new ParamCoreSyntaxException(is.get(1).getSource(), "[param-core] Bad sequential composition after: " + first); + } + + if (first instanceof GChoice) + { + return parseGChoice(rvs, checkRecGuard, (GChoice) first); + } + else if (first instanceof GRecursion) + { + return parseGRecursion(rvs, checkChoiceGuard, (GRecursion) first); + } + else if (first instanceof GContinue) + { + return parseGContinue(rvs, checkRecGuard, (GContinue) first); + } + else + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + first); + } + } + } + + private ParamCoreGType parseGChoice(Map rvs, + boolean checkRecGuard, GChoice gc) throws ParamCoreSyntaxException + { + List children = new LinkedList<>(); + for (GProtocolBlock b : gc.getBlocks()) + { + children.add(parseSeq(b.getInteractionSeq().getInteractions(), rvs, true, checkRecGuard)); // Check cases are guarded + } + + ParamRole src = null; + ParamRole dest = null; + Map cases = new HashMap<>(); + for (ParamCoreGType c : children) + { + // Because all cases should be action guards (unary choices) + if (!(c instanceof ParamCoreGChoice)) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + c); + } + ParamCoreGChoice tmp = (ParamCoreGChoice) c; + if (tmp.cases.size() > 1) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + c); + } + + if (src == null) + { + src = tmp.src; + dest = tmp.dest; + } + else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) + { + throw new ParamCoreSyntaxException(gc.getSource(), "[param-core] Non-directed choice not supported: " + gc); + } + + // "Flatten" nested choices (already checked they are guarded) -- Scribble choice subjects ignored + for (Entry e : tmp.cases.entrySet()) + { + ParamCoreMessage k = e.getKey(); + if (cases.keySet().stream().anyMatch(x -> x.op.equals(k.op))) + { + throw new ParamCoreSyntaxException(gc.getSource(), "[param-core] Non-deterministic actions not supported: " + k.op); + } + cases.put(k, e.getValue()); + } + } + + return this.af.ParamCoreGChoice(src, dest, cases); + } + + private ParamCoreGType parseGRecursion(Map rvs, + boolean checkChoiceGuard, GRecursion gr) throws ParamCoreSyntaxException + { + RecVar recvar = gr.recvar.toName(); + if (recvar.toString().contains("__")) // HACK: "inlined proto rec var" + { + RecVarNode rvn = (RecVarNode) ((ParamAstFactory) this.job.af).SimpleNameNode(null, RecVarKind.KIND, makeFreshRecVarName()); + rvs.put(recvar, rvn.toName()); + recvar = rvn.toName(); + } + ParamCoreGType body = parseSeq(gr.getBlock().getInteractionSeq().getInteractions(), rvs, checkChoiceGuard, true); // Check rec body is guarded + + return this.af.ParamCoreGRec(recvar, body); + } + + private ParamCoreGType parseGContinue(Map rvs, boolean checkRecGuard, GContinue gc) + throws ParamCoreSyntaxException + { + if (checkRecGuard) + { + throw new ParamCoreSyntaxException(gc.getSource(), "[param-core] Unguarded in recursion: " + gc); // FIXME: too conservative, e.g., rec X . A -> B . rec Y . X + } + RecVar recvar = gc.recvar.toName(); + if (rvs.containsKey(recvar)) + { + recvar = rvs.get(recvar); + } + return this.af.ParamCoreGRecVar(recvar); + } + + // Parses message interactions as unary choices + private ParamCoreGChoice parseGMessageTransfer(List is, Map rvs, GMessageTransfer gmt) throws ParamCoreSyntaxException + { + ParamCoreMessage a = this.af.ParamCoreAction(parseOp(gmt), parsePayload(gmt)); + String srcName = parseSourceRole(gmt); + String destName = parseDestinationRole(gmt); + ParamRole src; + ParamRole dest; + if (gmt instanceof ParamGCrossMessageTransfer) + { + ParamGCrossMessageTransfer cross = (ParamGCrossMessageTransfer) gmt; + src = af.ParamRole(srcName, cross.srcRangeStart, cross.srcRangeEnd); + dest = af.ParamRole(destName, cross.destRangeStart, cross.destRangeEnd); + } + else + { + src = af.ParamRole(srcName, 1, 1); // FIXME + dest = af.ParamRole(destName, 1, 1); + } + return parseGSimpleInteractionNode(is, rvs, src, a, dest); + } + + // Duplicated from parseGMessageTransfer (MessageTransfer and ConnectionAction have no common + + private ParamCoreGChoice parseGSimpleInteractionNode( + List is, Map rvs, + ParamRole src, ParamCoreMessage a, ParamRole dest) throws ParamCoreSyntaxException + { + if (src.equals(dest)) + { + throw new RuntimeException("[param-core] Shouldn't get in here (self-communication): " + src + ", " + dest); + } + + ParamCoreGType cont = parseSeq(is.subList(1, is.size()), rvs, false, false); // Subseqeuent choice/rec is guarded by (at least) this action + return this.af.ParamCoreGChoice(src, dest, Stream.of(a).collect(Collectors.toMap(x -> x, x -> cont))); + } + + private Op parseOp(GMessageTransfer gmt) throws ParamCoreSyntaxException + { + return parseOp(gmt.msg); + } + + private Op parseOp(MessageNode mn) throws ParamCoreSyntaxException + { + if (!mn.isMessageSigNode()) + { + throw new ParamCoreSyntaxException(mn.getSource(), " [param-core] Message sig names not supported: " + mn); // TODO: MessageSigName + } + MessageSigNode msn = ((MessageSigNode) mn); + return msn.op.toName(); + } + + private Payload parsePayload(GMessageTransfer gmt) throws ParamCoreSyntaxException + { + return parsePayload(gmt.msg); + } + + private Payload parsePayload(MessageNode mn) throws ParamCoreSyntaxException + { + if (!mn.isMessageSigNode()) + { + throw new ParamCoreSyntaxException(mn.getSource(), " [param-core] Message sig names not supported: " + mn); // TODO: MessageSigName + } + return ((MessageSigNode) mn).toMessage().payload; + } + + private String parseSourceRole(GMessageTransfer gmt) + { + return parseSourceRole(gmt.src); + } + + private String parseSourceRole(RoleNode rn) + { + return rn.toString(); + } + + private String parseDestinationRole(GMessageTransfer gmt) throws ParamCoreSyntaxException + { + if (gmt.getDestinations().size() > 1) + { + throw new ParamCoreSyntaxException(gmt.getSource(), " [TODO] Multicast not supported: " + gmt); + } + return parseDestinationRole(gmt.getDestinations().get(0)); + } + + private String parseDestinationRole(RoleNode rn) throws ParamCoreSyntaxException + { + return rn.toString(); + } + + + + + + + + + + + /* + // Mostly duplicated from parseGMessageTransfer, but GMessageTransfer/GConnect have no useful base class + private ParamCoreGConnect parseGConnect(GConnect gc) throws F17Exception + { + Role src = gc.src.toName(); + Role dest = gc.dest.toName(); + if (!gc.msg.isMessageSigNode()) + { + throw new F17SyntaxException(gc.msg.getSource(), " [f17] Message kind not supported: " + gc.msg); + } + MessageSigNode msn = ((MessageSigNode) gc.msg); + Op op = msn.op.toName(); + Payload pay = null; + if (msn.payloads.getElements().isEmpty()) + { + pay = Payload.EMPTY_PAYLOAD; + } + else + { + String tmp = msn.payloads.getElements().get(0).toString().trim(); + int i = tmp.indexOf('@'); + if (i != -1) + { + throw new F17Exception("[f17] Delegation not supported: " + tmp); + } + else + { + pay = msn.payloads.toPayload(); + } + } + return this.factory.GConnect(src, dest, op, pay); + } + */ + + /*private ParamCoreGType parseSeq(JobContext jc, ModuleContext mc, List is, + boolean checkChoiceGuard, boolean checkRecGuard) throws F17Exception + { + //List is = block.getInteractionSeq().getInteractions(); + if (is.isEmpty()) + { + return this.factory.GEnd(); + } + + GInteractionNode first = is.get(0); + if (first instanceof GSimpleInteractionNode && !(first instanceof GContinue)) + { + if (first instanceof GMessageTransfer) + { + ParamCoreGMessageTransfer gmt = parseGMessageTransfer((GMessageTransfer) first); + ParamCoreGType cont = parseSeq(jc, mc, is.subList(1, is.size()), false, false); + Map cases = new HashMap<>(); + cases.put(gmt, cont); + return this.factory.GChoice(cases); + } + else if (first instanceof GConnect) + { + ParamCoreGConnect gc = parseGConnect((GConnect) first); + ParamCoreGType cont = parseSeq(jc, mc, is.subList(1, is.size()), false, false); + Map cases = new HashMap<>(); + cases.put(gc, cont); + return this.factory.GChoice(cases); + } + else if (first instanceof GDisconnect) + { + F17GDisconnect gdc = parseGDisconnect((GDisconnect) first); + ParamCoreGType cont = parseSeq(jc, mc, is.subList(1, is.size()), false, false); + Map cases = new HashMap<>(); + cases.put(gdc, cont); + return this.factory.GChoice(cases); + } + else + { + throw new RuntimeException("[f17] Shouldn't get in here: " + first); + } + } + else + { + if (checkChoiceGuard) + { + throw new F17SyntaxException(first.getSource(), "[f17] Unguarded in choice case: " + first); + } + if (is.size() > 1) + { + throw new F17SyntaxException(is.get(1).getSource(), "[f17] Bad sequential composition after: " + first); + } + + if (first instanceof GChoice) + { + /*if (checkRecGuard) + { + throw new F17Exception(first.getSource(), "[f17] Unguarded in choice case (2): " + first); + }* / + + GChoice gc = (GChoice) first; + List parsed = new LinkedList<>(); + for (GProtocolBlock b : gc.getBlocks()) + { + parsed.add(parseSeq(jc, mc, b.getInteractionSeq().getInteractions(), true, checkRecGuard)); // "Directly" nested choice will still return a GlobalSend (which is really a choice; uniform global choice constructor is convenient) + } + Map cases = new HashMap<>(); + for (ParamCoreGType p : parsed) + { + if (!(p instanceof ParamCoreGChoice)) + { + throw new RuntimeException("[f17] Shouldn't get in here: " + p); + } + ParamCoreGChoice tmp = (ParamCoreGChoice) p; + //tmp.cases.entrySet().forEach((e) -> cases.put(e.getKey(), e.getValue())); + for (Entry e : tmp.cases.entrySet()) + { + ParamCoreGAction k = e.getKey(); + if (k.isMessageAction()) + { + if (cases.keySet().stream().anyMatch((x) -> + x.isMessageAction() && ((F17MessageAction) k).getOp().equals(((F17MessageAction) x).getOp()))) + { + throw new F17SyntaxException("[f17] Non-determinism (" + e.getKey() + ") not supported: " + gc); + } + } + cases.put(k, e.getValue()); + } + } + return this.factory.GChoice(cases); + } + else if (first instanceof GRecursion) + { + GRecursion gr = (GRecursion) first; + RecVar recvar = gr.recvar.toName(); + ParamCoreGType body = parseSeq(jc, mc, gr.getBlock().getInteractionSeq().getInteractions(), checkChoiceGuard, true); + return new ParamCoreGRec(recvar, body); + } + else if (first instanceof GContinue) + { + if (checkRecGuard) + { + throw new F17SyntaxException(first.getSource(), "[f17] Unguarded in recursion: " + first); // FIXME: conservative, e.g., rec X . A -> B . rec Y . X + } + + return this.factory.GRecVar(((GContinue) first).recvar.toName()); + } + else + { + throw new RuntimeException("[f17] Shouldn't get in here: " + first); + } + } + } + + private ParamCoreGMessageTransfer parseGMessageTransfer(GMessageTransfer gmt) throws F17Exception + { + Role src = gmt.src.toName(); + if (gmt.getDestinations().size() > 1) + { + throw new F17Exception(gmt.getSource(), " [TODO] Multicast not supported: " + gmt); + } + Role dest = gmt.getDestinations().get(0).toName(); + if (!gmt.msg.isMessageSigNode()) + { + throw new F17SyntaxException(gmt.msg.getSource(), " [f17] Not supported: " + gmt.msg); // TODO: MessageSigName + } + MessageSigNode msn = ((MessageSigNode) gmt.msg); + Op op = msn.op.toName(); + Payload pay = null; + if (msn.payloads.getElements().isEmpty()) + { + pay = Payload.EMPTY_PAYLOAD; + } + else + { + String tmp = msn.payloads.getElements().get(0).toString().trim(); + int i = tmp.indexOf('@'); + if (i != -1) + { + throw new F17Exception("[f17] Delegation not supported: " + tmp); + } + else + { + pay = msn.payloads.toPayload(); + } + } + return this.factory.GMessageTransfer(src, dest, op, pay); + } + + // Mostly duplicated from parseGMessageTransfer, but GMessageTransfer/GConnect have no useful base class + private ParamCoreGConnect parseGConnect(GConnect gc) throws F17Exception + { + Role src = gc.src.toName(); + Role dest = gc.dest.toName(); + if (!gc.msg.isMessageSigNode()) + { + throw new F17SyntaxException(gc.msg.getSource(), " [f17] Message kind not supported: " + gc.msg); + } + MessageSigNode msn = ((MessageSigNode) gc.msg); + Op op = msn.op.toName(); + Payload pay = null; + if (msn.payloads.getElements().isEmpty()) + { + pay = Payload.EMPTY_PAYLOAD; + } + else + { + String tmp = msn.payloads.getElements().get(0).toString().trim(); + int i = tmp.indexOf('@'); + if (i != -1) + { + throw new F17Exception("[f17] Delegation not supported: " + tmp); + } + else + { + pay = msn.payloads.toPayload(); + } + } + return this.factory.GConnect(src, dest, op, pay); + } + + private F17GDisconnect parseGDisconnect(GDisconnect gdc) throws F17Exception + { + Role src = gdc.src.toName(); + Role dest = gdc.dest.toName(); + return this.factory.GDisconnect(src, dest); + }*/ +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java new file mode 100644 index 000000000..defb5ab99 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java @@ -0,0 +1,53 @@ +package org.scribble.ext.go.core.ast.global; + +import org.scribble.ext.go.core.ast.ParamCoreAstFactory; +import org.scribble.ext.go.core.ast.ParamCoreRec; +import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; +import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; +import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + +public class ParamCoreGRec extends ParamCoreRec implements ParamCoreGType +{ + public ParamCoreGRec(RecVar recvar, ParamCoreGType body) + { + super(recvar, body); + } + + @Override + public ParamCoreLType project(ParamCoreAstFactory af, Role r) throws ParamCoreSyntaxException + { + ParamCoreLType proj = this.body.project(af, r); + return (proj instanceof ParamCoreLRecVar) ? ParamCoreLEnd.END : af.ParamCoreLRec(this.recvar, proj); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreGRec)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreGRec; + } + + @Override + public int hashCode() + { + int hash = 2333; + hash = 31 * hash + super.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java new file mode 100644 index 000000000..867d103e0 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java @@ -0,0 +1,46 @@ +package org.scribble.ext.go.core.ast.global; + +import org.scribble.ext.go.core.ast.ParamCoreAstFactory; +import org.scribble.ext.go.core.ast.ParamCoreRecVar; +import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; +import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; + + +public class ParamCoreGRecVar extends ParamCoreRecVar implements ParamCoreGType +{ + public ParamCoreGRecVar(RecVar var) + { + super(var); + } + + @Override + public ParamCoreLRecVar project(ParamCoreAstFactory af, Role r) + { + return af.ParamCoreLRecVar(this.recvar); + } + + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof ParamCoreGRecVar)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public int hashCode() + { + int hash = 2411; + hash = 31*hash + super.hashCode(); + return hash; + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreGRecVar; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java new file mode 100644 index 000000000..0a9f44b30 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java @@ -0,0 +1,14 @@ +package org.scribble.ext.go.core.ast.global; + +import org.scribble.ext.go.core.ast.ParamCoreAstFactory; +import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; +import org.scribble.ext.go.core.ast.ParamCoreType; +import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.type.name.Role; + + +public interface ParamCoreGType extends ParamCoreType +{ + + ParamCoreLType project(ParamCoreAstFactory af, Role subj) throws ParamCoreSyntaxException; +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java new file mode 100644 index 000000000..c5ae6808c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java @@ -0,0 +1,18 @@ +package org.scribble.ext.go.core.ast.local; + +public enum ParamCoreLActionKind +{ + SEND, + RECEIVE; + + @Override + public String toString() + { + switch (this) + { + case SEND: return "!"; + case RECEIVE: return "?"; + default: throw new RuntimeException("Won't get here: " + this); + } + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java new file mode 100644 index 000000000..76f08e71f --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java @@ -0,0 +1,54 @@ +package org.scribble.ext.go.core.ast.local; + +import java.util.Map; + +import org.scribble.ext.go.core.ast.ParamCoreMessage; +import org.scribble.ext.go.core.ast.ParamCoreChoice; +import org.scribble.ext.go.core.ast.ParamRole; +import org.scribble.type.kind.Local; + +public class ParamCoreLChoice extends ParamCoreChoice implements ParamCoreLType +{ + public final ParamCoreLActionKind kind; + + public ParamCoreLChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) + { + super(role, cases); + this.kind = kind; + } + + @Override + public int hashCode() + { + int hash = 2399; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.kind.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreLChoice)) + { + return false; + } + return super.equals(obj) && this.kind.equals(((ParamCoreLChoice) obj).kind); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreLChoice; + } + + @Override + public String toString() + { + return this.role.toString() + this.kind + casesToString(); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java new file mode 100644 index 000000000..6242ee095 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java @@ -0,0 +1,36 @@ +package org.scribble.ext.go.core.ast.local; + +import org.scribble.ext.go.core.ast.ParamCoreEnd; + + +public class ParamCoreLEnd extends ParamCoreEnd implements ParamCoreLType +{ + public static final ParamCoreLEnd END = new ParamCoreLEnd(); + + private ParamCoreLEnd() + { + + } + + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof ParamCoreLEnd)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreLEnd; + } + + @Override + public int hashCode() + { + return 31*2383; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java new file mode 100644 index 000000000..e6e319e6f --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java @@ -0,0 +1,41 @@ +package org.scribble.ext.go.core.ast.local; + +import org.scribble.ext.go.core.ast.ParamCoreRec; +import org.scribble.type.name.RecVar; + +public class ParamCoreLRec extends ParamCoreRec implements ParamCoreLType +{ + public ParamCoreLRec(RecVar recvar, ParamCoreLType body) + { + //super(recvar, annot, init, body); + super(recvar, body); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreLRec)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreLRec; + } + + @Override + public int hashCode() + { + int hash = 2389; + hash = 31 * hash + super.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java new file mode 100644 index 000000000..f2d67b81e --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java @@ -0,0 +1,37 @@ +package org.scribble.ext.go.core.ast.local; + +import org.scribble.ext.go.core.ast.ParamCoreRecVar; +import org.scribble.type.name.RecVar; + + +public class ParamCoreLRecVar extends ParamCoreRecVar implements ParamCoreLType +{ + public ParamCoreLRecVar(RecVar var) + { + super(var); + } + + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof ParamCoreLRecVar)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public int hashCode() + { + int hash = 2417; + hash = 31*hash + super.hashCode(); + return hash; + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreLRecVar; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java new file mode 100644 index 000000000..c1ec76b8e --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java @@ -0,0 +1,9 @@ +package org.scribble.ext.go.core.ast.local; + +import org.scribble.ext.go.core.ast.ParamCoreType; + + +public interface ParamCoreLType extends ParamCoreType +{ + +} From cfc0fb15734a90050121f4f7d815a42770fdb964 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 23 Aug 2017 11:50:32 +0100 Subject: [PATCH 046/433] Continued adding param-core syntax. --- .../java/org/scribble/cli/CommandLine.java | 2 +- .../scribble/ext/go/cli/ParamCommandLine.java | 226 +++++++++++++++++- .../scribble/ext/go/main/ParamException.java | 51 ++++ 3 files changed, 276 insertions(+), 3 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/main/ParamException.java diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 0dfbfc045..20f9ebfca 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -152,7 +152,7 @@ protected void runBody() throws ScribParserException, AntlrSourceException, Comm // Attempt certain "output tasks" even if above failed, in case can still do some useful output (hacky) try { - doNonAttemptableOutputTasks(job); + tryOutputTasks(job); } catch (ScribbleException x) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index cdb1c25ef..5c4e63652 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -5,10 +5,18 @@ import java.util.List; import java.util.Map; +import org.scribble.ast.Module; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.cli.CLArgFlag; import org.scribble.cli.CommandLine; import org.scribble.cli.CommandLineException; import org.scribble.ext.go.codegen.statetype.go.GoEndpointApiGenerator; +import org.scribble.ext.go.core.ast.ParamCoreAstFactory; +import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; +import org.scribble.ext.go.core.ast.global.ParamCoreGProtocolDeclTranslator; +import org.scribble.ext.go.core.ast.global.ParamCoreGType; +import org.scribble.ext.go.main.ParamException; +import org.scribble.ext.go.main.ParamJob; import org.scribble.ext.go.main.ParamMainContext; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; @@ -75,6 +83,24 @@ protected ParamMainContext newMainContext() throws ScribParserException, Scribbl } } + public static void main(String[] args) throws CommandLineException, AntlrSourceException + { + new ParamCommandLine(args).run(); + } + + @Override + protected void doValidationTasks(Job job) throws ParamCoreSyntaxException, AntlrSourceException, ScribParserException, CommandLineException + { + if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM)) + { + doParamCoreValidationTasks((ParamJob) job); + } + else + { + super.doValidationTasks(job); + } + } + @Override protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, CommandLineException { @@ -96,8 +122,204 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co } } - public static void main(String[] args) throws CommandLineException, AntlrSourceException + private void doParamCoreValidationTasks(ParamJob j) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException { - new ParamCommandLine(args).run(); + /*if (this.args.containsKey(CLArgFlag.PROJECT)) // HACK + // modules/f17/src/test/scrib/demo/fase17/AppD.scr in [default] mode bug --- projection/EFSM not properly formed if this if is commented ???? + { + + }*/ + + paramCorePreContextBuilding(j); + + GProtocolName simpname = new GProtocolName(this.paramArgs.get(ParamCLArgFlag.PARAM)[0]); + if (simpname.toString().equals("[ParamCoreAllTest]")) // HACK: ParamCoreAllTest + { + paramCoreParseAndCheckWF(j); // Includes base passes + } + else + { + paramCoreParseAndCheckWF(j, simpname); // Includes base passes + } + + // FIXME? param-core FSM building only used for param-core validation -- output tasks, e.g., -api, will still use default Scribble FSMs + // -- but the FSMs should be the same? -- no: action assertions treated differently in core than base + } + + + // Refactor into Param(Core)Job? + // Following methods are for assrt-*core* + + private void paramCorePreContextBuilding(ParamJob job) throws ScribbleException + { + job.runContextBuildingPasses(); + + //job.runVisitorPassOnParsedModules(RecRemover.class); // FIXME: Integrate into main passes? Do before unfolding? + // FIXME: no -- revise to support annots + } + + // Pre: assrtPreContextBuilding(job) + private void paramCoreParseAndCheckWF(ParamJob job) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + { + Module main = job.getContext().getMainModule(); + for (GProtocolDecl gpd : main.getGlobalProtocolDecls()) + { + if (!gpd.isAuxModifier()) + { + paramCoreParseAndCheckWF(job, gpd.getHeader().getDeclName()); // decl name is simple name + } + } + } + + // Pre: paramCorePreContextBuilding(job) + private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + { + Module main = job.getContext().getMainModule(); + if (!main.hasProtocolDecl(simpname)) + { + throw new ParamException("[param-core] Global protocol not found: " + simpname); + } + this.gpd = (GProtocolDecl) main.getProtocolDecl(simpname); + + ParamCoreAstFactory af = new ParamCoreAstFactory(); + ParamCoreGType gt = new ParamCoreGProtocolDeclTranslator(job, af).translate(this.gpd); + + job.debugPrintln("\n[param-core] Translated:\n " + gt); + + /*Map P0 = new HashMap<>(); + for (Role r : gpd.header.roledecls.getRoles()) + { + ParamCoreLType lt = gt.project(af, r, ParamTrueFormula.TRUE); + P0.put(r, lt); + + job.debugPrintln("\n[param-core] Projected onto " + r + ":\n " + lt); + } + + ParamCoreEGraphBuilder builder = new ParamCoreEGraphBuilder(job); + this.E0 = new HashMap<>(); + for (Role r : P0.keySet()) + { + EGraph g = builder.build(P0.get(r)); + this.E0.put(r, (ParamEState) g.init); + + + job.debugPrintln("\n[param-core] Built endpoint graph for " + r + ":\n" + g.toDot()); + } + + assrtCoreValidate(job, simpname, gpd.isExplicitModifier());//, this.E0); // TODO + + /*if (!job.fair) + { + Map U0 = new HashMap<>(); + for (Role r : E0.keySet()) + { + EState u = E0.get(r).unfairTransform(); + U0.put(r, u); + + job.debugPrintln + //System.out.println + ("\n[param-core] Unfair transform for " + r + ":\n" + u.toDot()); + } + + //validate(job, gpd.isExplicitModifier(), U0, true); //TODO + }*/ + + //((ParamJob) job).runF17ProjectionPasses(); // projections not built on demand; cf. models + + //return gt; + } + + // HACK: store in (Core) Job/JobContext? + protected GProtocolDecl gpd; + /*protected Map E0; // There is no core version + protected ParamCoreSModel model;*/ + + /*// FIXME: factor out -- cf. super.doAttemptableOutputTasks + @Override + protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleException + { + if (this.assrtCoreArgs.containsKey(ParamCoreCLArgFlag.ASSRT_CORE_EFSM)) + { + String[] args = this.assrtCoreArgs.get(ParamCoreCLArgFlag.ASSRT_CORE_EFSM); + for (int i = 0; i < args.length; i += 1) + { +i Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); + String out = E0.get(role).toDot(); + System.out.println("\n" + out); // Endpoint graphs are "inlined" (a single graph is built) + } + } + if (this.assrtCoreArgs.containsKey(ParamCoreCLArgFlag.ASSRT_CORE_EFSM_PNG)) + { + String[] args = this.assrtCoreArgs.get(ParamCoreCLArgFlag.ASSRT_CORE_EFSM_PNG); + for (int i = 0; i < args.length; i += 2) + { + Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); + String png = args[i+1]; + String out = E0.get(role).toDot(); + runDot(out, png); + } + } + if (this.assrtCoreArgs.containsKey(ParamCoreCLArgFlag.ASSRT_CORE_MODEL)) + { + System.out.println("\n" + model.toDot()); + } + if (this.assrtCoreArgs.containsKey(ParamCoreCLArgFlag.ASSRT_CORE_MODEL_PNG)) + { + String[] arg = this.assrtCoreArgs.get(ParamCoreCLArgFlag.ASSRT_CORE_MODEL_PNG); + String png = arg[0]; + runDot(model.toDot(), png); + } } + + private void assrtCoreValidate(Job job, GProtocolName simpname, boolean isExplicit, + //Map E0, + boolean... unfair) throws ScribbleException, CommandLineException + { + this.model = new ParamCoreSModelBuilder(job.sf).build(this.E0, isExplicit); + + job.debugPrintln("\n[param-core] Built model:\n" + this.model.toDot()); + + if (unfair.length == 0 || !unfair[0]) + { + ParamCoreSafetyErrors serrs = this.model.getSafetyErrors(job, simpname); // job just for debug printing + if (serrs.isSafe()) + { + job.debugPrintln("\n[param-core] Protocol safe."); + } + else + { + throw new ParamException("[param-core] Protocol not safe:\n" + serrs); + } + } + + /*F17ProgressErrors perrs = m.getProgressErrors(); + if (perrs.satisfiesProgress()) + { + job.debugPrintln + //System.out.println + ("\n[f17] " + ((unfair.length == 0) ? "Fair protocol" : "Protocol") + " satisfies progress."); + } + else + { + + // FIXME: refactor eventual reception as 1-bounded stable check + Set staberrs = m.getStableErrors(); + if (perrs.eventualReception.isEmpty()) + { + if (!staberrs.isEmpty()) + { + throw new RuntimeException("[f17] 1-stable check failure: " + staberrs); + } + } + else + { + if (staberrs.isEmpty()) + { + throw new RuntimeException("[f17] 1-stable check failure: " + perrs); + } + } + + throw new F17Exception("\n[f17] " + ((unfair.length == 0) ? "Fair protocol" : "Protocol") + " violates progress.\n" + perrs); + }* / + }*/ } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamException.java b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamException.java new file mode 100644 index 000000000..b441bb5e0 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamException.java @@ -0,0 +1,51 @@ +package org.scribble.ext.go.main; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.main.ScribbleException; + +//public class AssrtException extends Exception +public class ParamException extends ScribbleException +{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + public ParamException() + { + // TODO Auto-generated constructor stub + } + + public ParamException(String arg0) + { + super(arg0); + // TODO Auto-generated constructor stub + } + + public ParamException(Throwable arg0) + { + super(arg0); + // TODO Auto-generated constructor stub + } + + public ParamException(String arg0, Throwable arg1) + { + super(arg0, arg1); + // TODO Auto-generated constructor stub + } + + public ParamException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) + { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } + + public ParamException(CommonTree blame, String arg0) + { + super(blame, arg0); + // TODO Auto-generated constructor stub + } + +} From 11751e6fbf889b669d375c7f9c0d2eeb18c95692 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 23 Aug 2017 16:06:40 +0100 Subject: [PATCH 047/433] Continued on param-core syntax/projection. --- .../ext/go/core/ast/ParamCoreRec.java | 2 +- .../go/core/ast/global/ParamCoreGChoice.java | 72 ++----------------- 2 files changed, 7 insertions(+), 67 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java index c4a626e4e..55127a266 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java @@ -16,7 +16,7 @@ public ParamCoreRec(RecVar recvar, B body) @Override public String toString() { - return "mu " + this.recvar + this.body; + return "mu " + this.recvar + "." + this.body; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index e9314b5a2..c4c9548ee 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.core.ast.global; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -46,75 +47,14 @@ public ParamCoreLType project(ParamCoreAstFactory af, Role r) throws ParamCoreSy return af.ParamCoreLChoice(role, kind, projs); } - throw new RuntimeException("[param-core] TODO: " + this); - - /*// "Merge" - if (projs.values().stream().anyMatch(v -> (v instanceof ParamCoreLRecVar))) - { - if (projs.values().stream().anyMatch(v -> !(v instanceof ParamCoreLRecVar))) - { - throw new ParamCoreSyntaxException("[assrt-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge unguarded rec vars."); - } - - Set rvs = projs.values().stream().map(v -> ((ParamCoreLRecVar) v).recvar).collect(Collectors.toSet()); - Set> fs = projs.values().stream().map(v -> ((ParamCoreLRecVar) v).annotexprs).collect(Collectors.toSet()); // FIXME? syntactic equality of exprs - if (rvs.size() > 1 || fs.size() > 1) - { - throw new ParamCoreSyntaxException("[assrt-core] Cannot project \n" + this + "\n onto " + r + ": mixed unguarded rec vars: " + rvs); - } - - return af.ParamCoreLRecVar(rvs.iterator().next(), fs.iterator().next()); - } - - List filtered = projs.values().stream() - .filter(v -> !v.equals(ParamCoreLEnd.END)) - ////.collect(Collectors.toMap(e -> Map.Entry::getKey, e -> Map.Entry::getValue)); - //.map(v -> (ParamCoreLChoice) v) - .collect(Collectors.toList()); - - if (filtered.size() == 0) - { - return ParamCoreLEnd.END; - } - else if (filtered.size() == 1) + // "Merge" + Collection values = projs.values(); + if (values.size() > 1) { - return //(ParamCoreLChoice) - filtered.iterator().next(); // RecVar disallowed above + throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge for: " + projs.keySet()); } - List choices = filtered.stream().map(v -> (ParamCoreLChoice) v).collect(Collectors.toList()); - - Set roles = choices.stream().map(v -> v.role).collect(Collectors.toSet()); // Subj not one of curent src/dest, must be projected inside each case to a guarded continuation - if (roles.size() > 1) - { - throw new ParamCoreSyntaxException("[assrt-core] Cannot project \n" + this + "\n onto " + r + ": mixed peer roles: " + roles); - } - Set> kinds = choices.stream().map(v -> v.kind).collect(Collectors.toSet()); // Subj not one of curent src/dest, must be projected inside each case to a guarded continuation - if (kinds.size() > 1) - { - throw new ParamCoreSyntaxException("[assrt-core] Cannot project \n" + this + "\n onto " + r + ": mixed action kinds: " + kinds); - } - - Map merged = new HashMap<>(); - choices.forEach(v -> - { - if (!v.kind.equals(ParamCoreLActionKind.RECEIVE)) - { - throw new RuntimeException("[assrt-core] Shouldn't get here: " + v); // By role-enabling? - } - v.cases.entrySet().forEach(e -> - { - ParamCoreAction k = e.getKey(); - ParamCoreLType b = e.getValue(); - if (merged.containsKey(k)) //&& !b.equals(merged.get(k))) // TODO - { - throw new RuntimeException("[assrt-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge: " + b + " and " + merged.get(k)); - } - merged.put(k, b); - }); - }); - - return af.ParamCoreLChoice(roles.iterator().next(), ParamCoreLActionKind.RECEIVE, merged);*/ + return values.iterator().next(); } @Override From 71877084c8b6ddbdb0d723ef2ea40683abaac863 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Aug 2017 10:01:31 +0100 Subject: [PATCH 048/433] Added Z3 wrapper. --- .../scribble/ext/go/cli/ParamCommandLine.java | 97 +++++++++++++++++++ .../scribble/ext/go/core/ast/ParamRole.java | 4 +- .../go/core/ast/global/ParamCoreGChoice.java | 13 ++- .../ext/go/core/ast/global/ParamCoreGEnd.java | 10 ++ .../ParamCoreGProtocolDeclTranslator.java | 7 +- .../ext/go/core/ast/global/ParamCoreGRec.java | 9 ++ .../go/core/ast/global/ParamCoreGRecVar.java | 10 ++ .../go/core/ast/global/ParamCoreGType.java | 5 + .../org/scribble/ext/go/util/Z3Wrapper.java | 52 ++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 13 ++- 10 files changed, 211 insertions(+), 9 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 5c4e63652..c262ddbb0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -1,9 +1,15 @@ package org.scribble.ext.go.cli; import java.nio.file.Path; +import java.util.Collection; import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; @@ -13,11 +19,13 @@ import org.scribble.ext.go.codegen.statetype.go.GoEndpointApiGenerator; import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; +import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.global.ParamCoreGProtocolDeclTranslator; import org.scribble.ext.go.core.ast.global.ParamCoreGType; import org.scribble.ext.go.main.ParamException; import org.scribble.ext.go.main.ParamJob; import org.scribble.ext.go.main.ParamMainContext; +import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; import org.scribble.main.JobContext; @@ -186,6 +194,10 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro job.debugPrintln("\n[param-core] Translated:\n " + gt); + Map>>> protoRoles = getProtoRoles(job, gt); + + System.out.println("\n\n[param-core] Protoroles: " + protoRoles); + /*Map P0 = new HashMap<>(); for (Role r : gpd.header.roledecls.getRoles()) { @@ -228,6 +240,91 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro //return gt; } + + // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? + private Map>>> getProtoRoles(ParamJob job, ParamCoreGType gt) + { + Set prs = gt.getParamRoles(); + + Map> map + = prs.stream() + .map(x -> x.name) + .distinct() + .collect(Collectors.toMap(x -> x, x -> prs.stream().filter(y -> y.name.equals(x)).collect(Collectors.toSet()))); + + Map>>> powersets = map.keySet().stream().collect(Collectors.toMap(k -> k, k -> new HashSet<>())); + for (String n : map.keySet()) + { + Set>> tmp = powersets.get(n); + Set todo = new HashSet<>(map.get(n)); + while (!todo.isEmpty()) + { + Iterator i = todo.iterator(); + ParamRole next = i.next(); + i.remove(); + Set> range = new HashSet<>(); + range.add(Stream.of(next.start, next.end).collect(Collectors.toList())); + if (!tmp.contains(next)) + { + tmp.addAll(tmp.stream().map(t -> + { + Set> ggg = new HashSet<>(); + ggg.addAll(t); + ggg.add(range.iterator().next()); + return ggg; + }).collect(Collectors.toSet())); + tmp.add(range); + } + } + } + + Map>>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); + for (String r : powersets.keySet()) + { + Set>> powset = powersets.get(r); + + System.out.println("\n" + r + ": " + powset); + + for (Set> cand : powset) + { + Set> coset = powset.stream().filter(f -> f.stream().noneMatch(g -> cand.contains(g))).flatMap(Collection::stream).collect(Collectors.toSet()); + + String z3 = ""; + + if (cand.size() > 0) + { + z3 += cand.stream().map(c -> "(and (>= id " + c.get(0) + ") (<= id " + c.get(1) + "))") + .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); + } + + if (coset.size() > 0) + { + if (cand.size() > 0) + { + z3 = "(and " + z3 + " "; + } + z3 += coset.stream().map(c -> "(or (< id " + c.get(0) + ") (> id " + c.get(1) + "))") + .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); + if (cand.size() > 0) + { + z3 += ")"; + } + } + + z3 = "(declare-const id Int)\n(assert " + z3 + ")"; + + System.out.println("cand: " + cand); + System.out.println("coset: " + coset); + System.out.println("z3: " + z3); + + if (Z3Wrapper.checkSat(job, gpd, z3)) + { + protoRoles.get(r).add(cand); + } + } + } + return protoRoles; + } // HACK: store in (Core) Job/JobContext? protected GProtocolDecl gpd; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java index ddad9d9a3..b40a84b5f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java @@ -1,7 +1,5 @@ package org.scribble.ext.go.core.ast; -import org.scribble.ext.go.core.ast.global.ParamCoreGChoice; - public class ParamRole { public final String name; @@ -33,7 +31,7 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreGChoice)) + if (!(obj instanceof ParamRole)) { return false; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index c4c9548ee..de74d4d06 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -4,10 +4,13 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreChoice; +import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; @@ -26,6 +29,14 @@ public ParamCoreGChoice(ParamRole src, ParamRole dest, Map getParamRoles() + { + Set res = Stream.of(this.src, this.dest).collect(Collectors.toSet()); + this.cases.values().forEach(c -> res.addAll(c.getParamRoles())); + return res; + } @Override public ParamCoreLType project(ParamCoreAstFactory af, Role r) throws ParamCoreSyntaxException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java index 4d2d2ca7e..3f5c5e952 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java @@ -1,7 +1,11 @@ package org.scribble.ext.go.core.ast.global; +import java.util.Collections; +import java.util.Set; + import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreEnd; +import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; import org.scribble.type.name.Role; @@ -14,6 +18,12 @@ private ParamCoreGEnd() { } + + @Override + public Set getParamRoles() + { + return Collections.emptySet(); + } @Override public ParamCoreLEnd project(ParamCoreAstFactory af, Role r) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index a7f649f5c..f28ced913 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -144,7 +144,7 @@ private ParamCoreGType parseGChoice(Map rvs, } else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) { - throw new ParamCoreSyntaxException(gc.getSource(), "[param-core] Non-directed choice not supported: " + gc); + throw new ParamCoreSyntaxException(gc.getSource(), "[param-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); } // "Flatten" nested choices (already checked they are guarded) -- Scribble choice subjects ignored @@ -208,8 +208,9 @@ private ParamCoreGChoice parseGMessageTransfer(List is, Map getParamRoles() + { + return this.body.getParamRoles(); + } @Override public ParamCoreLType project(ParamCoreAstFactory af, Role r) throws ParamCoreSyntaxException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java index 867d103e0..bb5d7d0fa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java @@ -1,7 +1,11 @@ package org.scribble.ext.go.core.ast.global; +import java.util.Collections; +import java.util.Set; + import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreRecVar; +import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -13,6 +17,12 @@ public ParamCoreGRecVar(RecVar var) { super(var); } + + @Override + public Set getParamRoles() + { + return Collections.emptySet(); + } @Override public ParamCoreLRecVar project(ParamCoreAstFactory af, Role r) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java index 0a9f44b30..dc71d610f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java @@ -1,8 +1,11 @@ package org.scribble.ext.go.core.ast.global; +import java.util.Set; + import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; import org.scribble.ext.go.core.ast.ParamCoreType; +import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.type.name.Role; @@ -11,4 +14,6 @@ public interface ParamCoreGType extends ParamCoreType { ParamCoreLType project(ParamCoreAstFactory af, Role subj) throws ParamCoreSyntaxException; + + Set getParamRoles(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java new file mode 100644 index 000000000..f691a87ef --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -0,0 +1,52 @@ +package org.scribble.ext.go.util; + +import java.io.File; +import java.util.Arrays; + +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ext.go.main.ParamJob; +import org.scribble.main.ScribbleException; +import org.scribble.util.ScribUtil; + +// "Native" Z3 -- not Z3 Java API +public class Z3Wrapper +{ + + // Based on CommandLine::runDot, JobContext::runAut, etc + public static boolean checkSat(ParamJob job, GProtocolDecl gpd, String smt2) //throws ScribbleException + { + String tmpName = gpd.header.name + ".smt2.tmp"; + File tmp = new File(tmpName); + if (tmp.exists()) // Factor out with CommandLine.runDot (file exists check) + { + throw new RuntimeException("Cannot overwrite: " + tmpName); + } + smt2 = smt2 + "\n(check-sat)\n(exit)"; + try + { + ScribUtil.writeToFile(tmpName, smt2); + String[] res = ScribUtil.runProcess("Z3", tmpName); + String trim = res[0].trim(); + if (trim.equals("sat")) // FIXME: factor out + { + return true; + } + else if (trim.equals("unsat")) + { + return false; + } + else + { + throw new RuntimeException("[assrt] Z3 error: " + Arrays.toString(res)); + } + } + catch (ScribbleException e) + { + throw new RuntimeException(e); + } + finally + { + tmp.delete(); + } + } +} diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index cbb143eaf..1b5e80ddd 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -12,7 +12,16 @@ module assrt.tmp.ParamTest; //type "System.String" from "..." as str; -global protocol Proto1(role A[1..1], role B[1..1]) +global protocol Proto1(role A, role B) { - 1() from A[1..1] to B[1..1]; + choice at A + { + 1() from A[1..1] to B[1..2]; + 2() from B[1..1] to A[1..1]; + } + or + { + 3() from A[1..1] to B[1..2]; + 4() from B[2..2] to A[1..1]; + } } From a938919ccd50ba058e8e9a21b62a81cf2b2f4de1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Aug 2017 11:12:26 +0100 Subject: [PATCH 049/433] Continued. --- .../scribble/ext/go/cli/ParamCommandLine.java | 29 ++++++------- .../ext/go/core/ast/ParamCoreAstFactory.java | 5 ++- .../scribble/ext/go/core/ast/ParamRole.java | 17 ++++---- .../ParamCoreGProtocolDeclTranslator.java | 5 ++- .../scribble/ext/go/core/type/ParamRange.java | 43 +++++++++++++++++++ 5 files changed, 71 insertions(+), 28 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index c262ddbb0..4e48672c6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -9,7 +9,6 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; @@ -22,6 +21,7 @@ import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.global.ParamCoreGProtocolDeclTranslator; import org.scribble.ext.go.core.ast.global.ParamCoreGType; +import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.main.ParamException; import org.scribble.ext.go.main.ParamJob; import org.scribble.ext.go.main.ParamMainContext; @@ -194,7 +194,7 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro job.debugPrintln("\n[param-core] Translated:\n " + gt); - Map>>> protoRoles = getProtoRoles(job, gt); + Map>> protoRoles = getProtoRoles(job, gt); System.out.println("\n\n[param-core] Protoroles: " + protoRoles); @@ -214,7 +214,6 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro EGraph g = builder.build(P0.get(r)); this.E0.put(r, (ParamEState) g.init); - job.debugPrintln("\n[param-core] Built endpoint graph for " + r + ":\n" + g.toDot()); } @@ -242,7 +241,7 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro } // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? - private Map>>> getProtoRoles(ParamJob job, ParamCoreGType gt) + private Map>> getProtoRoles(ParamJob job, ParamCoreGType gt) { Set prs = gt.getParamRoles(); @@ -252,23 +251,23 @@ private Map>>> getProtoRoles(ParamJob job, ParamCo .distinct() .collect(Collectors.toMap(x -> x, x -> prs.stream().filter(y -> y.name.equals(x)).collect(Collectors.toSet()))); - Map>>> powersets = map.keySet().stream().collect(Collectors.toMap(k -> k, k -> new HashSet<>())); + Map>> powersets = map.keySet().stream().collect(Collectors.toMap(k -> k, k -> new HashSet<>())); for (String n : map.keySet()) { - Set>> tmp = powersets.get(n); + Set> tmp = powersets.get(n); Set todo = new HashSet<>(map.get(n)); while (!todo.isEmpty()) { Iterator i = todo.iterator(); ParamRole next = i.next(); i.remove(); - Set> range = new HashSet<>(); - range.add(Stream.of(next.start, next.end).collect(Collectors.toList())); + Set range = new HashSet<>(); + range.add(next.range); if (!tmp.contains(next)) { tmp.addAll(tmp.stream().map(t -> { - Set> ggg = new HashSet<>(); + Set ggg = new HashSet<>(); ggg.addAll(t); ggg.add(range.iterator().next()); return ggg; @@ -278,22 +277,22 @@ private Map>>> getProtoRoles(ParamJob job, ParamCo } } - Map>>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); + Map>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); for (String r : powersets.keySet()) { - Set>> powset = powersets.get(r); + Set> powset = powersets.get(r); System.out.println("\n" + r + ": " + powset); - for (Set> cand : powset) + for (Set cand : powset) { - Set> coset = powset.stream().filter(f -> f.stream().noneMatch(g -> cand.contains(g))).flatMap(Collection::stream).collect(Collectors.toSet()); + Set coset = powset.stream().filter(f -> f.stream().noneMatch(g -> cand.contains(g))).flatMap(Collection::stream).collect(Collectors.toSet()); String z3 = ""; if (cand.size() > 0) { - z3 += cand.stream().map(c -> "(and (>= id " + c.get(0) + ") (<= id " + c.get(1) + "))") + z3 += cand.stream().map(c -> "(and (>= id " + c.start + ") (<= id " + c.end + "))") .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); } @@ -303,7 +302,7 @@ private Map>>> getProtoRoles(ParamJob job, ParamCo { z3 = "(and " + z3 + " "; } - z3 += coset.stream().map(c -> "(or (< id " + c.get(0) + ") (> id " + c.get(1) + "))") + z3 += coset.stream().map(c -> "(or (< id " + c.start + ") (> id " + c.end + "))") .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); if (cand.size() > 0) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java index c393433ad..a65baf0f9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java @@ -13,6 +13,7 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLRec; import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.type.ParamRange; import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.RecVar; @@ -25,9 +26,9 @@ public ParamCoreAstFactory() } - public ParamRole ParamRole(String name, int start, int end) + public ParamRole ParamRole(String name, ParamRange range) // ParamRange not "ast", so not made by af { - return new ParamRole(name, start, end); + return new ParamRole(name, range); } // Pre: not null diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java index b40a84b5f..de0644c32 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java @@ -1,16 +1,16 @@ package org.scribble.ext.go.core.ast; +import org.scribble.ext.go.core.type.ParamRange; + public class ParamRole { public final String name; - public final int start; - public final int end; + public final ParamRange range; - public ParamRole(String name, int start, int end) + public ParamRole(String name, ParamRange range) { this.name = name; - this.start = start; - this.end = end; + this.range = range; } @Override @@ -19,8 +19,7 @@ public int hashCode() int hash = 7121; hash = 31 * hash + super.hashCode(); hash = 31 * hash + this.name.hashCode(); - hash = 31 * hash + this.start; - hash = 31 * hash + this.end; + hash = 31 * hash + this.range.hashCode(); return hash; } @@ -37,12 +36,12 @@ public boolean equals(Object obj) } ParamRole them = (ParamRole) obj; return this.name.equals(them.name) - && this.start == them.start && this.end == them.end; + && this.range.equals(them.range); } @Override public String toString() { - return this.name + "[" + this.start + ".." + this.end + "]"; + return this.name + this.range; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index f28ced913..512b9ba72 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -28,6 +28,7 @@ import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; import org.scribble.ext.go.core.ast.ParamRole; +import org.scribble.ext.go.core.type.ParamRange; import org.scribble.main.Job; import org.scribble.type.Payload; import org.scribble.type.kind.RecVarKind; @@ -203,8 +204,8 @@ private ParamCoreGChoice parseGMessageTransfer(List is, Map Date: Thu, 24 Aug 2017 11:50:22 +0100 Subject: [PATCH 050/433] Continued. --- .../java/org/scribble/type/name/Role.java | 1 + .../scribble/ext/go/cli/ParamCommandLine.java | 35 ++++++----- .../ext/go/core/ast/ParamCoreAstFactory.java | 1 + .../ext/go/core/ast/ParamCoreChoice.java | 1 + .../scribble/ext/go/core/ast/ParamRole.java | 47 -------------- .../go/core/ast/global/ParamCoreGChoice.java | 29 ++++++--- .../ext/go/core/ast/global/ParamCoreGEnd.java | 5 +- .../ParamCoreGProtocolDeclTranslator.java | 2 +- .../ext/go/core/ast/global/ParamCoreGRec.java | 17 +++-- .../go/core/ast/global/ParamCoreGRecVar.java | 5 +- .../go/core/ast/global/ParamCoreGType.java | 6 +- .../go/core/ast/local/ParamCoreLChoice.java | 2 +- .../scribble/ext/go/core/type/ParamRange.java | 2 +- .../scribble/ext/go/core/type/ParamRole.java | 63 +++++++++++++++++++ 14 files changed, 133 insertions(+), 83 deletions(-) delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java diff --git a/scribble-core/src/main/java/org/scribble/type/name/Role.java b/scribble-core/src/main/java/org/scribble/type/name/Role.java index fa537fa51..56f4d5ea6 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Role.java +++ b/scribble-core/src/main/java/org/scribble/type/name/Role.java @@ -47,6 +47,7 @@ public boolean equals(Object o) return n.canEqual(this) && super.equals(o); } + @Override public boolean canEqual(Object o) { return o instanceof Role; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 4e48672c6..9ccf33d81 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -3,6 +3,7 @@ import java.nio.file.Path; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -18,10 +19,11 @@ import org.scribble.ext.go.codegen.statetype.go.GoEndpointApiGenerator; import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.global.ParamCoreGProtocolDeclTranslator; import org.scribble.ext.go.core.ast.global.ParamCoreGType; +import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.ext.go.main.ParamException; import org.scribble.ext.go.main.ParamJob; import org.scribble.ext.go.main.ParamMainContext; @@ -194,20 +196,23 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro job.debugPrintln("\n[param-core] Translated:\n " + gt); - Map>> protoRoles = getProtoRoles(job, gt); + Map>> protoRoles = getProtoRoles(job, gt); System.out.println("\n\n[param-core] Protoroles: " + protoRoles); - /*Map P0 = new HashMap<>(); + Map P0 = new HashMap<>(); for (Role r : gpd.header.roledecls.getRoles()) { - ParamCoreLType lt = gt.project(af, r, ParamTrueFormula.TRUE); - P0.put(r, lt); + for (Set ranges : protoRoles.get(r)) + { + ParamCoreLType lt = gt.project(af, r, ranges); + P0.put(r, lt); - job.debugPrintln("\n[param-core] Projected onto " + r + ":\n " + lt); + job.debugPrintln("\n[param-core] Projected onto " + r + " for " + ranges + ":\n " + lt); + } } - ParamCoreEGraphBuilder builder = new ParamCoreEGraphBuilder(job); + /*ParamCoreEGraphBuilder builder = new ParamCoreEGraphBuilder(job); this.E0 = new HashMap<>(); for (Role r : P0.keySet()) { @@ -241,18 +246,18 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro } // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? - private Map>> getProtoRoles(ParamJob job, ParamCoreGType gt) + private Map>> getProtoRoles(ParamJob job, ParamCoreGType gt) { Set prs = gt.getParamRoles(); - Map> map + Map> map = prs.stream() - .map(x -> x.name) + .map(x -> x.getName()) .distinct() - .collect(Collectors.toMap(x -> x, x -> prs.stream().filter(y -> y.name.equals(x)).collect(Collectors.toSet()))); + .collect(Collectors.toMap(x -> x, x -> prs.stream().filter(y -> y.getName().equals(x)).collect(Collectors.toSet()))); - Map>> powersets = map.keySet().stream().collect(Collectors.toMap(k -> k, k -> new HashSet<>())); - for (String n : map.keySet()) + Map>> powersets = map.keySet().stream().collect(Collectors.toMap(k -> k, k -> new HashSet<>())); + for (Role n : map.keySet()) { Set> tmp = powersets.get(n); Set todo = new HashSet<>(map.get(n)); @@ -277,8 +282,8 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreG } } - Map>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); - for (String r : powersets.keySet()) + Map>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); + for (Role r : powersets.keySet()) { Set> powset = powersets.get(r); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java index a65baf0f9..da9bf32c9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java @@ -14,6 +14,7 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.RecVar; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java index b7511e70c..dabc114db 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.stream.Collectors; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.kind.ProtocolKind; public abstract class ParamCoreChoice implements ParamCoreType diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java deleted file mode 100644 index de0644c32..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamRole.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.scribble.ext.go.core.ast; - -import org.scribble.ext.go.core.type.ParamRange; - -public class ParamRole -{ - public final String name; - public final ParamRange range; - - public ParamRole(String name, ParamRange range) - { - this.name = name; - this.range = range; - } - - @Override - public int hashCode() - { - int hash = 7121; - hash = 31 * hash + super.hashCode(); - hash = 31 * hash + this.name.hashCode(); - hash = 31 * hash + this.range.hashCode(); - return hash; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (!(obj instanceof ParamRole)) - { - return false; - } - ParamRole them = (ParamRole) obj; - return this.name.equals(them.name) - && this.range.equals(them.range); - } - - @Override - public String toString() - { - return this.name + this.range; - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index de74d4d06..991cf0381 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -12,9 +12,10 @@ import org.scribble.ext.go.core.ast.ParamCoreChoice; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -39,30 +40,42 @@ public Set getParamRoles() } @Override - public ParamCoreLType project(ParamCoreAstFactory af, Role r) throws ParamCoreSyntaxException + public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException { Map projs = new HashMap<>(); for (Entry e : this.cases.entrySet()) { ParamCoreMessage a = e.getKey(); - projs.put(a, e.getValue().project(af, r)); + projs.put(a, e.getValue().project(af, r, ranges)); // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) // FIXME: receive assertion projection -- should not be the same as send? } // "Simple" cases - if (this.src.equals(r) || this.dest.equals(r)) + if (this.src.getName().equals(r)) { - ParamRole role = this.src.equals(r) ? this.dest : this.src; - ParamCoreLActionKind kind = this.src.equals(r) ? ParamCoreLActionKind.SEND : ParamCoreLActionKind.RECEIVE; - return af.ParamCoreLChoice(role, kind, projs); + return (ranges.contains(this.src.range)) + ? af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.SEND, projs) + : merge(af, r, ranges, projs); + } + else if (this.dest.getName().equals(r)) + { + return (ranges.contains(this.dest.range)) + ? af.ParamCoreLChoice(this.src, ParamCoreLActionKind.RECEIVE, projs) + : merge(af, r, ranges, projs); } + // src name != dest name + return merge(af, r, ranges, projs); + } + + private ParamCoreLType merge(ParamCoreAstFactory af, Role r, Set ranges, Map projs) throws ParamCoreSyntaxException + { // "Merge" Collection values = projs.values(); if (values.size() > 1) { - throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge for: " + projs.keySet()); + throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + " for " + ranges + ": cannot merge for: " + projs.keySet()); } return values.iterator().next(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java index 3f5c5e952..3583967d6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java @@ -5,8 +5,9 @@ import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreEnd; -import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.name.Role; @@ -26,7 +27,7 @@ public Set getParamRoles() } @Override - public ParamCoreLEnd project(ParamCoreAstFactory af, Role r) + public ParamCoreLEnd project(ParamCoreAstFactory af, Role r, Set ranges) { return af.ParamCoreLEnd(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index 512b9ba72..302554411 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -27,8 +27,8 @@ import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.main.Job; import org.scribble.type.Payload; import org.scribble.type.kind.RecVarKind; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java index 563e41f29..bf374ba5a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java @@ -5,10 +5,11 @@ import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreRec; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -26,10 +27,18 @@ public Set getParamRoles() } @Override - public ParamCoreLType project(ParamCoreAstFactory af, Role r) throws ParamCoreSyntaxException + public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException { - ParamCoreLType proj = this.body.project(af, r); - return (proj instanceof ParamCoreLRecVar) ? ParamCoreLEnd.END : af.ParamCoreLRec(this.recvar, proj); + ParamCoreLType proj = this.body.project(af, r, ranges); + if (proj instanceof ParamCoreLRecVar) + { + ParamCoreLRecVar rv = (ParamCoreLRecVar) proj; + return rv.recvar.equals(this.recvar) ? ParamCoreLEnd.END : rv; + } + else + { + return af.ParamCoreLRec(this.recvar, proj); + } } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java index bb5d7d0fa..d745bd9f0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java @@ -5,8 +5,9 @@ import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreRecVar; -import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -25,7 +26,7 @@ public Set getParamRoles() } @Override - public ParamCoreLRecVar project(ParamCoreAstFactory af, Role r) + public ParamCoreLRecVar project(ParamCoreAstFactory af, Role r, Set ranges) { return af.ParamCoreLRecVar(this.recvar); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java index dc71d610f..da3295fb4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java @@ -5,15 +5,17 @@ import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; import org.scribble.ext.go.core.ast.ParamCoreType; -import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.name.Role; public interface ParamCoreGType extends ParamCoreType { - ParamCoreLType project(ParamCoreAstFactory af, Role subj) throws ParamCoreSyntaxException; + // FIXME: clarify, Role subj is used as "role name" + ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; Set getParamRoles(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java index 76f08e71f..61ab13d68 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java @@ -3,8 +3,8 @@ import java.util.Map; import org.scribble.ext.go.core.ast.ParamCoreMessage; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.ext.go.core.ast.ParamCoreChoice; -import org.scribble.ext.go.core.ast.ParamRole; import org.scribble.type.kind.Local; public class ParamCoreLChoice extends ParamCoreChoice implements ParamCoreLType diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java index ddeb268bd..13dc3ca84 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java @@ -38,6 +38,6 @@ public boolean equals(Object obj) @Override public String toString() { - return "[" + this.start + ".." + this.end + "]"; + return "[" + this.start + ((this.start == this.end) ? "" : ".." + this.end) + "]"; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java new file mode 100644 index 000000000..04f4df81b --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java @@ -0,0 +1,63 @@ +package org.scribble.ext.go.core.type; + +import org.scribble.type.name.Role; + +// FIXME: make distinct kind? i.e., don't extend Role? -- yes: ParamRole is not a Role (Role is actually a ParamRole) +public class ParamRole extends Role +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public final ParamRange range; + + public ParamRole(String name, ParamRange range) + { + super(name); + this.range = range; + } + + // FIXME + public Role getName() + { + return new Role(this.getLastElement()); + } + + @Override + public int hashCode() + { + int hash = 7121; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.range.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamRole)) + { + return false; + } + ParamRole them = (ParamRole) obj; + return super.equals(them) // Does canEqual + && this.range.equals(them.range); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof ParamRole; + } + + @Override + public String toString() + { + return super.toString() + this.range; + } +} From 20f03266ab403afcd03cdca9947df19e6a14de64 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Aug 2017 13:33:16 +0100 Subject: [PATCH 051/433] Revised ParamRoleDecl. --- .../org/scribble/parser/antlr/ParamScribble.g | 5 +- .../scribble/ext/go/ast/ParamAstFactory.java | 5 +- .../ext/go/ast/ParamAstFactoryImpl.java | 27 +++++++- .../scribble/ext/go/ast/ParamRoleDecl.java | 27 ++++---- .../ast/name/simple/ParamRoleParamNode.java | 63 +++++++++++++++++++ .../scribble/ast/ParamAntlrRoleDecl.java | 24 ++++--- .../ast/name/ParamAntlrSimpleName.java | 15 +++++ .../ext/go/type/kind/ParamRoleParamKind.java | 43 +++++++++++++ .../ext/go/type/name/ParamRoleParam.java | 47 ++++++++++++++ 9 files changed, 232 insertions(+), 24 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/kind/ParamRoleParamKind.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 7a732e7df..43493fa31 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -571,11 +571,10 @@ roledecl: ^(ROLEDECL rolename) | - ROLE_KW rolename '[' simplename '..' simplename ']' + ROLE_KW rolename '(' simplename (',' simplename)* ')' -> - ^(PARAM_ROLEDECL rolename simplename simplename) + ^(PARAM_ROLEDECL rolename simplename+) ; -// Should be "number" -- but seems "conflict" with IDENTIFIER parameterdecllist: '<' parameterdecl (',' parameterdecl)* '>' diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java index f98ef36fe..b28a37bc9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java @@ -1,15 +1,18 @@ package org.scribble.ext.go.ast; +import java.util.List; + import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; +import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; public interface ParamAstFactory extends AstFactory { - ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, int start, int end); + ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, int srcRangeStart, int srcRangeEnd, int destRangeStart, int destRangeEnd); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index f18cbe2a5..a8ccdb91c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -1,12 +1,18 @@ package org.scribble.ext.go.ast; +import java.util.List; + import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.MessageNode; +import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.RoleDeclDel; import org.scribble.del.global.GMessageTransferDel; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; +import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; +import org.scribble.ext.go.type.kind.ParamRoleParamKind; +import org.scribble.type.kind.Kind; // FIXME: separate modified-del-only from new categories @@ -176,9 +182,9 @@ public AssrtGDo GDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList a // Explicitly creating new Assrt nodes @Override - public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, int start, int end) + public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params) { - ParamRoleDecl rd = new ParamRoleDecl(source, namenode, start, end); + ParamRoleDecl rd = new ParamRoleDecl(source, namenode, params); rd = del(rd, new RoleDeclDel()); return rd; } @@ -192,4 +198,21 @@ public ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, mt = del(mt, new GMessageTransferDel()); // FIXME return mt; } + + @Override + public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) + { + NameNode snn = null; + + // Default del's + if (kind.equals(ParamRoleParamKind.KIND)) + { + snn = new ParamRoleParamNode(source, identifier); + return castNameNode(kind, del(snn, createDefaultDelegate())); + } + else + { + return super.SimpleNameNode(source, kind, identifier); + } + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java index ec836fc98..249c8a867 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java @@ -1,46 +1,50 @@ package org.scribble.ext.go.ast; +import java.util.Collections; +import java.util.List; + import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.RoleDecl; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SimpleNameNode; import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; import org.scribble.main.ScribbleException; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; +import org.scribble.util.ScribUtil; import org.scribble.visit.AstVisitor; public class ParamRoleDecl extends RoleDecl { - public final int start; - public final int end; + public final List params; - public ParamRoleDecl(CommonTree source, RoleNode name, int start, int end) + public ParamRoleDecl(CommonTree source, RoleNode name, List params) { super(source, name); - this.start = start; - this.end = end; + this.params = Collections.unmodifiableList(params); } @Override protected ParamRoleDecl copy() { - return new ParamRoleDecl(this.source, (RoleNode) this.name, this.start, this.end); + return new ParamRoleDecl(this.source, (RoleNode) this.name, this.params); } @Override public ParamRoleDecl clone(AstFactory af) { RoleNode role = (RoleNode) this.name.clone(af); - return ((ParamAstFactory) af).ParamRoleDecl(this.source, role, this.start, this.end); + List params = ScribUtil.cloneList(af, this.params); + return ((ParamAstFactory) af).ParamRoleDecl(this.source, role, params); } @Override public ParamRoleDecl project(AstFactory af, Role self) { RoleDecl proj = super.project(af, self); - return reconstruct((SimpleNameNode) proj.name, this.start, this.end); + return reconstruct((SimpleNameNode) proj.name, this.params); // FIXME: //throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing } @@ -50,10 +54,10 @@ public ParamRoleDecl reconstruct(SimpleNameNode name) throw new RuntimeException("[param] Shouldn't get in here: " + this); } - public ParamRoleDecl reconstruct(SimpleNameNode name, int start, int end) + public ParamRoleDecl reconstruct(SimpleNameNode name, List params) { ScribDel del = del(); - ParamRoleDecl rd = new ParamRoleDecl(this.source, (RoleNode) name, start, end); + ParamRoleDecl rd = new ParamRoleDecl(this.source, (RoleNode) name, params); rd = (ParamRoleDecl) rd.del(del); return rd; } @@ -62,6 +66,7 @@ public ParamRoleDecl reconstruct(SimpleNameNode name, int start, int e public ParamRoleDecl visitChildren(AstVisitor nv) throws ScribbleException { RoleNode name = visitChildWithClassEqualityCheck(this, (RoleNode) this.name, nv); - return reconstruct(name, this.start, this.end); + List params = visitChildListWithClassEqualityCheck(this, this.params, nv); + return reconstruct(name, params); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java new file mode 100644 index 000000000..746ba46eb --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java @@ -0,0 +1,63 @@ +package org.scribble.ext.go.ast.name.simple; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.name.simple.SimpleNameNode; +import org.scribble.ext.go.type.kind.ParamRoleParamKind; +import org.scribble.ext.go.type.name.ParamRoleParam; + + +public class ParamRoleParamNode extends SimpleNameNode +{ + public ParamRoleParamNode(CommonTree source, String identifier) + { + super(source, identifier); + } + + @Override + protected ParamRoleParamNode copy() + { + return new ParamRoleParamNode(this.source, getIdentifier()); + } + + @Override + public ParamRoleParamNode clone(AstFactory af) + { + return (ParamRoleParamNode) af.SimpleNameNode(this.source, ParamRoleParamKind.KIND, getIdentifier()); + } + + @Override + public ParamRoleParam toName() + { + String id = getIdentifier(); + return new ParamRoleParam(id); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamRoleParamNode)) + { + return false; + } + return ((ParamRoleParamNode) o).canEqual(this) && super.equals(o); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof ParamRoleParamNode; + } + + @Override + public int hashCode() + { + int hash = 7159; + hash = 31 * super.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java index a8d0bf4e4..9f7db6ce9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java @@ -1,9 +1,14 @@ package org.scribble.ext.go.parser.scribble.ast; +import java.util.List; +import java.util.stream.Collectors; + import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.RoleDecl; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; +import org.scribble.ext.go.parser.scribble.ast.name.ParamAntlrSimpleName; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; @@ -12,15 +17,14 @@ public class ParamAntlrRoleDecl // Same as original public static final int NAME_CHILD_INDEX = 0; - public static final int START_CHILD_INDEX = 1; - public static final int END_CHILD_INDEX = 2; + public static final int PARAM_CHILDREN_START_INDEX = 1; public static RoleDecl parseParamRoleDecl(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) { RoleNode name = AntlrSimpleName.toRoleNode(getNameChild(root), af); - int start = getStartIndex(root); - int end = getEndIndex(root); - return af.ParamRoleDecl(root, name, start, end); + List params = getParamChildren(root) + .stream().map(p -> ParamAntlrSimpleName.toParamRoleParamNode(p, af)).collect(Collectors.toList()); + return af.ParamRoleDecl(root, name, params); } public static CommonTree getNameChild(CommonTree root) @@ -28,7 +32,13 @@ public static CommonTree getNameChild(CommonTree root) return (CommonTree) root.getChild(NAME_CHILD_INDEX); } - public static int getStartIndex(CommonTree root) + public static List getParamChildren(CommonTree root) + { + List children = root.getChildren(); + return children.subList(PARAM_CHILDREN_START_INDEX, children.size()).stream().map(c -> (CommonTree) c).collect(Collectors.toList()); + } + + /*public static int getStartIndex(CommonTree root) { return Integer.parseInt(root.getChild(START_CHILD_INDEX).getText()); } @@ -36,5 +46,5 @@ public static int getStartIndex(CommonTree root) public static int getEndIndex(CommonTree root) { return Integer.parseInt(root.getChild(END_CHILD_INDEX).getText()); - } + }*/ } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java new file mode 100644 index 000000000..2e4f0bc3c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java @@ -0,0 +1,15 @@ +package org.scribble.ext.go.parser.scribble.ast.name; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; +import org.scribble.ext.go.type.kind.ParamRoleParamKind; +import org.scribble.parser.scribble.ast.name.AntlrSimpleName; + +public class ParamAntlrSimpleName +{ + public static ParamRoleParamNode toParamRoleParamNode(CommonTree ct, AstFactory af) + { + return (ParamRoleParamNode) af.SimpleNameNode(ct, ParamRoleParamKind.KIND, AntlrSimpleName.getName(ct)); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/kind/ParamRoleParamKind.java b/scribble-go/src/main/java/org/scribble/ext/go/type/kind/ParamRoleParamKind.java new file mode 100644 index 000000000..fa6760079 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/kind/ParamRoleParamKind.java @@ -0,0 +1,43 @@ +package org.scribble.ext.go.type.kind; + +import java.io.Serializable; + +import org.scribble.type.kind.AbstractKind; + +public class ParamRoleParamKind extends AbstractKind implements Serializable +{ + private static final long serialVersionUID = 1L; + + public static final ParamRoleParamKind KIND = new ParamRoleParamKind(); + + protected ParamRoleParamKind() + { + + } + + @Override + public int hashCode() + { + return super.hashCode(); + } + + @Override + public boolean equals(Object o) + { + if (o == this) + { + return true; + } + if (!(o instanceof ParamRoleParamKind)) + { + return false; + } + return ((ParamRoleParamKind) o).canEqual(this); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof ParamRoleParamKind; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java b/scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java new file mode 100644 index 000000000..5735af539 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java @@ -0,0 +1,47 @@ +package org.scribble.ext.go.type.name; + +import org.scribble.ext.go.type.kind.ParamRoleParamKind; +import org.scribble.type.name.AbstractName; + +public class ParamRoleParam extends AbstractName +{ + private static final long serialVersionUID = 1L; + + protected ParamRoleParam() + { + super(ParamRoleParamKind.KIND); + } + + public ParamRoleParam(String text) + { + super(ParamRoleParamKind.KIND, text); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamRoleParam)) + { + return false; + } + ParamRoleParam n = (ParamRoleParam) o; + return n.canEqual(this) && super.equals(o); + } + + public boolean canEqual(Object o) + { + return o instanceof ParamRoleParam; + } + + @Override + public int hashCode() + { + int hash = 7187; + hash = 31 * super.hashCode(); + return hash; + } +} From 3fc4f7e8fdde48d0250673ef53df5eb7bb5b2669 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Aug 2017 13:35:31 +0100 Subject: [PATCH 052/433] Minor. --- .../main/java/org/scribble/ext/go/ast/ParamRoleDecl.java | 6 +++--- .../ext/go/ast/global/ParamGCrossMessageTransfer.java | 4 ++-- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java index 249c8a867..12ef42b78 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java @@ -43,9 +43,9 @@ public ParamRoleDecl clone(AstFactory af) @Override public ParamRoleDecl project(AstFactory af, Role self) { - RoleDecl proj = super.project(af, self); - return reconstruct((SimpleNameNode) proj.name, this.params); // FIXME: - //throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing + /*RoleDecl proj = super.project(af, self); + return reconstruct((SimpleNameNode) proj.name, this.params); // FIXME: */ + throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java index 3c3a83527..a3012874e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java @@ -41,8 +41,8 @@ public ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode m @Override public LNode project(AstFactory af, Role self) { - return super.project(af, self); // FIXME - //throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing + //return super.project(af, self); // FIXME + throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing } @Override diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 1b5e80ddd..0beb695e0 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -12,7 +12,7 @@ module assrt.tmp.ParamTest; //type "System.String" from "..." as str; -global protocol Proto1(role A, role B) +global protocol Proto1(role A, role B(m)) { choice at A { From aa39e3bc8cd8e56b7c1e7a269f52dda5e05bed04 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Aug 2017 14:06:13 +0100 Subject: [PATCH 053/433] Added param syntax for actual role params. --- .../org/scribble/type/name/AmbigName.java | 3 +- .../java/org/scribble/type/name/DataType.java | 3 +- .../org/scribble/type/name/GProtocolName.java | 3 +- .../org/scribble/type/name/LProtocolName.java | 3 +- .../scribble/type/name/MessageSigName.java | 3 +- .../org/scribble/type/name/ModuleName.java | 3 +- .../main/java/org/scribble/type/name/Op.java | 3 +- .../org/scribble/type/name/PackageName.java | 3 +- .../java/org/scribble/type/name/RecVar.java | 3 +- .../java/org/scribble/type/name/Role.java | 3 +- .../java/org/scribble/type/name/Scope.java | 3 +- .../scribble/ext/go/ast/ParamAstFactory.java | 2 +- .../ext/go/ast/ParamAstFactoryImpl.java | 2 +- .../global/ParamGCrossMessageTransfer.java | 13 +++++---- .../ast/name/simple/ParamRoleParamNode.java | 1 + .../ParamCoreGProtocolDeclTranslator.java | 4 +-- .../scribble/ext/go/core/type/ParamRange.java | 14 ++++++---- .../ParamAntlrGCrossMessageTransfer.java | 28 ++++++++++--------- .../ext/go/type/name/ParamRoleParam.java | 4 +-- 19 files changed, 48 insertions(+), 53 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/type/name/AmbigName.java b/scribble-core/src/main/java/org/scribble/type/name/AmbigName.java index 7e71c4b2d..5237e9648 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/AmbigName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/AmbigName.java @@ -45,8 +45,7 @@ public boolean equals(Object o) { return false; } - AmbigName n = (AmbigName) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) diff --git a/scribble-core/src/main/java/org/scribble/type/name/DataType.java b/scribble-core/src/main/java/org/scribble/type/name/DataType.java index 7e7aa6a8f..554e4b186 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/DataType.java +++ b/scribble-core/src/main/java/org/scribble/type/name/DataType.java @@ -59,8 +59,7 @@ public boolean equals(Object o) { return false; } - DataType n = (DataType) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) diff --git a/scribble-core/src/main/java/org/scribble/type/name/GProtocolName.java b/scribble-core/src/main/java/org/scribble/type/name/GProtocolName.java index 24172ab23..2a0976220 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/GProtocolName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/GProtocolName.java @@ -47,8 +47,7 @@ public boolean equals(Object o) { return false; } - GProtocolName n = (GProtocolName) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) diff --git a/scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java b/scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java index 3c0540914..57c27613c 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/LProtocolName.java @@ -53,8 +53,7 @@ public boolean equals(Object o) { return false; } - LProtocolName n = (LProtocolName) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) diff --git a/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java b/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java index 09a1837f0..f8e3f039c 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java @@ -67,8 +67,7 @@ public boolean equals(Object o) { return false; } - MessageSigName n = (MessageSigName) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) diff --git a/scribble-core/src/main/java/org/scribble/type/name/ModuleName.java b/scribble-core/src/main/java/org/scribble/type/name/ModuleName.java index d250feea3..0fd526cdc 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/ModuleName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/ModuleName.java @@ -89,8 +89,7 @@ public boolean equals(Object o) { return false; } - ModuleName n = (ModuleName) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) diff --git a/scribble-core/src/main/java/org/scribble/type/name/Op.java b/scribble-core/src/main/java/org/scribble/type/name/Op.java index 56720b373..2e6052c50 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Op.java +++ b/scribble-core/src/main/java/org/scribble/type/name/Op.java @@ -48,8 +48,7 @@ public boolean equals(Object o) { return false; } - Op n = (Op) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) diff --git a/scribble-core/src/main/java/org/scribble/type/name/PackageName.java b/scribble-core/src/main/java/org/scribble/type/name/PackageName.java index 843c1f6c5..20e911c11 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/PackageName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/PackageName.java @@ -49,8 +49,7 @@ public boolean equals(Object o) { return false; } - PackageName n = (PackageName) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) diff --git a/scribble-core/src/main/java/org/scribble/type/name/RecVar.java b/scribble-core/src/main/java/org/scribble/type/name/RecVar.java index b69f8cde7..1487b3cea 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/RecVar.java +++ b/scribble-core/src/main/java/org/scribble/type/name/RecVar.java @@ -40,8 +40,7 @@ public boolean equals(Object o) { return false; } - RecVar n = (RecVar) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) diff --git a/scribble-core/src/main/java/org/scribble/type/name/Role.java b/scribble-core/src/main/java/org/scribble/type/name/Role.java index 56f4d5ea6..762784952 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Role.java +++ b/scribble-core/src/main/java/org/scribble/type/name/Role.java @@ -43,8 +43,7 @@ public boolean equals(Object o) { return false; } - Role n = (Role) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } @Override diff --git a/scribble-core/src/main/java/org/scribble/type/name/Scope.java b/scribble-core/src/main/java/org/scribble/type/name/Scope.java index b0ed6991d..63fe5bf43 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/Scope.java +++ b/scribble-core/src/main/java/org/scribble/type/name/Scope.java @@ -61,8 +61,7 @@ public boolean equals(Object o) { return false; } - Scope n = (Scope) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java index b28a37bc9..82813c298 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java @@ -15,5 +15,5 @@ public interface ParamAstFactory extends AstFactory ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - int srcRangeStart, int srcRangeEnd, int destRangeStart, int destRangeEnd); + ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index a8ccdb91c..8db050464 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -191,7 +191,7 @@ public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List= 0; end >= start - public final int srcRangeStart; - public final int srcRangeEnd; // Inclusive - public final int destRangeStart; - public final int destRangeEnd; // Inclusive + public final ParamRoleParamNode srcRangeStart; + public final ParamRoleParamNode srcRangeEnd; // Inclusive + public final ParamRoleParamNode destRangeStart; + public final ParamRoleParamNode destRangeEnd; // Inclusive public ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - int srcRangeStart, int srcRangeEnd, int destRangeStart, int destRangeEnd) + ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) { super(source, src, msg, Arrays.asList(dest)); this.srcRangeStart = srcRangeStart; @@ -69,7 +70,7 @@ public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, Lis } public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, - int srcRangeStart, int srcRangeEnd, int destRangeStart, int destRangeEnd) + ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) { ScribDel del = del(); ParamGCrossMessageTransfer gmt = new ParamGCrossMessageTransfer(this.source, src, msg, dest, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java index 746ba46eb..62905540c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java @@ -7,6 +7,7 @@ import org.scribble.ext.go.type.name.ParamRoleParam; +// Currently used for both "actual params" and int literals public class ParamRoleParamNode extends SimpleNameNode { public ParamRoleParamNode(CommonTree source, String identifier) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index 302554411..7fc338b62 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -204,8 +204,8 @@ private ParamCoreGChoice parseGMessageTransfer(List is, Map { private static final long serialVersionUID = 1L; @@ -28,8 +29,7 @@ public boolean equals(Object o) { return false; } - ParamRoleParam n = (ParamRoleParam) o; - return n.canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } public boolean canEqual(Object o) From a7429d8d2a4ba3c3f369e9a1fbedde3e9d7a65c2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Aug 2017 14:26:39 +0100 Subject: [PATCH 054/433] Continued on param-core role params. --- .../scribble/ext/go/cli/ParamCommandLine.java | 21 ++++++++++++++++--- .../scribble/ext/go/core/type/ParamRange.java | 9 ++++++++ .../ext/go/type/name/ParamRoleParam.java | 15 ++++++++++++- .../src/test/scrib/param/tmp/ParamTest.scr | 9 ++++---- 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 9ccf33d81..3ef5d08d5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -27,6 +27,7 @@ import org.scribble.ext.go.main.ParamException; import org.scribble.ext.go.main.ParamJob; import org.scribble.ext.go.main.ParamMainContext; +import org.scribble.ext.go.type.name.ParamRoleParam; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; @@ -297,7 +298,9 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy if (cand.size() > 0) { - z3 += cand.stream().map(c -> "(and (>= id " + c.start + ") (<= id " + c.end + "))") + z3 += cand.stream().map(c -> "(and (>= id " + c.start + ") (<= id " + c.end + ")" + + ((!c.start.isConstant() || !c.end.isConstant()) ? "(<= " + c.start + " " + c.end + ") " : "") + + ")") .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); } @@ -307,15 +310,27 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy { z3 = "(and " + z3 + " "; } - z3 += coset.stream().map(c -> "(or (< id " + c.start + ") (> id " + c.end + "))") + z3 += coset.stream().map(c -> "(or (< id " + c.start + ") (> id " + c.end + ")" + + ((!c.start.isConstant() || !c.end.isConstant()) ? "(<= " + c.start + " " + c.end + ") " : "") + + ")") .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); if (cand.size() > 0) { z3 += ")"; } } + + Set actuals = cand.stream().flatMap(c -> c.getActualParams().stream()).collect(Collectors.toSet()); + actuals.addAll(coset.stream().flatMap(c -> c.getActualParams().stream()).collect(Collectors.toSet())); + //if (!actuals.isEmpty()) + { + z3 = "(exists ((id Int) " + + actuals.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + + ") " + z3 + ")"; + } - z3 = "(declare-const id Int)\n(assert " + z3 + ")"; + z3 = //"(declare-const id Int)\n + "(assert " + z3 + ")"; System.out.println("cand: " + cand); System.out.println("coset: " + coset); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java index c5f9c8c05..27a705d29 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java @@ -1,5 +1,9 @@ package org.scribble.ext.go.core.type; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.scribble.ext.go.type.name.ParamRoleParam; public class ParamRange @@ -13,6 +17,11 @@ public ParamRange(ParamRoleParam start, ParamRoleParam end) this.end = end; } + public Set getActualParams() // Hack + { + return Stream.of(this.start, this.end).filter(p -> !p.isConstant()).collect(Collectors.toSet()); + } + @Override public int hashCode() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java b/scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java index b53993fdf..4ecc5c004 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java @@ -3,7 +3,7 @@ import org.scribble.ext.go.type.kind.ParamRoleParamKind; import org.scribble.type.name.AbstractName; -// Currently used for both "actual params" and int literals -- cf ParamRoleParamRoleNode +// Currently used for both "actual params" and int literals -- cf. ParamRoleParamRoleNode, and isConstant public class ParamRoleParam extends AbstractName { private static final long serialVersionUID = 1L; @@ -17,6 +17,19 @@ public ParamRoleParam(String text) { super(ParamRoleParamKind.KIND, text); } + + public boolean isConstant() + { + try + { + Integer.valueOf(this.toString()); + return true; + } + catch (NumberFormatException e) + { + return false; + } + } @Override public boolean equals(Object o) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 0beb695e0..c06f452ad 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -12,16 +12,17 @@ module assrt.tmp.ParamTest; //type "System.String" from "..." as str; -global protocol Proto1(role A, role B(m)) +global protocol Proto1(role A, role B(n)) { choice at A { - 1() from A[1..1] to B[1..2]; + 1() from A[1..1] to B[1..n]; 2() from B[1..1] to A[1..1]; } or { - 3() from A[1..1] to B[1..2]; - 4() from B[2..2] to A[1..1]; + 3() from A[1..1] to B[1..n]; + //4() from B[2..2] to A[1..1]; + 4() from B[1..1] to A[1..1]; } } From 3601360cd13a485b00c1ef8278514d3b43ad593e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Aug 2017 14:42:42 +0100 Subject: [PATCH 055/433] Fixed param-core coset z3 bug." -a --- .../scribble/ext/go/cli/ParamCommandLine.java | 6 +-- .../src/test/scrib/param/tmp/ParamTest.scr | 38 ++++++++++++++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 3ef5d08d5..bcdd44c8f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -299,7 +299,7 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy if (cand.size() > 0) { z3 += cand.stream().map(c -> "(and (>= id " + c.start + ") (<= id " + c.end + ")" - + ((!c.start.isConstant() || !c.end.isConstant()) ? "(<= " + c.start + " " + c.end + ") " : "") + + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start + " " + c.end + ")" : "") + ")") .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); } @@ -310,8 +310,8 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy { z3 = "(and " + z3 + " "; } - z3 += coset.stream().map(c -> "(or (< id " + c.start + ") (> id " + c.end + ")" - + ((!c.start.isConstant() || !c.end.isConstant()) ? "(<= " + c.start + " " + c.end + ") " : "") + z3 += coset.stream().map(c -> "(and (not (and (>= id " + c.start + ") (<= id " + c.end + ")))" + + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start + " " + c.end + ")" : "") + ")") .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); if (cand.size() > 0) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index c06f452ad..c15d8f3cb 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -12,6 +12,25 @@ module assrt.tmp.ParamTest; //type "System.String" from "..." as str; +//* +global protocol Proto1(role A, role B(n)) +{ + 1() from A[1..1] to B[1..n]; + 2() from B[1..n] to A[1..1]; +} +//*/ + + +/* +global protocol Proto1(role A, role B(n)) // n = 1 gives 2 roles; n > 1 gives 3 roles +{ + 1() from A[1..1] to B[1..n]; + 2() from B[1..1] to A[1..1]; +} +//*/ + + +/* global protocol Proto1(role A, role B(n)) { choice at A @@ -22,7 +41,24 @@ global protocol Proto1(role A, role B(n)) or { 3() from A[1..1] to B[1..n]; - //4() from B[2..2] to A[1..1]; 4() from B[1..1] to A[1..1]; } } +//*/ + + +/* +global protocol Proto1(role A, role B) +{ + choice at A + { + 1() from A[1..1] to B[1..2]; + 2() from B[1..1] to A[1..1]; + } + or + { + 3() from A[1..1] to B[1..2]; + 4() from B[1..1] to A[1..1]; + } +} +//*/ From 3a441bb9c87f9ed7e3bc7bb399ca75f33d36f5b2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Aug 2017 14:45:38 +0100 Subject: [PATCH 056/433] Minor. --- .../statetype/go/GoEndpointApiGenerator.java | 13 ------------- .../statetype/go/GoSTBranchActionBuilder.java | 13 ------------- .../statetype/go/GoSTBranchStateBuilder.java | 13 ------------- .../codegen/statetype/go/GoSTCaseActionBuilder.java | 13 ------------- .../go/codegen/statetype/go/GoSTCaseBuilder.java | 13 ------------- .../codegen/statetype/go/GoSTEndStateBuilder.java | 13 ------------- .../statetype/go/GoSTOutputStateBuilder.java | 13 ------------- .../statetype/go/GoSTReceiveActionBuilder.java | 13 ------------- .../statetype/go/GoSTReceiveStateBuilder.java | 13 ------------- .../codegen/statetype/go/GoSTSendActionBuilder.java | 13 ------------- .../codegen/statetype/go/GoSTSessionAPIBuilder.java | 13 ------------- .../statetype/go/GoSTStateChanAPIBuilder.java | 13 ------------- 12 files changed, 156 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java index 55c637863..805778fae 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import java.util.Map; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java index 46d6ba454..002e6e7cd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import java.util.stream.Collectors; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java index c2bf20fc0..60fd7d7c2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import org.scribble.codegen.statetype.STBranchStateBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java index 2cc369ae4..4fb9e0452 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import java.util.stream.Collectors; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java index 2932ccb10..fa0562fc2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import java.util.HashMap; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java index e69615d68..b39678c05 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import org.scribble.codegen.statetype.STStateChanAPIBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java index af3792dc0..2ac14cec1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import org.scribble.codegen.statetype.STStateChanAPIBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java index f41386d0e..2681ac34f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import java.util.stream.Collectors; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java index 71201b871..1d7632ee2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import org.scribble.codegen.statetype.STStateChanAPIBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java index 922081b67..03f11b712 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import java.util.stream.Collectors; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java index 7af2bb555..ae89cb33d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import java.util.HashMap; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java index 06cb92377..603bc97c5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java @@ -1,16 +1,3 @@ -/** - * Copyright 2008 The Scribble Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ package org.scribble.ext.go.codegen.statetype.go; import java.util.Map; From 3bc47dd59199550de54c6f510cae1d0955e8c62f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 24 Aug 2017 20:33:15 +0100 Subject: [PATCH 057/433] Added param-core EFSM translation. --- .../statetype/STStateChanAPIBuilder.java | 4 +- .../scribble/ext/go/cli/ParamCommandLine.java | 44 +++++--- .../endpoint/ParamCoreEGraphBuilder.java | 100 ++++++++++++++++++ .../endpoint/ParamCoreEModelFactory.java | 15 +++ .../endpoint/ParamCoreEModelFactoryImpl.java | 39 +++++++ .../endpoint/action/ParamCoreEAction.java | 9 ++ .../endpoint/action/ParamCoreEReceive.java | 65 ++++++++++++ .../model/endpoint/action/ParamCoreESend.java | 65 ++++++++++++ .../ext/go/main/ParamMainContext.java | 16 +-- .../src/test/scrib/param/tmp/ParamTest.scr | 43 +++++--- 10 files changed, 365 insertions(+), 35 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEReceive.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreESend.java diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java index a158f719a..ee07cfe1b 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java @@ -70,7 +70,7 @@ public Map build() // filepath -> source { switch (s.getStateKind()) { - case ACCEPT: throw new RuntimeException("TODO"); + case ACCEPT: throw new RuntimeException("[TODO]: " + s.getStateKind()); case OUTPUT: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; case POLY_INPUT: { @@ -85,7 +85,7 @@ public Map build() // filepath -> source //api.put(getFilePath(getStateChanName(s) + "_Cases"), this.cb.build(this, s)); // FIXME: factor out break; } - case WRAP_SERVER: throw new RuntimeException("TODO"); + case WRAP_SERVER: throw new RuntimeException("[TODO]: " + s.getStateKind()); default: throw new RuntimeException("Shouldn't get in here: " + s); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index bcdd44c8f..b4e58fe87 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -22,6 +22,7 @@ import org.scribble.ext.go.core.ast.global.ParamCoreGProtocolDeclTranslator; import org.scribble.ext.go.core.ast.global.ParamCoreGType; import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.model.endpoint.ParamCoreEGraphBuilder; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.ext.go.main.ParamException; @@ -35,6 +36,8 @@ import org.scribble.main.ScribbleException; import org.scribble.main.resource.DirectoryResourceLocator; import org.scribble.main.resource.ResourceLocator; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; import org.scribble.util.ScribParserException; @@ -42,6 +45,11 @@ public class ParamCommandLine extends CommandLine { protected final Map paramArgs; // Maps each flag to list of associated argument values + + // HACK: store in (Core) Job/JobContext? + protected GProtocolDecl gpd; + protected Map, EState>> E0; // FIXME: make a "proper role" for param APIs + //protected ParamCoreSModel model; public ParamCommandLine(String... args) throws CommandLineException { @@ -201,29 +209,44 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro System.out.println("\n\n[param-core] Protoroles: " + protoRoles); - Map P0 = new HashMap<>(); - for (Role r : gpd.header.roledecls.getRoles()) + Map, ParamCoreLType>> P0 = new HashMap<>(); + for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? { for (Set ranges : protoRoles.get(r)) { ParamCoreLType lt = gt.project(af, r, ranges); - P0.put(r, lt); + Map, ParamCoreLType> tmp = P0.get(r); + if (tmp == null) + { + tmp = new HashMap<>(); + P0.put(r, tmp); + } + tmp.put(ranges, lt); job.debugPrintln("\n[param-core] Projected onto " + r + " for " + ranges + ":\n " + lt); } } - /*ParamCoreEGraphBuilder builder = new ParamCoreEGraphBuilder(job); + ParamCoreEGraphBuilder builder = new ParamCoreEGraphBuilder(job); this.E0 = new HashMap<>(); for (Role r : P0.keySet()) { - EGraph g = builder.build(P0.get(r)); - this.E0.put(r, (ParamEState) g.init); + for (Set ranges : P0.get(r).keySet()) + { + EGraph g = builder.build(P0.get(r).get(ranges)); + Map, EState> tmp = this.E0.get(r); + if (tmp == null) + { + tmp = new HashMap<>(); + this.E0.put(r, tmp); + } + tmp.put(ranges, g.init); - job.debugPrintln("\n[param-core] Built endpoint graph for " + r + ":\n" + g.toDot()); + job.debugPrintln("\n[param-core] Built endpoint graph for " + r + " for " + ranges + ":\n" + g.toDot()); + } } - assrtCoreValidate(job, simpname, gpd.isExplicitModifier());//, this.E0); // TODO + /*assrtCoreValidate(job, simpname, gpd.isExplicitModifier());//, this.E0); // TODO /*if (!job.fair) { @@ -344,11 +367,6 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy } return protoRoles; } - - // HACK: store in (Core) Job/JobContext? - protected GProtocolDecl gpd; - /*protected Map E0; // There is no core version - protected ParamCoreSModel model;*/ /*// FIXME: factor out -- cf. super.doAttemptableOutputTasks @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java new file mode 100644 index 000000000..6874e2952 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -0,0 +1,100 @@ +package org.scribble.ext.go.core.model.endpoint; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.scribble.ext.go.core.ast.ParamCoreMessage; +import org.scribble.ext.go.core.ast.ParamCoreRecVar; +import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; +import org.scribble.ext.go.core.ast.local.ParamCoreLChoice; +import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; +import org.scribble.ext.go.core.ast.local.ParamCoreLRec; +import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.ParamJob; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EGraphBuilderUtil; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.RecVar; + +public class ParamCoreEGraphBuilder +{ + + private final ParamJob job; + private final EGraphBuilderUtil util; // Not using any features for unguarded choice/recursion/continue (recursion manually tracked here) + + public ParamCoreEGraphBuilder(ParamJob job) + { + this.job = job; + this.util = new EGraphBuilderUtil(job.ef); + } + + public EGraph build(ParamCoreLType lt) + { + this.util.init(this.job.ef.newEState(Collections.emptySet())); + build(lt, this.util.getEntry(), this.util.getExit(), new HashMap<>()); + return this.util.finalise(); + } + + private void build(ParamCoreLType lt, EState s1, EState s2, Map recs) + { + if (lt instanceof ParamCoreLChoice) + { + ParamCoreLChoice lc = (ParamCoreLChoice) lt; + lc.cases.entrySet().stream().forEach(e -> + buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.kind, e.getKey(), e.getValue()) + ); + } + else if (lt instanceof ParamCoreLRec) + { + ParamCoreLRec lr = (ParamCoreLRec) lt; + Map tmp = new HashMap<>(recs); + tmp.put(lr.recvar, s1); + build(lr.body, s1, s2, tmp); + } + else + { + throw new RuntimeException("[assrt-core] Shouldn't get in here: " + lt); + } + } + + private void buildEdgeAndContinuation(EState s1, EState s2, Map recs, + ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a, ParamCoreLType cont) + { + if (cont instanceof ParamCoreLEnd) + { + this.util.addEdge(s1, toEAction(r, k, a), s2); + } + else if (cont instanceof ParamCoreRecVar) + { + EState s = recs.get(((ParamCoreRecVar) cont).recvar); + this.util.addEdge(s1, toEAction(r, k, a), s); + } + else + { + EState s = this.util.ef.newEState(Collections.emptySet()); + this.util.addEdge(s1, toEAction(r, k, a), s); + build(cont, s, s2, recs); + } + } + + private EAction toEAction(ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a) + { + ParamCoreEModelFactory ef = (ParamCoreEModelFactory) this.util.ef; // FIXME: factor out + if (k.equals(ParamCoreLActionKind.SEND)) + { + return ef.newParamCoreESend(r, a.op, a.pay); + + } + else if (k.equals(ParamCoreLActionKind.RECEIVE)) + { + return ef.newParamCoreEReceive(r, a.op, a.pay); + } + else + { + throw new RuntimeException("[assrt-core] Shouldn't get in here: " + k); + } + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java new file mode 100644 index 000000000..94f32dcb9 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java @@ -0,0 +1,15 @@ +package org.scribble.ext.go.core.model.endpoint; + +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreESend; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.model.endpoint.EModelFactory; +import org.scribble.type.Payload; +import org.scribble.type.name.MessageId; + +public interface ParamCoreEModelFactory extends EModelFactory +{ + + ParamCoreESend newParamCoreESend(ParamRole peer, MessageId mid, Payload payload); + ParamCoreEReceive newParamCoreEReceive(ParamRole peer, MessageId mid, Payload payload); +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java new file mode 100644 index 000000000..bb9515c80 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java @@ -0,0 +1,39 @@ +package org.scribble.ext.go.core.model.endpoint; + +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreESend; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.model.endpoint.EModelFactoryImpl; +import org.scribble.model.endpoint.actions.EReceive; +import org.scribble.model.endpoint.actions.ESend; +import org.scribble.type.Payload; +import org.scribble.type.name.MessageId; +import org.scribble.type.name.Role; + +public class ParamCoreEModelFactoryImpl extends EModelFactoryImpl implements ParamCoreEModelFactory +{ + + @Override + public ESend newESend(Role peer, MessageId mid, Payload payload) + { + throw new RuntimeException("[param-core] Shouldn't get in here: "); + } + + @Override + public EReceive newEReceive(Role peer, MessageId mid, Payload payload) + { + throw new RuntimeException("[param-core] Shouldn't get in here: "); + } + + @Override + public ParamCoreESend newParamCoreESend(ParamRole peer, MessageId mid, Payload payload) + { + return new ParamCoreESend(this, peer, mid, payload); + } + + @Override + public ParamCoreEReceive newParamCoreEReceive(ParamRole peer, MessageId mid, Payload payload) + { + return new ParamCoreEReceive(this, peer, mid, payload); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java new file mode 100644 index 000000000..7946269b9 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java @@ -0,0 +1,9 @@ +package org.scribble.ext.go.core.model.endpoint.action; + +import org.scribble.ext.go.core.type.ParamRole; + +public interface ParamCoreEAction +{ + + ParamRole getPeer(); +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEReceive.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEReceive.java new file mode 100644 index 000000000..d4cea453f --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEReceive.java @@ -0,0 +1,65 @@ +package org.scribble.ext.go.core.model.endpoint.action; + +import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.model.endpoint.actions.EReceive; +import org.scribble.model.global.SModelFactory; +import org.scribble.model.global.actions.SReceive; +import org.scribble.type.Payload; +import org.scribble.type.name.MessageId; +import org.scribble.type.name.Role; + +public class ParamCoreEReceive extends EReceive implements ParamCoreEAction +{ + + public ParamCoreEReceive(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + { + super(ef, peer, mid, payload); + } + + @Override + public ParamRole getPeer() + { + return (ParamRole) this.peer; + } + + @Override + public ParamCoreESend toDual(Role self) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this); + } + + @Override + public SReceive toGlobal(SModelFactory sf, Role self) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this); + } + + @Override + public int hashCode() + { + int hash = 6763; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamCoreEReceive)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof ParamCoreEReceive; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreESend.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreESend.java new file mode 100644 index 000000000..38df459a1 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreESend.java @@ -0,0 +1,65 @@ +package org.scribble.ext.go.core.model.endpoint.action; + +import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.model.endpoint.actions.ESend; +import org.scribble.model.global.SModelFactory; +import org.scribble.model.global.actions.SSend; +import org.scribble.type.Payload; +import org.scribble.type.name.MessageId; +import org.scribble.type.name.Role; + +public class ParamCoreESend extends ESend implements ParamCoreEAction +{ + + public ParamCoreESend(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + { + super(ef, peer, mid, payload); + } + + @Override + public ParamRole getPeer() + { + return (ParamRole) this.peer; + } + + @Override + public ParamCoreEReceive toDual(Role self) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this); + } + + @Override + public SSend toGlobal(SModelFactory sf, Role self) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this); + } + + @Override + public int hashCode() + { + int hash = 6779; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamCoreESend)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof ParamCoreESend; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java index bbbaf7e61..ebc4ccc70 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java @@ -2,14 +2,15 @@ import java.nio.file.Path; -import org.scribble.ast.AstFactory; +import org.scribble.ext.go.ast.ParamAstFactory; import org.scribble.ext.go.ast.ParamAstFactoryImpl; +import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; +import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactoryImpl; import org.scribble.ext.go.parser.scribble.ParamAntlrToScribParser; import org.scribble.ext.go.parser.scribble.ParamScribbleAntlrWrapper; import org.scribble.main.MainContext; import org.scribble.main.ScribbleException; import org.scribble.main.resource.ResourceLocator; -import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ScribbleAntlrWrapper; import org.scribble.util.ScribParserException; @@ -38,24 +39,23 @@ protected ScribbleAntlrWrapper newAntlrParser() } @Override - protected AntlrToScribParser newScribParser() + protected ParamAntlrToScribParser newScribParser() { return new ParamAntlrToScribParser(); } - protected AstFactory newAstFactory() + protected ParamAstFactory newAstFactory() { return new ParamAstFactoryImpl(); } - /*@Override - protected EModelFactory newEModelFactory() + @Override + protected ParamCoreEModelFactory newEModelFactory() { - //return new ParamEModelFactoryImpl(); return new ParamCoreEModelFactoryImpl(); // HACK FIXME } - @Override + /*@Override protected SModelFactory newSModelFactory() { //return new ParamSModelFactoryImpl(); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index c15d8f3cb..21fa8f3e5 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -12,7 +12,7 @@ module assrt.tmp.ParamTest; //type "System.String" from "..." as str; -//* +/* global protocol Proto1(role A, role B(n)) { 1() from A[1..1] to B[1..n]; @@ -30,24 +30,43 @@ global protocol Proto1(role A, role B(n)) // n = 1 gives 2 roles; n > 1 gives 3 //*/ +/* +global protocol Proto1(role A, role B(n,m)) +{ + 1() from A[1..1] to B[1..n]; + 2() from B[1..m] to A[1..1]; +} +//*/ + + +/* +global protocol Proto1(role A(n), role B(m)) +{ + 1() from A[1..n] to B[1..m]; + 2() from B[1..m] to A[1..n]; +} +//*/ + + /* global protocol Proto1(role A, role B(n)) { - choice at A - { - 1() from A[1..1] to B[1..n]; - 2() from B[1..1] to A[1..1]; - } - or - { - 3() from A[1..1] to B[1..n]; - 4() from B[1..1] to A[1..1]; - } + 1() from A[1..1] to B[1..n]; + 2() from B[2..n] to A[1..1]; } //*/ /* +global protocol Proto1(role A, role B(n,m)) +{ + 1() from A[1..1] to B[1..n]; + 2() from B[2..m] to A[1..1]; +} +//*/ + + +//* global protocol Proto1(role A, role B) { choice at A @@ -58,7 +77,7 @@ global protocol Proto1(role A, role B) or { 3() from A[1..1] to B[1..2]; - 4() from B[1..1] to A[1..1]; + 4() from B[2..2] to A[1..1]; } } //*/ From 413f73c578ffe1980d195a71a4d83595f81486e8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 25 Aug 2017 00:59:06 +0100 Subject: [PATCH 058/433] Added some param-core CL output options. --- .../scribble/ext/go/cli/ParamCLArgFlag.java | 4 ++ .../scribble/ext/go/cli/ParamCLArgParser.java | 35 +++++++++++++++++- .../scribble/ext/go/cli/ParamCommandLine.java | 37 +++++++++++-------- .../test/scrib/param/cgo18/ScatterGather.scr | 19 ++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 4 +- 5 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java index 44d5761ac..cf70b7efd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java @@ -6,5 +6,9 @@ public enum ParamCLArgFlag PARAM, // Non-unique flags + + // Non-unique flags + PARAM_CORE_EFSM, + PARAM_CORE_EFSM_PNG, GO_API_GEN } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java index 91e1947c8..0c80935f4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java @@ -10,10 +10,12 @@ public class ParamCLArgParser extends CLArgParser { // Unique flags - public static final String PARAM_FLAG = "-param"; + public static final String PARAM_FLAG = "-param"; // Non-unique flags - public static final String GO_API_GEN_FLAG = "-goapi"; + public static final String GO_API_GEN_FLAG = "-goapi"; + public static final String PARAM_CORE_EFSM_FLAG = "-param-fsm"; + public static final String PARAM_CORE_EFSM_PNG_FLAG = "-param-fsmpng"; private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); { @@ -22,6 +24,8 @@ public class ParamCLArgParser extends CLArgParser private static final Map PARAM_NON_UNIQUE_FLAGS = new HashMap<>(); { + ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.PARAM_CORE_EFSM_FLAG, ParamCLArgFlag.PARAM_CORE_EFSM); + ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.PARAM_CORE_EFSM_PNG_FLAG, ParamCLArgFlag.PARAM_CORE_EFSM_PNG); ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.GO_API_GEN_FLAG, ParamCLArgFlag.GO_API_GEN); } @@ -68,6 +72,8 @@ protected int parseFlag(int i) throws CommandLineException // Non-unique flags + case ParamCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); + case ParamCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); case ParamCLArgParser.GO_API_GEN_FLAG: { return goParseProtoAndRoleArgs(flag, i); @@ -104,6 +110,31 @@ private void paramCheckAndAddUniqueFlag(String flag, String[] args) throws Comma this.paramParsed.put(argFlag, args); } + private int paramParseRoleArg(String f, int i) throws CommandLineException + { + ParamCLArgFlag flag = ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + if ((i + 1) >= this.args.length) + { + throw new CommandLineException("Missing role argument"); + } + String role = this.args[++i]; + goConcatArgs(flag, role); + return i; + } + + protected int paramParseRoleAndFileArgs(String f, int i) throws CommandLineException + { + ParamCLArgFlag flag = ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + if ((i + 2) >= this.args.length) + { + throw new CommandLineException("Missing role/file arguments"); + } + String role = this.args[++i]; + String png = this.args[++i]; + goConcatArgs(flag, role, png); + return i; + } + // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index b4e58fe87..90d849dfe 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -8,6 +8,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; @@ -368,44 +369,50 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy return protoRoles; } - /*// FIXME: factor out -- cf. super.doAttemptableOutputTasks + // FIXME: factor out -- cf. super.doAttemptableOutputTasks @Override protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleException { - if (this.assrtCoreArgs.containsKey(ParamCoreCLArgFlag.ASSRT_CORE_EFSM)) + if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_EFSM)) { - String[] args = this.assrtCoreArgs.get(ParamCoreCLArgFlag.ASSRT_CORE_EFSM); + String[] args = this.paramArgs.get(ParamCLArgFlag.PARAM_CORE_EFSM); for (int i = 0; i < args.length; i += 1) { -i Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); - String out = E0.get(role).toDot(); - System.out.println("\n" + out); // Endpoint graphs are "inlined" (a single graph is built) + Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); + this.E0.get(role).entrySet().forEach(e -> + { + String out = e.getValue().toDot(); + System.out.println("\n" + role + " " + e.getKey() + ":\n" + out); // Endpoint graphs are "inlined" (a single graph is built) + }); } } - if (this.assrtCoreArgs.containsKey(ParamCoreCLArgFlag.ASSRT_CORE_EFSM_PNG)) + if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_EFSM_PNG)) { - String[] args = this.assrtCoreArgs.get(ParamCoreCLArgFlag.ASSRT_CORE_EFSM_PNG); + String[] args = this.paramArgs.get(ParamCLArgFlag.PARAM_CORE_EFSM_PNG); for (int i = 0; i < args.length; i += 2) { Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); String png = args[i+1]; - String out = E0.get(role).toDot(); - runDot(out, png); + for (Entry, EState> e : this.E0.get(role).entrySet()) + { + String out = e.getValue().toDot(); + runDot(out, png); + } } } - if (this.assrtCoreArgs.containsKey(ParamCoreCLArgFlag.ASSRT_CORE_MODEL)) + /*if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_MODEL)) { System.out.println("\n" + model.toDot()); } - if (this.assrtCoreArgs.containsKey(ParamCoreCLArgFlag.ASSRT_CORE_MODEL_PNG)) + if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_MODEL_PNG)) { - String[] arg = this.assrtCoreArgs.get(ParamCoreCLArgFlag.ASSRT_CORE_MODEL_PNG); + String[] arg = this.paramArgs.get(ParamCLArgFlag.PARAM_CORE_MODEL_PNG); String png = arg[0]; runDot(model.toDot(), png); - } + }*/ } - private void assrtCoreValidate(Job job, GProtocolName simpname, boolean isExplicit, + /*private void assrtCoreValidate(Job job, GProtocolName simpname, boolean isExplicit, //Map E0, boolean... unfair) throws ScribbleException, CommandLineException { diff --git a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr new file mode 100644 index 000000000..c90e84ce2 --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr @@ -0,0 +1,19 @@ +//Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cg018/ScatterGather.scr -V -param Proto1 + + +module assrt.cg018.ScatterGather; + + +type "int" from "..." as int; + + +//* +global protocol Proto1(role A, role B(k)) +{ + scatter(int) from A[1..1] to B[1..k]; + gather(int) from B[1..k] to A[1..1]; +} +//*/ + + diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 21fa8f3e5..856f27728 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,8 +8,8 @@ module assrt.tmp.ParamTest; -//type "System.UInt32" from "..." as int; -//type "System.String" from "..." as str; +//type "int" from "..." as int; +//type "string" from "..." as string; /* From cbef1ac7e135144aea6cd79efd64013e619aec66 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 25 Aug 2017 01:05:45 +0100 Subject: [PATCH 059/433] Minor. --- .../java/org/scribble/ext/go/cli/ParamCommandLine.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 90d849dfe..ddb3a14f3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -208,7 +208,7 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro Map>> protoRoles = getProtoRoles(job, gt); - System.out.println("\n\n[param-core] Protoroles: " + protoRoles); + job.debugPrintln("\n[param-core] Computed roles: " + protoRoles); Map, ParamCoreLType>> P0 = new HashMap<>(); for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? @@ -312,7 +312,7 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy { Set> powset = powersets.get(r); - System.out.println("\n" + r + ": " + powset); + job.debugPrintln("\n[param-core] Ranges powerset for " + r + ": " + powset); for (Set cand : powset) { @@ -356,9 +356,9 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy z3 = //"(declare-const id Int)\n "(assert " + z3 + ")"; - System.out.println("cand: " + cand); - System.out.println("coset: " + coset); - System.out.println("z3: " + z3); + job.debugPrintln("\n[param-core] Candidate role: " + cand); + job.debugPrintln("[param-core] Ranges co-set: " + coset); + job.debugPrintln("[param-core] Running Z3 on:\n" + z3); if (Z3Wrapper.checkSat(job, gpd, z3)) { From 3823285a4dff2482cf06eadb8fe1417ba762c4ae Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 25 Aug 2017 13:48:59 +0100 Subject: [PATCH 060/433] Adding param-core dot-transfers. --- .../org/scribble/parser/antlr/ParamScribble.g | 7 ++ .../scribble/ext/go/ast/ParamAstFactory.java | 3 + .../ext/go/ast/ParamAstFactoryImpl.java | 12 ++- .../global/ParamGCrossMessageTransfer.java | 43 +---------- .../ast/global/ParamGDotMessageTransfer.java | 62 +++++++++++++++ .../go/ast/global/ParamGMessageTransfer.java | 62 +++++++++++++++ .../ParamCoreGProtocolDeclTranslator.java | 2 +- .../scribble/ParamAntlrToScribParser.java | 4 + .../ParamAntlrGCrossMessageTransfer.java | 1 + .../global/ParamAntlrGDotMessageTransfer.java | 76 +++++++++++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 32 +++++++- 11 files changed, 261 insertions(+), 43 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 43493fa31..f173e2b59 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -62,6 +62,8 @@ tokens DO_KW = 'do'; //SPAWN_KW = 'spawn'; + DOT_KW = 'dot'; + /* * Parser output "node types" (corresponding to the various syntactic @@ -169,6 +171,7 @@ tokens PARAM_ROLEDECL = 'PARAM_ROLEDECL'; PARAM_GLOBALCROSSMESSAGETRANSFER = 'PARAM_GLOBALCROSSMESSAGETRANSFER'; + PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; } @@ -657,6 +660,10 @@ globalmessagetransfer: message FROM_KW rolename '[' simplename '..' simplename ']' TO_KW rolename '[' simplename '..' simplename ']' ';' -> ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename simplename simplename simplename simplename) +| + message DOT_KW rolename '[' simplename '..' simplename ']' TO_KW rolename '[' simplename '..' simplename ']' ';' +-> + ^(PARAM_GLOBALDOTMESSAGETRANSFER message rolename rolename simplename simplename simplename simplename) ; message: diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java index 82813c298..97de30f6c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java @@ -7,6 +7,7 @@ import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; +import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; @@ -16,4 +17,6 @@ public interface ParamAstFactory extends AstFactory ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); + ParamGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index 8db050464..0714422d2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -10,12 +10,12 @@ import org.scribble.del.RoleDeclDel; import org.scribble.del.global.GMessageTransferDel; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; +import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; import org.scribble.ext.go.type.kind.ParamRoleParamKind; import org.scribble.type.kind.Kind; -// FIXME: separate modified-del-only from new categories public class ParamAstFactoryImpl extends AstFactoryImpl implements ParamAstFactory { @@ -198,6 +198,16 @@ public ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, mt = del(mt, new GMessageTransferDel()); // FIXME return mt; } + + @Override + public ParamGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + { + ParamGDotMessageTransfer mt = new ParamGDotMessageTransfer(source, src, msg, dest, + srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); + mt = del(mt, new GMessageTransferDel()); // FIXME + return mt; + } @Override public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java index e2ea277ae..4c9232488 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java @@ -1,42 +1,23 @@ package org.scribble.ext.go.ast.global; -import java.util.Arrays; -import java.util.List; - import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.Constants; import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageTransfer; -import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; import org.scribble.ext.go.ast.ParamAstFactory; import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; -import org.scribble.main.ScribbleException; -import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -import org.scribble.visit.AstVisitor; // Subsumes scatter/gather, src/dest range length one -public class ParamGCrossMessageTransfer extends GMessageTransfer //implements ParamActionAssertNode +public class ParamGCrossMessageTransfer extends ParamGMessageTransfer { - // ParamRoleNode? -- cf. ParamRoleDecl - // All >= 0; end >= start - public final ParamRoleParamNode srcRangeStart; - public final ParamRoleParamNode srcRangeEnd; // Inclusive - public final ParamRoleParamNode destRangeStart; - public final ParamRoleParamNode destRangeEnd; // Inclusive - public ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) { - super(source, src, msg, Arrays.asList(dest)); - this.srcRangeStart = srcRangeStart; - this.srcRangeEnd = srcRangeEnd; - this.destRangeStart = destRangeStart; - this.destRangeEnd = destRangeEnd; + super(source, src, msg, dest, srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); } @Override @@ -64,11 +45,6 @@ public ParamGCrossMessageTransfer clone(AstFactory af) } @Override - public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) - { - throw new RuntimeException("[param] Shouldn't get in here: " + this); - } - public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) { @@ -79,22 +55,9 @@ public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, Rol return gmt; } - @Override - public MessageTransfer visitChildren(AstVisitor nv) throws ScribbleException - { - RoleNode src = (RoleNode) visitChild(this.src, nv); - MessageNode msg = (MessageNode) visitChild(this.msg, nv); - RoleNode dest = (RoleNode) visitChild(getDestinations().get(0), nv); - return reconstruct(src, msg, dest, this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); - } - @Override public String toString() { - return this.msg + Constants.FROM_KW + " " - + this.src + "[" + this.srcRangeStart + ".." + this.srcRangeEnd + "]" - + " " + Constants.TO_KW + " " - + getDestinations().get(0) + "[" + this.destRangeStart + ".." + this.destRangeEnd + "]" - + ";"; + return this.msg + " " + Constants.FROM_KW + " " + rangesToString(); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java new file mode 100644 index 000000000..eef862c0f --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java @@ -0,0 +1,62 @@ +package org.scribble.ext.go.ast.global; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.Constants; +import org.scribble.ast.MessageNode; +import org.scribble.ast.local.LNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; +import org.scribble.type.name.Role; + +public class ParamGDotMessageTransfer extends ParamGMessageTransfer +{ + public ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + { + super(source, src, msg, dest, srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); + } + + @Override + public LNode project(AstFactory af, Role self) + { + //return super.project(af, self); // FIXME + throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing + } + + @Override + protected ParamGDotMessageTransfer copy() + { + return new ParamGDotMessageTransfer(this.source, this.src, this.msg, getDestinations().get(0), + this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); + } + + @Override + public ParamGDotMessageTransfer clone(AstFactory af) + { + RoleNode src = this.src.clone(af); + MessageNode msg = this.msg.clone(af); + RoleNode dest = getDestinations().get(0).clone(af); + return ((ParamAstFactory) af).ParamGDotMessageTransfer(this.source, src, msg, dest, + this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); + } + + @Override + public ParamGDotMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, + ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + { + ScribDel del = del(); + ParamGDotMessageTransfer gmt = new ParamGDotMessageTransfer(this.source, src, msg, dest, + srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); + gmt = (ParamGDotMessageTransfer) gmt.del(del); + return gmt; + } + + @Override + public String toString() + { + return this.msg + " " + Constants.FROM_KW + " " + rangesToString(); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java new file mode 100644 index 000000000..0324bb4e4 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java @@ -0,0 +1,62 @@ +package org.scribble.ext.go.ast.global; + +import java.util.Arrays; +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.Constants; +import org.scribble.ast.MessageNode; +import org.scribble.ast.MessageTransfer; +import org.scribble.ast.global.GMessageTransfer; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.Global; +import org.scribble.visit.AstVisitor; + +public abstract class ParamGMessageTransfer extends GMessageTransfer //implements ParamActionAssertNode +{ + // ParamRoleNode? -- cf. ParamRoleDecl + // All >= 0; end >= start + public final ParamRoleParamNode srcRangeStart; + public final ParamRoleParamNode srcRangeEnd; // Inclusive + public final ParamRoleParamNode destRangeStart; + public final ParamRoleParamNode destRangeEnd; // Inclusive + + public ParamGMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + { + super(source, src, msg, Arrays.asList(dest)); + this.srcRangeStart = srcRangeStart; + this.srcRangeEnd = srcRangeEnd; + this.destRangeStart = destRangeStart; + this.destRangeEnd = destRangeEnd; + } + + @Override + public ParamGMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) + { + throw new RuntimeException("[param] Shouldn't get in here: " + this); + } + + public abstract ParamGMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, + ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); + + @Override + public MessageTransfer visitChildren(AstVisitor nv) throws ScribbleException + { + RoleNode src = (RoleNode) visitChild(this.src, nv); + MessageNode msg = (MessageNode) visitChild(this.msg, nv); + RoleNode dest = (RoleNode) visitChild(getDestinations().get(0), nv); + return reconstruct(src, msg, dest, this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); + } + + protected String rangesToString() + { + return + this.src + "[" + this.srcRangeStart + ".." + this.srcRangeEnd + "]" + + " " + Constants.TO_KW + " " + + getDestinations().get(0) + "[" + this.destRangeStart + ".." + this.destRangeEnd + "]" + + ";"; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index 7fc338b62..ea7cf7772 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -211,7 +211,7 @@ private ParamCoreGChoice parseGMessageTransfer(List is, Map "int" from "..." as int; //type "string" from "..." as string; + + + +global protocol Proto1(role A(n), role B(n)) +{ + 1() dot A[1..n] to B[1..n]; +} + + + + + + + + + + + + + + + + + + + + + + + /* @@ -66,7 +96,7 @@ global protocol Proto1(role A, role B(n,m)) //*/ -//* +/* global protocol Proto1(role A, role B) { choice at A From d7fbe919c578899207cd8e4790bf1e652862a6de Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 25 Aug 2017 19:26:07 +0100 Subject: [PATCH 061/433] Continued adding param-core dot transfers. --- .../ext/go/core/ast/ParamCoreActionKind.java | 8 +++++++ .../ext/go/core/ast/ParamCoreAstFactory.java | 5 +++-- .../ext/go/core/ast/ParamCoreChoice.java | 11 +++++++--- .../ext/go/core/ast/ParamCoreEnd.java | 5 +++-- .../ext/go/core/ast/ParamCoreRec.java | 5 +++-- .../ext/go/core/ast/ParamCoreRecVar.java | 5 +++-- .../ext/go/core/ast/ParamCoreType.java | 3 ++- .../core/ast/global/ParamCoreGActionKind.java | 21 +++++++++++++++++++ .../go/core/ast/global/ParamCoreGChoice.java | 14 +++++++++---- .../ext/go/core/ast/global/ParamCoreGEnd.java | 3 ++- .../ParamCoreGProtocolDeclTranslator.java | 16 ++++++++++---- .../ext/go/core/ast/global/ParamCoreGRec.java | 3 ++- .../go/core/ast/global/ParamCoreGRecVar.java | 3 ++- .../go/core/ast/global/ParamCoreGType.java | 3 ++- .../core/ast/local/ParamCoreLActionKind.java | 15 +++++++------ .../go/core/ast/local/ParamCoreLChoice.java | 10 +++++++-- .../ext/go/core/ast/local/ParamCoreLEnd.java | 3 ++- .../ext/go/core/ast/local/ParamCoreLRec.java | 3 ++- .../go/core/ast/local/ParamCoreLRecVar.java | 3 ++- .../ext/go/core/ast/local/ParamCoreLType.java | 3 ++- .../endpoint/ParamCoreEGraphBuilder.java | 6 +++--- .../src/test/scrib/param/tmp/ParamTest.scr | 2 +- 22 files changed, 110 insertions(+), 40 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreActionKind.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGActionKind.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreActionKind.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreActionKind.java new file mode 100644 index 000000000..80d6ffe57 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreActionKind.java @@ -0,0 +1,8 @@ +package org.scribble.ext.go.core.ast; + +import org.scribble.type.kind.ProtocolKind; + +public interface ParamCoreActionKind +{ + +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java index da9bf32c9..0047bfe56 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java @@ -2,6 +2,7 @@ import java.util.Map; +import org.scribble.ext.go.core.ast.global.ParamCoreGActionKind; import org.scribble.ext.go.core.ast.global.ParamCoreGChoice; import org.scribble.ext.go.core.ast.global.ParamCoreGEnd; import org.scribble.ext.go.core.ast.global.ParamCoreGRec; @@ -38,9 +39,9 @@ public ParamCoreMessage ParamCoreAction(Op op, Payload pay) return new ParamCoreMessage(op, pay); } - public ParamCoreGChoice ParamCoreGChoice(ParamRole src, ParamRole dest, Map cases) + public ParamCoreGChoice ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest, Map cases) { - return new ParamCoreGChoice(src, dest, cases); + return new ParamCoreGChoice(src, kind, dest, cases); } public ParamCoreGRec ParamCoreGRec(RecVar recvar, ParamCoreGType body) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java index dabc114db..1ddd1004f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java @@ -7,23 +7,28 @@ import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.kind.ProtocolKind; -public abstract class ParamCoreChoice implements ParamCoreType +public abstract class ParamCoreChoice, K extends ProtocolKind> implements ParamCoreType { public final ParamRole role; + public final ParamCoreActionKind kind; public final Map cases; // Pre: cases.size() > 1 - public ParamCoreChoice(ParamRole role, Map cases) + public ParamCoreChoice(ParamRole role, ParamCoreActionKind kind, Map cases) { this.role = role; + this.kind = kind; this.cases = Collections.unmodifiableMap(cases); } + public abstract ParamCoreActionKind getKind(); + @Override public int hashCode() { int hash = 29; hash = 31 * hash + this.role.hashCode(); + hash = 31 * hash + this.kind.hashCode(); hash = 31 * hash + this.cases.hashCode(); return hash; } @@ -41,7 +46,7 @@ public boolean equals(Object obj) } ParamCoreChoice them = (ParamCoreChoice) obj; return them.canEquals(this) - && this.role.equals(them.role) && this.cases.equals(them.cases); + && this.role.equals(them.role) && this.kind.equals(kind) && this.cases.equals(them.cases); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java index ec028a89d..0b1afde54 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java @@ -1,7 +1,8 @@ package org.scribble.ext.go.core.ast; +import org.scribble.type.kind.ProtocolKind; -public abstract class ParamCoreEnd implements ParamCoreType +public abstract class ParamCoreEnd implements ParamCoreType { @Override public String toString() @@ -16,7 +17,7 @@ public boolean equals(Object obj) { return false; } - return ((ParamCoreEnd) obj).canEquals(this); + return ((ParamCoreEnd) obj).canEquals(this); } public abstract boolean canEquals(Object o); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java index 55127a266..6a024641f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java @@ -1,8 +1,9 @@ package org.scribble.ext.go.core.ast; +import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; -public abstract class ParamCoreRec implements ParamCoreType +public abstract class ParamCoreRec, K extends ProtocolKind> implements ParamCoreType { public final RecVar recvar; // FIXME: RecVarNode? (Cf. AssrtCoreAction.op/pay) public final B body; @@ -30,7 +31,7 @@ public boolean equals(Object obj) { return false; } - ParamCoreRec them = (ParamCoreRec) obj; + ParamCoreRec them = (ParamCoreRec) obj; return them.canEquals(this) && this.recvar.equals(them.recvar) && this.body.equals(them.body); // FIXME: check B kind is equal? } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java index 8f227ca55..5dafbc2c0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java @@ -1,9 +1,10 @@ package org.scribble.ext.go.core.ast; +import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; -public abstract class ParamCoreRecVar implements ParamCoreType +public abstract class ParamCoreRecVar implements ParamCoreType { public final RecVar recvar; @@ -25,7 +26,7 @@ public boolean equals(Object obj) { return false; } - ParamCoreRecVar them = (ParamCoreRecVar) obj; + ParamCoreRecVar them = (ParamCoreRecVar) obj; return them.canEquals(this) && this.recvar.equals(them.recvar); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java index bf915f1ff..1f1376b92 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java @@ -1,8 +1,9 @@ package org.scribble.ext.go.core.ast; +import org.scribble.type.kind.ProtocolKind; // ast here means "core syntax" of session types -- it does not link the actual Scribble source (cf. base ast classes) -public interface ParamCoreType +public interface ParamCoreType { boolean canEquals(Object o); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGActionKind.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGActionKind.java new file mode 100644 index 000000000..af54eadfc --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGActionKind.java @@ -0,0 +1,21 @@ +package org.scribble.ext.go.core.ast.global; + +import org.scribble.ext.go.core.ast.ParamCoreActionKind; +import org.scribble.type.kind.Global; + +public enum ParamCoreGActionKind implements ParamCoreActionKind +{ + CROSS_TRANSFER, + DOT_TRANSFER; + + @Override + public String toString() + { + switch (this) + { + case CROSS_TRANSFER: return "->"; + case DOT_TRANSFER: return "=>"; + default: throw new RuntimeException("[param-core] Won't get here: " + this); + } + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index 991cf0381..1c587dece 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -24,12 +24,18 @@ public class ParamCoreGChoice extends ParamCoreChoice im public final ParamRole src; // Singleton -- no disconnect for now public final ParamRole dest; // this.dest == super.role -- arbitrary? - public ParamCoreGChoice(ParamRole src, ParamRole dest, Map cases) + public ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest, Map cases) { - super(dest, cases); + super(dest, kind, cases); this.src = src; this.dest = dest; } + + @Override + public ParamCoreGActionKind getKind() + { + return (ParamCoreGActionKind) this.kind; + } @Override public Set getParamRoles() @@ -55,13 +61,13 @@ public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ra if (this.src.getName().equals(r)) { return (ranges.contains(this.src.range)) - ? af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.SEND, projs) + ? af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.SEND_ALL, projs) : merge(af, r, ranges, projs); } else if (this.dest.getName().equals(r)) { return (ranges.contains(this.dest.range)) - ? af.ParamCoreLChoice(this.src, ParamCoreLActionKind.RECEIVE, projs) + ? af.ParamCoreLChoice(this.src, ParamCoreLActionKind.RECEIVE_ALL, projs) : merge(af, r, ranges, projs); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java index 3583967d6..ff7f411a8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java @@ -8,10 +8,11 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -public class ParamCoreGEnd extends ParamCoreEnd implements ParamCoreGType +public class ParamCoreGEnd extends ParamCoreEnd implements ParamCoreGType { public static final ParamCoreGEnd END = new ParamCoreGEnd(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index ea7cf7772..1d8ca87ca 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -122,6 +122,7 @@ private ParamCoreGType parseGChoice(Map rvs, children.add(parseSeq(b.getInteractionSeq().getInteractions(), rvs, true, checkRecGuard)); // Check cases are guarded } + ParamCoreGActionKind kind = null; ParamRole src = null; ParamRole dest = null; Map cases = new HashMap<>(); @@ -140,9 +141,14 @@ private ParamCoreGType parseGChoice(Map rvs, if (src == null) { + kind = tmp.getKind(); src = tmp.src; dest = tmp.dest; } + else if (!kind.equals(tmp.kind)) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + gc + ", " + kind + ", " + tmp.kind); + } else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) { throw new ParamCoreSyntaxException(gc.getSource(), "[param-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); @@ -160,7 +166,7 @@ else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) } } - return this.af.ParamCoreGChoice(src, dest, cases); + return this.af.ParamCoreGChoice(src, kind, dest, cases); } private ParamCoreGType parseGRecursion(Map rvs, @@ -199,11 +205,13 @@ private ParamCoreGChoice parseGMessageTransfer(List is, Map is, Map is, Map rvs, - ParamRole src, ParamCoreMessage a, ParamRole dest) throws ParamCoreSyntaxException + ParamRole src, ParamCoreGActionKind kind, ParamCoreMessage a, ParamRole dest) throws ParamCoreSyntaxException { if (src.equals(dest)) { @@ -228,7 +236,7 @@ private ParamCoreGChoice parseGSimpleInteractionNode( } ParamCoreGType cont = parseSeq(is.subList(1, is.size()), rvs, false, false); // Subseqeuent choice/rec is guarded by (at least) this action - return this.af.ParamCoreGChoice(src, dest, Stream.of(a).collect(Collectors.toMap(x -> x, x -> cont))); + return this.af.ParamCoreGChoice(src, kind, dest, Stream.of(a).collect(Collectors.toMap(x -> x, x -> cont))); } private Op parseOp(GMessageTransfer gmt) throws ParamCoreSyntaxException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java index bf374ba5a..695b0264a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java @@ -10,10 +10,11 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -public class ParamCoreGRec extends ParamCoreRec implements ParamCoreGType +public class ParamCoreGRec extends ParamCoreRec implements ParamCoreGType { public ParamCoreGRec(RecVar recvar, ParamCoreGType body) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java index d745bd9f0..4d81126cb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java @@ -8,11 +8,12 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; -public class ParamCoreGRecVar extends ParamCoreRecVar implements ParamCoreGType +public class ParamCoreGRecVar extends ParamCoreRecVar implements ParamCoreGType { public ParamCoreGRecVar(RecVar var) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java index da3295fb4..885cf2c5b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java @@ -8,10 +8,11 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.type.kind.Global; import org.scribble.type.name.Role; -public interface ParamCoreGType extends ParamCoreType +public interface ParamCoreGType extends ParamCoreType { // FIXME: clarify, Role subj is used as "role name" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java index c5ae6808c..fee4f52f2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java @@ -1,18 +1,21 @@ package org.scribble.ext.go.core.ast.local; -public enum ParamCoreLActionKind +import org.scribble.ext.go.core.ast.ParamCoreActionKind; +import org.scribble.type.kind.Local; + +public enum ParamCoreLActionKind implements ParamCoreActionKind { - SEND, - RECEIVE; + SEND_ALL, + RECEIVE_ALL; @Override public String toString() { switch (this) { - case SEND: return "!"; - case RECEIVE: return "?"; - default: throw new RuntimeException("Won't get here: " + this); + case SEND_ALL: return "!"; + case RECEIVE_ALL: return "?"; + default: throw new RuntimeException("[param-core] Won't get here: " + this); } } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java index 61ab13d68..b822cdb13 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java @@ -2,9 +2,9 @@ import java.util.Map; +import org.scribble.ext.go.core.ast.ParamCoreChoice; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.core.ast.ParamCoreChoice; import org.scribble.type.kind.Local; public class ParamCoreLChoice extends ParamCoreChoice implements ParamCoreLType @@ -13,9 +13,15 @@ public class ParamCoreLChoice extends ParamCoreChoice imp public ParamCoreLChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) { - super(role, cases); + super(role, kind, cases); this.kind = kind; } + + @Override + public ParamCoreLActionKind getKind() + { + return (ParamCoreLActionKind) this.kind; + } @Override public int hashCode() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java index 6242ee095..7e94f540f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java @@ -1,9 +1,10 @@ package org.scribble.ext.go.core.ast.local; import org.scribble.ext.go.core.ast.ParamCoreEnd; +import org.scribble.type.kind.Local; -public class ParamCoreLEnd extends ParamCoreEnd implements ParamCoreLType +public class ParamCoreLEnd extends ParamCoreEnd implements ParamCoreLType { public static final ParamCoreLEnd END = new ParamCoreLEnd(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java index e6e319e6f..195f6f7c1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java @@ -1,9 +1,10 @@ package org.scribble.ext.go.core.ast.local; import org.scribble.ext.go.core.ast.ParamCoreRec; +import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; -public class ParamCoreLRec extends ParamCoreRec implements ParamCoreLType +public class ParamCoreLRec extends ParamCoreRec implements ParamCoreLType { public ParamCoreLRec(RecVar recvar, ParamCoreLType body) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java index f2d67b81e..d9014128b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java @@ -1,10 +1,11 @@ package org.scribble.ext.go.core.ast.local; import org.scribble.ext.go.core.ast.ParamCoreRecVar; +import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; -public class ParamCoreLRecVar extends ParamCoreRecVar implements ParamCoreLType +public class ParamCoreLRecVar extends ParamCoreRecVar implements ParamCoreLType { public ParamCoreLRecVar(RecVar var) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java index c1ec76b8e..a96cb5913 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java @@ -1,9 +1,10 @@ package org.scribble.ext.go.core.ast.local; import org.scribble.ext.go.core.ast.ParamCoreType; +import org.scribble.type.kind.Local; -public interface ParamCoreLType extends ParamCoreType +public interface ParamCoreLType extends ParamCoreType { } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java index 6874e2952..3dd8cf18d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -69,7 +69,7 @@ private void buildEdgeAndContinuation(EState s1, EState s2, Map } else if (cont instanceof ParamCoreRecVar) { - EState s = recs.get(((ParamCoreRecVar) cont).recvar); + EState s = recs.get(((ParamCoreRecVar) cont).recvar); this.util.addEdge(s1, toEAction(r, k, a), s); } else @@ -83,12 +83,12 @@ else if (cont instanceof ParamCoreRecVar) private EAction toEAction(ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a) { ParamCoreEModelFactory ef = (ParamCoreEModelFactory) this.util.ef; // FIXME: factor out - if (k.equals(ParamCoreLActionKind.SEND)) + if (k.equals(ParamCoreLActionKind.SEND_ALL)) { return ef.newParamCoreESend(r, a.op, a.pay); } - else if (k.equals(ParamCoreLActionKind.RECEIVE)) + else if (k.equals(ParamCoreLActionKind.RECEIVE_ALL)) { return ef.newParamCoreEReceive(r, a.op, a.pay); } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 80ea01824..83a9450ef 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -13,7 +13,7 @@ module assrt.tmp.ParamTest; -global protocol Proto1(role A(n), role B(n)) +global protocol Proto1(role A(N), role B(n)) { 1() dot A[1..n] to B[1..n]; } From 86c8154c77d913146c06529cfb27a225abc34342 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 25 Aug 2017 20:28:55 +0100 Subject: [PATCH 062/433] Continued. --- .../ext/go/core/ast/global/ParamCoreGChoice.java | 7 ++++++- .../ast/global/ParamCoreGProtocolDeclTranslator.java | 10 +++++++++- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index 1c587dece..b1862ef73 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -48,6 +48,11 @@ public Set getParamRoles() @Override public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException { + if (this.kind != ParamCoreGActionKind.CROSS_TRANSFER) + { + throw new RuntimeException("[param-core] TODO: " + this); + } + Map projs = new HashMap<>(); for (Entry e : this.cases.entrySet()) { @@ -119,6 +124,6 @@ public boolean canEquals(Object o) @Override public String toString() { - return this.src.toString() + "->" + this.dest + casesToString(); // toString needed? + return this.src.toString() + this.kind + this.dest + casesToString(); // toString needed? } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index 1d8ca87ca..e23952c16 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -24,6 +24,7 @@ import org.scribble.del.global.GProtocolDefDel; import org.scribble.ext.go.ast.ParamAstFactory; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; +import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; @@ -215,9 +216,16 @@ private ParamCoreGChoice parseGMessageTransfer(List is, Map Date: Sun, 27 Aug 2017 19:02:28 +0100 Subject: [PATCH 063/433] Minor. --- .../src/test/scrib/param/tmp/ParamTest.scr | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 80ea01824..3a95ef09b 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -13,9 +13,23 @@ module assrt.tmp.ParamTest; +/* +- keep P + coP for "actual roles" -- needed for API gen -- ParamRole => ParamRoleName? cf. ParamRole ("actual") +- keep constraint for each "actual role" -- needed for API "selection" check +- index exprs +- WF G -- proto sig param decls + + +- how does prev pabble treat "actual roles"? e.g., pipeline +- how does prev pabble do projection wrt. arbitrary role ranges? +*/ + + + global protocol Proto1(role A(n), role B(n)) { - 1() dot A[1..n] to B[1..n]; + 1() from A[2..n] to B[2..n]; + //1() dot A[1..n] to B[1..n]; } From 07c00eb57c50d4bc2d4ec3c85dc6965e433e062a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 27 Aug 2017 20:23:59 +0100 Subject: [PATCH 064/433] Added frontend class skeletons for param-core API gen. --- .../scribble/ext/go/cli/ParamCLArgFlag.java | 4 +- .../scribble/ext/go/cli/ParamCLArgParser.java | 15 +- .../scribble/ext/go/cli/ParamCommandLine.java | 32 +++- .../ParamCoreSTEndpointApiGenerator.java | 33 ++++ .../ParamCoreSTStateChanAPIBuilder.java | 146 ++++++++++++++++++ .../test/scrib/param/cgo18/ScatterGather.scr | 3 +- 6 files changed, 218 insertions(+), 15 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java index cf70b7efd..7295535fd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java @@ -8,7 +8,9 @@ public enum ParamCLArgFlag // Non-unique flags // Non-unique flags + GO_API_GEN, + PARAM_CORE_EFSM, PARAM_CORE_EFSM_PNG, - GO_API_GEN + PARAM_CORE_API_GEN, } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java index 0c80935f4..eb8defaf2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java @@ -13,9 +13,11 @@ public class ParamCLArgParser extends CLArgParser public static final String PARAM_FLAG = "-param"; // Non-unique flags - public static final String GO_API_GEN_FLAG = "-goapi"; - public static final String PARAM_CORE_EFSM_FLAG = "-param-fsm"; - public static final String PARAM_CORE_EFSM_PNG_FLAG = "-param-fsmpng"; + public static final String GO_API_GEN_FLAG = "-goapi"; + + public static final String PARAM_CORE_EFSM_FLAG = "-param-fsm"; + public static final String PARAM_CORE_EFSM_PNG_FLAG = "-param-fsmpng"; + public static final String PARAM_CORE_API_GEN_FLAG = "-param-api"; private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); { @@ -27,6 +29,7 @@ public class ParamCLArgParser extends CLArgParser ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.PARAM_CORE_EFSM_FLAG, ParamCLArgFlag.PARAM_CORE_EFSM); ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.PARAM_CORE_EFSM_PNG_FLAG, ParamCLArgFlag.PARAM_CORE_EFSM_PNG); ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.GO_API_GEN_FLAG, ParamCLArgFlag.GO_API_GEN); + ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.PARAM_CORE_API_GEN_FLAG, ParamCLArgFlag.PARAM_CORE_API_GEN); } private static final Map PARAM_FLAGS = new HashMap<>(); @@ -72,12 +75,14 @@ protected int parseFlag(int i) throws CommandLineException // Non-unique flags - case ParamCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); - case ParamCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); case ParamCLArgParser.GO_API_GEN_FLAG: { return goParseProtoAndRoleArgs(flag, i); } + + case ParamCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); + case ParamCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); + case ParamCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParseRoleArg(flag, i); // Base CL diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index ddb3a14f3..a999b4877 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -23,6 +23,7 @@ import org.scribble.ext.go.core.ast.global.ParamCoreGProtocolDeclTranslator; import org.scribble.ext.go.core.ast.global.ParamCoreGType; import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; import org.scribble.ext.go.core.model.endpoint.ParamCoreEGraphBuilder; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; @@ -38,7 +39,6 @@ import org.scribble.main.resource.DirectoryResourceLocator; import org.scribble.main.resource.ResourceLocator; import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EState; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; import org.scribble.util.ScribParserException; @@ -49,7 +49,8 @@ public class ParamCommandLine extends CommandLine // HACK: store in (Core) Job/JobContext? protected GProtocolDecl gpd; - protected Map, EState>> E0; // FIXME: make a "proper role" for param APIs + protected Map, ParamCoreLType>> P0; + protected Map, EGraph>> E0; // FIXME: make a "proper role" for param APIs //protected ParamCoreSModel model; public ParamCommandLine(String... args) throws CommandLineException @@ -136,6 +137,23 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co outputClasses(goClasses); } } + else if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_API_GEN)) + { + JobContext jcontext = job.getContext(); + String[] args = this.paramArgs.get(ParamCLArgFlag.PARAM_CORE_API_GEN); + for (int i = 0; i < args.length; i += 1) + { + String simpname = this.paramArgs.get(ParamCLArgFlag.PARAM)[0]; + GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); + Role role = checkRoleArg(jcontext, fullname, args[i]); + for (Set ranges : this.P0.get(role).keySet()) + { + EGraph efsm = this.E0.get(role).get(ranges); + Map goClasses = new ParamCoreSTEndpointApiGenerator(job).generateGoApi(fullname, role, efsm); + outputClasses(goClasses); + } + } + } else { super.doNonAttemptableOutputTasks(job); @@ -210,7 +228,7 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro job.debugPrintln("\n[param-core] Computed roles: " + protoRoles); - Map, ParamCoreLType>> P0 = new HashMap<>(); + this.P0 = new HashMap<>(); for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? { for (Set ranges : protoRoles.get(r)) @@ -235,13 +253,13 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro for (Set ranges : P0.get(r).keySet()) { EGraph g = builder.build(P0.get(r).get(ranges)); - Map, EState> tmp = this.E0.get(r); + Map, EGraph> tmp = this.E0.get(r); if (tmp == null) { tmp = new HashMap<>(); this.E0.put(r, tmp); } - tmp.put(ranges, g.init); + tmp.put(ranges, g); job.debugPrintln("\n[param-core] Built endpoint graph for " + r + " for " + ranges + ":\n" + g.toDot()); } @@ -393,9 +411,9 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce { Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); String png = args[i+1]; - for (Entry, EState> e : this.E0.get(role).entrySet()) + for (Entry, EGraph> e : this.E0.get(role).entrySet()) { - String out = e.getValue().toDot(); + String out = e.getValue().init.toDot(); runDot(out, png); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java new file mode 100644 index 000000000..96264b99a --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -0,0 +1,33 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import java.util.Map; + +import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; +import org.scribble.main.Job; +import org.scribble.main.ScribbleException; +import org.scribble.model.endpoint.EGraph; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +// Duplicated from org.scribble.ext.go.codegen.statetype.go.GoStEndpointApiGenerator +public class ParamCoreSTEndpointApiGenerator +{ + public final Job job; + + public ParamCoreSTEndpointApiGenerator(Job job) + { + this.job = job; + } + + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later + public Map generateGoApi(GProtocolName fullname, Role self, EGraph egraph) throws ScribbleException + { + this.job.debugPrintln("\n[param-core] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); + ParamCoreSTStateChanAPIBuilder apigen + = new ParamCoreSTStateChanAPIBuilder(this.job, fullname, self, egraph); + Map api = apigen.build(); // filepath -> source + api.putAll(apigen.buildSessionAPI()); + return api; + } + +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java new file mode 100644 index 000000000..87847c461 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java @@ -0,0 +1,146 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import java.util.Map; + +import org.scribble.codegen.statetype.STActionBuilder; +import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.main.Job; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +// Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder +public class ParamCoreSTStateChanAPIBuilder extends STStateChanAPIBuilder +{ + //private int counter = 1; + + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later + public ParamCoreSTStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) + { + super(job, gpn, role, graph, + null, //new GoSTOutputStateBuilder(new GoSTSendActionBuilder()), + null, //new GoSTReceiveStateBuilder(new GoSTReceiveActionBuilder()), + null, //new GoSTBranchStateBuilder(new GoSTBranchActionBuilder()), + null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), + null); //new GoSTEndStateBuilder()); + + throw new RuntimeException("[param-core] TODO:"); + } + + @Override + public String getPackage() + { + throw new RuntimeException("[param-core] TODO:"); + //return this.gpn.getSimpleName().toString(); + } + + @Override + protected String makeSTStateName(EState s) + { + throw new RuntimeException("[param-core] TODO:"); + /*if (s.isTerminal()) + { + return "_EndState"; + } + String name = this.gpn.getSimpleName() + "_" + role + "_" + this.counter++; + //return (s.id == this.graph.init.id) ? name : "_" + name; // For "private" non-initial state channels + return name;*/ + } + + @Override + public String getFilePath(String filename) + { + throw new RuntimeException("[param-core] TODO:"); + /*if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go + { + filename = "$" + filename.substring(1); + } + return this.gpn.toString().replaceAll("\\.", "/") + "/" + filename + ".go";*/ + } + + @Override + public Map buildSessionAPI() // FIXME: factor out + { + throw new RuntimeException("[param-core] TODO:"); + //return new GoSTSessionAPIBuilder(this).buildSessionAPI(); + } + + protected static String getPackageDecl(STStateChanAPIBuilder api) + { + throw new RuntimeException("[param-core] TODO: "); + //return "package " + api.getPackage(); + } + + protected static String getStateChanPremable(STStateChanAPIBuilder api, EState s) + { + throw new RuntimeException("[param-core] TODO: "); + /*String tname = api.getStateChanName(s); + String res = + ParamSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + + "\n" + + "import \"org/scribble/runtime/net\"\n" + + "\n" + + "type " + tname + " struct{\n" + + "ep *net.MPSTEndpoint\n" // FIXME: factor out + + "state *net.LinearResource\n" // FIXME: EndSocket special case? // FIXME: only seems to work as a pointer (something to do with method calls via value recievers? is it copying the value before calling the function?) + + "}"; + + if (s.id == api.graph.init.id) + { + res += + "\n\n" + + "func New" + tname + "(ep *_Endpoint" + api.gpn.getSimpleName() + "_" + api.role + ") *" + tname + " {\n" // FIXME: factor out + + "ep." + api.role + ".SetInit()\n" + + "return &" + tname + " { ep: ep." + api.role + ", state: &net.LinearResource { } }\n" + + "}"; + } + + return res;*/ + } + + @Override + public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here because action builder hierarchy not suitable (extended by action kind, not by target language) + { + throw new RuntimeException("[param-core] TODO: "); + /*EState succ = curr.getSuccessor(a); + return + "func (s *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(a) + + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + + "s.state.Use()\n" + + ab.buildBody(this, curr, a, succ) + "\n" + + "}";*/ + } + + @Override + public String getChannelName(STStateChanAPIBuilder api, EAction a) + { + throw new RuntimeException("[param-core] TODO: "); + /*return + ////"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; + //"s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; + null;*/ + } + + @Override + public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) // FIXME: refactor action builders as interfaces and use generic parameter for kind + { + throw new RuntimeException("[param-core] TODO: "); + /*String res = ""; + + if (succ.isTerminal()) + { + res += "s.ep.SetDone()\n"; + } + res += "return &" + ab.getReturnType(this, curr, succ) + "{ ep: s.ep"; + if (!succ.isTerminal()) + { + res += ", state: &net.LinearResource {}"; // FIXME: EndSocket LinearResource special case + } + res += " }"; + + return res;*/ + } +} diff --git a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr index c90e84ce2..84d45e7ba 100644 --- a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr +++ b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr @@ -1,6 +1,5 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java -//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cg018/ScatterGather.scr -V -param Proto1 - +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr -param Proto1 -param-fsm B module assrt.cg018.ScatterGather; From d473c680a59183e3f49e7cbf6b60fc67e7bfd5f9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 27 Aug 2017 23:26:35 +0100 Subject: [PATCH 065/433] Added param syntax for index exprs. --- .../org/scribble/parser/antlr/ParamScribble.g | 22 ++++ .../scribble/ext/go/ast/ParamAstFactory.java | 12 ++- .../ext/go/ast/ParamAstFactoryImpl.java | 19 ++-- .../scribble/ext/go/ast/ParamRoleDecl.java | 18 ++-- .../global/ParamGCrossMessageTransfer.java | 8 +- .../ast/global/ParamGDotMessageTransfer.java | 8 +- .../go/ast/global/ParamGMessageTransfer.java | 16 ++- .../ast/name/simple/ParamRoleParamNode.java | 1 + .../scribble/ext/go/cli/ParamCommandLine.java | 17 +-- .../ext/go/core/ast/ParamCoreAstFactory.java | 4 +- .../go/core/ast/global/ParamCoreGChoice.java | 4 +- .../ParamCoreGProtocolDeclTranslator.java | 12 ++- .../scribble/ext/go/core/type/ParamRange.java | 19 ++-- .../scribble/ext/go/core/type/ParamRole.java | 24 +++-- .../scribble/ast/ParamAntlrRoleDecl.java | 10 +- .../ParamAntlrGCrossMessageTransfer.java | 12 ++- .../global/ParamAntlrGDotMessageTransfer.java | 12 ++- .../ast/index/ParamAntlrIndexExpr.java | 46 ++++++++ .../ast/name/ParamAntlrSimpleName.java | 1 + .../ext/go/type/index/ParamBinIndexExpr.java | 101 ++++++++++++++++++ .../ext/go/type/index/ParamIndexExpr.java | 39 +++++++ .../ext/go/type/index/ParamIndexFactory.java | 21 ++++ .../ext/go/type/index/ParamIndexInt.java | 69 ++++++++++++ .../ext/go/type/index/ParamIndexVar.java | 77 +++++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 6 ++ 25 files changed, 508 insertions(+), 70 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexFactory.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index f173e2b59..8577af3dc 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -169,6 +169,7 @@ tokens LOCALRECEIVE = 'local-receive';*/ + PARAM_BININDEXEXPR = 'PARAM_BININDEXEXPR'; PARAM_ROLEDECL = 'PARAM_ROLEDECL'; PARAM_GLOBALCROSSMESSAGETRANSFER = 'PARAM_GLOBALCROSSMESSAGETRANSFER'; PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; @@ -657,6 +658,12 @@ globalmessagetransfer: ^(GLOBALMESSAGETRANSFER message rolename rolename+) | + message FROM_KW rolename '[' paramindexexpr '..' paramindexexpr ']' TO_KW rolename '[' paramindexexpr '..' paramindexexpr ']' ';' +-> + ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr) +; + +/*| message FROM_KW rolename '[' simplename '..' simplename ']' TO_KW rolename '[' simplename '..' simplename ']' ';' -> ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename simplename simplename simplename simplename) @@ -664,6 +671,21 @@ globalmessagetransfer: message DOT_KW rolename '[' simplename '..' simplename ']' TO_KW rolename '[' simplename '..' simplename ']' ';' -> ^(PARAM_GLOBALDOTMESSAGETRANSFER message rolename rolename simplename simplename simplename simplename) +;*/ + +paramindexexpr: + unaryparamindexexpr (op=('+' | '-') unaryparamindexexpr)? +-> + ^(PARAM_BININDEXEXPR unaryparamindexexpr $op? unaryparamindexexpr?) +; +// FIXME: rename BIN constant + +unaryparamindexexpr: + simplename +| + '(' paramindexexpr ')' +-> + paramindexexpr ; message: diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java index 97de30f6c..877768b92 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java @@ -8,15 +8,19 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; -import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexVar; public interface ParamAstFactory extends AstFactory { - ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); + //ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); + ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); + ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd); ParamGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); + ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index 0714422d2..8a397a872 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -5,15 +5,13 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.MessageNode; -import org.scribble.ast.name.NameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.RoleDeclDel; import org.scribble.del.global.GMessageTransferDel; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; -import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; -import org.scribble.ext.go.type.kind.ParamRoleParamKind; -import org.scribble.type.kind.Kind; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexVar; public class ParamAstFactoryImpl extends AstFactoryImpl implements ParamAstFactory @@ -182,7 +180,8 @@ public AssrtGDo GDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList a // Explicitly creating new Assrt nodes @Override - public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params) + //public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params) + public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params) { ParamRoleDecl rd = new ParamRoleDecl(source, namenode, params); rd = del(rd, new RoleDeclDel()); @@ -191,7 +190,8 @@ public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List NameNode SimpleNameNode(CommonTree source, K kind, String identifier) { NameNode snn = null; @@ -224,5 +225,5 @@ public NameNode SimpleNameNode(CommonTree source, K kind, St { return super.SimpleNameNode(source, kind, identifier); } - } + }*/ } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java index 12ef42b78..cf9fa1792 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java @@ -9,18 +9,19 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SimpleNameNode; import org.scribble.del.ScribDel; -import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; +import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.main.ScribbleException; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; -import org.scribble.util.ScribUtil; import org.scribble.visit.AstVisitor; public class ParamRoleDecl extends RoleDecl { - public final List params; + //public final List params; + public final List params; - public ParamRoleDecl(CommonTree source, RoleNode name, List params) + //public ParamRoleDecl(CommonTree source, RoleNode name, List params) + public ParamRoleDecl(CommonTree source, RoleNode name, List params) { super(source, name); this.params = Collections.unmodifiableList(params); @@ -36,7 +37,8 @@ protected ParamRoleDecl copy() public ParamRoleDecl clone(AstFactory af) { RoleNode role = (RoleNode) this.name.clone(af); - List params = ScribUtil.cloneList(af, this.params); + //List params = ScribUtil.cloneList(af, this.params); + List params = this.params; return ((ParamAstFactory) af).ParamRoleDecl(this.source, role, params); } @@ -54,7 +56,8 @@ public ParamRoleDecl reconstruct(SimpleNameNode name) throw new RuntimeException("[param] Shouldn't get in here: " + this); } - public ParamRoleDecl reconstruct(SimpleNameNode name, List params) + //public ParamRoleDecl reconstruct(SimpleNameNode name, List params) + public ParamRoleDecl reconstruct(SimpleNameNode name, List params) { ScribDel del = del(); ParamRoleDecl rd = new ParamRoleDecl(this.source, (RoleNode) name, params); @@ -66,7 +69,8 @@ public ParamRoleDecl reconstruct(SimpleNameNode name, List params = visitChildListWithClassEqualityCheck(this, this.params, nv); + //List params = visitChildListWithClassEqualityCheck(this, this.params, nv); + List params = this.params; return reconstruct(name, params); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java index 4c9232488..5f6e853eb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java @@ -8,14 +8,15 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.type.name.Role; // Subsumes scatter/gather, src/dest range length one public class ParamGCrossMessageTransfer extends ParamGMessageTransfer { public ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) { super(source, src, msg, dest, srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); } @@ -46,7 +47,8 @@ public ParamGCrossMessageTransfer clone(AstFactory af) @Override public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, - ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) { ScribDel del = del(); ParamGCrossMessageTransfer gmt = new ParamGCrossMessageTransfer(this.source, src, msg, dest, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java index eef862c0f..5dea915b9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java @@ -8,13 +8,14 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.type.name.Role; public class ParamGDotMessageTransfer extends ParamGMessageTransfer { public ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) { super(source, src, msg, dest, srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); } @@ -45,7 +46,8 @@ public ParamGDotMessageTransfer clone(AstFactory af) @Override public ParamGDotMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, - ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) { ScribDel del = del(); ParamGDotMessageTransfer gmt = new ParamGDotMessageTransfer(this.source, src, msg, dest, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java index 0324bb4e4..11dbd0d57 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java @@ -9,7 +9,7 @@ import org.scribble.ast.MessageTransfer; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.visit.AstVisitor; @@ -18,13 +18,18 @@ public abstract class ParamGMessageTransfer extends GMessageTransfer //implemen { // ParamRoleNode? -- cf. ParamRoleDecl // All >= 0; end >= start - public final ParamRoleParamNode srcRangeStart; + /*public final ParamRoleParamNode srcRangeStart; public final ParamRoleParamNode srcRangeEnd; // Inclusive public final ParamRoleParamNode destRangeStart; - public final ParamRoleParamNode destRangeEnd; // Inclusive + public final ParamRoleParamNode destRangeEnd; // Inclusive*/ + public final ParamIndexExpr srcRangeStart; + public final ParamIndexExpr srcRangeEnd; // Inclusive + public final ParamIndexExpr destRangeStart; + public final ParamIndexExpr destRangeEnd; // Inclusive public ParamGMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) { super(source, src, msg, Arrays.asList(dest)); this.srcRangeStart = srcRangeStart; @@ -40,7 +45,8 @@ public ParamGMessageTransfer reconstruct(RoleNode src, MessageNode msg, List visitChildren(AstVisitor nv) throws ScribbleException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java index 62905540c..024fb0a9f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java @@ -8,6 +8,7 @@ // Currently used for both "actual params" and int literals +@Deprecated public class ParamRoleParamNode extends SimpleNameNode { public ParamRoleParamNode(CommonTree source, String identifier) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index a999b4877..50cb5c1b7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -30,7 +30,7 @@ import org.scribble.ext.go.main.ParamException; import org.scribble.ext.go.main.ParamJob; import org.scribble.ext.go.main.ParamMainContext; -import org.scribble.ext.go.type.name.ParamRoleParam; +import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; @@ -310,7 +310,8 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy ParamRole next = i.next(); i.remove(); Set range = new HashSet<>(); - range.add(next.range); + //range.add(next.range); + range.add(next.ranges.iterator().next()); if (!tmp.contains(next)) { tmp.addAll(tmp.stream().map(t -> @@ -340,8 +341,8 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy if (cand.size() > 0) { - z3 += cand.stream().map(c -> "(and (>= id " + c.start + ") (<= id " + c.end + ")" - + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start + " " + c.end + ")" : "") + z3 += cand.stream().map(c -> "(and (>= id " + c.start.toSmt2Formula() + ") (<= id " + c.end.toSmt2Formula() + ")" + + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") + ")") .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); } @@ -352,8 +353,8 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy { z3 = "(and " + z3 + " "; } - z3 += coset.stream().map(c -> "(and (not (and (>= id " + c.start + ") (<= id " + c.end + ")))" - + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start + " " + c.end + ")" : "") + z3 += coset.stream().map(c -> "(and (not (and (>= id " + c.start.toSmt2Formula() + ") (<= id " + c.end.toSmt2Formula() + ")))" + + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") + ")") .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); if (cand.size() > 0) @@ -362,7 +363,9 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy } } - Set actuals = cand.stream().flatMap(c -> c.getActualParams().stream()).collect(Collectors.toSet()); + //Set actuals + Set actuals + = cand.stream().flatMap(c -> c.getActualParams().stream()).collect(Collectors.toSet()); actuals.addAll(coset.stream().flatMap(c -> c.getActualParams().stream()).collect(Collectors.toSet())); //if (!actuals.isEmpty()) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java index 0047bfe56..5674e183e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java @@ -1,6 +1,8 @@ package org.scribble.ext.go.core.ast; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ext.go.core.ast.global.ParamCoreGActionKind; import org.scribble.ext.go.core.ast.global.ParamCoreGChoice; @@ -30,7 +32,7 @@ public ParamCoreAstFactory() public ParamRole ParamRole(String name, ParamRange range) // ParamRange not "ast", so not made by af { - return new ParamRole(name, range); + return new ParamRole(name, Stream.of(range).collect(Collectors.toSet())); } // Pre: not null diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index b1862ef73..1fc27e62f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -65,13 +65,13 @@ public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ra // "Simple" cases if (this.src.getName().equals(r)) { - return (ranges.contains(this.src.range)) + return (ranges.contains(this.src.ranges.iterator().next())) ? af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.SEND_ALL, projs) : merge(af, r, ranges, projs); } else if (this.dest.getName().equals(r)) { - return (ranges.contains(this.dest.range)) + return (ranges.contains(this.dest.ranges.iterator().next())) ? af.ParamCoreLChoice(this.src, ParamCoreLActionKind.RECEIVE_ALL, projs) : merge(af, r, ranges, projs); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index e23952c16..6c3685bcb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -213,15 +213,19 @@ private ParamCoreGChoice parseGMessageTransfer(List is, Map getActualParams() // Hack + //public Set getActualParams() // Hack + public Set getActualParams() // Hack { - return Stream.of(this.start, this.end).filter(p -> !p.isConstant()).collect(Collectors.toSet()); + //return Stream.of(this.start, this.end).filter(p -> !p.isConstant()).collect(Collectors.toSet()); + return Stream.of(this.start, this.end).flatMap(p -> p.getVars().stream()).collect(Collectors.toSet()); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java index 04f4df81b..540ca523c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java @@ -1,8 +1,12 @@ package org.scribble.ext.go.core.type; +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; + import org.scribble.type.name.Role; -// FIXME: make distinct kind? i.e., don't extend Role? -- yes: ParamRole is not a Role (Role is actually a ParamRole) +// FIXME: make distinct kind? i.e., don't extend Role? -- yes: ParamRole is not a Role (Role should actually be a ParamRole in that sense) public class ParamRole extends Role { /** @@ -10,12 +14,13 @@ public class ParamRole extends Role */ private static final long serialVersionUID = 1L; - public final ParamRange range; + //public final ParamRange range; + public final Set ranges; // size >= 1 -- size == 1 for parsed syntax - public ParamRole(String name, ParamRange range) + public ParamRole(String name, Set range) { super(name); - this.range = range; + this.ranges = Collections.unmodifiableSet(range); } // FIXME @@ -29,7 +34,7 @@ public int hashCode() { int hash = 7121; hash = 31 * hash + super.hashCode(); - hash = 31 * hash + this.range.hashCode(); + hash = 31 * hash + this.ranges.hashCode(); return hash; } @@ -46,7 +51,7 @@ public boolean equals(Object obj) } ParamRole them = (ParamRole) obj; return super.equals(them) // Does canEqual - && this.range.equals(them.range); + && this.ranges.equals(them.ranges); } @Override @@ -58,6 +63,11 @@ public boolean canEqual(Object o) @Override public String toString() { - return super.toString() + this.range; + String s = this.ranges.stream().map(r -> r.toString()).collect(Collectors.joining(", ")); + if (this.ranges.size() > 1) + { + s = "{" + s + "}"; + } + return super.toString() + s; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java index 9f7db6ce9..576012a62 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java @@ -7,8 +7,8 @@ import org.scribble.ast.RoleDecl; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; -import org.scribble.ext.go.parser.scribble.ast.name.ParamAntlrSimpleName; +import org.scribble.ext.go.type.index.ParamIndexFactory; +import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; @@ -22,8 +22,10 @@ public class ParamAntlrRoleDecl public static RoleDecl parseParamRoleDecl(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) { RoleNode name = AntlrSimpleName.toRoleNode(getNameChild(root), af); - List params = getParamChildren(root) - .stream().map(p -> ParamAntlrSimpleName.toParamRoleParamNode(p, af)).collect(Collectors.toList()); + /*List params = getParamChildren(root) + .stream().map(p -> ParamAntlrSimpleName.toParamRoleParamNode(p, af)).collect(Collectors.toList());*/ + List params = getParamChildren(root) + .stream().map(p -> ParamIndexFactory.ParamIntVar(p.getText())).collect(Collectors.toList()); return af.ParamRoleDecl(root, name, params); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java index 3d668adc5..6905fc276 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java @@ -5,8 +5,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.ParamAstFactory; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; -import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; -import org.scribble.ext.go.parser.scribble.ast.name.ParamAntlrSimpleName; +import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.global.AntlrGMessageTransfer; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; @@ -31,10 +31,14 @@ public class ParamAntlrGCrossMessageTransfer RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(root), af); MessageNode msg = AntlrGMessageTransfer.parseMessage(parser, getMessageChild(root), af); RoleNode dest = AntlrSimpleName.toRoleNode(getDestChild(root), af); - ParamRoleParamNode sourceStart = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeStartChild(root), af); + /*ParamRoleParamNode sourceStart = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeStartChild(root), af); ParamRoleParamNode sourceEnd = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeEndChild(root), af); ParamRoleParamNode destStart = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeStartChild(root), af); - ParamRoleParamNode destEnd = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeEndChild(root), af); + ParamRoleParamNode destEnd = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeEndChild(root), af);*/ + ParamIndexExpr sourceStart = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); + ParamIndexExpr sourceEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); + ParamIndexExpr destStart = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); + ParamIndexExpr destEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); return af.ParamGCrossMessageTransfer(root, src, msg, dest, sourceStart, sourceEnd, destStart, destEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java index 9fd090807..09b2a7cf4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java @@ -5,8 +5,8 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.ParamAstFactory; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; -import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; -import org.scribble.ext.go.parser.scribble.ast.name.ParamAntlrSimpleName; +import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.global.AntlrGMessageTransfer; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; @@ -32,10 +32,14 @@ public class ParamAntlrGDotMessageTransfer RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(root), af); MessageNode msg = AntlrGMessageTransfer.parseMessage(parser, getMessageChild(root), af); RoleNode dest = AntlrSimpleName.toRoleNode(getDestChild(root), af); - ParamRoleParamNode sourceStart = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeStartChild(root), af); + /*ParamRoleParamNode sourceStart = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeStartChild(root), af); ParamRoleParamNode sourceEnd = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeEndChild(root), af); ParamRoleParamNode destStart = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeStartChild(root), af); - ParamRoleParamNode destEnd = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeEndChild(root), af); + ParamRoleParamNode destEnd = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeEndChild(root), af);*/ + ParamIndexExpr sourceStart = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); + ParamIndexExpr sourceEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); + ParamIndexExpr destStart = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); + ParamIndexExpr destEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); return af.ParamGDotMessageTransfer(root, src, msg, dest, sourceStart, sourceEnd, destStart, destEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java new file mode 100644 index 000000000..fef782c3e --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java @@ -0,0 +1,46 @@ +package org.scribble.ext.go.parser.scribble.ast.index; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ext.go.type.index.ParamBinIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexFactory; + +public class ParamAntlrIndexExpr +{ + public static ParamIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) + { + String type = ct.getToken().getText(); // Duplicated from ScribParserUtil.getAntlrNodeType + switch (type) + { + case "PARAM_BININDEXEXPR": // FIXME: factor out + { + ParamIndexExpr left = parseParamIndexExpr((CommonTree) ct.getChild(0), af); + if (ct.getChildCount() < 2) + { + return left; + } + ParamIndexExpr right = parseParamIndexExpr((CommonTree) ct.getChild(2), af); + ParamBinIndexExpr.Op op; + switch (ct.getChild(1).getText()) + { + case "+": op = ParamBinIndexExpr.Op.Add; break; + case "-": op = ParamBinIndexExpr.Op.Subt; break; + default: throw new RuntimeException("[param] Shouldn't get in here: " + ct); + } + return ParamIndexFactory.ParamBinIndexExpr(op, left, right); + } + default: + { + try + { + return ParamIndexFactory.ParamIntVal(Integer.parseInt(type)); + } + catch (NumberFormatException e) + { + return ParamIndexFactory.ParamIntVar(type); + } + } + } + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java index 2e4f0bc3c..8fa148593 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java @@ -6,6 +6,7 @@ import org.scribble.ext.go.type.kind.ParamRoleParamKind; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; +@Deprecated public class ParamAntlrSimpleName { public static ParamRoleParamNode toParamRoleParamNode(CommonTree ct, AstFactory af) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java new file mode 100644 index 000000000..ff5af15fd --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java @@ -0,0 +1,101 @@ +package org.scribble.ext.go.type.index; + +import java.util.HashSet; +import java.util.Set; + + +// Binary arithmetic +public class ParamBinIndexExpr extends ParamIndexExpr +{ + public enum Op + { + Add, + Subt; + + @Override + public String toString() + { + switch (this) + { + case Add: return "+"; + case Subt: return "-"; + default: throw new RuntimeException("[param] Won't get in here: " + this); + } + } + } + + public final Op op; + public final ParamIndexExpr left; + public final ParamIndexExpr right; + + protected ParamBinIndexExpr(Op op, ParamIndexExpr left, ParamIndexExpr right) + { + this.left = left; + this.right = right; + this.op = op; + } + + @Override + public String toSmt2Formula() + { + String left = this.left.toSmt2Formula(); + String right = this.right.toSmt2Formula(); + String op; + switch(this.op) + { + case Add: op = "+"; break; + case Subt: op = "-"; break; + default: throw new RuntimeException("[param] Shouldn't get in here: " + this.op); + } + return "(" + op + " " + left + " " + right + ")"; + } + + @Override + public Set getVars() + { + Set vars = new HashSet<>(this.left.getVars()); + vars.addAll(this.right.getVars()); + return vars; + } + + @Override + public String toString() + { + return "(" + this.left.toString() + this.op + this.right.toString() + ")"; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamBinIndexExpr)) + { + return false; + } + ParamBinIndexExpr f = (ParamBinIndexExpr) o; + return super.equals(this) // Does canEqual + && this.op.equals(f.op) && this.left.equals(f.left) && this.right.equals(f.right); + // Storing left/right as a Set could give commutativity in equals, but not associativity + // Better to keep "syntactic" equality, and do via additional routines for, e.g., normal forms + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof ParamBinIndexExpr; + } + + @Override + public int hashCode() + { + int hash = 5879; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.op.hashCode(); + hash = 31 * hash + this.left.hashCode(); + hash = 31 * hash + this.right.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java new file mode 100644 index 000000000..5e00ddcd4 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java @@ -0,0 +1,39 @@ +package org.scribble.ext.go.type.index; + +import java.util.Set; + +public abstract class ParamIndexExpr +{ + public boolean isConstant() + { + return false; + } + + public abstract Set getVars(); + + public abstract String toSmt2Formula(); // Cf. toString -- but can be useful to separate, for debugging (and printing) + + // N.B. "syntactic" comparison + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamIndexExpr)) + { + return false; + } + return ((ParamIndexExpr) o).canEqual(this); + } + + protected abstract boolean canEqual(Object o); + + // In case subclasses do super + @Override + public int hashCode() + { + return 5869; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexFactory.java new file mode 100644 index 000000000..6f0442823 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexFactory.java @@ -0,0 +1,21 @@ +package org.scribble.ext.go.type.index; + +// Would correspond to a "types factory" -- cf. AST factory +public class ParamIndexFactory +{ + + public static ParamBinIndexExpr ParamBinIndexExpr(ParamBinIndexExpr.Op op, ParamIndexExpr left, ParamIndexExpr right) + { + return new ParamBinIndexExpr(op, left, right); + } + + public static ParamIndexInt ParamIntVal(int i) + { + return new ParamIndexInt(i); + } + + public static ParamIndexVar ParamIntVar(String text) + { + return new ParamIndexVar(text); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java new file mode 100644 index 000000000..792b38215 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java @@ -0,0 +1,69 @@ +package org.scribble.ext.go.type.index; + +import java.util.Collections; +import java.util.Set; + +// Integer literal +public class ParamIndexInt extends ParamIndexExpr +{ + public final int val; + + protected ParamIndexInt(int i) + { + this.val = i; + } + + @Override + public boolean isConstant() + { + return true; + } + + @Override + public String toSmt2Formula() + { + return Integer.toString(this.val); + } + + @Override + public Set getVars() + { + return Collections.emptySet(); + } + + @Override + public String toString() + { + return Integer.toString(this.val); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamIndexInt)) + { + return false; + } + return super.equals(this) // Does canEqual + && this.val == ((ParamIndexInt) o).val; + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof ParamIndexInt; + } + + @Override + public int hashCode() + { + int hash = 5897; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.val; + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java new file mode 100644 index 000000000..af4338797 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java @@ -0,0 +1,77 @@ +package org.scribble.ext.go.type.index; + +import java.util.HashSet; +import java.util.Set; + +import org.scribble.ext.go.type.name.ParamRoleParam; + +// Variable occurrence +public class ParamIndexVar extends ParamIndexExpr +{ + public final String name; + + protected ParamIndexVar(String name) + { + this.name = name; + } + + public ParamRoleParam toRoleParam() + { + return new ParamRoleParam(this.name); + } + + @Override + public String toSmt2Formula() + { + /*if (this.name.startsWith("_dum")) // FIXME + { + throw new RuntimeException("[assrt] Use squash first: " + this); + }*/ + //return "(" + this.name + ")"; + return this.name; + } + + @Override + public Set getVars() + { + Set vars = new HashSet<>(); + vars.add(this); // FIXME: currently may also be a role + return vars; + } + + @Override + public String toString() + { + return this.name; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamIndexVar)) + { + return false; + } + return super.equals(this) // Does canEqual + && this.name.equals(((ParamIndexVar) o).name); + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof ParamIndexVar; + } + + @Override + public int hashCode() + { + int hash = 5903; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.name.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 3a95ef09b..6f396ee24 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -25,12 +25,18 @@ module assrt.tmp.ParamTest; */ +global protocol Proto1(role A(n), role B(n)) +{ + 1() from A[1..1] to B[2..n+1]; +} +/* global protocol Proto1(role A(n), role B(n)) { 1() from A[2..n] to B[2..n]; //1() dot A[1..n] to B[1..n]; } +//*/ From 37eb81bb0ccd78c244137181cfe3e8edb7836dc8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 27 Aug 2017 23:30:40 +0100 Subject: [PATCH 066/433] Contined. --- .../main/antlr3/org/scribble/parser/antlr/ParamScribble.g | 4 ++++ .../java/org/scribble/ext/go/cli/ParamCommandLine.java | 7 +++++-- .../java/org/scribble/ext/go/core/type/ParamRange.java | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 8577af3dc..94ea48ab6 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -661,6 +661,10 @@ globalmessagetransfer: message FROM_KW rolename '[' paramindexexpr '..' paramindexexpr ']' TO_KW rolename '[' paramindexexpr '..' paramindexexpr ']' ';' -> ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr) +| + message DOT_KW rolename '[' paramindexexpr '..' paramindexexpr ']' TO_KW rolename '[' paramindexexpr '..' paramindexexpr ']' ';' +-> + ^(PARAM_GLOBALDOTMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr) ; /*| diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 50cb5c1b7..3a33e39ad 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -289,6 +289,9 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro } // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? + + //..HERE FIXME ActualParam -- ParamRange is now already a Set + private Map>> getProtoRoles(ParamJob job, ParamCoreGType gt) { Set prs = gt.getParamRoles(); @@ -365,8 +368,8 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy //Set actuals Set actuals - = cand.stream().flatMap(c -> c.getActualParams().stream()).collect(Collectors.toSet()); - actuals.addAll(coset.stream().flatMap(c -> c.getActualParams().stream()).collect(Collectors.toSet())); + = cand.stream().flatMap(c -> c.getVars().stream()).collect(Collectors.toSet()); + actuals.addAll(coset.stream().flatMap(c -> c.getVars().stream()).collect(Collectors.toSet())); //if (!actuals.isEmpty()) { z3 = "(exists ((id Int) " diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java index e391bb0ed..fdec075e6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java @@ -23,7 +23,7 @@ public ParamRange(ParamIndexExpr start, ParamIndexExpr end) } //public Set getActualParams() // Hack - public Set getActualParams() // Hack + public Set getVars() { //return Stream.of(this.start, this.end).filter(p -> !p.isConstant()).collect(Collectors.toSet()); return Stream.of(this.start, this.end).flatMap(p -> p.getVars().stream()).collect(Collectors.toSet()); From 509167c63633b2325dab499bf43f33b5958e8405 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 27 Aug 2017 23:43:31 +0100 Subject: [PATCH 067/433] Fixed minor param cross/dot transfer parsing bug. --- .../ast/global/ParamAntlrGCrossMessageTransfer.java | 2 +- .../ast/global/ParamAntlrGDotMessageTransfer.java | 2 +- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java index 6905fc276..7db9c3c6a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java @@ -35,7 +35,7 @@ public class ParamAntlrGCrossMessageTransfer ParamRoleParamNode sourceEnd = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeEndChild(root), af); ParamRoleParamNode destStart = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeStartChild(root), af); ParamRoleParamNode destEnd = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeEndChild(root), af);*/ - ParamIndexExpr sourceStart = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); + ParamIndexExpr sourceStart = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeStartChild(root), af); ParamIndexExpr sourceEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); ParamIndexExpr destStart = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); ParamIndexExpr destEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java index 09b2a7cf4..fcd2d9361 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java @@ -36,7 +36,7 @@ public class ParamAntlrGDotMessageTransfer ParamRoleParamNode sourceEnd = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeEndChild(root), af); ParamRoleParamNode destStart = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeStartChild(root), af); ParamRoleParamNode destEnd = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeEndChild(root), af);*/ - ParamIndexExpr sourceStart = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); + ParamIndexExpr sourceStart = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeStartChild(root), af); ParamIndexExpr sourceEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); ParamIndexExpr destStart = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); ParamIndexExpr destEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 6f396ee24..589641690 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -18,6 +18,7 @@ module assrt.tmp.ParamTest; - keep constraint for each "actual role" -- needed for API "selection" check - index exprs - WF G -- proto sig param decls +- examples - how does prev pabble treat "actual roles"? e.g., pipeline @@ -25,10 +26,13 @@ module assrt.tmp.ParamTest; */ -global protocol Proto1(role A(n), role B(n)) +//*/ +global protocol Proto1(role A(m,n), role B(m,n)) { - 1() from A[1..1] to B[2..n+1]; + 1() from A[1..1] to B[1..n]; + 2() from B[1..n-1] to A[1..1]; } +//*/ /* global protocol Proto1(role A(n), role B(n)) From 1358127977ade50621f4882b3fc4b6e52a0a7bc9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 00:03:24 +0100 Subject: [PATCH 068/433] Added param explicit "actual roles". --- .../scribble/ext/go/cli/ParamCommandLine.java | 50 +++++++++++----- .../go/core/ast/global/ParamCoreGChoice.java | 37 ++++++++---- .../ext/go/core/ast/global/ParamCoreGEnd.java | 9 +-- .../ext/go/core/ast/global/ParamCoreGRec.java | 9 +-- .../go/core/ast/global/ParamCoreGRecVar.java | 9 +-- .../go/core/ast/global/ParamCoreGType.java | 6 +- .../ext/go/core/type/ParamActualRole.java | 59 +++++++++++++++++++ .../scribble/ext/go/core/type/ParamRange.java | 12 ++-- .../scribble/ext/go/core/type/ParamRole.java | 22 +++---- 9 files changed, 150 insertions(+), 63 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 3a33e39ad..a3d5cb3ac 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -25,6 +25,7 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; import org.scribble.ext.go.core.model.endpoint.ParamCoreEGraphBuilder; +import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.ext.go.main.ParamException; @@ -49,8 +50,10 @@ public class ParamCommandLine extends CommandLine // HACK: store in (Core) Job/JobContext? protected GProtocolDecl gpd; - protected Map, ParamCoreLType>> P0; - protected Map, EGraph>> E0; // FIXME: make a "proper role" for param APIs + //protected Map, ParamCoreLType>> P0; + protected Map> P0; + //protected Map, EGraph>> E0; // FIXME: make a "proper role" for param APIs + protected Map> E0; // FIXME: make a "proper role" for param APIs //protected ParamCoreSModel model; public ParamCommandLine(String... args) throws CommandLineException @@ -146,7 +149,8 @@ else if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_API_GEN)) String simpname = this.paramArgs.get(ParamCLArgFlag.PARAM)[0]; GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); Role role = checkRoleArg(jcontext, fullname, args[i]); - for (Set ranges : this.P0.get(role).keySet()) + //for (Set ranges : this.P0.get(role).keySet()) + for (ParamActualRole ranges : this.P0.get(role).keySet()) { EGraph efsm = this.E0.get(role).get(ranges); Map goClasses = new ParamCoreSTEndpointApiGenerator(job).generateGoApi(fullname, role, efsm); @@ -224,17 +228,22 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro job.debugPrintln("\n[param-core] Translated:\n " + gt); - Map>> protoRoles = getProtoRoles(job, gt); + //Map>> + Map> + protoRoles = getProtoRoles(job, gt); job.debugPrintln("\n[param-core] Computed roles: " + protoRoles); this.P0 = new HashMap<>(); for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? { - for (Set ranges : protoRoles.get(r)) + //for (Set ranges : protoRoles.get(r)) + for (ParamActualRole ranges : protoRoles.get(r)) { - ParamCoreLType lt = gt.project(af, r, ranges); - Map, ParamCoreLType> tmp = P0.get(r); + //ParamCoreLType lt = gt.project(af, r, ranges); + ParamCoreLType lt = gt.project(af, ranges); + //Map, ParamCoreLType> tmp = P0.get(r); + Map tmp = P0.get(r); if (tmp == null) { tmp = new HashMap<>(); @@ -250,10 +259,12 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro this.E0 = new HashMap<>(); for (Role r : P0.keySet()) { - for (Set ranges : P0.get(r).keySet()) + //for (Set ranges : this.P0.get(r).keySet()) + for (ParamActualRole ranges : this.P0.get(r).keySet()) { - EGraph g = builder.build(P0.get(r).get(ranges)); - Map, EGraph> tmp = this.E0.get(r); + EGraph g = builder.build(this.P0.get(r).get(ranges)); + //Map, EGraph> tmp = this.E0.get(r); + Map tmp = this.E0.get(r); if (tmp == null) { tmp = new HashMap<>(); @@ -261,7 +272,9 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro } tmp.put(ranges, g); - job.debugPrintln("\n[param-core] Built endpoint graph for " + r + " for " + ranges + ":\n" + g.toDot()); + job.debugPrintln("\n[param-core] Built endpoint graph for " + //+ r + " for " + + ranges + ":\n" + g.toDot()); } } @@ -292,7 +305,9 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro //..HERE FIXME ActualParam -- ParamRange is now already a Set - private Map>> getProtoRoles(ParamJob job, ParamCoreGType gt) + private //Map>> + Map> + getProtoRoles(ParamJob job, ParamCoreGType gt) { Set prs = gt.getParamRoles(); @@ -329,7 +344,8 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy } } - Map>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); + //Map>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); + Map> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); for (Role r : powersets.keySet()) { Set> powset = powersets.get(r); @@ -384,9 +400,10 @@ private Map>> getProtoRoles(ParamJob job, ParamCoreGTy job.debugPrintln("[param-core] Ranges co-set: " + coset); job.debugPrintln("[param-core] Running Z3 on:\n" + z3); - if (Z3Wrapper.checkSat(job, gpd, z3)) + if (Z3Wrapper.checkSat(job, this.gpd, z3)) { - protoRoles.get(r).add(cand); + //protoRoles.get(r).add(cand); + protoRoles.get(r).add(new ParamActualRole(r.toString(), cand, coset)); } } } @@ -417,7 +434,8 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce { Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); String png = args[i+1]; - for (Entry, EGraph> e : this.E0.get(role).entrySet()) + //for (Entry, EGraph> e : this.E0.get(role).entrySet()) + for (Entry e : this.E0.get(role).entrySet()) { String out = e.getValue().init.toDot(); runDot(out, png); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index 1fc27e62f..b8f858d88 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -14,10 +14,9 @@ import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; public class ParamCoreGChoice extends ParamCoreChoice implements ParamCoreGType { @@ -46,7 +45,8 @@ public Set getParamRoles() } @Override - public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException + //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException + public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException { if (this.kind != ParamCoreGActionKind.CROSS_TRANSFER) { @@ -57,36 +57,47 @@ public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ra for (Entry e : this.cases.entrySet()) { ParamCoreMessage a = e.getKey(); - projs.put(a, e.getValue().project(af, r, ranges)); + //projs.put(a, e.getValue().project(af, r, ranges)); + projs.put(a, e.getValue().project(af, subj)); // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) // FIXME: receive assertion projection -- should not be the same as send? } // "Simple" cases - if (this.src.getName().equals(r)) + //if (this.src.getName().equals(r)) + if (this.src.getName().equals(subj.getName())) { - return (ranges.contains(this.src.ranges.iterator().next())) + //return (ranges.contains(this.src.ranges.iterator().next())) + return (subj.ranges.contains(this.src.ranges.iterator().next())) ? af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.SEND_ALL, projs) - : merge(af, r, ranges, projs); + //: merge(af, r, ranges, projs); + : merge(af, subj, projs); } - else if (this.dest.getName().equals(r)) + //else if (this.dest.getName().equals(r)) + else if (this.dest.getName().equals(subj.getName())) { - return (ranges.contains(this.dest.ranges.iterator().next())) + //return (ranges.contains(this.dest.ranges.iterator().next())) + return (subj.ranges.contains(this.dest.ranges.iterator().next())) ? af.ParamCoreLChoice(this.src, ParamCoreLActionKind.RECEIVE_ALL, projs) - : merge(af, r, ranges, projs); + //: merge(af, r, ranges, projs); + : merge(af, subj, projs); } // src name != dest name - return merge(af, r, ranges, projs); + //return merge(af, r, ranges, projs); + return merge(af, subj, projs); } - private ParamCoreLType merge(ParamCoreAstFactory af, Role r, Set ranges, Map projs) throws ParamCoreSyntaxException + //private ParamCoreLType merge(ParamCoreAstFactory af, Role r, Set ranges, Map projs) throws ParamCoreSyntaxException + private ParamCoreLType merge(ParamCoreAstFactory af, ParamActualRole r, Map projs) throws ParamCoreSyntaxException { // "Merge" Collection values = projs.values(); if (values.size() > 1) { - throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + " for " + ranges + ": cannot merge for: " + projs.keySet()); + throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + //+ " for " + ranges + + ": cannot merge for: " + projs.keySet()); } return values.iterator().next(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java index ff7f411a8..f6ec8d11c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java @@ -5,11 +5,11 @@ import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreEnd; -import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; -import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; public class ParamCoreGEnd extends ParamCoreEnd implements ParamCoreGType @@ -28,7 +28,8 @@ public Set getParamRoles() } @Override - public ParamCoreLEnd project(ParamCoreAstFactory af, Role r, Set ranges) + //public ParamCoreLEnd project(ParamCoreAstFactory af, Role r, Set ranges) + public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException { return af.ParamCoreLEnd(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java index 695b0264a..f9aba5d7a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java @@ -8,11 +8,10 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; public class ParamCoreGRec extends ParamCoreRec implements ParamCoreGType { @@ -28,9 +27,11 @@ public Set getParamRoles() } @Override - public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException + //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException + public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException { - ParamCoreLType proj = this.body.project(af, r, ranges); + //ParamCoreLType proj = this.body.project(af, r, ranges); + ParamCoreLType proj = this.body.project(af, subj); if (proj instanceof ParamCoreLRecVar) { ParamCoreLRecVar rv = (ParamCoreLRecVar) proj; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java index 4d81126cb..d3da4d92b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java @@ -5,12 +5,12 @@ import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreRecVar; -import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; -import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; -import org.scribble.type.name.Role; public class ParamCoreGRecVar extends ParamCoreRecVar implements ParamCoreGType @@ -27,7 +27,8 @@ public Set getParamRoles() } @Override - public ParamCoreLRecVar project(ParamCoreAstFactory af, Role r, Set ranges) + //public ParamCoreLRecVar project(ParamCoreAstFactory af, Role r, Set ranges) + public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException { return af.ParamCoreLRecVar(this.recvar); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java index 885cf2c5b..4e1469442 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java @@ -6,17 +6,17 @@ import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; import org.scribble.ext.go.core.ast.ParamCoreType; import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.kind.Global; -import org.scribble.type.name.Role; public interface ParamCoreGType extends ParamCoreType { // FIXME: clarify, Role subj is used as "role name" - ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; + //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; + ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException; Set getParamRoles(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java new file mode 100644 index 000000000..44aaf9083 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java @@ -0,0 +1,59 @@ +package org.scribble.ext.go.core.type; + +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; + +public class ParamActualRole extends ParamRole +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public final Set coranges; + + public ParamActualRole(String name, Set ranges, Set coranges) + { + super(name, ranges); + this.coranges = Collections.unmodifiableSet(coranges); + } + + @Override + public String toString() + { + String rs2 = "{" + this.coranges.stream().map(r -> r.toString()).collect(Collectors.joining(", ")) + "}"; + return super.toString() + rs2; + } + + @Override + public int hashCode() + { + int hash = 7193; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.coranges.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamActualRole)) + { + return false; + } + ParamActualRole them = (ParamActualRole) obj; + return super.equals(them) // Does canEqual + && this.coranges.equals(them.coranges); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof ParamActualRole; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java index fdec075e6..83b097be8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java @@ -28,6 +28,12 @@ public Set getVars() //return Stream.of(this.start, this.end).filter(p -> !p.isConstant()).collect(Collectors.toSet()); return Stream.of(this.start, this.end).flatMap(p -> p.getVars().stream()).collect(Collectors.toSet()); } + + @Override + public String toString() + { + return "[" + this.start + ((this.start == this.end) ? "" : ".." + this.end) + "]"; + } @Override public int hashCode() @@ -52,10 +58,4 @@ public boolean equals(Object obj) ParamRange them = (ParamRange) obj; return this.start.equals(them.start) && this.end.equals(them.end); } - - @Override - public String toString() - { - return "[" + this.start + ((this.start == this.end) ? "" : ".." + this.end) + "]"; - } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java index 540ca523c..2455a2fbf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java @@ -17,10 +17,10 @@ public class ParamRole extends Role //public final ParamRange range; public final Set ranges; // size >= 1 -- size == 1 for parsed syntax - public ParamRole(String name, Set range) + public ParamRole(String name, Set ranges) { super(name); - this.ranges = Collections.unmodifiableSet(range); + this.ranges = Collections.unmodifiableSet(ranges); } // FIXME @@ -28,6 +28,13 @@ public Role getName() { return new Role(this.getLastElement()); } + + @Override + public String toString() + { + String rs = "{" + this.ranges.stream().map(r -> r.toString()).collect(Collectors.joining(", ")) + "}"; + return super.toString() + rs; + } @Override public int hashCode() @@ -59,15 +66,4 @@ public boolean canEqual(Object o) { return o instanceof ParamRole; } - - @Override - public String toString() - { - String s = this.ranges.stream().map(r -> r.toString()).collect(Collectors.joining(", ")); - if (this.ranges.size() > 1) - { - s = "{" + s + "}"; - } - return super.toString() + s; - } } From 2d315709e953347e7699edc1dca1045e80462617 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 00:25:45 +0100 Subject: [PATCH 069/433] Revised param-core API gen to take ParamActualRole. Added draft Ring example. --- .../scribble/ext/go/cli/ParamCommandLine.java | 2 +- .../ParamCoreSTEndpointApiGenerator.java | 4 +-- .../ParamCoreSTStateChanAPIBuilder.java | 9 +++++-- .../endpoint/action/ParamCoreEAction.java | 2 +- .../src/test/scrib/param/cgo18/Ring.scr | 25 +++++++++++++++++++ .../test/scrib/param/cgo18/ScatterGather.scr | 2 +- 6 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 scribble-go/src/test/scrib/param/cgo18/Ring.scr diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index a3d5cb3ac..6551bb497 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -153,7 +153,7 @@ else if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_API_GEN)) for (ParamActualRole ranges : this.P0.get(role).keySet()) { EGraph efsm = this.E0.get(role).get(ranges); - Map goClasses = new ParamCoreSTEndpointApiGenerator(job).generateGoApi(fullname, role, efsm); + Map goClasses = new ParamCoreSTEndpointApiGenerator(job).generateGoApi(fullname, ranges, efsm); outputClasses(goClasses); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index 96264b99a..9c5450c27 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -3,11 +3,11 @@ import java.util.Map; import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; +import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.main.Job; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoStEndpointApiGenerator public class ParamCoreSTEndpointApiGenerator @@ -20,7 +20,7 @@ public ParamCoreSTEndpointApiGenerator(Job job) } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later - public Map generateGoApi(GProtocolName fullname, Role self, EGraph egraph) throws ScribbleException + public Map generateGoApi(GProtocolName fullname, ParamActualRole self, EGraph egraph) throws ScribbleException { this.job.debugPrintln("\n[param-core] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); ParamCoreSTStateChanAPIBuilder apigen diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java index 87847c461..a8cc1f79d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java @@ -4,12 +4,12 @@ import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.main.Job; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder public class ParamCoreSTStateChanAPIBuilder extends STStateChanAPIBuilder @@ -17,7 +17,7 @@ public class ParamCoreSTStateChanAPIBuilder extends STStateChanAPIBuilder //private int counter = 1; // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later - public ParamCoreSTStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) + public ParamCoreSTStateChanAPIBuilder(Job job, GProtocolName gpn, ParamActualRole role, EGraph graph) { super(job, gpn, role, graph, null, //new GoSTOutputStateBuilder(new GoSTSendActionBuilder()), @@ -28,6 +28,11 @@ public ParamCoreSTStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGr throw new RuntimeException("[param-core] TODO:"); } + + protected ParamActualRole getSelf() + { + return (ParamActualRole) this.getSelf(); + } @Override public String getPackage() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java index 7946269b9..1cdfbf8f2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java @@ -5,5 +5,5 @@ public interface ParamCoreEAction { - ParamRole getPeer(); + ParamRole getPeer(); // N.B. *not* ParamActualRole } diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr new file mode 100644 index 000000000..94e5a0765 --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -0,0 +1,25 @@ +//Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Ring.scr -param Proto1 -param-fsm B + +module assrt.cg018.Ring; + + +type "int" from "..." as int; + + +//* +global protocol Proto1(role A(k), role B(k)) +{ + choice at A //[1..1] // FIXME + { + m1(int) dot A[1..1] to B[1..k-1]; + m1(int) dot B[1..k] to A[1..1]; + do Proto1(A, B); // FIXME + } + or + { + m2(int) dot A[1..1] to B[1..k-1]; + m2(int) dot B[1..k] to A[1..1]; + } +} +//*/ diff --git a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr index 84d45e7ba..4486f4fac 100644 --- a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr +++ b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr @@ -8,7 +8,7 @@ type "int" from "..." as int; //* -global protocol Proto1(role A, role B(k)) +global protocol Proto1(role A(k), role B(k)) { scatter(int) from A[1..1] to B[1..k]; gather(int) from B[1..k] to A[1..1]; From 2443eb4a2f7fc6a6e4b843a586dbeb2ec281805f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 01:17:48 +0100 Subject: [PATCH 070/433] Added ParamGChoice. --- .../java/org/scribble/ast/AstFactoryImpl.java | 4 +- .../main/java/org/scribble/ast/Choice.java | 2 +- .../java/org/scribble/ast/global/GChoice.java | 11 +-- .../java/org/scribble/ast/local/LChoice.java | 2 +- .../org/scribble/del/global/GChoiceDel.java | 1 + .../org/scribble/parser/antlr/ParamScribble.g | 7 +- .../scribble/ext/go/ast/ParamAstFactory.java | 3 + .../ext/go/ast/ParamAstFactoryImpl.java | 14 ++- .../scribble/ext/go/ast/ParamRoleDecl.java | 2 +- .../ext/go/ast/global/ParamGChoice.java | 86 +++++++++++++++++++ .../ext/go/del/global/ParamGChoiceDel.java | 34 ++++++++ .../scribble/ParamAntlrToScribParser.java | 4 + .../scribble/ast/ParamAntlrGChoice.java | 52 +++++++++++ .../src/test/scrib/param/cgo18/Ring.scr | 6 +- .../src/test/scrib/param/tmp/ParamTest.scr | 16 +++- 15 files changed, 223 insertions(+), 21 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGChoiceDel.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java diff --git a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java index b175f23ce..755821954 100644 --- a/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/ast/AstFactoryImpl.java @@ -34,7 +34,6 @@ import org.scribble.ast.global.GWrap; import org.scribble.ast.local.LAccept; import org.scribble.ast.local.LChoice; -import org.scribble.ast.local.LRequest; import org.scribble.ast.local.LContinue; import org.scribble.ast.local.LDelegationElem; import org.scribble.ast.local.LDisconnect; @@ -48,6 +47,7 @@ import org.scribble.ast.local.LProtocolHeader; import org.scribble.ast.local.LReceive; import org.scribble.ast.local.LRecursion; +import org.scribble.ast.local.LRequest; import org.scribble.ast.local.LSend; import org.scribble.ast.local.LWrapClient; import org.scribble.ast.local.LWrapServer; @@ -91,7 +91,6 @@ import org.scribble.del.global.GWrapDel; import org.scribble.del.local.LAcceptDel; import org.scribble.del.local.LChoiceDel; -import org.scribble.del.local.LRequestDel; import org.scribble.del.local.LContinueDel; import org.scribble.del.local.LDisconnectDel; import org.scribble.del.local.LDoDel; @@ -102,6 +101,7 @@ import org.scribble.del.local.LProtocolDefDel; import org.scribble.del.local.LReceiveDel; import org.scribble.del.local.LRecursionDel; +import org.scribble.del.local.LRequestDel; import org.scribble.del.local.LSendDel; import org.scribble.del.local.LWrapClientDel; import org.scribble.del.local.LWrapServerDel; diff --git a/scribble-core/src/main/java/org/scribble/ast/Choice.java b/scribble-core/src/main/java/org/scribble/ast/Choice.java index 5559358a3..4d75de830 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Choice.java +++ b/scribble-core/src/main/java/org/scribble/ast/Choice.java @@ -57,7 +57,7 @@ public String toString() { String sep = " " + Constants.OR_KW + " "; return Constants.CHOICE_KW + " " + Constants.AT_KW + " " + this.subj + " " - + this.blocks.stream().map((b) -> b.toString()).collect(Collectors.joining(sep)); + + this.blocks.stream().map(b -> b.toString()).collect(Collectors.joining(sep)); } /*@Override diff --git a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java b/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java index 5718f822d..60e20c63b 100644 --- a/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/global/GChoice.java @@ -107,15 +107,8 @@ public List getBlocks() return castBlocks(super.getBlocks()); } - private static List castBlocks(List> blocks) + protected static List castBlocks(List> blocks) { - return blocks.stream().map((b) -> (GProtocolBlock) b).collect(Collectors.toList()); + return blocks.stream().map(b -> (GProtocolBlock) b).collect(Collectors.toList()); } - - /*// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350 - @Override - public Global getKind() - { - return GCompoundInteractionNode.super.getKind(); - }*/ } diff --git a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java index 68b176d2c..455b99727 100644 --- a/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java +++ b/scribble-core/src/main/java/org/scribble/ast/local/LChoice.java @@ -77,7 +77,7 @@ public Role inferLocalChoiceSubject(ProjectedChoiceSubjectFixer fixer) private static List castBlocks(List> blocks) { - return blocks.stream().map((b) -> (LProtocolBlock) b).collect(Collectors.toList()); + return blocks.stream().map(b -> (LProtocolBlock) b).collect(Collectors.toList()); } @Override diff --git a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java index 7fdf44fdf..0f07840ae 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GChoiceDel.java @@ -38,6 +38,7 @@ public class GChoiceDel extends ChoiceDel implements GCompoundInteractionNodeDel { + @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 94ea48ab6..328ea2785 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -169,10 +169,11 @@ tokens LOCALRECEIVE = 'local-receive';*/ - PARAM_BININDEXEXPR = 'PARAM_BININDEXEXPR'; + PARAM_BININDEXEXPR = 'PARAM_BININDEXEXPR'; // FIXME: rename bin part PARAM_ROLEDECL = 'PARAM_ROLEDECL'; PARAM_GLOBALCROSSMESSAGETRANSFER = 'PARAM_GLOBALCROSSMESSAGETRANSFER'; PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; + PARAM_GLOBALCHOICE = 'PARAM_GLOBALCHOICE'; } @@ -746,6 +747,10 @@ globalchoice: CHOICE_KW AT_KW rolename globalprotocolblock (OR_KW globalprotocolblock)* -> ^(GLOBALCHOICE rolename globalprotocolblock+) +| + CHOICE_KW AT_KW rolename '[' paramindexexpr ']' globalprotocolblock (OR_KW globalprotocolblock)* +-> + ^(PARAM_GLOBALCHOICE rolename paramindexexpr globalprotocolblock+) ; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java index 877768b92..8ad36f10d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java @@ -5,7 +5,9 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; +import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.global.ParamGChoice; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; import org.scribble.ext.go.type.index.ParamIndexExpr; @@ -23,4 +25,5 @@ ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNod ParamGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd); + ParamGChoice ParamGChoice(CommonTree source, RoleNode subj, ParamIndexExpr expr, List blocks); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index 8a397a872..bcf92c537 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -5,11 +5,14 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.MessageNode; +import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.RoleDeclDel; import org.scribble.del.global.GMessageTransferDel; +import org.scribble.ext.go.ast.global.ParamGChoice; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; +import org.scribble.ext.go.del.global.ParamGChoiceDel; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -17,6 +20,7 @@ public class ParamAstFactoryImpl extends AstFactoryImpl implements ParamAstFactory { + // Instantiating existing node classes with new dels /*@Override @@ -120,7 +124,7 @@ public AssrtLConnect LConnect(CommonTree source, RoleNode src, MessageNode msg, }* / - // Returning new node classes in place of existing + // Returning new node classes in place of existing -- FIXME: do for GMessageTransfer and GChoice // Still used by parsing for empty annotation/assertion nodes -- but we return an Assrt node // Easier to make all global as Assrt nodes, to avoid cast checks in, e.g., AssrtGProtocolDeclDel::leaveProjection (for GProtocolHeader), and so all projections will be Assrt kinds only @@ -210,6 +214,14 @@ public ParamGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, Role return mt; } + @Override + public ParamGChoice ParamGChoice(CommonTree source, RoleNode subj, ParamIndexExpr expr, List blocks) + { + ParamGChoice gc = new ParamGChoice(source, subj, expr, blocks); + gc = del(gc, new ParamGChoiceDel()); + return gc; + } + /*@Override public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java index cf9fa1792..d789fdbca 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java @@ -21,7 +21,7 @@ public class ParamRoleDecl extends RoleDecl public final List params; //public ParamRoleDecl(CommonTree source, RoleNode name, List params) - public ParamRoleDecl(CommonTree source, RoleNode name, List params) + public ParamRoleDecl(CommonTree source, RoleNode name, List params) // Separating params from base RoleNode better for subprotos? { super(source, name); this.params = Collections.unmodifiableList(params); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java new file mode 100644 index 000000000..b34998897 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java @@ -0,0 +1,86 @@ +package org.scribble.ext.go.ast.global; + +import java.util.List; +import java.util.stream.Collectors; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.Constants; +import org.scribble.ast.ProtocolBlock; +import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.local.LChoice; +import org.scribble.ast.local.LProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; +import org.scribble.util.ScribUtil; +import org.scribble.visit.AstVisitor; + +public class ParamGChoice extends GChoice +{ + + public final ParamIndexExpr expr; + public ParamGChoice(CommonTree source, RoleNode subj, ParamIndexExpr expr, List blocks) + { + super(source, subj, blocks); + this.expr = expr; + } + + // Similar pattern to reconstruct + // Idea is, if extending the AST class (more fields), then reconstruct/project should also be extended (and called from extended del) + public LChoice project(AstFactory af, Role self, List blocks) + { + throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing + } + + @Override + protected ScribNodeBase copy() + { + return new ParamGChoice(this.source, this.subj, this.expr, getBlocks()); + } + + @Override + public ParamGChoice clone(AstFactory af) + { + RoleNode subj = this.subj.clone(af); + List blocks = ScribUtil.cloneList(af, getBlocks()); + return ((ParamAstFactory) af).ParamGChoice(this.source, subj, this.expr, blocks); + } + + @Override + public ParamGChoice reconstruct(RoleNode subj, List> blocks) + { + throw new RuntimeException("[param] Shouldn't get in here: " + this); + } + + public ParamGChoice reconstruct(RoleNode subj, ParamIndexExpr expr, List> blocks) + { + ScribDel del = del(); + ParamGChoice gc = new ParamGChoice(this.source, subj, expr, castBlocks(blocks)); + gc = (ParamGChoice) gc.del(del); + return gc; + } + + @Override + public ParamGChoice visitChildren(AstVisitor nv) throws ScribbleException + { + RoleNode subj = (RoleNode) visitChild(this.subj, nv); + List blocks = visitChildListWithClassEqualityCheck(this, getBlocks(), nv); + return reconstruct(subj, this.expr, blocks); + } + + @Override + public String toString() + { + String sep = " " + Constants.OR_KW + " "; + return Constants.CHOICE_KW + " " + Constants.AT_KW + " " + this.subj + + "[" + this.expr + "]" + + " " + getBlocks().stream().map(b -> b.toString()).collect(Collectors.joining(sep)); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGChoiceDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGChoiceDel.java new file mode 100644 index 000000000..bc37cf9cb --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGChoiceDel.java @@ -0,0 +1,34 @@ +package org.scribble.ext.go.del.global; + +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.ast.ScribNode; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDelBase; +import org.scribble.del.global.GChoiceDel; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.ast.global.ParamGChoice; +import org.scribble.main.ScribbleException; +import org.scribble.visit.ProtocolDefInliner; +import org.scribble.visit.env.InlineProtocolEnv; + +public class ParamGChoiceDel extends GChoiceDel +{ + @Override + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + { + ParamGChoice gc = (ParamGChoice) visited; + List blocks = gc.getBlocks().stream() + .map(b -> (GProtocolBlock) ((InlineProtocolEnv) b.del().env()).getTranslation()).collect(Collectors.toList()); + RoleNode subj = gc.subj.clone(inl.job.af); + + ParamGChoice inlined = ((ParamAstFactory) inl.job.af).ParamGChoice(gc.getSource(), subj, gc.expr, blocks); + + inl.pushEnv(inl.popEnv().setTranslation(inlined)); + + //return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); + return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java index b743f1071..dec9d1559 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java @@ -4,6 +4,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.ScribNode; import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.parser.scribble.ast.ParamAntlrGChoice; import org.scribble.ext.go.parser.scribble.ast.ParamAntlrRoleDecl; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGCrossMessageTransfer; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGDotMessageTransfer; @@ -16,6 +17,7 @@ public class ParamAntlrToScribParser extends AntlrToScribParser public static final String PARAM_ROLEDECL_NODE_TYPE = "PARAM_ROLEDECL"; public static final String PARAM_GLOBALCROSSMESSAGETRANSFER_NODE_TYPE = "PARAM_GLOBALCROSSMESSAGETRANSFER"; public static final String PARAM_GLOBALDOTMESSAGETRANSFER_NODE_TYPE = "PARAM_GLOBALDOTMESSAGETRANSFER"; + public static final String PARAM_GLOBALCHOICE_NODE_TYPE = "PARAM_GLOBALCHOICE"; public ParamAntlrToScribParser() { @@ -36,6 +38,8 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException return ParamAntlrGCrossMessageTransfer.parseParamGCrossMessageTransfer(this, ct, aaf); case PARAM_GLOBALDOTMESSAGETRANSFER_NODE_TYPE: return ParamAntlrGDotMessageTransfer.parseParamGDotMessageTransfer(this, ct, aaf); + case PARAM_GLOBALCHOICE_NODE_TYPE: + return ParamAntlrGChoice.parseParamGChoice(this, ct, aaf); default: return super.parse(ct, af); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java new file mode 100644 index 000000000..118376b25 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java @@ -0,0 +1,52 @@ +package org.scribble.ext.go.parser.scribble.ast; + +import java.util.LinkedList; +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.AntlrToScribParserUtil; +import org.scribble.parser.scribble.ast.name.AntlrSimpleName; +import org.scribble.util.ScribParserException; + +public class ParamAntlrGChoice +{ + public static final int SUBJECT_CHILD_INDEX = 0; + + public static final int BLOCK_CHILDREN_START_INDEX = 2; + public static final int INDEX_EXPR_CHILD_INDEX = 1; + + public static GChoice parseParamGChoice(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException + { + RoleNode subj = AntlrSimpleName.toRoleNode(getSubjectChild(root), af); + List blocks = new LinkedList<>(); + ParamIndexExpr expr = ParamAntlrIndexExpr.parseParamIndexExpr(getIndexExprChild(root), af); + for (CommonTree b : getBlockChildren(root)) + { + blocks.add((GProtocolBlock) parser.parse(b, af)); + } + return af.ParamGChoice(root, subj, expr, blocks); + } + + public static CommonTree getSubjectChild(CommonTree ct) + { + return (CommonTree) ct.getChild(SUBJECT_CHILD_INDEX); + } + + public static CommonTree getIndexExprChild(CommonTree ct) + { + return (CommonTree) ct.getChild(INDEX_EXPR_CHILD_INDEX); + } + + public static List getBlockChildren(CommonTree ct) + { + List children = ct.getChildren(); + return AntlrToScribParserUtil.toCommonTreeList(children.subList(BLOCK_CHILDREN_START_INDEX, children.size())); + } +} diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index 94e5a0765..3a760b5b8 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -8,13 +8,13 @@ type "int" from "..." as int; //* -global protocol Proto1(role A(k), role B(k)) +global protocol Proto1(role A(k), role B(k)) // FIXME: role param WF { - choice at A //[1..1] // FIXME + choice at A[1] // FIXME: role index WF? { m1(int) dot A[1..1] to B[1..k-1]; m1(int) dot B[1..k] to A[1..1]; - do Proto1(A, B); // FIXME + do Proto1(A, B); // FIXME: role params? } or { diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 589641690..febb77080 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,7 +8,7 @@ module assrt.tmp.ParamTest; -//type "int" from "..." as int; +type "int" from "..." as int; //type "string" from "..." as string; @@ -26,7 +26,19 @@ module assrt.tmp.ParamTest; */ -//*/ +global protocol Proto1(role A, role B(n)) +{ + choice at A[1] + { + 1(int) from A[1..1] to B[1..n]; + } + or + { + 2(int) from A[1..1] to B[1..n]; + } +} + +/*/ global protocol Proto1(role A(m,n), role B(m,n)) { 1() from A[1..1] to B[1..n]; From 1e21fa936a2154e68a2efee67b8bdccd5718f0fd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 01:19:36 +0100 Subject: [PATCH 071/433] Minor. --- scribble-go/src/test/scrib/param/cgo18/Ring.scr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index 3a760b5b8..120e74ec4 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -1,5 +1,5 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java -//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Ring.scr -param Proto1 -param-fsm B +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Ring.scr -param Proto1 module assrt.cg018.Ring; From e4a6b6a2ec5b67c09788f3c902536c56fbff9167 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 01:39:55 +0100 Subject: [PATCH 072/433] Revised param Ring example. --- .../scribble/ext/go/ast/ParamAstFactoryImpl.java | 3 ++- scribble-go/src/test/scrib/param/cgo18/Ring.scr | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index bcf92c537..017e0529a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -13,6 +13,7 @@ import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; import org.scribble.ext.go.del.global.ParamGChoiceDel; +import org.scribble.ext.go.del.global.ParamGMessageTransferDel; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -210,7 +211,7 @@ public ParamGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, Role { ParamGDotMessageTransfer mt = new ParamGDotMessageTransfer(source, src, msg, dest, srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); - mt = del(mt, new GMessageTransferDel()); // FIXME + mt = del(mt, new ParamGMessageTransferDel()); // FIXME: parameterised self connection check return mt; } diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index 120e74ec4..6d1ae06c7 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -8,18 +8,18 @@ type "int" from "..." as int; //* -global protocol Proto1(role A(k), role B(k)) // FIXME: role param WF +global protocol Proto1(role B(k)) // FIXME: role param WF { - choice at A[1] // FIXME: role index WF? + choice at B[1] // FIXME: role index WF? { - m1(int) dot A[1..1] to B[1..k-1]; - m1(int) dot B[1..k] to A[1..1]; - do Proto1(A, B); // FIXME: role params? + m1(int) dot B[1..k-1] to B[1..k]; // FIXME: range-sensitive role enabling + m1(int) dot B[k..k] to B[1..1]; + do Proto1(B); // FIXME: role params? } or { - m2(int) dot A[1..1] to B[1..k-1]; - m2(int) dot B[1..k] to A[1..1]; + m2(int) dot B[1..k-1] to B[1..k]; + m2(int) dot B[k..k] to B[1..1]; } } //*/ From e0bd68033814e3bd1cd9b02b958e31b1382fb3df Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 01:40:22 +0100 Subject: [PATCH 073/433] Added missing ParamGMessageTransferDel.java. --- .../del/global/ParamGMessageTransferDel.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMessageTransferDel.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMessageTransferDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMessageTransferDel.java new file mode 100644 index 000000000..fd9cf686e --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMessageTransferDel.java @@ -0,0 +1,32 @@ +package org.scribble.ext.go.del.global; + +import java.util.List; + +import org.scribble.ast.ScribNode; +import org.scribble.ast.global.GMessageTransfer; +import org.scribble.del.global.GMessageTransferDel; +import org.scribble.main.ScribbleException; +import org.scribble.type.name.Role; +import org.scribble.visit.wf.NameDisambiguator; + +public class ParamGMessageTransferDel extends GMessageTransferDel +{ + public ParamGMessageTransferDel() + { + + } + + @Override + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + { + GMessageTransfer gmt = (GMessageTransfer) visited; + Role src = gmt.src.toName(); + List dests = gmt.getDestinationRoles(); + if (dests.contains(src)) + { + // FIXME TODO + //throw new ScribbleException(gmt.getSource(), "[TODO] Self connections not supported: " + gmt); // Would currently be subsumed by unconnected check + } + return gmt; + } +} From 91c8c534b882659c35f285667b5c0ef7deb4538c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 01:50:32 +0100 Subject: [PATCH 074/433] Minor to param Ring example. --- scribble-go/src/test/scrib/param/cgo18/Ring.scr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index 6d1ae06c7..5af1cc4fc 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -12,13 +12,13 @@ global protocol Proto1(role B(k)) // FIXME: role param WF { choice at B[1] // FIXME: role index WF? { - m1(int) dot B[1..k-1] to B[1..k]; // FIXME: range-sensitive role enabling + m1(int) dot B[1..k-1] to B[2..k]; // FIXME: range-sensitive role enabling m1(int) dot B[k..k] to B[1..1]; do Proto1(B); // FIXME: role params? } or { - m2(int) dot B[1..k-1] to B[1..k]; + m2(int) dot B[1..k-1] to B[2..k]; m2(int) dot B[k..k] to B[1..1]; } } From 346fcd418dcf68b957eedeea889e3cc8060fdfa0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 13:31:31 +0100 Subject: [PATCH 075/433] Minor. --- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index febb77080..a62c5a8b8 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -23,6 +23,15 @@ type "int" from "..." as int; - how does prev pabble treat "actual roles"? e.g., pipeline - how does prev pabble do projection wrt. arbitrary role ranges? + + +vs. pabble +- projection (distribution) +- type generation vs. code generation (related to above, heavyweight code generation needed because not fully projected) + +message passing +- abstract transport -- shared mem, TCP -- integrated +- domain flexibility -- parallel algs, Web services -- shared parameterised abstraction, concrete transport independence */ From 0e6985f6044b25870c8a7f3bb56b1d20e606174a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 13:33:57 +0100 Subject: [PATCH 076/433] Minor. --- scribble-go/src/test/scrib/param/cgo18/Ring.scr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index 5af1cc4fc..3926442ad 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -8,13 +8,13 @@ type "int" from "..." as int; //* -global protocol Proto1(role B(k)) // FIXME: role param WF +global protocol Proto1(role B(k)) // FIXME: role param WF -- params only for root protos? { choice at B[1] // FIXME: role index WF? { m1(int) dot B[1..k-1] to B[2..k]; // FIXME: range-sensitive role enabling m1(int) dot B[k..k] to B[1..1]; - do Proto1(B); // FIXME: role params? + do Proto1(B); // FIXME: role params? or disallow role permuting? } or { From 4d1d179075d7ef28a09e8683889417d84fa3f41f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 15:19:48 +0100 Subject: [PATCH 077/433] Minor. --- .../java/org/scribble/ext/go/core/type/ParamActualRole.java | 2 +- .../src/main/java/org/scribble/ext/go/core/type/ParamRole.java | 2 +- scribble-go/src/test/scrib/param/cgo18/Ring.scr | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java index 44aaf9083..e5a32b02a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java @@ -22,7 +22,7 @@ public ParamActualRole(String name, Set ranges, Set cora @Override public String toString() { - String rs2 = "{" + this.coranges.stream().map(r -> r.toString()).collect(Collectors.joining(", ")) + "}"; + String rs2 = "{" + this.coranges.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; return super.toString() + rs2; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java index 2455a2fbf..706b1ceb0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java @@ -32,7 +32,7 @@ public Role getName() @Override public String toString() { - String rs = "{" + this.ranges.stream().map(r -> r.toString()).collect(Collectors.joining(", ")) + "}"; + String rs = "{" + this.ranges.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; return super.toString() + rs; } diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index 3926442ad..103a51bc5 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -1,7 +1,7 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java //$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Ring.scr -param Proto1 -module assrt.cg018.Ring; +module assrt.cgo18.Ring; type "int" from "..." as int; From 17c4a9c7bf0b3c453ab013391ca3ce9e7df53b9a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 15:30:08 +0100 Subject: [PATCH 078/433] Minor typo fixing in param examples. --- scribble-go/src/test/scrib/param/cgo18/Ring.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index 103a51bc5..004e1d9a3 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -1,7 +1,7 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java //$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Ring.scr -param Proto1 -module assrt.cgo18.Ring; +module param.cgo18.Ring; type "int" from "..." as int; diff --git a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr index 4486f4fac..9e61699ed 100644 --- a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr +++ b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr @@ -1,7 +1,7 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java //$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr -param Proto1 -param-fsm B -module assrt.cg018.ScatterGather; +module param.cgo18.ScatterGather; type "int" from "..." as int; From 9c8e8f3eee7c055735a66e294f6d9354d7df3d30 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 15:45:36 +0100 Subject: [PATCH 079/433] Minor. --- .../main/java/org/scribble/ext/go/cli/ParamCommandLine.java | 4 ++-- .../java/org/scribble/ext/go/core/type/ParamActualRole.java | 4 +++- .../main/java/org/scribble/ext/go/core/type/ParamRole.java | 6 +++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 6551bb497..4482a9d50 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -396,8 +396,8 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro z3 = //"(declare-const id Int)\n "(assert " + z3 + ")"; - job.debugPrintln("\n[param-core] Candidate role: " + cand); - job.debugPrintln("[param-core] Ranges co-set: " + coset); + job.debugPrintln("\n[param-core] Candidate: " + cand); + job.debugPrintln("[param-core] Co-set: " + coset); job.debugPrintln("[param-core] Running Z3 on:\n" + z3); if (Z3Wrapper.checkSat(job, this.gpd, z3)) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java index e5a32b02a..057416721 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java @@ -22,8 +22,10 @@ public ParamActualRole(String name, Set ranges, Set cora @Override public String toString() { + // Duplicated from super to make braces mandatory + String rs1 = "{" + this.ranges.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; String rs2 = "{" + this.coranges.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; - return super.toString() + rs2; + return super.getLastElement() + rs1 + rs2; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java index 706b1ceb0..d55022f4e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java @@ -32,7 +32,11 @@ public Role getName() @Override public String toString() { - String rs = "{" + this.ranges.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; + String rs = this.ranges.stream().map(Object::toString).collect(Collectors.joining(", ")); + if (this.ranges.size() > 1) + { + rs = "{" + rs + "}"; + } return super.toString() + rs; } From 44834d5b0badae8d6ba1ed548bd7eb529c68060a Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Sat, 26 Aug 2017 23:58:10 +0100 Subject: [PATCH 080/433] Add parameterised Scribble protocol examples. --- scribble-go/src/test/scrib/param/cgo18/AllToAll.scr | 6 ++++++ scribble-go/src/test/scrib/param/cgo18/AllToOne.scr | 6 ++++++ scribble-go/src/test/scrib/param/cgo18/OneToAll.scr | 6 ++++++ scribble-go/src/test/scrib/param/cgo18/OneToOne.scr | 6 ++++++ 4 files changed, 24 insertions(+) create mode 100644 scribble-go/src/test/scrib/param/cgo18/AllToAll.scr create mode 100644 scribble-go/src/test/scrib/param/cgo18/AllToOne.scr create mode 100644 scribble-go/src/test/scrib/param/cgo18/OneToAll.scr create mode 100644 scribble-go/src/test/scrib/param/cgo18/OneToOne.scr diff --git a/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr b/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr new file mode 100644 index 000000000..ab9e9df68 --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr @@ -0,0 +1,6 @@ +module param.cgo18.AllToAll; + +global protocol P(role A(N), role B(M)) +{ + Msg() from A[1..N] to B[1..M]; +} diff --git a/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr b/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr new file mode 100644 index 000000000..e4296d241 --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr @@ -0,0 +1,6 @@ +module param.cgo18.AllToOne; + +global protocol P(role A(N), role B) +{ + Msg() from A[1..N] to B[1..1]; +} diff --git a/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr b/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr new file mode 100644 index 000000000..f5f2c6e72 --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr @@ -0,0 +1,6 @@ +module param.cgo18.OneToAll; + +global protocol P(role A, role B(N)) +{ + Msg() from A[1..1] to B[1..N]; +} diff --git a/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr b/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr new file mode 100644 index 000000000..5254d0f1d --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr @@ -0,0 +1,6 @@ +module param.cgo18.OneToOne; + +global protocol P(role A, role B) +{ + Msg() from A[1..1] to B[1..1]; +} From a05711ada8c0bb9c93fc3fe489d5aa990db67236 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Mon, 28 Aug 2017 20:17:51 +0100 Subject: [PATCH 081/433] Add type definitions for the protocols. --- scribble-go/src/test/scrib/param/cgo18/AllToAll.scr | 4 +++- scribble-go/src/test/scrib/param/cgo18/AllToOne.scr | 4 +++- scribble-go/src/test/scrib/param/cgo18/OneToAll.scr | 4 +++- scribble-go/src/test/scrib/param/cgo18/OneToOne.scr | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr b/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr index ab9e9df68..50a2f04d4 100644 --- a/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr +++ b/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr @@ -1,6 +1,8 @@ module param.cgo18.AllToAll; +type int from "runtime" as int; + global protocol P(role A(N), role B(M)) { - Msg() from A[1..N] to B[1..M]; + Msg(int) from A[1..N] to B[1..M]; } diff --git a/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr b/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr index e4296d241..1186c2fe3 100644 --- a/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr +++ b/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr @@ -1,6 +1,8 @@ module param.cgo18.AllToOne; +type int from "runtime" as int; + global protocol P(role A(N), role B) { - Msg() from A[1..N] to B[1..1]; + Msg(int) from A[1..N] to B[1..1]; } diff --git a/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr b/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr index f5f2c6e72..1adedc2a1 100644 --- a/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr +++ b/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr @@ -1,6 +1,8 @@ module param.cgo18.OneToAll; +type int from "runtime" as int; + global protocol P(role A, role B(N)) { - Msg() from A[1..1] to B[1..N]; + Msg(int) from A[1..1] to B[1..N]; } diff --git a/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr b/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr index 5254d0f1d..893af6d61 100644 --- a/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr +++ b/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr @@ -1,6 +1,8 @@ module param.cgo18.OneToOne; +type int from "runtime" as int; + global protocol P(role A, role B) { - Msg() from A[1..1] to B[1..1]; + Msg(int) from A[1..1] to B[1..1]; } From 01762ff5f607ea1e391498427fc5598b9a33bdb1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 20:31:40 +0100 Subject: [PATCH 082/433] Added some more param examples (not all working). --- .../src/test/scrib/param/cgo18/MergeSort.scr | 27 +++++++++++++++++++ .../test/scrib/param/cgo18/SpectralNorm.scr | 21 +++++++++++++++ .../src/test/scrib/param/cgo18/SumEuler.scr | 17 ++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 scribble-go/src/test/scrib/param/cgo18/MergeSort.scr create mode 100644 scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr create mode 100644 scribble-go/src/test/scrib/param/cgo18/SumEuler.scr diff --git a/scribble-go/src/test/scrib/param/cgo18/MergeSort.scr b/scribble-go/src/test/scrib/param/cgo18/MergeSort.scr new file mode 100644 index 000000000..587f2d889 --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/MergeSort.scr @@ -0,0 +1,27 @@ +//Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SumEuler.scr -param Proto1 + +module param.cgo18.MergeSort; + + +type "int" from "..." as int; +type "int[]" from "..." as intarray; + + +//* +global protocol Proto1(role M(i, j), role W(i, j)) +{ + /* // ?? + M --> W[0][1..n] : <[] int> + forall (i < log n), + forall (j < i), + W[i][j*2] --> W[i+1][j] . W[i][j*2+1] --> W[i+1][j] + W[log n][0] --> M + */ + + // TODO + 1(intarray) from M[1..1] to W[0..i*j]; + 2() dot W[...] to W[...]; + 3() from W[...] to M[1..1]; +} +//*/ diff --git a/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr b/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr new file mode 100644 index 000000000..a6dcb455f --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr @@ -0,0 +1,21 @@ +//Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr -param Proto1 + +module param.cgo18.SpectralNorm; + + +type "int" from "..." as int; +type "..." from "..." as vec; + + +//* +global protocol Proto1(role M(n), role W(n)) +{ + Data(int, int) from M[1..1] to W[1..n]; + Data(vec) from M[1..1] to W[1..n]; + Data(vec) from W[1..n] to M[1..1]; // here master-workers compute x + Data(vec) from M[1..1] to W[1..n]; + Data(vec) from W[1..n] to M[1..1]; // here master-workers compute v + do Proto1(M, W); +} +//*/ diff --git a/scribble-go/src/test/scrib/param/cgo18/SumEuler.scr b/scribble-go/src/test/scrib/param/cgo18/SumEuler.scr new file mode 100644 index 000000000..8c34cf13d --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/SumEuler.scr @@ -0,0 +1,17 @@ +//Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SumEuler.scr -param Proto1 + +module param.cgo18.SumEuler; + + +type "int" from "..." as int; +type "int[]" from "..." as intarray; + + +//* // cf. ScatterGather.scr +global protocol Proto1(role M(n), role W(n)) +{ + 1(intarray) from M[1..1] to W[1..n]; + 2(int) from W[1..n] to M[1..1]; +} +//*/ From e3ac9848f9c93585cc98fc3203e76d4b501e53c7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 20:32:11 +0100 Subject: [PATCH 083/433] Minor. --- scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr b/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr index a6dcb455f..2ae66b379 100644 --- a/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr +++ b/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr @@ -13,9 +13,9 @@ global protocol Proto1(role M(n), role W(n)) { Data(int, int) from M[1..1] to W[1..n]; Data(vec) from M[1..1] to W[1..n]; - Data(vec) from W[1..n] to M[1..1]; // here master-workers compute x + Data(vec) from W[1..n] to M[1..1]; // here master-workers compute x Data(vec) from M[1..1] to W[1..n]; - Data(vec) from W[1..n] to M[1..1]; // here master-workers compute v + Data(vec) from W[1..n] to M[1..1]; // here master-workers compute v do Proto1(M, W); } //*/ From 3a21a8271c7bafe6183baad3f17afddee5e962fd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 20:37:34 +0100 Subject: [PATCH 084/433] Fixed typos in examples in last merge from nickng. --- scribble-go/src/test/scrib/param/cgo18/AllToAll.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/AllToOne.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/OneToAll.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/OneToOne.scr | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr b/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr index 50a2f04d4..fb8530204 100644 --- a/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr +++ b/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr @@ -1,6 +1,6 @@ module param.cgo18.AllToAll; -type int from "runtime" as int; +type "int" from "runtime" as int; global protocol P(role A(N), role B(M)) { diff --git a/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr b/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr index 1186c2fe3..e6cab8e17 100644 --- a/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr +++ b/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr @@ -1,6 +1,6 @@ module param.cgo18.AllToOne; -type int from "runtime" as int; +type "int" from "runtime" as int; global protocol P(role A(N), role B) { diff --git a/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr b/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr index 1adedc2a1..daf8e7cce 100644 --- a/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr +++ b/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr @@ -1,6 +1,6 @@ module param.cgo18.OneToAll; -type int from "runtime" as int; +type "int" from "runtime" as int; global protocol P(role A, role B(N)) { diff --git a/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr b/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr index 893af6d61..bee95bd3c 100644 --- a/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr +++ b/scribble-go/src/test/scrib/param/cgo18/OneToOne.scr @@ -1,6 +1,6 @@ module param.cgo18.OneToOne; -type int from "runtime" as int; +type "int" from "runtime" as int; global protocol P(role A, role B) { From 445fa3c6bc45d0c885463990ca2bce40c334bc8e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 28 Aug 2017 20:50:32 +0100 Subject: [PATCH 085/433] Minor. --- scribble-go/src/test/scrib/param/cgo18/AllToAll.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/AllToOne.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/OneToAll.scr | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr b/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr index fb8530204..1e75b1a45 100644 --- a/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr +++ b/scribble-go/src/test/scrib/param/cgo18/AllToAll.scr @@ -2,7 +2,7 @@ module param.cgo18.AllToAll; type "int" from "runtime" as int; -global protocol P(role A(N), role B(M)) +global protocol P(role A(N, M), role B(N, M)) { Msg(int) from A[1..N] to B[1..M]; } diff --git a/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr b/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr index e6cab8e17..32fc62b74 100644 --- a/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr +++ b/scribble-go/src/test/scrib/param/cgo18/AllToOne.scr @@ -2,7 +2,7 @@ module param.cgo18.AllToOne; type "int" from "runtime" as int; -global protocol P(role A(N), role B) +global protocol P(role A(N), role B(N)) { Msg(int) from A[1..N] to B[1..1]; } diff --git a/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr b/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr index daf8e7cce..ac0320ea9 100644 --- a/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr +++ b/scribble-go/src/test/scrib/param/cgo18/OneToAll.scr @@ -2,7 +2,7 @@ module param.cgo18.OneToAll; type "int" from "runtime" as int; -global protocol P(role A, role B(N)) +global protocol P(role A(N), role B(N)) { Msg(int) from A[1..1] to B[1..N]; } From f96ee57fa261927b6a32b7e472c48a6d3f834438 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 29 Aug 2017 13:15:25 +0100 Subject: [PATCH 086/433] Partly fixed a param-core projection bug for rolename self-comm. --- .../del/global/GMessageTransferDel.java | 2 +- .../ext/go/ast/ParamAstFactoryImpl.java | 3 +- .../go/core/ast/global/ParamCoreGChoice.java | 17 ++----- .../endpoint/ParamCoreEGraphBuilder.java | 4 +- .../src/test/scrib/param/tmp/ParamTest.scr | 49 ++++++++++++++++++- 5 files changed, 56 insertions(+), 19 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java index e605a16af..8fce8ad62 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GMessageTransferDel.java @@ -42,7 +42,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisa List dests = gmt.getDestinationRoles(); if (dests.contains(src)) { - throw new ScribbleException(gmt.getSource(), "[TODO] Self connections not supported: " + gmt); // Would currently be subsumed by unconnected check + throw new ScribbleException(gmt.getSource(), "[TODO] Self communications not supported: " + gmt); // Would currently be subsumed by unconnected check } return gmt; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index 017e0529a..5561c98f4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -8,7 +8,6 @@ import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.RoleDeclDel; -import org.scribble.del.global.GMessageTransferDel; import org.scribble.ext.go.ast.global.ParamGChoice; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; @@ -200,7 +199,7 @@ public ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, { ParamGCrossMessageTransfer mt = new ParamGCrossMessageTransfer(source, src, msg, dest, srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); - mt = del(mt, new GMessageTransferDel()); // FIXME + mt = del(mt, new ParamGMessageTransferDel()); // FIXME: parameterised self connection check return mt; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index b8f858d88..a3ec10b75 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -65,22 +65,13 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro // "Simple" cases //if (this.src.getName().equals(r)) - if (this.src.getName().equals(subj.getName())) + if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.ranges.iterator().next())) // FIXME: factor out? { - //return (ranges.contains(this.src.ranges.iterator().next())) - return (subj.ranges.contains(this.src.ranges.iterator().next())) - ? af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.SEND_ALL, projs) - //: merge(af, r, ranges, projs); - : merge(af, subj, projs); + return af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.SEND_ALL, projs); } - //else if (this.dest.getName().equals(r)) - else if (this.dest.getName().equals(subj.getName())) + else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.ranges.iterator().next())) { - //return (ranges.contains(this.dest.ranges.iterator().next())) - return (subj.ranges.contains(this.dest.ranges.iterator().next())) - ? af.ParamCoreLChoice(this.src, ParamCoreLActionKind.RECEIVE_ALL, projs) - //: merge(af, r, ranges, projs); - : merge(af, subj, projs); + return af.ParamCoreLChoice(this.src, ParamCoreLActionKind.RECEIVE_ALL, projs); } // src name != dest name diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java index 3dd8cf18d..6350b56bd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -56,7 +56,7 @@ else if (lt instanceof ParamCoreLRec) } else { - throw new RuntimeException("[assrt-core] Shouldn't get in here: " + lt); + throw new RuntimeException("[param-core] Shouldn't get in here: " + lt); } } @@ -94,7 +94,7 @@ else if (k.equals(ParamCoreLActionKind.RECEIVE_ALL)) } else { - throw new RuntimeException("[assrt-core] Shouldn't get in here: " + k); + throw new RuntimeException("[param-core] Shouldn't get in here: " + k); } } } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index a62c5a8b8..637f1726e 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -34,8 +34,53 @@ message passing - domain flexibility -- parallel algs, Web services -- shared parameterised abstraction, concrete transport independence */ +global protocol Proto1(role A) +{ + //1() from A[1..1] to A[2..2]; // OK + //1() from A[1..1] to A[1..1]; // Bad + 1() from A[1..1] to A[1..2]; // FIXME: should be bad +} -global protocol Proto1(role A, role B(n)) + +/* +global protocol Proto1(role A(n), role B(n)) +{ + 1() from A[1..1] to B[1..n]; + 2() from B[1..n] to A[1..1]; + //do Proto1(A, B); // OK + do Proto1(B, A); // OK because same "param knowledge"? -- cf. computed roles +} +//*/ + +/* +global protocol Proto1(role A(n), role B(n, m), role C(m) +{ + 1() from A[1..1] to B[1..n]; + 2() from B[1..n] to A[1..1]; + + 3() from B[1..1] to C[1..m]; + 4() from C[1..m] to B[1..1]; + + do Proto1(C, B, A); // Bad because different "param knowledge"? + //do Proto1(B, A, C); // Also bad +} +//*/ + + + + + + + + + + + + + + +/* +global protocol Proto1(role A(n), role B(n)) { choice at A[1] { @@ -43,9 +88,11 @@ global protocol Proto1(role A, role B(n)) } or { + //2(int) from A[1..1] to B[1..n-1]; 2(int) from A[1..1] to B[1..n]; } } +//*/ /*/ global protocol Proto1(role A(m,n), role B(m,n)) From 05684f22221f4f993e87e36366a60cbf4296a35a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 29 Aug 2017 21:29:51 +0100 Subject: [PATCH 087/433] Added basic param-core WF. No Scribble-specific WF for params yet. --- .../scribble/ext/go/cli/ParamCommandLine.java | 5 + .../go/core/ast/global/ParamCoreGChoice.java | 99 +++++++++++++++++++ .../ext/go/core/ast/global/ParamCoreGEnd.java | 8 ++ .../ParamCoreGProtocolDeclTranslator.java | 6 +- .../ext/go/core/ast/global/ParamCoreGRec.java | 8 ++ .../go/core/ast/global/ParamCoreGRecVar.java | 8 ++ .../go/core/ast/global/ParamCoreGType.java | 4 + .../scribble/ext/go/core/type/ParamRole.java | 9 ++ .../src/test/scrib/param/cgo18/Ring.scr | 2 +- .../src/test/scrib/param/tmp/ParamTest.scr | 81 +++++++++++++++ 10 files changed, 227 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 4482a9d50..8c44ca1a4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -228,6 +228,11 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro job.debugPrintln("\n[param-core] Translated:\n " + gt); + if (!gt.isWellFormed(job, gpd)) + { + throw new ParamException("[param-core] Global type not well-formed:\n " + gt); + } + //Map>> Map> protoRoles = getProtoRoles(job, gt); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index a3ec10b75..2b9f088a6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -5,9 +5,12 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreChoice; import org.scribble.ext.go.core.ast.ParamCoreMessage; @@ -15,7 +18,11 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.type.kind.Global; public class ParamCoreGChoice extends ParamCoreChoice implements ParamCoreGType @@ -29,6 +36,98 @@ public ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest this.src = src; this.dest = dest; } + + @Override + public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) + { + // src range size=1 enforced by syntax + // Directed choice check by ParamCoreGProtocolDeclTranslator ensures dests are same + + ParamRange srcRange = src.getParsedRange(); + ParamRange destRange = dest.getParsedRange(); + Set vars = Stream.of(srcRange, destRange).flatMap(r -> r.getVars().stream()).collect(Collectors.toSet()); + + /*// CHECKME: is range size>0 already ensured by syntax? + Function foo1 = r -> + "(assert (exists ((foobartmp Int)" + + vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")) + + ") (and" + + " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")" // FIXME: factor out with above + + ")))"; + Predicate foo2 = r -> + { + String foo = foo1.apply(srcRange); + + job.debugPrintln("\n[param-core] [WF] Checking non-empty ranges:\n " + foo); + + return Z3Wrapper.checkSat(job, gpd, foo); + };*/ + Function foo1 = r -> // FIXME: factor out with above + "(assert " + + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and (and") + + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant + + (vars.isEmpty() ? "" : ")") + + " (> " + r.start.toSmt2Formula() + " " + r.end.toSmt2Formula() + ")" + + (vars.isEmpty() ? "" : "))") + + ")"; + Predicate foo2 = r -> + { + String foo = foo1.apply(r); + + job.debugPrintln("\n[param-core] [WF] Checking WF range interval for " + r + ":\n " + foo); + + return Z3Wrapper.checkSat(job, gpd, foo); + }; + if (foo2.test(srcRange) || foo2.test(destRange)) + { + return false; + } + + + if (this.src.getName().equals(this.dest.getName())) + { + if (this.kind == ParamCoreGActionKind.CROSS_TRANSFER) + { + String smt2 = "(assert (exists ((foobartmp Int)"; // FIXME: factor out + smt2 += vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")); + smt2 += ") (and"; + smt2 += Stream.of(srcRange, destRange) + .map(r -> " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")") + .collect(Collectors.joining()); + smt2 += ")))"; + + job.debugPrintln("\n[param-core] [WF] Checking non-overlapping ranges for " + this.src.getName() + ":\n " + smt2); + + if (Z3Wrapper.checkSat(job, gpd, smt2)) + { + return false; + } + // CHECKME: projection cases for rolename self-comm but non-overlapping intervals + } + } + + if (this.kind == ParamCoreGActionKind.DOT_TRANSFER) + { + String smt2 = "(assert" + + (vars.isEmpty() ? "" : " (forall (" + vars.stream().map(v -> "(" + v + " Int)").collect(Collectors.joining(" "))) + ") " + + "(and (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") (- " + + destRange.end.toSmt2Formula() + " " + destRange.start.toSmt2Formula() + "))" + + (!this.src.getName().equals(this.dest.getName()) ? "" : + " (not (= " + srcRange.start.toSmt2Formula() + " " + destRange.start.toSmt2Formula() + "))") + + ")" + + (vars.isEmpty() ? "" : ")") + + ")"; + + job.debugPrintln("\n[param-core] [WF] Checking dot-range alignment between " + srcRange + " and " + destRange + ":\n " + smt2); + + if (!Z3Wrapper.checkSat(job, gpd, smt2)) + { + return false; + } + } + + return true; + } @Override public ParamCoreGActionKind getKind() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java index f6ec8d11c..fafc74450 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java @@ -3,12 +3,14 @@ import java.util.Collections; import java.util.Set; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreEnd; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.ParamJob; import org.scribble.type.kind.Global; @@ -21,6 +23,12 @@ private ParamCoreGEnd() } + @Override + public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) + { + return true; + } + @Override public Set getParamRoles() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index 6c3685bcb..962a7130a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -152,7 +152,8 @@ else if (!kind.equals(tmp.kind)) } else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) { - throw new ParamCoreSyntaxException(gc.getSource(), "[param-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); + throw new ParamCoreSyntaxException(gc.getSource(), + "[param-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); } // "Flatten" nested choices (already checked they are guarded) -- Scribble choice subjects ignored @@ -161,7 +162,8 @@ else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) ParamCoreMessage k = e.getKey(); if (cases.keySet().stream().anyMatch(x -> x.op.equals(k.op))) { - throw new ParamCoreSyntaxException(gc.getSource(), "[param-core] Non-deterministic actions not supported: " + k.op); + throw new ParamCoreSyntaxException(gc.getSource(), + "[param-core] Non-deterministic actions not supported: " + k.op); } cases.put(k, e.getValue()); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java index f9aba5d7a..79cb6678e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java @@ -2,6 +2,7 @@ import java.util.Set; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreRec; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; @@ -10,6 +11,7 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.ParamJob; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; @@ -20,6 +22,12 @@ public ParamCoreGRec(RecVar recvar, ParamCoreGType body) super(recvar, body); } + @Override + public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) + { + return this.body.isWellFormed(job, gpd); + } + @Override public Set getParamRoles() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java index d3da4d92b..c43431d3b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java @@ -3,12 +3,14 @@ import java.util.Collections; import java.util.Set; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreRecVar; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.ParamJob; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; @@ -20,6 +22,12 @@ public ParamCoreGRecVar(RecVar var) super(var); } + @Override + public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) + { + return true; + } + @Override public Set getParamRoles() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java index 4e1469442..a3be78a53 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java @@ -2,18 +2,22 @@ import java.util.Set; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; import org.scribble.ext.go.core.ast.ParamCoreType; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.ParamJob; import org.scribble.type.kind.Global; public interface ParamCoreGType extends ParamCoreType { + boolean isWellFormed(ParamJob job, GProtocolDecl gpd); + // FIXME: clarify, Role subj is used as "role name" //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java index d55022f4e..cf89a98fb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java @@ -23,6 +23,15 @@ public ParamRole(String name, Set ranges) this.ranges = Collections.unmodifiableSet(ranges); } + public ParamRange getParsedRange() + { + if (this.ranges.size() > 1) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this.ranges); + } + return this.ranges.iterator().next(); + } + // FIXME public Role getName() { diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index 004e1d9a3..e9160d0b2 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -12,7 +12,7 @@ global protocol Proto1(role B(k)) // FIXME: role param WF -- params only for ro { choice at B[1] // FIXME: role index WF? { - m1(int) dot B[1..k-1] to B[2..k]; // FIXME: range-sensitive role enabling + m1(int) dot B[1..k-1] to B[2..k]; // FIXME: k>2 global invariant // FIXME: range-sensitive role enabling -- a Scribble-specific issue, choice subjs m1(int) dot B[k..k] to B[1..1]; do Proto1(B); // FIXME: role params? or disallow role permuting? } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 637f1726e..ddfcc4f9e 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -34,12 +34,93 @@ message passing - domain flexibility -- parallel algs, Web services -- shared parameterised abstraction, concrete transport independence */ + +global protocol Proto1(role A(n, m)) +{ + 1() from A[1..n-1] to A[2..2]; // Currently bad range interval under n>=1 +} + + +/* +global protocol Proto1(role A(n, m)) +//global protocol Proto1(role A(n, m), role B(n, m)) +{ + //1() from A[1..n-1] to A[2..2]; // Currently bad range interval under n>=1 + + //1() from A[1..n+1] to A[2..2]; // Bad, overlapping for n>=1 + + //1() from A[1..n+m] to B[1..1]; // OK + + //1() from A[1..n+m] to A[1..1]; // Bad, overlapping +} +//*/ + + +/* +global protocol Proto1(role A(n, m)) +//global protocol Proto1(role A(n, m), role B(n, m)) +{ + //1() dot A[1..n] to A[1..n]; // Bad -- ruled out by self-comm + + //1() dot A[1..n] to A[2..n+1]; // OK + + //1() dot A[1..n] to A[1+1..n+2]; // Bad + + 1() dot A[1..1+n] to A[m..m+n]; // Bad + //1() dot A[1..1+n] to A[2..2+n]; // OK + + //1() dot A[1..1+n] to B[m..m+n]; // OK +} +//*/ + +/* +global protocol Proto1(role A, role B) +{ + choice at A[1] + { + 1() from A[1..1] to B[1..2]; + } + or + { + 2() from A[1..1] to B[1..2]; + } +} +//*/ + +/* +global protocol Proto1(role A, role B) +{ + choice at A[1] + { + 1() from A[1..1] to B[1..1]; + 1() from A[1..1] to B[2..2]; // Bad if directed choice + } + or + { + 2() from A[1..1] to B[2..2]; + 2() from A[1..1] to B[1..1]; + } +} +//*/ + +/* +global protocol Proto1(role A, role B) +{ + choice at A[1] + { + 1() from A[2..2] to B[1..1]; // FIXME: role-enabling + } +} +//*/ + +/* global protocol Proto1(role A) { //1() from A[1..1] to A[2..2]; // OK //1() from A[1..1] to A[1..1]; // Bad 1() from A[1..1] to A[1..2]; // FIXME: should be bad } +//*/ /* From 636db7ba18a14baaa9ad8641ea978efe43ccaed9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 29 Aug 2017 21:35:40 +0100 Subject: [PATCH 088/433] Minor. --- .../org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index 2b9f088a6..cc497808b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -40,8 +40,8 @@ public ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest @Override public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) { - // src range size=1 enforced by syntax - // Directed choice check by ParamCoreGProtocolDeclTranslator ensures dests are same + // src (i.e., choice subj) range size=1 for non-unary choices enforced by ParamScribble.g syntax + // Directed choice check by ParamCoreGProtocolDeclTranslator ensures all dests (including ranges) are (syntactically) the same ParamRange srcRange = src.getParsedRange(); ParamRange destRange = dest.getParsedRange(); From 8d2a2e1f8f1524dd8d35af4066242762d150ee68 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 29 Aug 2017 22:09:23 +0100 Subject: [PATCH 089/433] Continued. --- .../ext/go/core/ast/global/ParamCoreGChoice.java | 1 + scribble-go/src/test/scrib/param/cgo18/Ring.scr | 8 ++++++-- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 14 ++++++++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index cc497808b..e76b4b140 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -91,6 +91,7 @@ public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) String smt2 = "(assert (exists ((foobartmp Int)"; // FIXME: factor out smt2 += vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")); smt2 += ") (and"; + smt2 += vars.isEmpty() ? "" : vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")); // FIXME: lower bound constant -- replace by global invariant smt2 += Stream.of(srcRange, destRange) .map(r -> " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")") .collect(Collectors.joining()); diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index e9160d0b2..28dfe786c 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -12,13 +12,17 @@ global protocol Proto1(role B(k)) // FIXME: role param WF -- params only for ro { choice at B[1] // FIXME: role index WF? { - m1(int) dot B[1..k-1] to B[2..k]; // FIXME: k>2 global invariant // FIXME: range-sensitive role enabling -- a Scribble-specific issue, choice subjs + //m1(int) dot B[1..k-1] to B[2..k]; // FIXME: k>2 global invariant // FIXME: range-sensitive role enabling -- a Scribble-specific issue, choice subjs + m1(int) dot B[1..k] to B[2..k+1]; + m1(int) dot B[k..k] to B[1..1]; do Proto1(B); // FIXME: role params? or disallow role permuting? } or { - m2(int) dot B[1..k-1] to B[2..k]; + //m2(int) dot B[1..k-1] to B[2..k]; + m2(int) dot B[1..k] to B[2..k+1]; + m2(int) dot B[k..k] to B[1..1]; } } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index ddfcc4f9e..27982da6c 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -35,10 +35,12 @@ message passing */ +/* global protocol Proto1(role A(n, m)) { 1() from A[1..n-1] to A[2..2]; // Currently bad range interval under n>=1 } +//*/ /* @@ -52,13 +54,16 @@ global protocol Proto1(role A(n, m)) //1() from A[1..n+m] to B[1..1]; // OK //1() from A[1..n+m] to A[1..1]; // Bad, overlapping + + 1() from A[1..1] to A[n..n+1]; // Bad + //1() from A[1..1] to A[n+1..n+2]; // OK } //*/ -/* -global protocol Proto1(role A(n, m)) -//global protocol Proto1(role A(n, m), role B(n, m)) +//* +//global protocol Proto1(role A(n, m)) +global protocol Proto1(role A(n, m), role B(n, m)) { //1() dot A[1..n] to A[1..n]; // Bad -- ruled out by self-comm @@ -66,10 +71,11 @@ global protocol Proto1(role A(n, m)) //1() dot A[1..n] to A[1+1..n+2]; // Bad - 1() dot A[1..1+n] to A[m..m+n]; // Bad + //1() dot A[1..1+n] to A[m..m+n]; // Bad //1() dot A[1..1+n] to A[2..2+n]; // OK //1() dot A[1..1+n] to B[m..m+n]; // OK + 1() dot A[1..1+n] to B[1..1+m]; // OK } //*/ From 0c67dc888fbdd627bd657cd96381709d8bcb80b8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 29 Aug 2017 22:26:29 +0100 Subject: [PATCH 090/433] Added param syntax for multiplication in index exprs. --- .../antlr3/org/scribble/parser/antlr/ParamScribble.g | 2 +- .../parser/scribble/ast/index/ParamAntlrIndexExpr.java | 1 + .../scribble/ext/go/type/index/ParamBinIndexExpr.java | 7 +++++-- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 10 +++++----- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 328ea2785..95aa11185 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -679,7 +679,7 @@ globalmessagetransfer: ;*/ paramindexexpr: - unaryparamindexexpr (op=('+' | '-') unaryparamindexexpr)? + unaryparamindexexpr (op=('+' | '-' | '*') unaryparamindexexpr)? -> ^(PARAM_BININDEXEXPR unaryparamindexexpr $op? unaryparamindexexpr?) ; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java index fef782c3e..c58e2383f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java @@ -26,6 +26,7 @@ public static ParamIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) { case "+": op = ParamBinIndexExpr.Op.Add; break; case "-": op = ParamBinIndexExpr.Op.Subt; break; + case "*": op = ParamBinIndexExpr.Op.Mult; break; default: throw new RuntimeException("[param] Shouldn't get in here: " + ct); } return ParamIndexFactory.ParamBinIndexExpr(op, left, right); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java index ff5af15fd..57975facc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java @@ -10,15 +10,17 @@ public class ParamBinIndexExpr extends ParamIndexExpr public enum Op { Add, - Subt; + Subt, + Mult; @Override public String toString() { switch (this) { - case Add: return "+"; + case Add: return "+"; case Subt: return "-"; + case Mult: return "*"; default: throw new RuntimeException("[param] Won't get in here: " + this); } } @@ -45,6 +47,7 @@ public String toSmt2Formula() { case Add: op = "+"; break; case Subt: op = "-"; break; + case Mult: op = "*"; break; default: throw new RuntimeException("[param] Shouldn't get in here: " + this.op); } return "(" + op + " " + left + " " + right + ")"; diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 27982da6c..358ad38c4 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -35,10 +35,10 @@ message passing */ -/* -global protocol Proto1(role A(n, m)) +//* +global protocol Proto1(role A(n, m), role B(n, m)) { - 1() from A[1..n-1] to A[2..2]; // Currently bad range interval under n>=1 + 1() from A[1..1] to B[1..m*n]; } //*/ @@ -61,7 +61,7 @@ global protocol Proto1(role A(n, m)) //*/ -//* +/* //global protocol Proto1(role A(n, m)) global protocol Proto1(role A(n, m), role B(n, m)) { @@ -74,8 +74,8 @@ global protocol Proto1(role A(n, m), role B(n, m)) //1() dot A[1..1+n] to A[m..m+n]; // Bad //1() dot A[1..1+n] to A[2..2+n]; // OK + //1() dot A[1..1+n] to B[1..1+m]; // Bad //1() dot A[1..1+n] to B[m..m+n]; // OK - 1() dot A[1..1+n] to B[1..1+m]; // OK } //*/ From bcbb3761db53678f252fe514db83b40238b4fb5a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 30 Aug 2017 11:22:04 +0100 Subject: [PATCH 091/433] Minor. --- scribble-go/src/test/scrib/param/cgo18/Ring.scr | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index 28dfe786c..cb377ed59 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -13,17 +13,20 @@ global protocol Proto1(role B(k)) // FIXME: role param WF -- params only for ro choice at B[1] // FIXME: role index WF? { //m1(int) dot B[1..k-1] to B[2..k]; // FIXME: k>2 global invariant // FIXME: range-sensitive role enabling -- a Scribble-specific issue, choice subjs + //m1(int) dot B[k..k] to B[1..1]; + m1(int) dot B[1..k] to B[2..k+1]; + m1(int) dot B[k+1..k+1] to B[1..1]; - m1(int) dot B[k..k] to B[1..1]; do Proto1(B); // FIXME: role params? or disallow role permuting? } or { //m2(int) dot B[1..k-1] to B[2..k]; - m2(int) dot B[1..k] to B[2..k+1]; + //m2(int) dot B[k..k] to B[1..1]; - m2(int) dot B[k..k] to B[1..1]; + m2(int) dot B[1..k] to B[2..k+1]; + m2(int) dot B[k+1..k+1] to B[1..1]; } } //*/ From 70d274c10dd3804e1bb6599f131af793ddc88854 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 30 Aug 2017 16:06:46 +0100 Subject: [PATCH 092/433] Fixed Z3Wrapper call from Z3 to z3. --- .../org/scribble/ext/go/util/Z3Wrapper.java | 2 +- .../src/test/scrib/param/tmp/ParamTest.scr | 53 +++++++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index f691a87ef..97e2b0df0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -25,7 +25,7 @@ public static boolean checkSat(ParamJob job, GProtocolDecl gpd, String smt2) //t try { ScribUtil.writeToFile(tmpName, smt2); - String[] res = ScribUtil.runProcess("Z3", tmpName); + String[] res = ScribUtil.runProcess("z3", tmpName); String trim = res[0].trim(); if (trim.equals("sat")) // FIXME: factor out { diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 358ad38c4..0fe0a555c 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -35,7 +35,54 @@ message passing */ -//* +global protocol Proto1(role A(n), role B(n)) +{ + /*bid() from B[1..n] to A[1..1]; + + ... + + bidorskip(x:int) from B[1..n] to A[1..1]; + + choice at A[1] + { + highestbid() from A[1..1] to B[1..n]; + do Proto1(A, B); + } + or + { + + win() from A[1..1] to B[1..n]; + }*/ + + + /*do MyBiddingSubproto(A, B); + do MyBiddingSubproto(A, C); + do MyBiddingSubproto(A, D); + ... + + + for (i 1 .. N) + { + do MyBiddingSubproto(A, B[i]); + }*/ + + choice at B[1..n] + { + bid() from B[1..n] to A[1..1]; + } + or + { + skip() from B[1..n] to A[1..1]; + } + + bidorskip(x:int) from B[1..n] to A[1..1]; + + G +} + + + +/* global protocol Proto1(role A(n, m), role B(n, m)) { 1() from A[1..1] to B[1..m*n]; @@ -99,7 +146,7 @@ global protocol Proto1(role A, role B) choice at A[1] { 1() from A[1..1] to B[1..1]; - 1() from A[1..1] to B[2..2]; // Bad if directed choice + 1() from A[1..1] to B[2..2]; // Bad, non-directed choice } or { @@ -114,7 +161,7 @@ global protocol Proto1(role A, role B) { choice at A[1] { - 1() from A[2..2] to B[1..1]; // FIXME: role-enabling + 1() from A[2..2] to B[1..1]; // FIXME: role-enabling -- Scribble detail, also proto sig param decls } } //*/ From eacb6b5917ec618654f295b014dd37253fc9a098 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 30 Aug 2017 16:17:23 +0100 Subject: [PATCH 093/433] Fixed ANTLR dir bug in base scribblec.sh. --- scribble-dist/src/main/resources/scribblec.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-dist/src/main/resources/scribblec.sh b/scribble-dist/src/main/resources/scribblec.sh index 5f2df50b3..8841ee7a8 100644 --- a/scribble-dist/src/main/resources/scribblec.sh +++ b/scribble-dist/src/main/resources/scribblec.sh @@ -25,7 +25,7 @@ # ANTLR 3 runtime location (if no lib jar) -ANTLR= +ANTLR='scribble-parser/lib/antlr-3.5.2-complete.jar' # e.g., '~/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' # or '/cygdrive/c/Users/[User]/.m2/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar' # (i.e., the Maven install location) From 6645534a581a9c4af7b251e49a6b204020f0b774 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 30 Aug 2017 17:51:37 +0100 Subject: [PATCH 094/433] Added initial Auction example draft. --- .../src/test/scrib/param/cgo18/Auction.scr | 59 ++++++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 80 ++++++++++++++++++- 2 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 scribble-go/src/test/scrib/param/cgo18/Auction.scr diff --git a/scribble-go/src/test/scrib/param/cgo18/Auction.scr b/scribble-go/src/test/scrib/param/cgo18/Auction.scr new file mode 100644 index 000000000..5956561ac --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/Auction.scr @@ -0,0 +1,59 @@ +//Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Auction.scr -param Proto1 + +module param.cgo18.Auction; + + +type "int" from "..." as int; + + +//* +global protocol Proto1(role A(n), role B(n)) +{ + bid(int) from B[1..n] to A[1..1]; + + do X(A, B); +} + +// mu X +aux global protocol X(role A, role B(n)) +{ + choice at A[1] + { + highestbid(int) from A[1..1] to B[1..n]; + + /* // If "directly" corresponding to formalism + wigglychoice at B[i:1..n] + { + bid(int) wigglyarrow B[i] to A[1..1]; + } + or + { + skip(int) wigglyarrow B[i] to A[1..1]; + }*/ + + // Version to implement + /*foreach (i: 1..n) + { + choice at B[i]*/ + choice at B[i:1..n] + { + bid(int) from B[i] to A[1..1]; + } + or + { + skip(int) from B[i] to A[1..1]; + } + //} + + // "Traditional MPST" solution + //bidOrSkip(int) from B[1..n] to A[1..1]; + + do X(A, B); + } + or + { + winner() from A[1..1] to B[1..n]; + } +} +//*/ diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 0fe0a555c..929f864c1 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -35,6 +35,84 @@ message passing */ + +global protocol Proto1(role A(n), role B(n)) +{ + 1() from A[1..1] to B[1..n]; +} + + + + + + + + + +/*// A=Auctioneer, B=Bidder +global protocol Auction(role A(n), role B(n)) +{ + bid(int) from B[1..n] to A; // A[1..1] + + do X(A, B); +} + +// mu X +aux global protocol X(role A, role B(n)) +{ + choice at A + { + highestbid(int) from A to B[1..n]; + + specialchoice at B[i:1..n] + { + bid(int) specialarrow B[i] to A; + } + or + { + skip(int) specialarrow B[i] to A; + } + + + for (i: 1..n) + { + choice at B[i] + { + bid(int) from B[i] to A; + } + or + { + skip(int) from B[i] to A; + } + } + //bidOrSkip(int) from B[1..n] to A; + + do X(A, B); + } + or + { + winner() from A to B[1..n]; + } +} +//*/ + + + /*choice at B[1..n] + { + bid() fromto A; + } + or + { + skip() from B[1..n] to A; + }*/ + + + + + + + +/* global protocol Proto1(role A(n), role B(n)) { /*bid() from B[1..n] to A[1..1]; @@ -64,7 +142,7 @@ global protocol Proto1(role A(n), role B(n)) for (i 1 .. N) { do MyBiddingSubproto(A, B[i]); - }*/ + }* / choice at B[1..n] { From c40a9808126833d784fa3633cc62408f8102291c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 30 Aug 2017 18:58:01 +0100 Subject: [PATCH 095/433] Added param-core WF check for singleton choice-subjs. --- .../go/core/ast/global/ParamCoreGChoice.java | 21 ++++++++++++-- .../src/test/scrib/param/tmp/ParamTest.scr | 29 +++++++++++++++++-- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index e76b4b140..5fae71e4c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -27,7 +27,7 @@ public class ParamCoreGChoice extends ParamCoreChoice implements ParamCoreGType { - public final ParamRole src; // Singleton -- no disconnect for now + public final ParamRole src; public final ParamRole dest; // this.dest == super.role -- arbitrary? public ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest, Map cases) @@ -84,6 +84,21 @@ public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) } + String bar = "(assert " + + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and ") + + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant + + "(not (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") 0))" + + (vars.isEmpty() ? "" : "))") + + ")"; + + job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subk for " + this.src + ":\n " + bar); + + if (Z3Wrapper.checkSat(job, gpd, bar)) + { + return false; + } + + if (this.src.getName().equals(this.dest.getName())) { if (this.kind == ParamCoreGActionKind.CROSS_TRANSFER) @@ -165,11 +180,11 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro // "Simple" cases //if (this.src.getName().equals(r)) - if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.ranges.iterator().next())) // FIXME: factor out? + if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? { return af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.SEND_ALL, projs); } - else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.ranges.iterator().next())) + else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) { return af.ParamCoreLChoice(this.src, ParamCoreLActionKind.RECEIVE_ALL, projs); } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 929f864c1..72962d902 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -35,16 +35,41 @@ message passing */ - +//* global protocol Proto1(role A(n), role B(n)) { - 1() from A[1..1] to B[1..n]; + choice at A[i:1..n] + { + 1() from A[1..1] to B[1..2]; + } + or + { + 2() from A[1..1] to B[1..2]; + } } +//*/ +/* +global protocol Proto1(role A(n), role B(n)) +{ + //choice at A[i:1..n] + choice at A[1] + { + 1() from A[1..1] to B[1..2]; // OK + + 1() from A[1..2] to B[1..2]; // Bad + 1() from A[1..n] to B[1..2]; // Bad + } + or + { + 2() from A[1..1] to B[1..2]; + } +} +//*/ From 7c9c5e920b8e57a6253d64cdd20d9d1f96ec0bfd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 30 Aug 2017 21:57:33 +0100 Subject: [PATCH 096/433] Adding param-core multi-choices. --- .../main/java/org/scribble/ast/Constants.java | 2 + .../org/scribble/parser/antlr/ParamScribble.g | 12 + .../scribble/ext/go/ast/ParamAstFactory.java | 3 + .../ext/go/ast/ParamAstFactoryImpl.java | 11 + .../ext/go/ast/global/ParamGChoice.java | 2 +- .../ext/go/ast/global/ParamGMultiChoices.java | 93 +++++++ .../ext/go/core/ast/ParamCoreAstFactory.java | 16 ++ .../go/core/ast/global/ParamCoreGChoice.java | 12 +- .../ast/global/ParamCoreGMultiChoices.java | 241 ++++++++++++++++++ .../ParamCoreGProtocolDeclTranslator.java | 78 +++++- .../go/core/ast/local/ParamCoreLChoice.java | 17 +- .../ast/local/ParamCoreLMultiChoices.java | 66 +++++ .../endpoint/ParamCoreEGraphBuilder.java | 10 +- .../go/del/global/ParamGMultiChoicesDel.java | 35 +++ .../scribble/ParamAntlrToScribParser.java | 4 + .../scribble/ast/ParamAntlrGChoice.java | 4 +- .../scribble/ast/ParamAntlrGMultiChoices.java | 68 +++++ .../src/test/scrib/param/tmp/ParamTest.scr | 16 +- 18 files changed, 665 insertions(+), 25 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoices.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMultiChoicesDel.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGMultiChoices.java diff --git a/scribble-core/src/main/java/org/scribble/ast/Constants.java b/scribble-core/src/main/java/org/scribble/ast/Constants.java index fb62cde91..011701bba 100644 --- a/scribble-core/src/main/java/org/scribble/ast/Constants.java +++ b/scribble-core/src/main/java/org/scribble/ast/Constants.java @@ -52,4 +52,6 @@ public class Constants public static final String CATCHES_KW = "catches";*/ public static final String DO_KW = "do"; //public static final String SPAWN_KW = "spawn"; + + public static final String CHOICES_KW = "choices"; } diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 95aa11185..43e22d107 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -63,6 +63,7 @@ tokens //SPAWN_KW = 'spawn'; DOT_KW = 'dot'; + CHOICES_KW = 'choices'; /* @@ -174,6 +175,7 @@ tokens PARAM_GLOBALCROSSMESSAGETRANSFER = 'PARAM_GLOBALCROSSMESSAGETRANSFER'; PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; PARAM_GLOBALCHOICE = 'PARAM_GLOBALCHOICE'; + PARAM_GLOBALMULTICHOICES = 'PARAM_GLOBALMULTICHOICES'; } @@ -643,6 +645,9 @@ globalinteraction: globaldisconnect | globalwrap + +| + globalmultichoices ; /*| globalparallel @@ -752,6 +757,13 @@ globalchoice: -> ^(PARAM_GLOBALCHOICE rolename paramindexexpr globalprotocolblock+) ; + + +globalmultichoices: + CHOICES_KW AT_KW rolename '[' simplename ':' paramindexexpr '..' paramindexexpr ']' globalprotocolblock (OR_KW globalprotocolblock)* +-> + ^(PARAM_GLOBALMULTICHOICES rolename simplename paramindexexpr paramindexexpr globalprotocolblock+) +; /** diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java index 8ad36f10d..a7ce93191 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java @@ -10,6 +10,7 @@ import org.scribble.ext.go.ast.global.ParamGChoice; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; +import org.scribble.ext.go.ast.global.ParamGMultiChoices; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -26,4 +27,6 @@ ParamGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode sr //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd); ParamGChoice ParamGChoice(CommonTree source, RoleNode subj, ParamIndexExpr expr, List blocks); + ParamGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, ParamIndexVar var, + ParamIndexExpr start, ParamIndexExpr end, List blocks); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index 5561c98f4..235706c24 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -11,8 +11,10 @@ import org.scribble.ext.go.ast.global.ParamGChoice; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; +import org.scribble.ext.go.ast.global.ParamGMultiChoices; import org.scribble.ext.go.del.global.ParamGChoiceDel; import org.scribble.ext.go.del.global.ParamGMessageTransferDel; +import org.scribble.ext.go.del.global.ParamGMultiChoicesDel; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -221,6 +223,15 @@ public ParamGChoice ParamGChoice(CommonTree source, RoleNode subj, ParamIndexExp gc = del(gc, new ParamGChoiceDel()); return gc; } + + @Override + public ParamGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, ParamIndexVar var, + ParamIndexExpr start, ParamIndexExpr end, List blocks) + { + ParamGMultiChoices gc = new ParamGMultiChoices(source, subj, var, start, end, blocks); + gc = del(gc, new ParamGMultiChoicesDel()); + return gc; + } /*@Override public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java index b34998897..9ebe10fe8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java @@ -24,8 +24,8 @@ public class ParamGChoice extends GChoice { - public final ParamIndexExpr expr; + public ParamGChoice(CommonTree source, RoleNode subj, ParamIndexExpr expr, List blocks) { super(source, subj, blocks); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoices.java new file mode 100644 index 000000000..a0d9c6a82 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoices.java @@ -0,0 +1,93 @@ +package org.scribble.ext.go.ast.global; + +import java.util.List; +import java.util.stream.Collectors; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.Constants; +import org.scribble.ast.ProtocolBlock; +import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.local.LChoice; +import org.scribble.ast.local.LProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; +import org.scribble.util.ScribUtil; +import org.scribble.visit.AstVisitor; + +public class ParamGMultiChoices extends GChoice +{ + public final ParamIndexVar var; + public final ParamIndexExpr start; + public final ParamIndexExpr end; + + public ParamGMultiChoices(CommonTree source, RoleNode subj, ParamIndexVar var, + ParamIndexExpr start, ParamIndexExpr end, List blocks) + { + super(source, subj, blocks); + this.var = var; + this.start = start; + this.end = end; + } + + // Similar pattern to reconstruct + // Idea is, if extending the AST class (more fields), then reconstruct/project should also be extended (and called from extended del) + public LChoice project(AstFactory af, Role self, List blocks) + { + throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing + } + + @Override + protected ScribNodeBase copy() + { + return new ParamGMultiChoices(this.source, this.subj, this.var, this.start, this.end, getBlocks()); + } + + @Override + public ParamGMultiChoices clone(AstFactory af) + { + RoleNode subj = this.subj.clone(af); + List blocks = ScribUtil.cloneList(af, getBlocks()); + return ((ParamAstFactory) af).ParamGMultiChoices(this.source, subj, this.var, this.start, this.end, blocks); + } + + @Override + public ParamGMultiChoices reconstruct(RoleNode subj, List> blocks) + { + throw new RuntimeException("[param] Shouldn't get in here: " + this); + } + + public ParamGMultiChoices reconstruct(RoleNode subj, ParamIndexVar var, + ParamIndexExpr start, ParamIndexExpr end, List> blocks) + { + ScribDel del = del(); + ParamGMultiChoices gc = new ParamGMultiChoices(this.source, subj, var, start, end, castBlocks(blocks)); + gc = (ParamGMultiChoices) gc.del(del); + return gc; + } + + @Override + public ParamGMultiChoices visitChildren(AstVisitor nv) throws ScribbleException + { + RoleNode subj = (RoleNode) visitChild(this.subj, nv); + List blocks = visitChildListWithClassEqualityCheck(this, getBlocks(), nv); + return reconstruct(subj, this.var, this.start, this.end, blocks); + } + + @Override + public String toString() + { + String sep = " " + Constants.OR_KW + " "; + return Constants.CHOICES_KW + " " + Constants.AT_KW + " " + this.subj + + "[" + this.var + ":" + this.start + ".." + this.end + "]" + + " " + getBlocks().stream().map(b -> b.toString()).collect(Collectors.joining(sep)); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java index 5674e183e..239bff9d7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java @@ -1,23 +1,27 @@ package org.scribble.ext.go.core.ast; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import org.scribble.ext.go.core.ast.global.ParamCoreGActionKind; import org.scribble.ext.go.core.ast.global.ParamCoreGChoice; import org.scribble.ext.go.core.ast.global.ParamCoreGEnd; +import org.scribble.ext.go.core.ast.global.ParamCoreGMultiChoices; import org.scribble.ext.go.core.ast.global.ParamCoreGRec; import org.scribble.ext.go.core.ast.global.ParamCoreGRecVar; import org.scribble.ext.go.core.ast.global.ParamCoreGType; import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; import org.scribble.ext.go.core.ast.local.ParamCoreLChoice; import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; +import org.scribble.ext.go.core.ast.local.ParamCoreLMultiChoices; import org.scribble.ext.go.core.ast.local.ParamCoreLRec; import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.type.Payload; import org.scribble.type.name.Op; import org.scribble.type.name.RecVar; @@ -46,6 +50,12 @@ public ParamCoreGChoice ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kin return new ParamCoreGChoice(src, kind, dest, cases); } + public ParamCoreGMultiChoices ParamCoreGMultiChoices(ParamRole src, ParamIndexVar var, + ParamRole dest, Set cases, ParamCoreGType cont) + { + return new ParamCoreGMultiChoices(src, var, dest, cases, cont); + } + public ParamCoreGRec ParamCoreGRec(RecVar recvar, ParamCoreGType body) { return new ParamCoreGRec(recvar, body); @@ -66,6 +76,12 @@ public ParamCoreLChoice ParamCoreLChoice(ParamRole role, ParamCoreLActionKind ki return new ParamCoreLChoice(role, kind, cases); } + public ParamCoreLMultiChoices ParamCoreLMultiChoices(ParamRole role, ParamCoreLActionKind kind, + ParamIndexVar var, Set cases, ParamCoreLType cont) + { + return new ParamCoreLMultiChoices(role, kind, var, cases, cont); + } + /*public ParamCoreLSend LSend(Role self, Role peer, Op op, Payload pay) { return new ParamCoreLSend(self, peer, op, pay); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index 5fae71e4c..662611fcb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -1,7 +1,7 @@ package org.scribble.ext.go.core.ast.global; -import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -27,7 +27,7 @@ public class ParamCoreGChoice extends ParamCoreChoice implements ParamCoreGType { - public final ParamRole src; + public final ParamRole src; // "Singleton" -- checked by isWellFormed public final ParamRole dest; // this.dest == super.role -- arbitrary? public ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest, Map cases) @@ -43,8 +43,8 @@ public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) // src (i.e., choice subj) range size=1 for non-unary choices enforced by ParamScribble.g syntax // Directed choice check by ParamCoreGProtocolDeclTranslator ensures all dests (including ranges) are (syntactically) the same - ParamRange srcRange = src.getParsedRange(); - ParamRange destRange = dest.getParsedRange(); + ParamRange srcRange = this.src.getParsedRange(); + ParamRange destRange = this.dest.getParsedRange(); Set vars = Stream.of(srcRange, destRange).flatMap(r -> r.getVars().stream()).collect(Collectors.toSet()); /*// CHECKME: is range size>0 already ensured by syntax? @@ -91,7 +91,7 @@ public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) + (vars.isEmpty() ? "" : "))") + ")"; - job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subk for " + this.src + ":\n " + bar); + job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subject for " + this.src + ":\n " + bar); if (Z3Wrapper.checkSat(job, gpd, bar)) { @@ -198,7 +198,7 @@ else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this private ParamCoreLType merge(ParamCoreAstFactory af, ParamActualRole r, Map projs) throws ParamCoreSyntaxException { // "Merge" - Collection values = projs.values(); + Set values = new HashSet<>(projs.values()); if (values.size() > 1) { throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java new file mode 100644 index 000000000..ac5cac277 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java @@ -0,0 +1,241 @@ +package org.scribble.ext.go.core.ast.global; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ext.go.core.ast.ParamCoreAstFactory; +import org.scribble.ext.go.core.ast.ParamCoreChoice; +import org.scribble.ext.go.core.ast.ParamCoreMessage; +import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; +import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.type.kind.Global; + +public class ParamCoreGMultiChoices extends ParamCoreChoice implements ParamCoreGType +{ + public final ParamRole src; // Cf. ParamCoreGChoice singleton src + public final ParamRole dest; // this.dest == super.role -- arbitrary? + + public final ParamIndexVar var; + + public ParamCoreGMultiChoices(ParamRole src, ParamIndexVar var, ParamRole dest, Set cases, ParamCoreGType cont) + { + super(dest, ParamCoreGActionKind.CROSS_TRANSFER, cases.stream().collect(Collectors.toMap(c -> c, c -> cont))); // FIXME + this.src = src; + this.dest = dest; + this.var = var; + } + + @Override + public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) + { + // src (i.e., choice subj) range size=1 for non-unary choices enforced by ParamScribble.g syntax + // Directed choice check by ParamCoreGProtocolDeclTranslator ensures all dests (including ranges) are (syntactically) the same + + /*ParamRange srcRange = src.getParsedRange(); + ParamRange destRange = dest.getParsedRange(); + Set vars = Stream.of(srcRange, destRange).flatMap(r -> r.getVars().stream()).collect(Collectors.toSet()); + + Function foo1 = r -> // FIXME: factor out with above + "(assert " + + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and (and") + + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant + + (vars.isEmpty() ? "" : ")") + + " (> " + r.start.toSmt2Formula() + " " + r.end.toSmt2Formula() + ")" + + (vars.isEmpty() ? "" : "))") + + ")"; + Predicate foo2 = r -> + { + String foo = foo1.apply(r); + + job.debugPrintln("\n[param-core] [WF] Checking WF range interval for " + r + ":\n " + foo); + + return Z3Wrapper.checkSat(job, gpd, foo); + }; + if (foo2.test(srcRange) || foo2.test(destRange)) + { + return false; + } + + + String bar = "(assert " + + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and ") + + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant + + "(not (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") 0))" + + (vars.isEmpty() ? "" : "))") + + ")"; + + job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subk for " + this.src + ":\n " + bar); + + if (Z3Wrapper.checkSat(job, gpd, bar)) + { + return false; + } + + + if (this.src.getName().equals(this.dest.getName())) + { + if (this.kind == ParamCoreGActionKind.CROSS_TRANSFER) + { + String smt2 = "(assert (exists ((foobartmp Int)"; // FIXME: factor out + smt2 += vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")); + smt2 += ") (and"; + smt2 += vars.isEmpty() ? "" : vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")); // FIXME: lower bound constant -- replace by global invariant + smt2 += Stream.of(srcRange, destRange) + .map(r -> " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")") + .collect(Collectors.joining()); + smt2 += ")))"; + + job.debugPrintln("\n[param-core] [WF] Checking non-overlapping ranges for " + this.src.getName() + ":\n " + smt2); + + if (Z3Wrapper.checkSat(job, gpd, smt2)) + { + return false; + } + // CHECKME: projection cases for rolename self-comm but non-overlapping intervals + } + } + + if (this.kind == ParamCoreGActionKind.DOT_TRANSFER) + { + String smt2 = "(assert" + + (vars.isEmpty() ? "" : " (forall (" + vars.stream().map(v -> "(" + v + " Int)").collect(Collectors.joining(" "))) + ") " + + "(and (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") (- " + + destRange.end.toSmt2Formula() + " " + destRange.start.toSmt2Formula() + "))" + + (!this.src.getName().equals(this.dest.getName()) ? "" : + " (not (= " + srcRange.start.toSmt2Formula() + " " + destRange.start.toSmt2Formula() + "))") + + ")" + + (vars.isEmpty() ? "" : ")") + + ")"; + + job.debugPrintln("\n[param-core] [WF] Checking dot-range alignment between " + srcRange + " and " + destRange + ":\n " + smt2); + + if (!Z3Wrapper.checkSat(job, gpd, smt2)) + { + return false; + } + }*/ + + return true; + } + + @Override + public ParamCoreGActionKind getKind() + { + return (ParamCoreGActionKind) this.kind; + } + + @Override + public Set getParamRoles() + { + Set res = Stream.of(this.src, this.dest).collect(Collectors.toSet()); + res.addAll(this.cases.values().iterator().next().getParamRoles()); + return res; + } + + @Override + //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException + public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException + { + if (this.kind != ParamCoreGActionKind.CROSS_TRANSFER) + { + throw new RuntimeException("[param-core] TODO: " + this); + } + + Map projs = new HashMap<>(); + for (Entry e : this.cases.entrySet()) + { + ParamCoreMessage a = e.getKey(); + //projs.put(a, e.getValue().project(af, r, ranges)); + projs.put(a, e.getValue().project(af, subj)); + // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) + // FIXME: receive assertion projection -- should not be the same as send? + } + + // FIXME: same condition as merge (factor out) // FIXME: no, already syntactic singleton continuation already checked by ParamCoreGProtocolDeclTranslator? + Set values = new HashSet<>(projs.values()); + if (values.size() > 1) + { + throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + subj + //+ " for " + ranges + + ": cannot merge for: " + projs.keySet()); + } + + // "Simple" cases -- same projection as ParamCoreGChoice, i.e., same local types? -- index var redundant, apart from "syntactic consistency" for subsequent message actions? (i.e., only for Scribble syntax?) + if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? + { + return af.ParamCoreLMultiChoices(this.dest, ParamCoreLActionKind.SEND_ALL, this.var, projs.keySet(), values.iterator().next()); + } + else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) + { + return af.ParamCoreLMultiChoices(this.src, ParamCoreLActionKind.RECEIVE_ALL, this.var, projs.keySet(), values.iterator().next()); + } + + // src name != dest name + //return merge(af, r, ranges, projs); + return merge(af, subj, projs); + } + + //private ParamCoreLType merge(ParamCoreAstFactory af, Role r, Set ranges, Map projs) throws ParamCoreSyntaxException + private ParamCoreLType merge(ParamCoreAstFactory af, ParamActualRole r, Map projs) throws ParamCoreSyntaxException + { + // "Merge" + Set values = new HashSet<>(projs.values()); + if (values.size() > 1) + { + throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + //+ " for " + ranges + + ": cannot merge for: " + projs.keySet()); + } + + return values.iterator().next(); + } + + @Override + public int hashCode() + { + int hash = 2339; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.src.hashCode(); + hash = 31 * hash + this.var.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreGMultiChoices)) + { + return false; + } + ParamCoreGMultiChoices them = (ParamCoreGMultiChoices) obj; + return super.equals(obj) // Does canEquals + && this.src.equals(them.src) && this.var.equals(them.var); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreGMultiChoices; + } + + @Override + public String toString() + { + return this.src.toString() + this.kind + "*" + this.dest + casesToString(); // toString needed? + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index 962a7130a..383742b4a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.core.ast.global; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -25,6 +26,7 @@ import org.scribble.ext.go.ast.ParamAstFactory; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; +import org.scribble.ext.go.ast.global.ParamGMultiChoices; import org.scribble.ext.go.core.ast.ParamCoreAstFactory; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; @@ -81,7 +83,7 @@ private ParamCoreGType parseSeq(List is, Map r } else { - throw new RuntimeException("[param] Shouldn't get in here: " + first); + throw new RuntimeException("[param-core] Shouldn't get in here: " + first); } } else @@ -97,7 +99,14 @@ private ParamCoreGType parseSeq(List is, Map r if (first instanceof GChoice) { - return parseGChoice(rvs, checkRecGuard, (GChoice) first); + if (first instanceof ParamGMultiChoices) + { + return parseParamGMultiChoices(rvs, checkRecGuard, (ParamGMultiChoices) first); + } + else // GChoice or ParamGChoice + { + return parseGChoice(rvs, checkRecGuard, (GChoice) first); + } } else if (first instanceof GRecursion) { @@ -172,6 +181,71 @@ else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) return this.af.ParamCoreGChoice(src, kind, dest, cases); } + // FIXME: factor out with parseGChoice + private ParamCoreGType parseParamGMultiChoices(Map rvs, + boolean checkRecGuard, ParamGMultiChoices gc) throws ParamCoreSyntaxException + { + List children = new LinkedList<>(); + for (GProtocolBlock b : gc.getBlocks()) + { + children.add(parseSeq(b.getInteractionSeq().getInteractions(), rvs, true, checkRecGuard)); // Check cases are guarded + } + + ParamCoreGActionKind kind = null; + ParamRole src = null; + ParamRole dest = null; + Map cases = new HashMap<>(); + for (ParamCoreGType c : children) + { + // Because all cases should be action guards (unary choices) + if (!(c instanceof ParamCoreGChoice)) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + c); + } + ParamCoreGChoice tmp = (ParamCoreGChoice) c; + if (tmp.cases.size() > 1) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + c); + } + + if (src == null) + { + kind = tmp.getKind(); + src = tmp.src; + dest = tmp.dest; + } + else if (!kind.equals(tmp.kind)) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + gc + ", " + kind + ", " + tmp.kind); + } + else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) + { + throw new ParamCoreSyntaxException(gc.getSource(), + "[param-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); + } + + // "Flatten" nested choices (already checked they are guarded) -- Scribble choice subjects ignored + for (Entry e : tmp.cases.entrySet()) + { + ParamCoreMessage k = e.getKey(); + if (cases.keySet().stream().anyMatch(x -> x.op.equals(k.op))) + { + throw new ParamCoreSyntaxException(gc.getSource(), + "[param-core] Non-deterministic actions not supported: " + k.op); + } + cases.put(k, e.getValue()); + } + } + + if (new HashSet<>(cases.values()).size() > 1) + { + throw new ParamCoreSyntaxException(gc.getSource(), + "[param-core] Continuations not syntactically equal: " + cases.values()); + } + + return this.af.ParamCoreGMultiChoices(src, gc.var, dest, cases.keySet(), cases.values().iterator().next()); + } + private ParamCoreGType parseGRecursion(Map rvs, boolean checkChoiceGuard, GRecursion gr) throws ParamCoreSyntaxException { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java index b822cdb13..25763ed34 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java @@ -9,12 +9,9 @@ public class ParamCoreLChoice extends ParamCoreChoice implements ParamCoreLType { - public final ParamCoreLActionKind kind; - public ParamCoreLChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) { super(role, kind, cases); - this.kind = kind; } @Override @@ -22,6 +19,12 @@ public ParamCoreLActionKind getKind() { return (ParamCoreLActionKind) this.kind; } + + @Override + public String toString() + { + return this.role.toString() + this.kind + casesToString(); + } @Override public int hashCode() @@ -43,7 +46,7 @@ public boolean equals(Object obj) { return false; } - return super.equals(obj) && this.kind.equals(((ParamCoreLChoice) obj).kind); // Does canEquals + return super.equals(obj); // Does canEquals } @Override @@ -51,10 +54,4 @@ public boolean canEquals(Object o) { return o instanceof ParamCoreLChoice; } - - @Override - public String toString() - { - return this.role.toString() + this.kind + casesToString(); - } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java new file mode 100644 index 000000000..d22226933 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java @@ -0,0 +1,66 @@ +package org.scribble.ext.go.core.ast.local; + +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.ext.go.core.ast.ParamCoreChoice; +import org.scribble.ext.go.core.ast.ParamCoreMessage; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.type.kind.Local; + +// FIXME: factor out better with ParamCoreChoice +public class ParamCoreLMultiChoices extends ParamCoreChoice implements ParamCoreLType +{ + public final ParamIndexVar var; // Redundant? + + // Pre: cases.size() > 1 + public ParamCoreLMultiChoices(ParamRole role, ParamCoreLActionKind kind, ParamIndexVar var, Set cases, ParamCoreLType cont) + { + super(role, kind, cases.stream().collect(Collectors.toMap(c -> c, c -> cont))); + this.var = var; + } + + @Override + public ParamCoreLActionKind getKind() + { + return (ParamCoreLActionKind) this.kind; + } + + @Override + public String toString() + { + return this.role.toString() + this.kind + casesToString(); + } + + @Override + public int hashCode() + { + int hash = 7207; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.var.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreChoice)) + { + return false; + } + ParamCoreLMultiChoices them = (ParamCoreLMultiChoices) obj; + return super.equals(this) + && this.var.equals(them.var); + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreChoice; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java index 6350b56bd..43072ce34 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -9,6 +9,7 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; import org.scribble.ext.go.core.ast.local.ParamCoreLChoice; import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; +import org.scribble.ext.go.core.ast.local.ParamCoreLMultiChoices; import org.scribble.ext.go.core.ast.local.ParamCoreLRec; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamRole; @@ -44,7 +45,14 @@ private void build(ParamCoreLType lt, EState s1, EState s2, Map { ParamCoreLChoice lc = (ParamCoreLChoice) lt; lc.cases.entrySet().stream().forEach(e -> - buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.kind, e.getKey(), e.getValue()) + buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue()) + ); + } + else if (lt instanceof ParamCoreLMultiChoices) + { + ParamCoreLMultiChoices lc = (ParamCoreLMultiChoices) lt; + lc.cases.entrySet().stream().forEach(e -> // FIXME: all conts are syntactically the same, so implicitly do the merge here? + buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue()) ); } else if (lt instanceof ParamCoreLRec) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMultiChoicesDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMultiChoicesDel.java new file mode 100644 index 000000000..20044a73a --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMultiChoicesDel.java @@ -0,0 +1,35 @@ +package org.scribble.ext.go.del.global; + +import java.util.List; +import java.util.stream.Collectors; + +import org.scribble.ast.ScribNode; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDelBase; +import org.scribble.del.global.GChoiceDel; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.ast.global.ParamGMultiChoices; +import org.scribble.main.ScribbleException; +import org.scribble.visit.ProtocolDefInliner; +import org.scribble.visit.env.InlineProtocolEnv; + +public class ParamGMultiChoicesDel extends GChoiceDel +{ + @Override + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException + { + ParamGMultiChoices gc = (ParamGMultiChoices) visited; + List blocks = gc.getBlocks().stream() + .map(b -> (GProtocolBlock) ((InlineProtocolEnv) b.del().env()).getTranslation()).collect(Collectors.toList()); + RoleNode subj = gc.subj.clone(inl.job.af); + + ParamGMultiChoices inlined = ((ParamAstFactory) inl.job.af).ParamGMultiChoices(gc.getSource(), subj, + gc.var, gc.start, gc.end, blocks); + + inl.pushEnv(inl.popEnv().setTranslation(inlined)); + + //return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); + return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java index dec9d1559..ce3eac7c7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java @@ -5,6 +5,7 @@ import org.scribble.ast.ScribNode; import org.scribble.ext.go.ast.ParamAstFactory; import org.scribble.ext.go.parser.scribble.ast.ParamAntlrGChoice; +import org.scribble.ext.go.parser.scribble.ast.ParamAntlrGMultiChoices; import org.scribble.ext.go.parser.scribble.ast.ParamAntlrRoleDecl; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGCrossMessageTransfer; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGDotMessageTransfer; @@ -18,6 +19,7 @@ public class ParamAntlrToScribParser extends AntlrToScribParser public static final String PARAM_GLOBALCROSSMESSAGETRANSFER_NODE_TYPE = "PARAM_GLOBALCROSSMESSAGETRANSFER"; public static final String PARAM_GLOBALDOTMESSAGETRANSFER_NODE_TYPE = "PARAM_GLOBALDOTMESSAGETRANSFER"; public static final String PARAM_GLOBALCHOICE_NODE_TYPE = "PARAM_GLOBALCHOICE"; + public static final String PARAM_GLOBALMULTICHOICES_NODE_TYPE = "PARAM_GLOBALMULTICHOICES"; public ParamAntlrToScribParser() { @@ -40,6 +42,8 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException return ParamAntlrGDotMessageTransfer.parseParamGDotMessageTransfer(this, ct, aaf); case PARAM_GLOBALCHOICE_NODE_TYPE: return ParamAntlrGChoice.parseParamGChoice(this, ct, aaf); + case PARAM_GLOBALMULTICHOICES_NODE_TYPE: + return ParamAntlrGMultiChoices.parseParamGMultiChoices(this, ct, aaf); default: return super.parse(ct, af); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java index 118376b25..aa4c8bd99 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java @@ -4,10 +4,10 @@ import java.util.List; import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.ast.global.ParamGChoice; import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.parser.scribble.AntlrToScribParser; @@ -22,7 +22,7 @@ public class ParamAntlrGChoice public static final int BLOCK_CHILDREN_START_INDEX = 2; public static final int INDEX_EXPR_CHILD_INDEX = 1; - public static GChoice parseParamGChoice(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException + public static ParamGChoice parseParamGChoice(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException { RoleNode subj = AntlrSimpleName.toRoleNode(getSubjectChild(root), af); List blocks = new LinkedList<>(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGMultiChoices.java new file mode 100644 index 000000000..475d20fb8 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGMultiChoices.java @@ -0,0 +1,68 @@ +package org.scribble.ext.go.parser.scribble.ast; + +import java.util.LinkedList; +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.global.GChoice; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.AntlrToScribParserUtil; +import org.scribble.parser.scribble.ast.name.AntlrSimpleName; +import org.scribble.util.ScribParserException; + +public class ParamAntlrGMultiChoices +{ + public static final int SUBJECT_CHILD_INDEX = 0; + + public static final int BLOCK_CHILDREN_START_INDEX = 4; + + public static final int INDEX_VAR_CHILD_INDEX = 1; + public static final int START_INDEX_EXPR_CHILD_INDEX = 2; + public static final int END_INDEX_EXPR_CHILD_INDEX = 3; + + public static GChoice parseParamGMultiChoices(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException + { + RoleNode subj = AntlrSimpleName.toRoleNode(getSubjectChild(root), af); + List blocks = new LinkedList<>(); + ParamIndexVar var = (ParamIndexVar) ParamAntlrIndexExpr.parseParamIndexExpr(getIndexVarChild(root), af); + ParamIndexExpr start = ParamAntlrIndexExpr.parseParamIndexExpr(getStartIndexExprChild(root), af); + ParamIndexExpr end = ParamAntlrIndexExpr.parseParamIndexExpr(getEndIndexExprChild(root), af); + for (CommonTree b : getBlockChildren(root)) + { + blocks.add((GProtocolBlock) parser.parse(b, af)); + } + return af.ParamGMultiChoices(root, subj, var, start, end, blocks); + } + + public static CommonTree getSubjectChild(CommonTree ct) + { + return (CommonTree) ct.getChild(SUBJECT_CHILD_INDEX); + } + + public static CommonTree getIndexVarChild(CommonTree ct) + { + return (CommonTree) ct.getChild(INDEX_VAR_CHILD_INDEX); + } + + public static CommonTree getStartIndexExprChild(CommonTree ct) + { + return (CommonTree) ct.getChild(START_INDEX_EXPR_CHILD_INDEX); + } + + public static CommonTree getEndIndexExprChild(CommonTree ct) + { + return (CommonTree) ct.getChild(END_INDEX_EXPR_CHILD_INDEX); + } + + public static List getBlockChildren(CommonTree ct) + { + List children = ct.getChildren(); + return AntlrToScribParserUtil.toCommonTreeList(children.subList(BLOCK_CHILDREN_START_INDEX, children.size())); + } +} diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 72962d902..84761e607 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -32,20 +32,30 @@ vs. pabble message passing - abstract transport -- shared mem, TCP -- integrated - domain flexibility -- parallel algs, Web services -- shared parameterised abstraction, concrete transport independence + + +// encode "multi-choices" by local role(thread) forking/joining? for dynamic join/leave use param-value dependency? (run-time checked?) */ //* global protocol Proto1(role A(n), role B(n)) { - choice at A[i:1..n] + choices at A[i:1..n] { 1() from A[1..1] to B[1..2]; + + //3() from A[1..n] to B[1..2]; } or { 2() from A[1..1] to B[1..2]; + + //3() from A[1..n] to B[1..2]; // OK + //3() from A[1..1] to B[1..2]; // Bad } + + //3() from A[1..n] to B[1..2]; // FIXME: do like this for multi-choices? } //*/ @@ -61,8 +71,8 @@ global protocol Proto1(role A(n), role B(n)) { 1() from A[1..1] to B[1..2]; // OK - 1() from A[1..2] to B[1..2]; // Bad - 1() from A[1..n] to B[1..2]; // Bad + //1() from A[1..2] to B[1..2]; // Bad + //1() from A[1..n] to B[1..2]; // Bad } or { From 9ffaab45b16a8e8a45c7512e4143ece027f29ca2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 30 Aug 2017 22:34:32 +0100 Subject: [PATCH 097/433] Adding param-core message actions for multichoices. --- .../org/scribble/parser/antlr/ParamScribble.g | 10 ++ .../scribble/ext/go/ast/ParamAstFactory.java | 3 + .../ext/go/ast/ParamAstFactoryImpl.java | 11 +++ .../global/ParamGMultiChoicesTransfer.java | 97 +++++++++++++++++++ .../ast/global/ParamCoreGMultiChoices.java | 15 +-- .../ParamCoreGProtocolDeclTranslator.java | 39 ++++++-- .../scribble/ParamAntlrToScribParser.java | 4 + .../ParamAntlrGMultiChoicesTransfer.java | 69 +++++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 7 +- 9 files changed, 236 insertions(+), 19 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoicesTransfer.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGMultiChoicesTransfer.java diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 43e22d107..34b3fbb08 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -176,6 +176,7 @@ tokens PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; PARAM_GLOBALCHOICE = 'PARAM_GLOBALCHOICE'; PARAM_GLOBALMULTICHOICES = 'PARAM_GLOBALMULTICHOICES'; + PARAM_GLOBALMULTICHOICESTRANSFER = 'PARAM_GLOBALMULTICHOICESTRANSFER'; } @@ -648,6 +649,8 @@ globalinteraction: | globalmultichoices +| + globalmultichoicetransfer ; /*| globalparallel @@ -765,6 +768,13 @@ globalmultichoices: ^(PARAM_GLOBALMULTICHOICES rolename simplename paramindexexpr paramindexexpr globalprotocolblock+) ; +globalmultichoicetransfer: + message FROM_KW rolename '[' simplename ']' TO_KW rolename '[' paramindexexpr '..' paramindexexpr ']' ';' +-> + ^(PARAM_GLOBALMULTICHOICESTRANSFER message rolename rolename simplename paramindexexpr paramindexexpr) +; + + /** * Section 3.7.6 Global Recursion diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java index a7ce93191..23acfa928 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java @@ -10,6 +10,7 @@ import org.scribble.ext.go.ast.global.ParamGChoice; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; +import org.scribble.ext.go.ast.global.ParamGMultiChoicesTransfer; import org.scribble.ext.go.ast.global.ParamGMultiChoices; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -29,4 +30,6 @@ ParamGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode sr ParamGChoice ParamGChoice(CommonTree source, RoleNode subj, ParamIndexExpr expr, List blocks); ParamGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, ParamIndexVar var, ParamIndexExpr start, ParamIndexExpr end, List blocks); + ParamGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + ParamIndexVar var, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index 235706c24..fb4320e96 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -12,6 +12,7 @@ import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; import org.scribble.ext.go.ast.global.ParamGMultiChoices; +import org.scribble.ext.go.ast.global.ParamGMultiChoicesTransfer; import org.scribble.ext.go.del.global.ParamGChoiceDel; import org.scribble.ext.go.del.global.ParamGMessageTransferDel; import org.scribble.ext.go.del.global.ParamGMultiChoicesDel; @@ -233,6 +234,16 @@ public ParamGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, P return gc; } + @Override + public ParamGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + ParamIndexVar var, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) + { + ParamGMultiChoicesTransfer mt = new ParamGMultiChoicesTransfer(source, src, msg, dest, + var, destRangeStart, destRangeEnd); + mt = del(mt, new ParamGMessageTransferDel()); // FIXME: not a ParamGMessageTransfer + return mt; + } + /*@Override public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoicesTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoicesTransfer.java new file mode 100644 index 000000000..9ec00a3cb --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoicesTransfer.java @@ -0,0 +1,97 @@ +package org.scribble.ext.go.ast.global; + +import java.util.Arrays; +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.Constants; +import org.scribble.ast.MessageNode; +import org.scribble.ast.MessageTransfer; +import org.scribble.ast.global.GMessageTransfer; +import org.scribble.ast.local.LNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; +import org.scribble.visit.AstVisitor; + +// Subsumes scatter/gather, src/dest range length one +public class ParamGMultiChoicesTransfer extends GMessageTransfer +{ + public final ParamIndexVar var; + public final ParamIndexExpr destRangeStart; + public final ParamIndexExpr destRangeEnd; // Inclusive + + public ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + ParamIndexVar var, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) + { + super(source, src, msg, Arrays.asList(dest)); + this.var = var; + this.destRangeStart = destRangeStart; + this.destRangeEnd = destRangeEnd; + } + + @Override + public LNode project(AstFactory af, Role self) + { + //return super.project(af, self); // FIXME + throw new RuntimeException("[param] TODO: " + this); // Not just project, but most passes after parsing + } + + @Override + protected ParamGMultiChoicesTransfer copy() + { + return new ParamGMultiChoicesTransfer(this.source, this.src, this.msg, getDestinations().get(0), + this.var, this.destRangeStart, this.destRangeEnd); + } + + @Override + public ParamGMultiChoicesTransfer clone(AstFactory af) + { + RoleNode src = this.src.clone(af); + MessageNode msg = this.msg.clone(af); + RoleNode dest = getDestinations().get(0).clone(af); + return ((ParamAstFactory) af).ParamGMultiChoicesTransfer(this.source, src, msg, dest, + this.var, this.destRangeStart, this.destRangeEnd); + } + + @Override + public ParamGMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) + { + throw new RuntimeException("[param] Shouldn't get in here: " + this); + } + + public ParamGMultiChoicesTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, + ParamIndexVar var, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) + { + ScribDel del = del(); + ParamGMultiChoicesTransfer gmt = new ParamGMultiChoicesTransfer(this.source, src, msg, dest, + var, destRangeStart, destRangeEnd); + gmt = (ParamGMultiChoicesTransfer) gmt.del(del); + return gmt; + } + + @Override + public MessageTransfer visitChildren(AstVisitor nv) throws ScribbleException + { + RoleNode src = (RoleNode) visitChild(this.src, nv); + MessageNode msg = (MessageNode) visitChild(this.msg, nv); + RoleNode dest = (RoleNode) visitChild(getDestinations().get(0), nv); + return reconstruct(src, msg, dest, this.var, this.destRangeStart, this.destRangeEnd); + } + + @Override + public String toString() + { + return this.msg + " " + Constants.FROM_KW + " " + + this.src + "[" + this.var + "]" + + " " + Constants.TO_KW + " " + + getDestinations().get(0) + "[" + this.destRangeStart + ".." + this.destRangeEnd + "]" + + ";"; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java index ac5cac277..54dbad195 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java @@ -16,6 +16,7 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.ext.go.main.ParamJob; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -200,6 +201,14 @@ private ParamCoreLType merge(ParamCoreAstFactory af, ParamActualRole r, Map is, Map rvs) throws ParamCoreSyntaxException + { + GInteractionNode in = is.get(0); + if (!(in instanceof ParamGMultiChoicesTransfer)) + { + throw new ParamCoreSyntaxException(in.getSource(), "[param-core] Expected GMultiChoicesTransfer: " + in.getClass()); + } + + ParamGMultiChoicesTransfer gmt = (ParamGMultiChoicesTransfer) in; + ParamCoreMessage a = this.af.ParamCoreAction(parseOp(gmt), parsePayload(gmt)); + + String srcName = parseSourceRole(gmt); + String destName = parseDestinationRole(gmt); + ParamRole src = af.ParamRole(srcName, new ParamRange(gmt.var, gmt.var)); // HACK var -- multichoices needs src range (e.g., projection), but multichoicestransfer doesn't + ParamRole dest = af.ParamRole(destName, new ParamRange(gmt.destRangeStart, gmt.destRangeEnd)); + + ParamCoreGType cont = parseSeq(is.subList(1, is.size()), rvs, false, false); // Subseqeuent choice/rec is guarded by (at least) this action + return this.af.ParamCoreGMultiChoices(src, gmt.var, dest, Stream.of(a).collect(Collectors.toSet()), cont); + } + // FIXME: factor out with parseGChoice private ParamCoreGType parseParamGMultiChoices(Map rvs, boolean checkRecGuard, ParamGMultiChoices gc) throws ParamCoreSyntaxException { - List children = new LinkedList<>(); + List children = new LinkedList<>(); for (GProtocolBlock b : gc.getBlocks()) { - children.add(parseSeq(b.getInteractionSeq().getInteractions(), rvs, true, checkRecGuard)); // Check cases are guarded + children.add(parseGMultiChoicesTransfer(b.getInteractionSeq().getInteractions(), rvs)); // Check cases are guarded } ParamCoreGActionKind kind = null; ParamRole src = null; ParamRole dest = null; Map cases = new HashMap<>(); - for (ParamCoreGType c : children) + for (ParamCoreGMultiChoices c : children) { - // Because all cases should be action guards (unary choices) - if (!(c instanceof ParamCoreGChoice)) - { - throw new RuntimeException("[param-core] Shouldn't get in here: " + c); - } - ParamCoreGChoice tmp = (ParamCoreGChoice) c; + ParamCoreGMultiChoices tmp = (ParamCoreGMultiChoices) c; if (tmp.cases.size() > 1) { throw new RuntimeException("[param-core] Shouldn't get in here: " + c); @@ -243,7 +259,10 @@ else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) "[param-core] Continuations not syntactically equal: " + cases.values()); } - return this.af.ParamCoreGMultiChoices(src, gc.var, dest, cases.keySet(), cases.values().iterator().next()); + return this.af.ParamCoreGMultiChoices( + //src, + new ParamRole(gc.subj.toString(), Stream.of(new ParamRange(gc.start, gc.end)).collect(Collectors.toSet())), + gc.var, dest, cases.keySet(), cases.values().iterator().next()); } private ParamCoreGType parseGRecursion(Map rvs, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java index ce3eac7c7..e72534476 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java @@ -9,6 +9,7 @@ import org.scribble.ext.go.parser.scribble.ast.ParamAntlrRoleDecl; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGCrossMessageTransfer; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGDotMessageTransfer; +import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGMultiChoicesTransfer; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.util.ScribParserException; @@ -20,6 +21,7 @@ public class ParamAntlrToScribParser extends AntlrToScribParser public static final String PARAM_GLOBALDOTMESSAGETRANSFER_NODE_TYPE = "PARAM_GLOBALDOTMESSAGETRANSFER"; public static final String PARAM_GLOBALCHOICE_NODE_TYPE = "PARAM_GLOBALCHOICE"; public static final String PARAM_GLOBALMULTICHOICES_NODE_TYPE = "PARAM_GLOBALMULTICHOICES"; + public static final String PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE = "PARAM_GLOBALMULTICHOICESTRANSFER"; public ParamAntlrToScribParser() { @@ -44,6 +46,8 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException return ParamAntlrGChoice.parseParamGChoice(this, ct, aaf); case PARAM_GLOBALMULTICHOICES_NODE_TYPE: return ParamAntlrGMultiChoices.parseParamGMultiChoices(this, ct, aaf); + case PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE: + return ParamAntlrGMultiChoicesTransfer.parseParamGMultiChoicesTransfer(this, ct, aaf); default: return super.parse(ct, af); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGMultiChoicesTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGMultiChoicesTransfer.java new file mode 100644 index 000000000..b713a4cfe --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGMultiChoicesTransfer.java @@ -0,0 +1,69 @@ +package org.scribble.ext.go.parser.scribble.ast.global; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.MessageNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.ast.global.ParamGMultiChoicesTransfer; +import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.ast.global.AntlrGMessageTransfer; +import org.scribble.parser.scribble.ast.name.AntlrSimpleName; +import org.scribble.util.ScribParserException; + +public class ParamAntlrGMultiChoicesTransfer +{ + // Same as original + public static final int MESSAGE_CHILD_INDEX = 0; + public static final int SOURCE_CHILD_INDEX = 1; + public static final int DESTINATION_CHILD_INDEX = 2; + + // New + public static final int INDEX_VAR_CHILD_INDEX = 3; + public static final int DEST_START_CHILD_INDEX = 4; + public static final int DEST_END_CHILD_INDEX = 5; + + public static ParamGMultiChoicesTransfer + parseParamGMultiChoicesTransfer(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException + { + RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(root), af); + MessageNode msg = AntlrGMessageTransfer.parseMessage(parser, getMessageChild(root), af); + RoleNode dest = AntlrSimpleName.toRoleNode(getDestChild(root), af); + ParamIndexVar var = (ParamIndexVar) ParamAntlrIndexExpr.parseParamIndexExpr(getIndexVarChild(root), af); + ParamIndexExpr destStart = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); + ParamIndexExpr destEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); + return af.ParamGMultiChoicesTransfer(root, src, msg, dest, var, destStart, destEnd); + } + + public static CommonTree getMessageChild(CommonTree root) + { + return (CommonTree) root.getChild(MESSAGE_CHILD_INDEX); + } + + public static CommonTree getSourceChild(CommonTree root) + { + return (CommonTree) root.getChild(SOURCE_CHILD_INDEX); + } + + public static CommonTree getDestChild(CommonTree root) + { + return (CommonTree) root.getChild(DESTINATION_CHILD_INDEX); + } + + public static CommonTree getIndexVarChild(CommonTree root) + { + return (CommonTree) root.getChild(INDEX_VAR_CHILD_INDEX); + } + + public static CommonTree getDestRangeStartChild(CommonTree root) + { + return (CommonTree) root.getChild(DEST_START_CHILD_INDEX); + } + + public static CommonTree getDestRangeEndChild(CommonTree root) + { + return (CommonTree) root.getChild(DEST_END_CHILD_INDEX); + } +} diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 84761e607..a56d7683c 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -43,19 +43,20 @@ global protocol Proto1(role A(n), role B(n)) { choices at A[i:1..n] { - 1() from A[1..1] to B[1..2]; + 1() from A[i] to B[1..2]; //3() from A[1..n] to B[1..2]; } or { - 2() from A[1..1] to B[1..2]; + 2() from A[i] to B[1..2]; + //2() from A[1..1] to B[1..2]; //3() from A[1..n] to B[1..2]; // OK //3() from A[1..1] to B[1..2]; // Bad } - //3() from A[1..n] to B[1..2]; // FIXME: do like this for multi-choices? + //3() from A[1..n] to B[1..2]; // FIXME: support this for param-core multi-choices? } //*/ From 8ee7402f4b77a7129a500b12ceb68b6581be8d5c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 30 Aug 2017 22:41:56 +0100 Subject: [PATCH 098/433] Fixed a param-core WF check bug for unary choice-src range. Continued adding param-core message transfer actions for multichoices. --- .../go/core/ast/global/ParamCoreGChoice.java | 23 +++++++++++-------- .../ast/global/ParamCoreGMultiChoices.java | 2 +- .../core/ast/local/ParamCoreLActionKind.java | 4 +++- .../endpoint/ParamCoreEGraphBuilder.java | 4 ++++ .../src/test/scrib/param/cgo18/Auction.scr | 6 +++-- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index 662611fcb..e7237ed50 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -84,18 +84,21 @@ public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) } - String bar = "(assert " - + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and ") - + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant - + "(not (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") 0))" - + (vars.isEmpty() ? "" : "))") - + ")"; + if (this.cases.size() > 1) + { + String bar = "(assert " + + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and ") + + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant + + "(not (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") 0))" + + (vars.isEmpty() ? "" : "))") + + ")"; - job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subject for " + this.src + ":\n " + bar); + job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subject for " + this.src + ":\n " + bar); - if (Z3Wrapper.checkSat(job, gpd, bar)) - { - return false; + if (Z3Wrapper.checkSat(job, gpd, bar)) + { + return false; + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java index 54dbad195..ddb208cdc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java @@ -179,7 +179,7 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro } else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) { - return af.ParamCoreLMultiChoices(this.src, ParamCoreLActionKind.RECEIVE_ALL, this.var, projs.keySet(), values.iterator().next()); + return af.ParamCoreLMultiChoices(this.src, ParamCoreLActionKind.MULTICHOICES_RECEIVE_ALL, this.var, projs.keySet(), values.iterator().next()); } // src name != dest name diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java index fee4f52f2..609615beb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java @@ -6,7 +6,8 @@ public enum ParamCoreLActionKind implements ParamCoreActionKind { SEND_ALL, - RECEIVE_ALL; + RECEIVE_ALL, + MULTICHOICES_RECEIVE_ALL; @Override public String toString() @@ -15,6 +16,7 @@ public String toString() { case SEND_ALL: return "!"; case RECEIVE_ALL: return "?"; + case MULTICHOICES_RECEIVE_ALL: return "?*"; default: throw new RuntimeException("[param-core] Won't get here: " + this); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java index 43072ce34..2ae72be87 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -100,6 +100,10 @@ else if (k.equals(ParamCoreLActionKind.RECEIVE_ALL)) { return ef.newParamCoreEReceive(r, a.op, a.pay); } + else if (k.equals(ParamCoreLActionKind.MULTICHOICES_RECEIVE_ALL)) + { + throw new RuntimeException("[param-core] TODO: " + k); + } else { throw new RuntimeException("[param-core] Shouldn't get in here: " + k); diff --git a/scribble-go/src/test/scrib/param/cgo18/Auction.scr b/scribble-go/src/test/scrib/param/cgo18/Auction.scr index 5956561ac..781349651 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Auction.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Auction.scr @@ -36,20 +36,22 @@ aux global protocol X(role A, role B(n)) /*foreach (i: 1..n) { choice at B[i]*/ - choice at B[i:1..n] + choices at B[i:1..n] { bid(int) from B[i] to A[1..1]; + do X(A, B); } or { skip(int) from B[i] to A[1..1]; + do X(A, B); } //} // "Traditional MPST" solution //bidOrSkip(int) from B[1..n] to A[1..1]; - do X(A, B); + //do X(A, B); } or { From aa4488bc85028905fac0383ab4485cd2bfeb0d69 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 31 Aug 2017 12:09:58 +0100 Subject: [PATCH 099/433] Added param-core dot-transfer projections. --- .../ext/go/core/ast/ParamCoreAstFactory.java | 5 ++- .../ext/go/core/ast/ParamCoreChoice.java | 2 +- .../go/core/ast/global/ParamCoreGChoice.java | 33 +++++++++++++------ .../ast/global/ParamCoreGMultiChoices.java | 4 +-- .../core/ast/local/ParamCoreLActionKind.java | 18 ++++++---- .../ast/local/ParamCoreLMultiChoices.java | 6 ++-- .../endpoint/ParamCoreEGraphBuilder.java | 6 ++-- .../src/test/scrib/param/tmp/ParamTest.scr | 26 +++++++++++++++ 8 files changed, 71 insertions(+), 29 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java index 239bff9d7..9ecdabd8c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java @@ -76,10 +76,9 @@ public ParamCoreLChoice ParamCoreLChoice(ParamRole role, ParamCoreLActionKind ki return new ParamCoreLChoice(role, kind, cases); } - public ParamCoreLMultiChoices ParamCoreLMultiChoices(ParamRole role, ParamCoreLActionKind kind, - ParamIndexVar var, Set cases, ParamCoreLType cont) + public ParamCoreLMultiChoices ParamCoreLMultiChoices(ParamRole role, ParamIndexVar var, Set cases, ParamCoreLType cont) { - return new ParamCoreLMultiChoices(role, kind, var, cases, cont); + return new ParamCoreLMultiChoices(role, var, cases, cont); } /*public ParamCoreLSend LSend(Role self, Role peer, Op op, Payload pay) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java index 1ddd1004f..ec8ef10ca 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java @@ -61,7 +61,7 @@ protected String casesToString() .map(e -> e.getKey() + "." + e.getValue()).collect(Collectors.joining(", ")); s = (this.cases.size() > 1) ? "{ " + s + " }" - : ":" + s; + : s; return s; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index e7237ed50..2139ae2d3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -166,11 +166,6 @@ public Set getParamRoles() //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException { - if (this.kind != ParamCoreGActionKind.CROSS_TRANSFER) - { - throw new RuntimeException("[param-core] TODO: " + this); - } - Map projs = new HashMap<>(); for (Entry e : this.cases.entrySet()) { @@ -182,14 +177,32 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro } // "Simple" cases - //if (this.src.getName().equals(r)) - if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? + if (this.kind == ParamCoreGActionKind.CROSS_TRANSFER) + { + //if (this.src.getName().equals(r)) + if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? + { + return af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.CROSS_SEND, projs); + } + else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) + { + return af.ParamCoreLChoice(this.src, ParamCoreLActionKind.CROSS_RECEIVE, projs); + } + } + else if (this.kind == ParamCoreGActionKind.DOT_TRANSFER) { - return af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.SEND_ALL, projs); + if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? + { + return af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.DOT_SEND, projs); + } + else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) + { + return af.ParamCoreLChoice(this.src, ParamCoreLActionKind.DOT_RECEIVE, projs); + } } - else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) + else { - return af.ParamCoreLChoice(this.src, ParamCoreLActionKind.RECEIVE_ALL, projs); + throw new RuntimeException("[param-core] TODO: " + this); } // src name != dest name diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java index ddb208cdc..0afb1a622 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java @@ -175,11 +175,11 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro // "Simple" cases -- same projection as ParamCoreGChoice, i.e., same local types? -- index var redundant, apart from "syntactic consistency" for subsequent message actions? (i.e., only for Scribble syntax?) if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? { - return af.ParamCoreLMultiChoices(this.dest, ParamCoreLActionKind.SEND_ALL, this.var, projs.keySet(), values.iterator().next()); + return af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.CROSS_SEND, projs); } else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) { - return af.ParamCoreLMultiChoices(this.src, ParamCoreLActionKind.MULTICHOICES_RECEIVE_ALL, this.var, projs.keySet(), values.iterator().next()); + return af.ParamCoreLMultiChoices(this.src, this.var, projs.keySet(), values.iterator().next()); } // src name != dest name diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java index 609615beb..5c2959db2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java @@ -5,19 +5,23 @@ public enum ParamCoreLActionKind implements ParamCoreActionKind { - SEND_ALL, - RECEIVE_ALL, - MULTICHOICES_RECEIVE_ALL; + CROSS_SEND, + CROSS_RECEIVE, // Multi-receive, but unary choice // Cf. API gen, unary vs. non-unary choice + MULTICHOICES_RECEIVE, // Multi-choice receive + DOT_SEND, + DOT_RECEIVE; @Override public String toString() { switch (this) { - case SEND_ALL: return "!"; - case RECEIVE_ALL: return "?"; - case MULTICHOICES_RECEIVE_ALL: return "?*"; - default: throw new RuntimeException("[param-core] Won't get here: " + this); + case CROSS_SEND: return "!"; + case CROSS_RECEIVE: return "?"; + case MULTICHOICES_RECEIVE: return "?*"; + case DOT_SEND: return "!="; + case DOT_RECEIVE: return "?="; + default: throw new RuntimeException("[param-core] Won't get here: " + this); } } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java index d22226933..7bd2b67ff 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java @@ -9,15 +9,15 @@ import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.type.kind.Local; -// FIXME: factor out better with ParamCoreChoice +// FIXME: factor out better with ParamCoreChoice -- or deprecate and just use kind? public class ParamCoreLMultiChoices extends ParamCoreChoice implements ParamCoreLType { public final ParamIndexVar var; // Redundant? // Pre: cases.size() > 1 - public ParamCoreLMultiChoices(ParamRole role, ParamCoreLActionKind kind, ParamIndexVar var, Set cases, ParamCoreLType cont) + public ParamCoreLMultiChoices(ParamRole role, ParamIndexVar var, Set cases, ParamCoreLType cont) { - super(role, kind, cases.stream().collect(Collectors.toMap(c -> c, c -> cont))); + super(role, ParamCoreLActionKind.MULTICHOICES_RECEIVE, cases.stream().collect(Collectors.toMap(c -> c, c -> cont))); this.var = var; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java index 2ae72be87..a77c6cc81 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -91,16 +91,16 @@ else if (cont instanceof ParamCoreRecVar) private EAction toEAction(ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a) { ParamCoreEModelFactory ef = (ParamCoreEModelFactory) this.util.ef; // FIXME: factor out - if (k.equals(ParamCoreLActionKind.SEND_ALL)) + if (k.equals(ParamCoreLActionKind.CROSS_SEND)) { return ef.newParamCoreESend(r, a.op, a.pay); } - else if (k.equals(ParamCoreLActionKind.RECEIVE_ALL)) + else if (k.equals(ParamCoreLActionKind.CROSS_RECEIVE)) { return ef.newParamCoreEReceive(r, a.op, a.pay); } - else if (k.equals(ParamCoreLActionKind.MULTICHOICES_RECEIVE_ALL)) + else if (k.equals(ParamCoreLActionKind.MULTICHOICES_RECEIVE)) { throw new RuntimeException("[param-core] TODO: " + k); } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index a56d7683c..518ec2db6 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -40,6 +40,32 @@ message passing //* global protocol Proto1(role A(n), role B(n)) +{ + 1() dot A[1..n] to B[1..n]; +} +//*/ + + +/* +global protocol Proto1(role A(n), role B(n)) +{ + /*choices at A[i:1..n] + { + 1() from A[i] to B[1..1]; + }* / + + /*choice at A[1] + { + 1() from A[1..1] to B[1..1]; + }* / + + 1() from A[1..n] to B[1..1]; // Above and this are equivalent for n=1 +} +//*/ + + +/* +global protocol Proto1(role A(n), role B(n)) { choices at A[i:1..n] { From eca5f87145da15b4dfacc4a4d1ae648b3cb45b75 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 31 Aug 2017 12:43:56 +0100 Subject: [PATCH 100/433] Added param-core EFSM translation for dot and multichoices-receive actions. Modified Ring example to be WF. --- .../endpoint/ParamCoreEGraphBuilder.java | 15 +++- .../endpoint/ParamCoreEModelFactory.java | 14 ++-- .../endpoint/ParamCoreEModelFactoryImpl.java | 33 +++++++-- ...ceive.java => ParamCoreECrossReceive.java} | 10 +-- ...oreESend.java => ParamCoreECrossSend.java} | 10 +-- .../endpoint/action/ParamCoreEDotReceive.java | 71 +++++++++++++++++++ .../endpoint/action/ParamCoreEDotSend.java | 71 +++++++++++++++++++ .../action/ParamCoreEMultiChoicesReceive.java | 71 +++++++++++++++++++ .../global/ParamAntlrGDotMessageTransfer.java | 3 + .../ast/index/ParamAntlrIndexExpr.java | 3 + .../src/test/scrib/param/cgo18/Ring.scr | 58 ++++++++++++++- .../src/test/scrib/param/tmp/ParamTest.scr | 15 +++- 12 files changed, 349 insertions(+), 25 deletions(-) rename scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/{ParamCoreEReceive.java => ParamCoreECrossReceive.java} (77%) rename scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/{ParamCoreESend.java => ParamCoreECrossSend.java} (78%) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java index a77c6cc81..26cbc47f8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -93,16 +93,25 @@ private EAction toEAction(ParamRole r, ParamCoreLActionKind k, ParamCoreMessage ParamCoreEModelFactory ef = (ParamCoreEModelFactory) this.util.ef; // FIXME: factor out if (k.equals(ParamCoreLActionKind.CROSS_SEND)) { - return ef.newParamCoreESend(r, a.op, a.pay); + return ef.newParamCoreECrossSend(r, a.op, a.pay); } else if (k.equals(ParamCoreLActionKind.CROSS_RECEIVE)) { - return ef.newParamCoreEReceive(r, a.op, a.pay); + return ef.newParamCoreECrossReceive(r, a.op, a.pay); + } + else if (k.equals(ParamCoreLActionKind.DOT_SEND)) + { + return ef.newParamCoreEDotSend(r, a.op, a.pay); + + } + else if (k.equals(ParamCoreLActionKind.DOT_RECEIVE)) + { + return ef.newParamCoreEDotReceive(r, a.op, a.pay); } else if (k.equals(ParamCoreLActionKind.MULTICHOICES_RECEIVE)) { - throw new RuntimeException("[param-core] TODO: " + k); + return ef.newParamCoreEMultiChoicesReceive(r, a.op, a.pay); } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java index 94f32dcb9..a376aa565 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java @@ -1,7 +1,10 @@ package org.scribble.ext.go.core.model.endpoint; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreESend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.model.endpoint.EModelFactory; import org.scribble.type.Payload; @@ -10,6 +13,9 @@ public interface ParamCoreEModelFactory extends EModelFactory { - ParamCoreESend newParamCoreESend(ParamRole peer, MessageId mid, Payload payload); - ParamCoreEReceive newParamCoreEReceive(ParamRole peer, MessageId mid, Payload payload); + ParamCoreECrossSend newParamCoreECrossSend(ParamRole peer, MessageId mid, Payload payload); + ParamCoreECrossReceive newParamCoreECrossReceive(ParamRole peer, MessageId mid, Payload payload); + ParamCoreEDotSend newParamCoreEDotSend(ParamRole peer, MessageId mid, Payload payload); + ParamCoreEDotReceive newParamCoreEDotReceive(ParamRole peer, MessageId mid, Payload payload); + ParamCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(ParamRole peer, MessageId mid, Payload payload); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java index bb9515c80..3689e307b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java @@ -1,7 +1,10 @@ package org.scribble.ext.go.core.model.endpoint; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreESend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.model.endpoint.EModelFactoryImpl; import org.scribble.model.endpoint.actions.EReceive; @@ -26,14 +29,32 @@ public EReceive newEReceive(Role peer, MessageId mid, Payload payload) } @Override - public ParamCoreESend newParamCoreESend(ParamRole peer, MessageId mid, Payload payload) + public ParamCoreECrossSend newParamCoreECrossSend(ParamRole peer, MessageId mid, Payload payload) { - return new ParamCoreESend(this, peer, mid, payload); + return new ParamCoreECrossSend(this, peer, mid, payload); } @Override - public ParamCoreEReceive newParamCoreEReceive(ParamRole peer, MessageId mid, Payload payload) + public ParamCoreECrossReceive newParamCoreECrossReceive(ParamRole peer, MessageId mid, Payload payload) { - return new ParamCoreEReceive(this, peer, mid, payload); + return new ParamCoreECrossReceive(this, peer, mid, payload); + } + + @Override + public ParamCoreEDotSend newParamCoreEDotSend(ParamRole peer, MessageId mid, Payload payload) + { + return new ParamCoreEDotSend(this, peer, mid, payload); + } + + @Override + public ParamCoreEDotReceive newParamCoreEDotReceive(ParamRole peer, MessageId mid, Payload payload) + { + return new ParamCoreEDotReceive(this, peer, mid, payload); + } + + @Override + public ParamCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(ParamRole peer, MessageId mid, Payload payload) + { + return new ParamCoreEMultiChoicesReceive(this, peer, mid, payload); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEReceive.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossReceive.java similarity index 77% rename from scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEReceive.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossReceive.java index d4cea453f..ff7588add 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEReceive.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossReceive.java @@ -9,10 +9,10 @@ import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; -public class ParamCoreEReceive extends EReceive implements ParamCoreEAction +public class ParamCoreECrossReceive extends EReceive implements ParamCoreEAction { - public ParamCoreEReceive(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + public ParamCoreECrossReceive(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) { super(ef, peer, mid, payload); } @@ -24,7 +24,7 @@ public ParamRole getPeer() } @Override - public ParamCoreESend toDual(Role self) + public ParamCoreECrossSend toDual(Role self) { throw new RuntimeException("[param-core] Shouldn't get in here: " + this); } @@ -50,7 +50,7 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamCoreEReceive)) + if (!(o instanceof ParamCoreECrossReceive)) { return false; } @@ -60,6 +60,6 @@ public boolean equals(Object o) @Override public boolean canEqual(Object o) { - return o instanceof ParamCoreEReceive; + return o instanceof ParamCoreECrossReceive; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreESend.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossSend.java similarity index 78% rename from scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreESend.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossSend.java index 38df459a1..421a251df 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreESend.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossSend.java @@ -9,10 +9,10 @@ import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; -public class ParamCoreESend extends ESend implements ParamCoreEAction +public class ParamCoreECrossSend extends ESend implements ParamCoreEAction { - public ParamCoreESend(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + public ParamCoreECrossSend(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) { super(ef, peer, mid, payload); } @@ -24,7 +24,7 @@ public ParamRole getPeer() } @Override - public ParamCoreEReceive toDual(Role self) + public ParamCoreECrossReceive toDual(Role self) { throw new RuntimeException("[param-core] Shouldn't get in here: " + this); } @@ -50,7 +50,7 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamCoreESend)) + if (!(o instanceof ParamCoreECrossSend)) { return false; } @@ -60,6 +60,6 @@ public boolean equals(Object o) @Override public boolean canEqual(Object o) { - return o instanceof ParamCoreESend; + return o instanceof ParamCoreECrossSend; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java new file mode 100644 index 000000000..236d47d5c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java @@ -0,0 +1,71 @@ +package org.scribble.ext.go.core.model.endpoint.action; + +import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.model.endpoint.actions.EReceive; +import org.scribble.model.global.SModelFactory; +import org.scribble.model.global.actions.SReceive; +import org.scribble.type.Payload; +import org.scribble.type.name.MessageId; +import org.scribble.type.name.Role; + +public class ParamCoreEDotReceive extends EReceive implements ParamCoreEAction +{ + + public ParamCoreEDotReceive(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + { + super(ef, peer, mid, payload); + } + + @Override + public ParamRole getPeer() + { + return (ParamRole) this.peer; + } + + @Override + public ParamCoreEDotSend toDual(Role self) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this); + } + + @Override + public SReceive toGlobal(SModelFactory sf, Role self) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this); + } + + @Override + protected String getCommSymbol() + { + return "?="; + } + + @Override + public int hashCode() + { + int hash = 7213; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamCoreEDotReceive)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof ParamCoreEDotReceive; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java new file mode 100644 index 000000000..34ecf4fa5 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java @@ -0,0 +1,71 @@ +package org.scribble.ext.go.core.model.endpoint.action; + +import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.model.endpoint.actions.ESend; +import org.scribble.model.global.SModelFactory; +import org.scribble.model.global.actions.SSend; +import org.scribble.type.Payload; +import org.scribble.type.name.MessageId; +import org.scribble.type.name.Role; + +public class ParamCoreEDotSend extends ESend implements ParamCoreEAction +{ + + public ParamCoreEDotSend(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + { + super(ef, peer, mid, payload); + } + + @Override + public ParamRole getPeer() + { + return (ParamRole) this.peer; + } + + @Override + public ParamCoreEDotReceive toDual(Role self) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this); + } + + @Override + public SSend toGlobal(SModelFactory sf, Role self) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this); + } + + @Override + protected String getCommSymbol() + { + return "?="; + } + + @Override + public int hashCode() + { + int hash = 7211; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamCoreEDotSend)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof ParamCoreEDotSend; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java new file mode 100644 index 000000000..c1645f9b0 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java @@ -0,0 +1,71 @@ +package org.scribble.ext.go.core.model.endpoint.action; + +import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.model.endpoint.actions.EReceive; +import org.scribble.model.global.SModelFactory; +import org.scribble.model.global.actions.SReceive; +import org.scribble.type.Payload; +import org.scribble.type.name.MessageId; +import org.scribble.type.name.Role; + +public class ParamCoreEMultiChoicesReceive extends EReceive implements ParamCoreEAction +{ + + public ParamCoreEMultiChoicesReceive(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + { + super(ef, peer, mid, payload); + } + + @Override + public ParamRole getPeer() + { + return (ParamRole) this.peer; + } + + @Override + public ParamCoreECrossSend toDual(Role self) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this); + } + + @Override + public SReceive toGlobal(SModelFactory sf, Role self) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this); + } + + @Override + protected String getCommSymbol() + { + return "?*"; + } + + @Override + public int hashCode() + { + int hash = 7219; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof ParamCoreEMultiChoicesReceive)) + { + return false; + } + return super.equals(o); // Does canEquals + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof ParamCoreEMultiChoicesReceive; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java index fcd2d9361..b0537b48b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java @@ -39,6 +39,9 @@ public class ParamAntlrGDotMessageTransfer ParamIndexExpr sourceStart = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeStartChild(root), af); ParamIndexExpr sourceEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); ParamIndexExpr destStart = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); + + System.out.println("aaa: " + getDestRangeEndChild(root)); + ParamIndexExpr destEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); return af.ParamGDotMessageTransfer(root, src, msg, dest, sourceStart, sourceEnd, destStart, destEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java index c58e2383f..6c159f614 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java @@ -20,6 +20,9 @@ public static ParamIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) { return left; } + + System.out.println("bbb: " + ct.getChildren()); + ParamIndexExpr right = parseParamIndexExpr((CommonTree) ct.getChild(2), af); ParamBinIndexExpr.Op op; switch (ct.getChild(1).getText()) diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index cb377ed59..dece31543 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -7,7 +7,58 @@ module param.cgo18.Ring; type "int" from "..." as int; -//* +global protocol Proto1(role B(k)) +{ + m1(int) dot B[1..k] to B[2..k+1]; + m1(int) dot B[k+1..k+1] to B[1..1]; + m1(int) dot B[1..k] to B[2..k+1]; + m1(int) dot B[k+1..k+1] to B[1..1]; + //... + m1(int) dot B[1..k] to B[2..k+1]; + m1(int) dot B[k+1..k+1] to B[1..1]; +} + + +global protocol Proto2(role B(k)) +{ + choice at B[1] + { + m1(int) from B[1..1] to B[2..k+1]; + m1(int) dot B[1..k] to B[2..k+1]; + m1(int) dot B[k+1..k+1] to B[1..1]; + + do Proto2(B); + } + or + { + m2(int) from B[1..1] to B[2..k+1]; + m2(int) dot B[1..k] to B[2..k+1]; + m2(int) dot B[k+1..k+1] to B[1..1]; + } +} + + +/* +global protocol Proto3(role B(k)) +{ + choices at B[i:1..k+1] + { + m1(int) from B[i] to B[i+1]; // Projection at dest? + m1(int) dot B[k+1..k+1] to B[1..1]; + + do Proto3(B); + } + or + { + m2(int) from B[i] to B[i+1]; + m2(int) dot B[k+1..k+1] to B[1..1]; + } +} +//*/ + + + +/* global protocol Proto1(role B(k)) // FIXME: role param WF -- params only for root protos? { choice at B[1] // FIXME: role index WF? @@ -15,6 +66,10 @@ global protocol Proto1(role B(k)) // FIXME: role param WF -- params only for ro //m1(int) dot B[1..k-1] to B[2..k]; // FIXME: k>2 global invariant // FIXME: range-sensitive role enabling -- a Scribble-specific issue, choice subjs //m1(int) dot B[k..k] to B[1..1]; + //m1(int) dot B[1..k] to B[2..k+1]; + //m1(int) dot B[k+1..k+1] to B[1..1]; + + m1(int) from B[1..1] to B[2..k+1]; m1(int) dot B[1..k] to B[2..k+1]; m1(int) dot B[k+1..k+1] to B[1..1]; @@ -25,6 +80,7 @@ global protocol Proto1(role B(k)) // FIXME: role param WF -- params only for ro //m2(int) dot B[1..k-1] to B[2..k]; //m2(int) dot B[k..k] to B[1..1]; + m2(int) from B[1..1] to B[2..k+1]; m2(int) dot B[1..k] to B[2..k+1]; m2(int) dot B[k+1..k+1] to B[1..1]; } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 518ec2db6..f45a29afe 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -38,7 +38,7 @@ message passing */ -//* +/* global protocol Proto1(role A(n), role B(n)) { 1() dot A[1..n] to B[1..n]; @@ -46,6 +46,19 @@ global protocol Proto1(role A(n), role B(n)) //*/ +/* +global protocol Proto1(role A(n), role B(n)) +{ + choices at A[i:1..n] + { + //1(int) from A[i+1] to B[1..1]; // Allow? + + //1(int) from A[i+1] to B[i+1]; // Allow? + } +} +//*/ + + /* global protocol Proto1(role A(n), role B(n)) { From 7ce7d9fd1187a4c22d48c35ccec004e51c98a06c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 31 Aug 2017 16:39:10 +0100 Subject: [PATCH 101/433] Fixed dot-transfer projection and src-range WF check. --- .../model/endpoint/actions/EAction.java | 2 +- .../ext/go/core/ast/ParamCoreAstFactory.java | 13 +++- .../ext/go/core/ast/ParamCoreChoice.java | 2 +- .../go/core/ast/global/ParamCoreGChoice.java | 74 ++++++++++++++----- .../ast/global/ParamCoreGMultiChoices.java | 8 +- .../go/core/ast/local/ParamCoreLChoice.java | 17 ++++- .../core/ast/local/ParamCoreLCrossChoice.java | 46 ++++++++++++ .../core/ast/local/ParamCoreLDotChoice.java | 60 +++++++++++++++ .../ast/local/ParamCoreLMultiChoices.java | 22 +----- .../endpoint/ParamCoreEGraphBuilder.java | 24 +++--- .../endpoint/ParamCoreEModelFactory.java | 5 +- .../endpoint/ParamCoreEModelFactoryImpl.java | 9 ++- .../endpoint/action/ParamCoreEDotReceive.java | 29 +++++++- .../endpoint/action/ParamCoreEDotSend.java | 32 +++++++- .../global/ParamAntlrGDotMessageTransfer.java | 3 - .../ast/index/ParamAntlrIndexExpr.java | 3 - .../src/test/scrib/param/cgo18/Ring.scr | 44 ++++++++--- .../src/test/scrib/param/tmp/ParamTest.scr | 32 +++++++- 18 files changed, 335 insertions(+), 90 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java index fc0121252..22f09a6e2 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EAction.java @@ -24,7 +24,7 @@ public abstract class EAction extends MAction { - public final Role peer; + public final Role peer; // this.peer == this.obj /*public final MessageId mid; public final Payload payload; // Empty for MessageSigNames*/ diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java index 9ecdabd8c..7a4f45192 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java @@ -13,7 +13,8 @@ import org.scribble.ext.go.core.ast.global.ParamCoreGRecVar; import org.scribble.ext.go.core.ast.global.ParamCoreGType; import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; -import org.scribble.ext.go.core.ast.local.ParamCoreLChoice; +import org.scribble.ext.go.core.ast.local.ParamCoreLCrossChoice; +import org.scribble.ext.go.core.ast.local.ParamCoreLDotChoice; import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; import org.scribble.ext.go.core.ast.local.ParamCoreLMultiChoices; import org.scribble.ext.go.core.ast.local.ParamCoreLRec; @@ -21,6 +22,7 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.type.Payload; import org.scribble.type.name.Op; @@ -71,9 +73,14 @@ public ParamCoreGEnd ParamCoreGEnd() return ParamCoreGEnd.END; } - public ParamCoreLChoice ParamCoreLChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) + public ParamCoreLCrossChoice ParamCoreLCrossChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) { - return new ParamCoreLChoice(role, kind, cases); + return new ParamCoreLCrossChoice(role, kind, cases); + } + + public ParamCoreLDotChoice ParamCoreLDotChoice(ParamRole role, ParamIndexExpr offset, ParamCoreLActionKind kind, Map cases) + { + return new ParamCoreLDotChoice(role, offset, kind, cases); } public ParamCoreLMultiChoices ParamCoreLMultiChoices(ParamRole role, ParamIndexVar var, Set cases, ParamCoreLType cont) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java index ec8ef10ca..1ddd1004f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java @@ -61,7 +61,7 @@ protected String casesToString() .map(e -> e.getKey() + "." + e.getValue()).collect(Collectors.joining(", ")); s = (this.cases.size() > 1) ? "{ " + s + " }" - : s; + : ":" + s; return s; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index 2139ae2d3..ddb0eed7a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -16,14 +16,19 @@ import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; +import org.scribble.ext.go.core.ast.local.ParamCoreLDotChoice; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.type.index.ParamBinIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexFactory; import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; public class ParamCoreGChoice extends ParamCoreChoice implements ParamCoreGType { @@ -84,20 +89,23 @@ public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) } - if (this.cases.size() > 1) + if (this.kind == ParamCoreGActionKind.CROSS_TRANSFER) { - String bar = "(assert " - + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and ") - + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant - + "(not (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") 0))" - + (vars.isEmpty() ? "" : "))") - + ")"; + if (this.cases.size() > 1) + { + String bar = "(assert " + + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and ") + + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant + + "(not (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") 0))" + + (vars.isEmpty() ? "" : "))") + + ")"; - job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subject for " + this.src + ":\n " + bar); + job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subject for " + this.src + ":\n " + bar); - if (Z3Wrapper.checkSat(job, gpd, bar)) - { - return false; + if (Z3Wrapper.checkSat(job, gpd, bar)) + { + return false; + } } } @@ -177,27 +185,55 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro } // "Simple" cases + Role srcName = this.src.getName(); + Role destName = this.dest.getName(); + Role subjName = subj.getName(); + ParamRange srcRange = this.src.getParsedRange(); + ParamRange destRange = this.dest.getParsedRange(); if (this.kind == ParamCoreGActionKind.CROSS_TRANSFER) { //if (this.src.getName().equals(r)) - if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? + if (srcName.equals(subjName) && subj.ranges.contains(srcRange)) // FIXME: factor out? { - return af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.CROSS_SEND, projs); + return af.ParamCoreLCrossChoice(this.dest, ParamCoreLActionKind.CROSS_SEND, projs); } - else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) + else if (destName.equals(subjName) && subj.ranges.contains(destRange)) { - return af.ParamCoreLChoice(this.src, ParamCoreLActionKind.CROSS_RECEIVE, projs); + return af.ParamCoreLCrossChoice(this.src, ParamCoreLActionKind.CROSS_RECEIVE, projs); } } else if (this.kind == ParamCoreGActionKind.DOT_TRANSFER) { - if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? + if (srcName.equals(subjName) && subj.ranges.contains(srcRange)) // FIXME: factor out? { - return af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.DOT_SEND, projs); + if (destName.equals(subjName) && subj.ranges.contains(destRange)) // Possible for dot-transfer (src.start != dest.start) -- cf. cross-transfer + { + ParamIndexExpr offset = ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Add, + ParamIndexFactory.ParamIntVar("_id"), + ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Subt, destRange.start, srcRange.start)); + Map tmp = projs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, + p -> new ParamCoreLDotChoice(this.dest, offset, ParamCoreLActionKind.DOT_SEND, + Stream.of(p.getKey()).collect(Collectors.toMap(k -> k, k -> p.getValue()))) + )); + ParamIndexExpr offset2 = ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Add, + ParamIndexFactory.ParamIntVar("_id"), + ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Subt, srcRange.start, destRange.start)); + return af.ParamCoreLDotChoice(this.src, offset2, ParamCoreLActionKind.DOT_RECEIVE, tmp); + } + else + { + ParamIndexExpr offset = ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Add, + ParamIndexFactory.ParamIntVar("_id"), + ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Subt, destRange.start, srcRange.start)); + return af.ParamCoreLDotChoice(this.dest, offset, ParamCoreLActionKind.DOT_SEND, projs); + } } - else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) + else if (destName.equals(subjName) && subj.ranges.contains(destRange)) { - return af.ParamCoreLChoice(this.src, ParamCoreLActionKind.DOT_RECEIVE, projs); + ParamIndexExpr offset = ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Add, + ParamIndexFactory.ParamIntVar("_id"), + ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Subt, srcRange.start, destRange.start)); + return af.ParamCoreLDotChoice(this.src, offset, ParamCoreLActionKind.DOT_RECEIVE, projs); } } else diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java index 0afb1a622..d15b0e4a4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java @@ -24,11 +24,11 @@ public class ParamCoreGMultiChoices extends ParamCoreChoice implements ParamCoreGType { - public final ParamRole src; // Cf. ParamCoreGChoice singleton src - public final ParamRole dest; // this.dest == super.role -- arbitrary? - + public final ParamRole src; // Gives the Scribble choices-subj range // Cf. ParamCoreGChoice singleton src public final ParamIndexVar var; + public final ParamRole dest; // this.dest == super.role -- arbitrary? + public ParamCoreGMultiChoices(ParamRole src, ParamIndexVar var, ParamRole dest, Set cases, ParamCoreGType cont) { super(dest, ParamCoreGActionKind.CROSS_TRANSFER, cases.stream().collect(Collectors.toMap(c -> c, c -> cont))); // FIXME @@ -175,7 +175,7 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro // "Simple" cases -- same projection as ParamCoreGChoice, i.e., same local types? -- index var redundant, apart from "syntactic consistency" for subsequent message actions? (i.e., only for Scribble syntax?) if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? { - return af.ParamCoreLChoice(this.dest, ParamCoreLActionKind.CROSS_SEND, projs); + return af.ParamCoreLCrossChoice(this.dest, ParamCoreLActionKind.CROSS_SEND, projs); } else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java index 25763ed34..f80816de9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java @@ -1,15 +1,16 @@ package org.scribble.ext.go.core.ast.local; import java.util.Map; +import java.util.stream.Collectors; import org.scribble.ext.go.core.ast.ParamCoreChoice; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.type.kind.Local; -public class ParamCoreLChoice extends ParamCoreChoice implements ParamCoreLType +public abstract class ParamCoreLChoice extends ParamCoreChoice implements ParamCoreLType { - public ParamCoreLChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) + protected ParamCoreLChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) { super(role, kind, cases); } @@ -26,12 +27,22 @@ public String toString() return this.role.toString() + this.kind + casesToString(); } + @Override + protected String casesToString() + { + String s = this.cases.entrySet().stream() + .map(e -> e.getKey() + "." + e.getValue()).collect(Collectors.joining(", ")); + s = (this.cases.size() > 1) + ? "{ " + s + " }" + : s; // No ":", cf. global + return s; + } + @Override public int hashCode() { int hash = 2399; hash = 31 * hash + super.hashCode(); - hash = 31 * hash + this.kind.hashCode(); return hash; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java new file mode 100644 index 000000000..3ebe93815 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java @@ -0,0 +1,46 @@ +package org.scribble.ext.go.core.ast.local; + +import java.util.Map; + +import org.scribble.ext.go.core.ast.ParamCoreMessage; +import org.scribble.ext.go.core.type.ParamRole; + +public class ParamCoreLCrossChoice extends ParamCoreLChoice +{ + public ParamCoreLCrossChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) + { + super(role, kind, cases); + if (kind != ParamCoreLActionKind.CROSS_SEND && kind != ParamCoreLActionKind.CROSS_RECEIVE) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + kind); + } + } + + @Override + public int hashCode() + { + int hash = 7229; + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreLCrossChoice)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreLCrossChoice; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java new file mode 100644 index 000000000..278ba95a6 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java @@ -0,0 +1,60 @@ +package org.scribble.ext.go.core.ast.local; + +import java.util.Map; + +import org.scribble.ext.go.core.ast.ParamCoreMessage; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; + +public class ParamCoreLDotChoice extends ParamCoreLChoice +{ + public final ParamIndexExpr offset; + + public ParamCoreLDotChoice(ParamRole role, ParamIndexExpr offset, ParamCoreLActionKind kind, Map cases) + { + super(role, kind, cases); + if (kind != ParamCoreLActionKind.DOT_SEND && kind != ParamCoreLActionKind.DOT_RECEIVE) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + kind); + } + this.offset = offset; + } + + @Override + public String toString() + { + ParamRange g = this.role.ranges.iterator().next(); + return this.role.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + + this.kind + casesToString(); + } + + @Override + public int hashCode() + { + int hash = 7237; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.offset.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof ParamCoreLDotChoice)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof ParamCoreLDotChoice; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java index 7bd2b67ff..0703fb417 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java @@ -3,14 +3,12 @@ import java.util.Set; import java.util.stream.Collectors; -import org.scribble.ext.go.core.ast.ParamCoreChoice; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.ext.go.type.index.ParamIndexVar; -import org.scribble.type.kind.Local; -// FIXME: factor out better with ParamCoreChoice -- or deprecate and just use kind? -public class ParamCoreLMultiChoices extends ParamCoreChoice implements ParamCoreLType +// FIXME: factor out better with ParamCore(L)Choice -- or deprecate and just use kind? +public class ParamCoreLMultiChoices extends ParamCoreLChoice { public final ParamIndexVar var; // Redundant? @@ -20,18 +18,6 @@ public ParamCoreLMultiChoices(ParamRole role, ParamIndexVar var, Set c, c -> cont))); this.var = var; } - - @Override - public ParamCoreLActionKind getKind() - { - return (ParamCoreLActionKind) this.kind; - } - - @Override - public String toString() - { - return this.role.toString() + this.kind + casesToString(); - } @Override public int hashCode() @@ -49,7 +35,7 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreChoice)) + if (!(obj instanceof ParamCoreLMultiChoices)) { return false; } @@ -61,6 +47,6 @@ public boolean equals(Object obj) @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreChoice; + return o instanceof ParamCoreLMultiChoices; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java index 26cbc47f8..0e955b475 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -8,12 +8,14 @@ import org.scribble.ext.go.core.ast.ParamCoreRecVar; import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; import org.scribble.ext.go.core.ast.local.ParamCoreLChoice; +import org.scribble.ext.go.core.ast.local.ParamCoreLDotChoice; import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; import org.scribble.ext.go.core.ast.local.ParamCoreLMultiChoices; import org.scribble.ext.go.core.ast.local.ParamCoreLRec; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.endpoint.EState; @@ -44,15 +46,18 @@ private void build(ParamCoreLType lt, EState s1, EState s2, Map if (lt instanceof ParamCoreLChoice) { ParamCoreLChoice lc = (ParamCoreLChoice) lt; + ParamIndexExpr offset = (lc instanceof ParamCoreLDotChoice) + ? ((ParamCoreLDotChoice) lc).offset + : null; lc.cases.entrySet().stream().forEach(e -> - buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue()) + buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue(), offset) ); } else if (lt instanceof ParamCoreLMultiChoices) { ParamCoreLMultiChoices lc = (ParamCoreLMultiChoices) lt; lc.cases.entrySet().stream().forEach(e -> // FIXME: all conts are syntactically the same, so implicitly do the merge here? - buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue()) + buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue(), null) ); } else if (lt instanceof ParamCoreLRec) @@ -69,26 +74,26 @@ else if (lt instanceof ParamCoreLRec) } private void buildEdgeAndContinuation(EState s1, EState s2, Map recs, - ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a, ParamCoreLType cont) + ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a, ParamCoreLType cont, ParamIndexExpr offset) { if (cont instanceof ParamCoreLEnd) { - this.util.addEdge(s1, toEAction(r, k, a), s2); + this.util.addEdge(s1, toEAction(r, k, a, offset), s2); } else if (cont instanceof ParamCoreRecVar) { EState s = recs.get(((ParamCoreRecVar) cont).recvar); - this.util.addEdge(s1, toEAction(r, k, a), s); + this.util.addEdge(s1, toEAction(r, k, a, offset), s); } else { EState s = this.util.ef.newEState(Collections.emptySet()); - this.util.addEdge(s1, toEAction(r, k, a), s); + this.util.addEdge(s1, toEAction(r, k, a, offset), s); build(cont, s, s2, recs); } } - private EAction toEAction(ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a) + private EAction toEAction(ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a, ParamIndexExpr offset) { ParamCoreEModelFactory ef = (ParamCoreEModelFactory) this.util.ef; // FIXME: factor out if (k.equals(ParamCoreLActionKind.CROSS_SEND)) @@ -102,12 +107,11 @@ else if (k.equals(ParamCoreLActionKind.CROSS_RECEIVE)) } else if (k.equals(ParamCoreLActionKind.DOT_SEND)) { - return ef.newParamCoreEDotSend(r, a.op, a.pay); - + return ef.newParamCoreEDotSend(r, offset, a.op, a.pay); } else if (k.equals(ParamCoreLActionKind.DOT_RECEIVE)) { - return ef.newParamCoreEDotReceive(r, a.op, a.pay); + return ef.newParamCoreEDotReceive(r, offset, a.op, a.pay); } else if (k.equals(ParamCoreLActionKind.MULTICHOICES_RECEIVE)) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java index a376aa565..3a0c9273b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java @@ -6,6 +6,7 @@ import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.model.endpoint.EModelFactory; import org.scribble.type.Payload; import org.scribble.type.name.MessageId; @@ -15,7 +16,7 @@ public interface ParamCoreEModelFactory extends EModelFactory ParamCoreECrossSend newParamCoreECrossSend(ParamRole peer, MessageId mid, Payload payload); ParamCoreECrossReceive newParamCoreECrossReceive(ParamRole peer, MessageId mid, Payload payload); - ParamCoreEDotSend newParamCoreEDotSend(ParamRole peer, MessageId mid, Payload payload); - ParamCoreEDotReceive newParamCoreEDotReceive(ParamRole peer, MessageId mid, Payload payload); + ParamCoreEDotSend newParamCoreEDotSend(ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload); + ParamCoreEDotReceive newParamCoreEDotReceive(ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload); ParamCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(ParamRole peer, MessageId mid, Payload payload); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java index 3689e307b..611c2b9e0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java @@ -6,6 +6,7 @@ import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.model.endpoint.EModelFactoryImpl; import org.scribble.model.endpoint.actions.EReceive; import org.scribble.model.endpoint.actions.ESend; @@ -41,15 +42,15 @@ public ParamCoreECrossReceive newParamCoreECrossReceive(ParamRole peer, MessageI } @Override - public ParamCoreEDotSend newParamCoreEDotSend(ParamRole peer, MessageId mid, Payload payload) + public ParamCoreEDotSend newParamCoreEDotSend(ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload) { - return new ParamCoreEDotSend(this, peer, mid, payload); + return new ParamCoreEDotSend(this, peer, offset, mid, payload); } @Override - public ParamCoreEDotReceive newParamCoreEDotReceive(ParamRole peer, MessageId mid, Payload payload) + public ParamCoreEDotReceive newParamCoreEDotReceive(ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload) { - return new ParamCoreEDotReceive(this, peer, mid, payload); + return new ParamCoreEDotReceive(this, peer, offset, mid, payload); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java index 236d47d5c..2196a5ebc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java @@ -1,7 +1,9 @@ package org.scribble.ext.go.core.model.endpoint.action; import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; +import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.model.endpoint.actions.EReceive; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SReceive; @@ -11,10 +13,12 @@ public class ParamCoreEDotReceive extends EReceive implements ParamCoreEAction { + public final ParamIndexExpr offset; - public ParamCoreEDotReceive(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + public ParamCoreEDotReceive(ParamCoreEModelFactory ef, ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload) { super(ef, peer, mid, payload); + this.offset = offset; } @Override @@ -34,6 +38,25 @@ public SReceive toGlobal(SModelFactory sf, Role self) { throw new RuntimeException("[param-core] Shouldn't get in here: " + this); } + + @Override + public String toString() + { + ParamRole peer = getPeer(); + ParamRange g = peer.ranges.iterator().next(); + return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + + getCommSymbol() + this.mid + this.payload; + } + + @Override + public String toStringWithMessageIdHack() + { + String m = this.mid.isMessageSigName() ? "^" + this.mid : this.mid.toString(); // HACK + ParamRole peer = getPeer(); + ParamRange g = peer.ranges.iterator().next(); + return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + + getCommSymbol() + m + this.payload; + } @Override protected String getCommSymbol() @@ -46,6 +69,7 @@ public int hashCode() { int hash = 7213; hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.offset.hashCode(); return hash; } @@ -60,7 +84,8 @@ public boolean equals(Object o) { return false; } - return super.equals(o); // Does canEquals + return super.equals(o) // Does canEquals + && this.offset.equals(((ParamCoreEDotSend) o).offset); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java index 34ecf4fa5..65ed6bf9c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java @@ -1,7 +1,9 @@ package org.scribble.ext.go.core.model.endpoint.action; import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; +import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.model.endpoint.actions.ESend; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SSend; @@ -11,10 +13,13 @@ public class ParamCoreEDotSend extends ESend implements ParamCoreEAction { + public final ParamIndexExpr offset; - public ParamCoreEDotSend(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + // ParamRole range is original peer absolute range -- local id plus offset will be inside this range + public ParamCoreEDotSend(ParamCoreEModelFactory ef, ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload) { super(ef, peer, mid, payload); + this.offset = offset; } @Override @@ -34,11 +39,30 @@ public SSend toGlobal(SModelFactory sf, Role self) { throw new RuntimeException("[param-core] Shouldn't get in here: " + this); } + + @Override + public String toString() + { + ParamRole peer = getPeer(); + ParamRange g = peer.ranges.iterator().next(); + return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + + getCommSymbol() + this.mid + this.payload; + } + @Override + public String toStringWithMessageIdHack() + { + String m = this.mid.isMessageSigName() ? "^" + this.mid : this.mid.toString(); // HACK + ParamRole peer = getPeer(); + ParamRange g = peer.ranges.iterator().next(); + return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + + getCommSymbol() + m + this.payload; + } + @Override protected String getCommSymbol() { - return "?="; + return "!="; } @Override @@ -46,6 +70,7 @@ public int hashCode() { int hash = 7211; hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.offset.hashCode(); return hash; } @@ -60,7 +85,8 @@ public boolean equals(Object o) { return false; } - return super.equals(o); // Does canEquals + return super.equals(o) // Does canEquals + && this.offset.equals(((ParamCoreEDotSend) o).offset); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java index b0537b48b..fcd2d9361 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java @@ -39,9 +39,6 @@ public class ParamAntlrGDotMessageTransfer ParamIndexExpr sourceStart = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeStartChild(root), af); ParamIndexExpr sourceEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); ParamIndexExpr destStart = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); - - System.out.println("aaa: " + getDestRangeEndChild(root)); - ParamIndexExpr destEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); return af.ParamGDotMessageTransfer(root, src, msg, dest, sourceStart, sourceEnd, destStart, destEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java index 6c159f614..c58e2383f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java @@ -20,9 +20,6 @@ public static ParamIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) { return left; } - - System.out.println("bbb: " + ct.getChildren()); - ParamIndexExpr right = parseParamIndexExpr((CommonTree) ct.getChild(2), af); ParamBinIndexExpr.Op op; switch (ct.getChild(1).getText()) diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index dece31543..5848c3861 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -9,44 +9,66 @@ type "int" from "..." as int; global protocol Proto1(role B(k)) { - m1(int) dot B[1..k] to B[2..k+1]; + choice at B[1] + { + m1(int) dot B[1..k] to B[2..k+1]; + m1(int) dot B[k+1..k+1] to B[1..1]; + //m1(int) from B[k+1..k+1] to B[1..1]; // Equivalent to above line + + do Proto1(B); + } + or + { + m2(int) dot B[1..k] to B[2..k+1]; + m2(int) dot B[k+1..k+1] to B[1..1]; + //m2(int) from B[k+1..k+1] to B[1..1]; // Equivalent to above line + } +} + + + +/* +global protocol Proto2(role B(k)) +{ + m1(int) dot B[1..k] to B[2..k+1]; m1(int) dot B[k+1..k+1] to B[1..1]; - m1(int) dot B[1..k] to B[2..k+1]; + m1(int) dot B[1..k] to B[2..k+1]; m1(int) dot B[k+1..k+1] to B[1..1]; //... - m1(int) dot B[1..k] to B[2..k+1]; + m1(int) dot B[1..k] to B[2..k+1]; m1(int) dot B[k+1..k+1] to B[1..1]; } -global protocol Proto2(role B(k)) +global protocol Proto3(role B(k)) { choice at B[1] { - m1(int) from B[1..1] to B[2..k+1]; - m1(int) dot B[1..k] to B[2..k+1]; + m1(int) from B[1..1] to B[2..k+1]; + m1(int) dot B[1..k] to B[2..k+1]; m1(int) dot B[k+1..k+1] to B[1..1]; - do Proto2(B); + do Proto3(B); } or { - m2(int) from B[1..1] to B[2..k+1]; - m2(int) dot B[1..k] to B[2..k+1]; + m2(int) from B[1..1] to B[2..k+1]; + m2(int) dot B[1..k] to B[2..k+1]; m2(int) dot B[k+1..k+1] to B[1..1]; } } +//*/ /* -global protocol Proto3(role B(k)) +global protocol Proto4(role B(k)) { choices at B[i:1..k+1] { m1(int) from B[i] to B[i+1]; // Projection at dest? m1(int) dot B[k+1..k+1] to B[1..1]; - do Proto3(B); + do Proto4(B); } or { diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index f45a29afe..bd6a256e1 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -38,10 +38,34 @@ message passing */ +//* +global protocol Proto1(role A(n)) +{ + 1() dot A[1..n] to A[2..n+1]; + + 2() dot A[3..n+3] to A[4..n+4]; +} +//*/ + + /* -global protocol Proto1(role A(n), role B(n)) +global protocol Proto1(role A(n)) { - 1() dot A[1..n] to B[1..n]; + choice at A[1] + { + 1() dot A[1..n] to A[2..n+1]; + } + or + { + 2() dot A[1..n] to A[2..n+1]; + //2() dot A[2..n+1] to A[1..n]; // Bad: non-directed + } + + + /*choices at A[i:1..n] + { + 1() from A[i] to B[1..1]; + }* / } //*/ @@ -53,7 +77,9 @@ global protocol Proto1(role A(n), role B(n)) { //1(int) from A[i+1] to B[1..1]; // Allow? - //1(int) from A[i+1] to B[i+1]; // Allow? + //1(int) from A[i] to B[i+1]; // Allow? // Key point of foreach? relative indexing -- how to derive actual roles? + // A[i:1..n] ->* B[i+1:1..n]: 1() . end ? + // for (i:1..n) ( A[i] ->* B[i+1]: 1() . end ) } } //*/ From 430e4867772374895d0220e7c068cc2c25a2c521 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 31 Aug 2017 16:42:18 +0100 Subject: [PATCH 102/433] Minor. --- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index bd6a256e1..0974c01a8 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -39,10 +39,17 @@ message passing //* +global protocol Proto1(role A(n), role B(n)) +{ + 1() dot A[1..n] to B[1+1..n+1]; +} +//*/ + + +/* global protocol Proto1(role A(n)) { 1() dot A[1..n] to A[2..n+1]; - 2() dot A[3..n+3] to A[4..n+4]; } //*/ From 3893e50875fab084bb8212cb6bb0cc060ee5b06b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 31 Aug 2017 17:59:52 +0100 Subject: [PATCH 103/433] Fixed param-core EFSM translation for multichoices-receive. --- .../model/endpoint/actions/EReceive.java | 3 +- .../model/endpoint/actions/ESend.java | 2 +- .../ext/go/core/ast/ParamCoreAstFactory.java | 17 +++-- .../ext/go/core/ast/ParamCoreChoice.java | 9 ++- .../go/core/ast/global/ParamCoreGChoice.java | 19 +++-- .../ast/global/ParamCoreGMultiChoices.java | 20 ++++-- .../ParamCoreGProtocolDeclTranslator.java | 14 ++-- .../go/core/ast/local/ParamCoreLChoice.java | 4 +- .../core/ast/local/ParamCoreLCrossChoice.java | 4 +- .../core/ast/local/ParamCoreLDotChoice.java | 4 +- .../ast/local/ParamCoreLMultiChoices.java | 25 +++++-- .../endpoint/ParamCoreEGraphBuilder.java | 71 ++++++++++++++----- .../endpoint/ParamCoreEModelFactory.java | 5 +- .../endpoint/ParamCoreEModelFactoryImpl.java | 7 +- .../action/ParamCoreEMultiChoicesReceive.java | 38 ++++++++-- .../src/test/scrib/param/cgo18/Auction.scr | 35 ++++++++- .../src/test/scrib/param/tmp/ParamTest.scr | 12 ++++ 17 files changed, 223 insertions(+), 66 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java index 11b351dc2..c4bb258bb 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/EReceive.java @@ -91,9 +91,10 @@ public boolean equals(Object o) { return false; } - return ((EReceive) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } + @Override public boolean canEqual(Object o) { return o instanceof EReceive; diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java index fb8176cd6..9188a0d1b 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/actions/ESend.java @@ -90,7 +90,7 @@ public boolean equals(Object o) { return false; } - return ((ESend) o).canEqual(this) && super.equals(o); + return super.equals(o); // Does canEqual } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java index 7a4f45192..5dffd7dbc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java @@ -1,7 +1,7 @@ package org.scribble.ext.go.core.ast; -import java.util.Map; -import java.util.Set; +import java.util.LinkedHashMap; +import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -47,13 +47,13 @@ public ParamCoreMessage ParamCoreAction(Op op, Payload pay) return new ParamCoreMessage(op, pay); } - public ParamCoreGChoice ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest, Map cases) + public ParamCoreGChoice ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest, LinkedHashMap cases) { return new ParamCoreGChoice(src, kind, dest, cases); } public ParamCoreGMultiChoices ParamCoreGMultiChoices(ParamRole src, ParamIndexVar var, - ParamRole dest, Set cases, ParamCoreGType cont) + ParamRole dest, List cases, ParamCoreGType cont) { return new ParamCoreGMultiChoices(src, var, dest, cases, cont); } @@ -73,17 +73,20 @@ public ParamCoreGEnd ParamCoreGEnd() return ParamCoreGEnd.END; } - public ParamCoreLCrossChoice ParamCoreLCrossChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) + public ParamCoreLCrossChoice ParamCoreLCrossChoice(ParamRole role, ParamCoreLActionKind kind, + LinkedHashMap cases) { return new ParamCoreLCrossChoice(role, kind, cases); } - public ParamCoreLDotChoice ParamCoreLDotChoice(ParamRole role, ParamIndexExpr offset, ParamCoreLActionKind kind, Map cases) + public ParamCoreLDotChoice ParamCoreLDotChoice(ParamRole role, ParamIndexExpr offset, ParamCoreLActionKind kind, + LinkedHashMap cases) { return new ParamCoreLDotChoice(role, offset, kind, cases); } - public ParamCoreLMultiChoices ParamCoreLMultiChoices(ParamRole role, ParamIndexVar var, Set cases, ParamCoreLType cont) + public ParamCoreLMultiChoices ParamCoreLMultiChoices(ParamRole role, ParamIndexVar var, + List cases, ParamCoreLType cont) { return new ParamCoreLMultiChoices(role, var, cases, cont); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java index 1ddd1004f..62282301c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java @@ -1,7 +1,6 @@ package org.scribble.ext.go.core.ast; -import java.util.Collections; -import java.util.Map; +import java.util.LinkedHashMap; import java.util.stream.Collectors; import org.scribble.ext.go.core.type.ParamRole; @@ -11,14 +10,14 @@ public abstract class ParamCoreChoice, K extends Prot { public final ParamRole role; public final ParamCoreActionKind kind; - public final Map cases; + public final LinkedHashMap cases; // Pre: cases.size() > 1 - public ParamCoreChoice(ParamRole role, ParamCoreActionKind kind, Map cases) + public ParamCoreChoice(ParamRole role, ParamCoreActionKind kind, LinkedHashMap cases) { this.role = role; this.kind = kind; - this.cases = Collections.unmodifiableMap(cases); + this.cases = new LinkedHashMap<>(cases); } public abstract ParamCoreActionKind getKind(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index ddb0eed7a..efee053a5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -1,7 +1,7 @@ package org.scribble.ext.go.core.ast.global; -import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -35,7 +35,7 @@ public class ParamCoreGChoice extends ParamCoreChoice im public final ParamRole src; // "Singleton" -- checked by isWellFormed public final ParamRole dest; // this.dest == super.role -- arbitrary? - public ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest, Map cases) + public ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest, LinkedHashMap cases) { super(dest, kind, cases); this.src = src; @@ -174,7 +174,7 @@ public Set getParamRoles() //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException { - Map projs = new HashMap<>(); + LinkedHashMap projs = new LinkedHashMap<>(); for (Entry e : this.cases.entrySet()) { ParamCoreMessage a = e.getKey(); @@ -211,10 +211,19 @@ else if (this.kind == ParamCoreGActionKind.DOT_TRANSFER) ParamIndexExpr offset = ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Add, ParamIndexFactory.ParamIntVar("_id"), ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Subt, destRange.start, srcRange.start)); - Map tmp = projs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, + /*Map tmp = projs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, p -> new ParamCoreLDotChoice(this.dest, offset, ParamCoreLActionKind.DOT_SEND, Stream.of(p.getKey()).collect(Collectors.toMap(k -> k, k -> p.getValue()))) - )); + ));*/ + Function, LinkedHashMap> foo = e -> + { + LinkedHashMap res = new LinkedHashMap<>(); + res.put(e.getKey(), e.getValue()); + return res; + }; + LinkedHashMap tmp = new LinkedHashMap<>(); + projs.entrySet().forEach(e -> tmp.put(e.getKey(), + new ParamCoreLDotChoice(this.dest, offset, ParamCoreLActionKind.DOT_SEND, foo.apply(e)))); ParamIndexExpr offset2 = ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Add, ParamIndexFactory.ParamIntVar("_id"), ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Subt, srcRange.start, destRange.start)); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java index d15b0e4a4..837a3bbdc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java @@ -1,7 +1,8 @@ package org.scribble.ext.go.core.ast.global; -import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -29,14 +30,22 @@ public class ParamCoreGMultiChoices extends ParamCoreChoice cases, ParamCoreGType cont) + public ParamCoreGMultiChoices(ParamRole src, ParamIndexVar var, ParamRole dest, List cases, ParamCoreGType cont) { - super(dest, ParamCoreGActionKind.CROSS_TRANSFER, cases.stream().collect(Collectors.toMap(c -> c, c -> cont))); // FIXME + //super(dest, ParamCoreGActionKind.CROSS_TRANSFER, cases.stream().collect(Collectors.toMap(c -> c, c -> cont))); // FIXME + super(dest, ParamCoreGActionKind.CROSS_TRANSFER, foo(cases, cont)); // FIXME this.src = src; this.dest = dest; this.var = var; } + private static LinkedHashMap foo(List cases, ParamCoreGType cont) + { + LinkedHashMap tmp = new LinkedHashMap<>(); + cases.stream().forEach(c -> tmp.put(c, cont)); + return tmp; + } + @Override public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) { @@ -153,7 +162,7 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro throw new RuntimeException("[param-core] TODO: " + this); } - Map projs = new HashMap<>(); + LinkedHashMap projs = new LinkedHashMap<>(); for (Entry e : this.cases.entrySet()) { ParamCoreMessage a = e.getKey(); @@ -179,7 +188,8 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro } else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) { - return af.ParamCoreLMultiChoices(this.src, this.var, projs.keySet(), values.iterator().next()); + return af.ParamCoreLMultiChoices(this.src, this.var, projs.keySet().stream().collect(Collectors.toList()), + values.iterator().next()); } // src name != dest name diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index a0c834694..340aea1ee 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -2,6 +2,7 @@ import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -136,7 +137,7 @@ private ParamCoreGType parseGChoice(Map rvs, ParamCoreGActionKind kind = null; ParamRole src = null; ParamRole dest = null; - Map cases = new HashMap<>(); + LinkedHashMap cases = new LinkedHashMap<>(); for (ParamCoreGType c : children) { // Because all cases should be action guards (unary choices) @@ -199,7 +200,7 @@ private ParamCoreGMultiChoices parseGMultiChoicesTransfer(List ParamRole dest = af.ParamRole(destName, new ParamRange(gmt.destRangeStart, gmt.destRangeEnd)); ParamCoreGType cont = parseSeq(is.subList(1, is.size()), rvs, false, false); // Subseqeuent choice/rec is guarded by (at least) this action - return this.af.ParamCoreGMultiChoices(src, gmt.var, dest, Stream.of(a).collect(Collectors.toSet()), cont); + return this.af.ParamCoreGMultiChoices(src, gmt.var, dest, Stream.of(a).collect(Collectors.toList()), cont); } // FIXME: factor out with parseGChoice @@ -215,7 +216,7 @@ private ParamCoreGType parseParamGMultiChoices(Map rvs, ParamCoreGActionKind kind = null; ParamRole src = null; ParamRole dest = null; - Map cases = new HashMap<>(); + LinkedHashMap cases = new LinkedHashMap<>(); for (ParamCoreGMultiChoices c : children) { ParamCoreGMultiChoices tmp = (ParamCoreGMultiChoices) c; @@ -262,7 +263,7 @@ else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) return this.af.ParamCoreGMultiChoices( //src, new ParamRole(gc.subj.toString(), Stream.of(new ParamRange(gc.start, gc.end)).collect(Collectors.toSet())), - gc.var, dest, cases.keySet(), cases.values().iterator().next()); + gc.var, dest, cases.keySet().stream().collect(Collectors.toList()), cases.values().iterator().next()); } private ParamCoreGType parseGRecursion(Map rvs, @@ -343,7 +344,10 @@ private ParamCoreGChoice parseGSimpleInteractionNode( } ParamCoreGType cont = parseSeq(is.subList(1, is.size()), rvs, false, false); // Subseqeuent choice/rec is guarded by (at least) this action - return this.af.ParamCoreGChoice(src, kind, dest, Stream.of(a).collect(Collectors.toMap(x -> x, x -> cont))); + LinkedHashMap tmp = new LinkedHashMap<>(); + tmp.put(a, cont); + return this.af.ParamCoreGChoice(src, kind, dest, tmp); + //Stream.of(a).collect(Collectors.toMap(x -> x, x -> cont))); } private Op parseOp(GMessageTransfer gmt) throws ParamCoreSyntaxException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java index f80816de9..7e45c654e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java @@ -1,6 +1,6 @@ package org.scribble.ext.go.core.ast.local; -import java.util.Map; +import java.util.LinkedHashMap; import java.util.stream.Collectors; import org.scribble.ext.go.core.ast.ParamCoreChoice; @@ -10,7 +10,7 @@ public abstract class ParamCoreLChoice extends ParamCoreChoice implements ParamCoreLType { - protected ParamCoreLChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) + protected ParamCoreLChoice(ParamRole role, ParamCoreLActionKind kind, LinkedHashMap cases) { super(role, kind, cases); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java index 3ebe93815..22ad40301 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java @@ -1,13 +1,13 @@ package org.scribble.ext.go.core.ast.local; -import java.util.Map; +import java.util.LinkedHashMap; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.type.ParamRole; public class ParamCoreLCrossChoice extends ParamCoreLChoice { - public ParamCoreLCrossChoice(ParamRole role, ParamCoreLActionKind kind, Map cases) + public ParamCoreLCrossChoice(ParamRole role, ParamCoreLActionKind kind, LinkedHashMap cases) { super(role, kind, cases); if (kind != ParamCoreLActionKind.CROSS_SEND && kind != ParamCoreLActionKind.CROSS_RECEIVE) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java index 278ba95a6..2f160b076 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java @@ -1,6 +1,6 @@ package org.scribble.ext.go.core.ast.local; -import java.util.Map; +import java.util.LinkedHashMap; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.type.ParamRange; @@ -11,7 +11,7 @@ public class ParamCoreLDotChoice extends ParamCoreLChoice { public final ParamIndexExpr offset; - public ParamCoreLDotChoice(ParamRole role, ParamIndexExpr offset, ParamCoreLActionKind kind, Map cases) + public ParamCoreLDotChoice(ParamRole role, ParamIndexExpr offset, ParamCoreLActionKind kind, LinkedHashMap cases) { super(role, kind, cases); if (kind != ParamCoreLActionKind.DOT_SEND && kind != ParamCoreLActionKind.DOT_RECEIVE) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java index 0703fb417..d4c3ec9df 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java @@ -1,7 +1,8 @@ package org.scribble.ext.go.core.ast.local; -import java.util.Set; -import java.util.stream.Collectors; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.type.ParamRole; @@ -13,12 +14,28 @@ public class ParamCoreLMultiChoices extends ParamCoreLChoice public final ParamIndexVar var; // Redundant? // Pre: cases.size() > 1 - public ParamCoreLMultiChoices(ParamRole role, ParamIndexVar var, Set cases, ParamCoreLType cont) + public ParamCoreLMultiChoices(ParamRole role, ParamIndexVar var, List cases, ParamCoreLType cont) { - super(role, ParamCoreLActionKind.MULTICHOICES_RECEIVE, cases.stream().collect(Collectors.toMap(c -> c, c -> cont))); + super(role, ParamCoreLActionKind.MULTICHOICES_RECEIVE, foo(cases, cont)); this.var = var; } + private static LinkedHashMap foo(List cases, ParamCoreLType cont) + { + LinkedHashMap tmp = new LinkedHashMap<>(); + cases.stream().forEach(c -> tmp.put(c, cont)); + return tmp; + } + + public ParamCoreLType getContinuation() + { + if (new HashSet<>(this.cases.values()).size() > 1) + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + this.cases); + } + return this.cases.values().iterator().next(); + } + @Override public int hashCode() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java index 0e955b475..0f7ce88cd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -2,7 +2,9 @@ import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.scribble.ext.go.core.ast.ParamCoreMessage; import org.scribble.ext.go.core.ast.ParamCoreRecVar; @@ -20,6 +22,8 @@ import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.Payload; +import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; public class ParamCoreEGraphBuilder @@ -45,20 +49,26 @@ private void build(ParamCoreLType lt, EState s1, EState s2, Map { if (lt instanceof ParamCoreLChoice) { - ParamCoreLChoice lc = (ParamCoreLChoice) lt; - ParamIndexExpr offset = (lc instanceof ParamCoreLDotChoice) - ? ((ParamCoreLDotChoice) lc).offset - : null; - lc.cases.entrySet().stream().forEach(e -> - buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue(), offset) - ); - } - else if (lt instanceof ParamCoreLMultiChoices) - { - ParamCoreLMultiChoices lc = (ParamCoreLMultiChoices) lt; - lc.cases.entrySet().stream().forEach(e -> // FIXME: all conts are syntactically the same, so implicitly do the merge here? - buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue(), null) - ); + if (lt instanceof ParamCoreLMultiChoices) + { + ParamCoreLMultiChoices lc = (ParamCoreLMultiChoices) lt; + /*lc.cases.entrySet().stream().forEach(e -> // FIXME: all conts are syntactically the same, so implicitly do the merge here? + buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue(), null) + );*/ + List> mids = lc.cases.keySet().stream().map(x -> x.op).collect(Collectors.toList()); + List pays = lc.cases.keySet().stream().map(x -> x.pay).collect(Collectors.toList()); + buildMultiChoicesEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), mids, pays, lc.getContinuation()); + } + else + { + ParamCoreLChoice lc = (ParamCoreLChoice) lt; + ParamIndexExpr offset = (lc instanceof ParamCoreLDotChoice) + ? ((ParamCoreLDotChoice) lc).offset + : null; + lc.cases.entrySet().stream().forEach(e -> + buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue(), offset) + ); + } } else if (lt instanceof ParamCoreLRec) { @@ -76,19 +86,42 @@ else if (lt instanceof ParamCoreLRec) private void buildEdgeAndContinuation(EState s1, EState s2, Map recs, ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a, ParamCoreLType cont, ParamIndexExpr offset) { + EAction ea = toEAction(r, k, a, offset); + if (cont instanceof ParamCoreLEnd) + { + this.util.addEdge(s1, ea, s2); + } + else if (cont instanceof ParamCoreRecVar) + { + EState s = recs.get(((ParamCoreRecVar) cont).recvar); + this.util.addEdge(s1, ea, s); + } + else + { + EState s = this.util.ef.newEState(Collections.emptySet()); + this.util.addEdge(s1, ea, s); + build(cont, s, s2, recs); + } + } + + // FIXME: factor out with above + private void buildMultiChoicesEdgeAndContinuation(EState s1, EState s2, Map recs, + ParamRole r, ParamCoreLActionKind k, List> mids, List pays, ParamCoreLType cont) + { + EAction ea = ((ParamCoreEModelFactory) this.util.ef).newParamCoreEMultiChoicesReceive(r, mids, pays); if (cont instanceof ParamCoreLEnd) { - this.util.addEdge(s1, toEAction(r, k, a, offset), s2); + this.util.addEdge(s1, ea, s2); } else if (cont instanceof ParamCoreRecVar) { EState s = recs.get(((ParamCoreRecVar) cont).recvar); - this.util.addEdge(s1, toEAction(r, k, a, offset), s); + this.util.addEdge(s1, ea, s); } else { EState s = this.util.ef.newEState(Collections.emptySet()); - this.util.addEdge(s1, toEAction(r, k, a, offset), s); + this.util.addEdge(s1, ea, s); build(cont, s, s2, recs); } } @@ -113,10 +146,10 @@ else if (k.equals(ParamCoreLActionKind.DOT_RECEIVE)) { return ef.newParamCoreEDotReceive(r, offset, a.op, a.pay); } - else if (k.equals(ParamCoreLActionKind.MULTICHOICES_RECEIVE)) + /*else if (k.equals(ParamCoreLActionKind.MULTICHOICES_RECEIVE)) { return ef.newParamCoreEMultiChoicesReceive(r, a.op, a.pay); - } + }*/ else { throw new RuntimeException("[param-core] Shouldn't get in here: " + k); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java index 3a0c9273b..3d8eb84ce 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java @@ -1,5 +1,7 @@ package org.scribble.ext.go.core.model.endpoint; +import java.util.List; + import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; @@ -18,5 +20,6 @@ public interface ParamCoreEModelFactory extends EModelFactory ParamCoreECrossReceive newParamCoreECrossReceive(ParamRole peer, MessageId mid, Payload payload); ParamCoreEDotSend newParamCoreEDotSend(ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload); ParamCoreEDotReceive newParamCoreEDotReceive(ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload); - ParamCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(ParamRole peer, MessageId mid, Payload payload); + ParamCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(ParamRole peer,//MessageId mid, Payload payload) + List> mids, List pays); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java index 611c2b9e0..0598c1f42 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java @@ -1,5 +1,7 @@ package org.scribble.ext.go.core.model.endpoint; +import java.util.List; + import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; @@ -54,8 +56,9 @@ public ParamCoreEDotReceive newParamCoreEDotReceive(ParamRole peer, ParamIndexEx } @Override - public ParamCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(ParamRole peer, MessageId mid, Payload payload) + public ParamCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(ParamRole peer,//MessageId mid, Payload payload) + List> mids, List pays) { - return new ParamCoreEMultiChoicesReceive(this, peer, mid, payload); + return new ParamCoreEMultiChoicesReceive(this, peer, mids, pays); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java index c1645f9b0..e1def9e31 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java @@ -1,5 +1,10 @@ package org.scribble.ext.go.core.model.endpoint.action; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.model.endpoint.actions.EReceive; @@ -11,10 +16,14 @@ public class ParamCoreEMultiChoicesReceive extends EReceive implements ParamCoreEAction { + public final List> mids; + public final List pays; // mids.size() == pays.size() - public ParamCoreEMultiChoicesReceive(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + public ParamCoreEMultiChoicesReceive(ParamCoreEModelFactory ef, ParamRole peer, List> mids, List pays) { - super(ef, peer, mid, payload); + super(ef, peer, null, null); // null OK? + this.mids = Collections.unmodifiableList(mids); + this.pays = Collections.unmodifiableList(pays); } @Override @@ -34,6 +43,23 @@ public SReceive toGlobal(SModelFactory sf, Role self) { throw new RuntimeException("[param-core] Shouldn't get in here: " + this); } + + @Override + public String toString() + { + Iterator pays = this.pays.iterator(); + String ms = "{" + this.mids.stream().map(m -> m.toString() + pays.next().toString()).collect(Collectors.joining(", ")) + "}"; + return this.peer + getCommSymbol() + ms; + } + + @Override + public String toStringWithMessageIdHack() + { + Iterator pays = this.pays.iterator(); + String ms = "{" + this.mids.stream().map(m -> (m.isMessageSigName() ? "^" + m : m.toString()) + + pays.next().toString()).collect(Collectors.joining(", ")) + "}"; + return this.obj + getCommSymbol() + ms; + } @Override protected String getCommSymbol() @@ -45,7 +71,9 @@ protected String getCommSymbol() public int hashCode() { int hash = 7219; - hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.obj.hashCode(); + hash = 31 * hash + this.mids.hashCode(); // N.B. excluding this.mid, this.payload + hash = 31 * hash + this.pays.hashCode(); return hash; } @@ -60,7 +88,9 @@ public boolean equals(Object o) { return false; } - return super.equals(o); // Does canEquals + ParamCoreEMultiChoicesReceive them = (ParamCoreEMultiChoicesReceive) o; + return them.canEqual(this) && // N.B. don't call super: this.mid, this.pay == null + this.obj.equals(them.obj) && this.mids.equals(them.mids) && this.pays.equals(them.pays); } @Override diff --git a/scribble-go/src/test/scrib/param/cgo18/Auction.scr b/scribble-go/src/test/scrib/param/cgo18/Auction.scr index 781349651..4149775ef 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Auction.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Auction.scr @@ -15,6 +15,39 @@ global protocol Proto1(role A(n), role B(n)) do X(A, B); } +// mu X +aux global protocol X(role A, role B(n)) +{ + choice at A[1] + { + highestBidSoFar(int) from A[1..1] to B[1..n]; + + choices at B[i:1..n] + { + bid(int) from B[i] to A[1..1]; + do X(A, B); + } + or + { + skip(int) from B[i] to A[1..1]; + do X(A, B); + } + } + or + { + winner() from A[1..1] to B[1..n]; + } +} +//*/ + + + + + + + + +/* // mu X aux global protocol X(role A, role B(n)) { @@ -35,7 +68,7 @@ aux global protocol X(role A, role B(n)) // Version to implement /*foreach (i: 1..n) { - choice at B[i]*/ + choice at B[i]* / choices at B[i:1..n] { bid(int) from B[i] to A[1..1]; diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 0974c01a8..ec474b329 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -40,6 +40,18 @@ message passing //* global protocol Proto1(role A(n), role B(n)) +{ + choices at A[i:1..n] + { + 1() from A[i] to B[1..i]; // FIXME: bad "i" + //1() from A[j] to B[1..1]; // FIXME: bad "i" + } +} +//*/ + + +/* +global protocol Proto1(role A(n), role B(n)) { 1() dot A[1..n] to B[1+1..n+1]; } From e63b1f757eec35dffac38862c80b4fcc08cceb33 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 31 Aug 2017 18:22:08 +0100 Subject: [PATCH 104/433] Minor. --- .../endpoint/ParamCoreEGraphBuilder.java | 5 ++--- .../src/test/scrib/param/tmp/ParamTest.scr | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java index 0f7ce88cd..2ea6be3a6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -52,12 +52,11 @@ private void build(ParamCoreLType lt, EState s1, EState s2, Map if (lt instanceof ParamCoreLMultiChoices) { ParamCoreLMultiChoices lc = (ParamCoreLMultiChoices) lt; - /*lc.cases.entrySet().stream().forEach(e -> // FIXME: all conts are syntactically the same, so implicitly do the merge here? - buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue(), null) - );*/ List> mids = lc.cases.keySet().stream().map(x -> x.op).collect(Collectors.toList()); List pays = lc.cases.keySet().stream().map(x -> x.pay).collect(Collectors.toList()); buildMultiChoicesEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), mids, pays, lc.getContinuation()); + // N.B. this directly constructs a single continuation for the multichoices-receiver + // cf. multichoices sender side, standard cross-send with separate (but identical) continuations -- could also build single contination for sender by introducing explicit multichoices-send constructor } else { diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index ec474b329..df786a634 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -37,9 +37,25 @@ message passing // encode "multi-choices" by local role(thread) forking/joining? for dynamic join/leave use param-value dependency? (run-time checked?) */ - //* global protocol Proto1(role A(n), role B(n)) +{ + choices at A[i:1..n] + { + 1() from A[i] to B[1..1]; + 3() from B[1..1] to A[1..n]; + } + or + { + 2() from A[i] to B[1..1]; + 3() from B[1..1] to A[1..n]; + } +} +//*/ + + +/* +global protocol Proto1(role A(n), role B(n)) { choices at A[i:1..n] { @@ -84,6 +100,7 @@ global protocol Proto1(role A(n)) /*choices at A[i:1..n] { 1() from A[i] to B[1..1]; + //1() from B[1..1] to A[i]; // Not allowed }* / } //*/ From 2541dbcf6ab404e320d3e2b9c757fe25f16d9a48 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 1 Sep 2017 00:28:07 +0100 Subject: [PATCH 105/433] Minor. --- .../src/test/scrib/param/cgo18/Auction.scr | 2 +- .../test/scrib/param/cgo18/ScatterGather.scr | 2 +- .../src/test/scrib/param/tmp/ParamTest.scr | 32 ++++++++++++++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/Auction.scr b/scribble-go/src/test/scrib/param/cgo18/Auction.scr index 4149775ef..39ab4156c 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Auction.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Auction.scr @@ -16,7 +16,7 @@ global protocol Proto1(role A(n), role B(n)) } // mu X -aux global protocol X(role A, role B(n)) +aux global protocol X(role A, role B) { choice at A[1] { diff --git a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr index 9e61699ed..4e91b708a 100644 --- a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr +++ b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr @@ -11,7 +11,7 @@ type "int" from "..." as int; global protocol Proto1(role A(k), role B(k)) { scatter(int) from A[1..1] to B[1..k]; - gather(int) from B[1..k] to A[1..1]; + gather(int) from B[1..k] to A[1..1]; } //*/ diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index df786a634..17ff8c5c4 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -37,7 +37,37 @@ message passing // encode "multi-choices" by local role(thread) forking/joining? for dynamic join/leave use param-value dependency? (run-time checked?) */ -//* +global protocol P1(role A(n), role B(n)) +{ + 1() from A[1..1] to B[1..n]; +} + +/* +global protocol P1(role A(N), role B(N)) +{ + Msg(int) from A[1..(N-1)] to B[1..1]; +} + +global protocol P2(role A(N), role B(N)) +{ + Msg(int) from A[N..(N+N)] to B[1..1]; +} +//*/ + + +/*global protocol Proto1(role A(k), role B(k)) +{ + 1() from A[1..1] to B[k+k..(k+k)+k]; +}*/ + +/*global protocol Proto1(role A(n, m), role B(n, m)) +{ + //1() from A[1..m] to B[m+1..n]; + 1() from A[1..m] to B[m+1..(m+1)+n]; +} +//*/ + +/* global protocol Proto1(role A(n), role B(n)) { choices at A[i:1..n] From d0f1ed8bbb905867442e07590bf4e27cdb3cfc13 Mon Sep 17 00:00:00 2001 From: dcastrop Date: Fri, 1 Sep 2017 18:38:16 +0100 Subject: [PATCH 106/433] Example --- .../src/test/scrib/param/cgo18/MergeSort.scr | 27 ------------ .../src/test/scrib/param/cgo18/Reduce.scr | 42 +++++++++++++++++++ 2 files changed, 42 insertions(+), 27 deletions(-) delete mode 100644 scribble-go/src/test/scrib/param/cgo18/MergeSort.scr create mode 100644 scribble-go/src/test/scrib/param/cgo18/Reduce.scr diff --git a/scribble-go/src/test/scrib/param/cgo18/MergeSort.scr b/scribble-go/src/test/scrib/param/cgo18/MergeSort.scr deleted file mode 100644 index 587f2d889..000000000 --- a/scribble-go/src/test/scrib/param/cgo18/MergeSort.scr +++ /dev/null @@ -1,27 +0,0 @@ -//Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java -//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SumEuler.scr -param Proto1 - -module param.cgo18.MergeSort; - - -type "int" from "..." as int; -type "int[]" from "..." as intarray; - - -//* -global protocol Proto1(role M(i, j), role W(i, j)) -{ - /* // ?? - M --> W[0][1..n] : <[] int> - forall (i < log n), - forall (j < i), - W[i][j*2] --> W[i+1][j] . W[i][j*2+1] --> W[i+1][j] - W[log n][0] --> M - */ - - // TODO - 1(intarray) from M[1..1] to W[0..i*j]; - 2() dot W[...] to W[...]; - 3() from W[...] to M[1..1]; -} -//*/ diff --git a/scribble-go/src/test/scrib/param/cgo18/Reduce.scr b/scribble-go/src/test/scrib/param/cgo18/Reduce.scr new file mode 100644 index 000000000..30b433e9d --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/Reduce.scr @@ -0,0 +1,42 @@ +//Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SumEuler.scr -param Proto1 + +module param.cgo18.Reduce; + + +type "int" from "..." as int; +type "int[]" from "..." as intarray; + + +//* +global protocol Reduce( role M(N) + , role W(N) + , role R(N) + ) +{ + /* // ?? + M --> W[0][1..n] : <[] int> + forall (i < log n), + forall (j < i), + W[i][j*2] --> W[i+1][j] . W[i][j*2+1] --> W[i+1][j] + W[log n][0] --> M + */ + + distrib(intarray) from M[1 .. 1] to W[1..8*N]; + + redl1(intarray) from W[1 .. N] to R[1..1]; + redl1(intarray) from W[ N..2*N] to R[2..2]; + redl1(intarray) from W[2*N..3*N] to R[3..3]; + redl1(intarray) from W[3*N..4*N] to R[4..4]; + redl1(intarray) from W[4*N..5*N] to R[5..5]; + redl1(intarray) from W[5*N..6*N] to R[6..6]; + redl1(intarray) from W[6*N..7*N] to R[7..7]; + redl1(intarray) from W[7*N..8*N] to R[8..8]; + + /* Can we simplify this? */ + redl2(intarray) dot R[5..8] to R[1..4]; + redl3(intarray) dot R[3..4] to R[1..2]; + redl4(intarray) dot R[2..2] to R[1..1]; + gather(intarray) dot R[1..1] to M[1..1]; +} +//*/ From e909dc3e82b70f7772007fcb147c7b4131acc09b Mon Sep 17 00:00:00 2001 From: dcastrop Date: Fri, 1 Sep 2017 18:42:35 +0100 Subject: [PATCH 107/433] Fixed Ranges in Reduce.scr. --- .../src/test/scrib/param/cgo18/Reduce.scr | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/Reduce.scr b/scribble-go/src/test/scrib/param/cgo18/Reduce.scr index 30b433e9d..d72e7604b 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Reduce.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Reduce.scr @@ -24,14 +24,15 @@ global protocol Reduce( role M(N) distrib(intarray) from M[1 .. 1] to W[1..8*N]; - redl1(intarray) from W[1 .. N] to R[1..1]; - redl1(intarray) from W[ N..2*N] to R[2..2]; - redl1(intarray) from W[2*N..3*N] to R[3..3]; - redl1(intarray) from W[3*N..4*N] to R[4..4]; - redl1(intarray) from W[4*N..5*N] to R[5..5]; - redl1(intarray) from W[5*N..6*N] to R[6..6]; - redl1(intarray) from W[6*N..7*N] to R[7..7]; - redl1(intarray) from W[7*N..8*N] to R[8..8]; + // These ranges seem to fail + redl1(intarray) from W[1 .. N] to R[1..1]; + redl1(intarray) from W[ N+1..2*N] to R[2..2]; + redl1(intarray) from W[2*N+1..3*N] to R[3..3]; + redl1(intarray) from W[3*N+1..4*N] to R[4..4]; + redl1(intarray) from W[4*N+1..5*N] to R[5..5]; + redl1(intarray) from W[5*N+1..6*N] to R[6..6]; + redl1(intarray) from W[6*N+1..7*N] to R[7..7]; + redl1(intarray) from W[7*N+1..8*N] to R[8..8]; /* Can we simplify this? */ redl2(intarray) dot R[5..8] to R[1..4]; From 454edffb72ea60cbc193e6e52dec12776831748b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 2 Sep 2017 11:28:10 +0100 Subject: [PATCH 108/433] Working on param-core API gen. Fixed Reduce example. --- .../java/org/scribble/cli/CommandLine.java | 2 +- .../codegen/statetype/STActionBuilder.java | 12 +- .../statetype/STBranchStateBuilder.java | 2 +- .../codegen/statetype/STCaseBuilder.java | 4 +- .../codegen/statetype/STEndStateBuilder.java | 2 +- .../statetype/STOutputStateBuilder.java | 2 +- .../statetype/STReceiveStateBuilder.java | 2 +- ...uilder.java => STStateChanApiBuilder.java} | 6 +- .../codegen/statetype/STStateChanBuilder.java | 4 +- .../org/scribble/parser/antlr/ParamScribble.g | 2 +- .../scribble/ext/go/cli/ParamCommandLine.java | 4 +- .../statetype/go/GoEndpointApiGenerator.java | 2 +- .../statetype/go/GoSTBranchActionBuilder.java | 10 +- .../statetype/go/GoSTBranchStateBuilder.java | 6 +- .../statetype/go/GoSTCaseActionBuilder.java | 8 +- .../codegen/statetype/go/GoSTCaseBuilder.java | 12 +- .../statetype/go/GoSTEndStateBuilder.java | 8 +- .../statetype/go/GoSTOutputStateBuilder.java | 6 +- .../go/GoSTReceiveActionBuilder.java | 6 +- .../statetype/go/GoSTReceiveStateBuilder.java | 4 +- .../statetype/go/GoSTSendActionBuilder.java | 6 +- ...uilder.java => GoSTSessionApiBuilder.java} | 6 +- ...lder.java => GoSTStateChanApiBuilder.java} | 16 +- .../ParamCoreSTEndpointApiGenerator.java | 6 +- .../ParamCoreSTStateChanAPIBuilder.java | 151 ----------- .../ParamCoreSTStateChanApiBuilder.java | 241 ++++++++++++++++++ .../src/test/scrib/param/cgo18/Reduce.scr | 16 +- .../src/test/scrib/param/tmp/ParamTest.scr | 8 +- 28 files changed, 325 insertions(+), 229 deletions(-) rename scribble-codegen/src/main/java/org/scribble/codegen/statetype/{STStateChanAPIBuilder.java => STStateChanApiBuilder.java} (95%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GoSTSessionAPIBuilder.java => GoSTSessionApiBuilder.java} (94%) rename scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/{GoSTStateChanAPIBuilder.java => GoSTStateChanApiBuilder.java} (85%) delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 20f9ebfca..6ec79586c 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -436,7 +436,7 @@ protected void outputClasses(Map classes) throws ScribbleExcepti } else { - f = path -> { System.out.println(path + ":\n" + classes.get(path)); }; + f = path -> { System.out.println("\n[" + path + "]:\n" + classes.get(path)); }; } classes.keySet().stream().forEach(f); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index 64d718c6e..29df566b1 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -18,26 +18,26 @@ public abstract class STActionBuilder { - public abstract String getActionName(STStateChanAPIBuilder api, EAction a); + public abstract String getActionName(STStateChanApiBuilder api, EAction a); public abstract String buildArgs(EAction a); - public abstract String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ); + public abstract String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ); - public String getReturnType(STStateChanAPIBuilder api, EState curr, EState succ) + public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) { return api.getStateChanName(succ); } - public String buildReturn(STStateChanAPIBuilder api, EState curr, EState succ) + public String buildReturn(STStateChanApiBuilder api, EState curr, EState succ) { return api.buildActionReturn(this, curr, succ); } - public String build(STStateChanAPIBuilder api, EState curr, EAction a) + public String build(STStateChanApiBuilder api, EState curr, EAction a) { return api.buildAction(this, curr, a); // Because action builder hierarchy not suitable (extended by action kinds, not by target language) } - public String getStateChanType(STStateChanAPIBuilder api, EState curr, EAction a) + public String getStateChanType(STStateChanApiBuilder api, EState curr, EAction a) { return api.getStateChanName(curr); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java index 87f662188..ed6a96647 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java @@ -25,7 +25,7 @@ public STBranchStateBuilder(STBranchActionBuilder bb) } @Override - public String build(STStateChanAPIBuilder api, EState s) + public String build(STStateChanApiBuilder api, EState s) { String out = getPreamble(api, s); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java index bc3fc04bf..76720fc16 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STCaseBuilder.java @@ -27,7 +27,7 @@ public STCaseBuilder(STCaseActionBuilder cb) } @Override - public String build(STStateChanAPIBuilder api, EState s) + public String build(STStateChanApiBuilder api, EState s) { String out = getPreamble(api, s); @@ -47,5 +47,5 @@ public String build(STStateChanAPIBuilder api, EState s) return out; } - public abstract String getCaseStateChanName(STStateChanAPIBuilder api, EState s); + public abstract String getCaseStateChanName(STStateChanApiBuilder api, EState s); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java index cc80d80b0..6af53b509 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STEndStateBuilder.java @@ -23,7 +23,7 @@ public STEndStateBuilder() } @Override - public String build(STStateChanAPIBuilder api, EState s) + public String build(STStateChanApiBuilder api, EState s) { return getPreamble(api, s); } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java index bd7ae7c8b..06ceed8b9 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STOutputStateBuilder.java @@ -29,7 +29,7 @@ public STOutputStateBuilder(STSendActionBuilder sb) } @Override - public String build(STStateChanAPIBuilder api, EState s) + public String build(STStateChanApiBuilder api, EState s) { String out = getPreamble(api, s); /*"package " + getPackage(gpn) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java index dc5ebf640..7a7639304 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STReceiveStateBuilder.java @@ -28,7 +28,7 @@ public STReceiveStateBuilder(STReceiveActionBuilder rb) } @Override - public String build(STStateChanAPIBuilder api, EState s) + public String build(STStateChanApiBuilder api, EState s) { String out = getPreamble(api, s); diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java similarity index 95% rename from scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java rename to scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java index ee07cfe1b..8281423d0 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanAPIBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java @@ -26,7 +26,7 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; -public abstract class STStateChanAPIBuilder +public abstract class STStateChanApiBuilder { public final Job job; @@ -42,7 +42,7 @@ public abstract class STStateChanAPIBuilder private Map names = new HashMap<>(); - protected STStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph, + protected STStateChanApiBuilder(Job job, GProtocolName gpn, Role role, EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, STBranchStateBuilder bb, STCaseBuilder cb, STEndStateBuilder eb) { this.job = job; @@ -112,7 +112,7 @@ public String getStateChanName(EState s) public abstract String buildAction(STActionBuilder ab, EState curr, EAction a); - public abstract String getChannelName(STStateChanAPIBuilder api, EAction a); + public abstract String getChannelName(STStateChanApiBuilder api, EAction a); public abstract String buildActionReturn(STActionBuilder ab, EState curr, EState succ); // FIXME: refactor action builders as interfaces and use generic parameter for kind } diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java index d2af364dc..86faec0d4 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanBuilder.java @@ -17,6 +17,6 @@ public abstract class STStateChanBuilder { - public abstract String getPreamble(STStateChanAPIBuilder api, EState s); - public abstract String build(STStateChanAPIBuilder api, EState s); + public abstract String getPreamble(STStateChanApiBuilder api, EState s); + public abstract String build(STStateChanApiBuilder api, EState s); } diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 34b3fbb08..4af680106 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -1,4 +1,4 @@ -//$ java -cp scribble-parser/lib/antlr-3.5.2-complete.jar org.antlr.Tool -o scribble-assertions/target/generated-sources/antlr3 scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +//$ java -cp scribble-parser/lib/antlr-3.5.2-complete.jar org.antlr.Tool -o scribble-go/target/generated-sources/antlr3 scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g // Cygwin/Windows: //$ java -cp scribble-parser/lib/antlr-3.5.2-complete.jar org.antlr.Tool -o scribble-go/target/generated-sources/antlr3/org/scribble/parser/antlr scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 8c44ca1a4..4f80b63f2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -354,6 +354,8 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro for (Role r : powersets.keySet()) { Set> powset = powersets.get(r); + int i = 1; + int size = powset.size(); job.debugPrintln("\n[param-core] Ranges powerset for " + r + ": " + powset); @@ -401,7 +403,7 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro z3 = //"(declare-const id Int)\n "(assert " + z3 + ")"; - job.debugPrintln("\n[param-core] Candidate: " + cand); + job.debugPrintln("\n[param-core] Candidate (" + i++ + "/" + size + "): " + cand); job.debugPrintln("[param-core] Co-set: " + coset); job.debugPrintln("[param-core] Running Z3 on:\n" + z3); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java index 805778fae..0661a833d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java @@ -21,7 +21,7 @@ public GoEndpointApiGenerator(Job job) public Map generateGoApi(GProtocolName fullname, Role self) throws ScribbleException { this.job.debugPrintln("\n[Go API gen] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); - GoSTStateChanAPIBuilder apigen = new GoSTStateChanAPIBuilder(this.job, fullname, self, this.job.getContext().getEGraph(fullname, self)); + GoSTStateChanApiBuilder apigen = new GoSTStateChanApiBuilder(this.job, fullname, self, this.job.getContext().getEGraph(fullname, self)); Map api = apigen.build(); // filepath -> source api.putAll(apigen.buildSessionAPI()); // FIXME: factor better with STStateChanAPIBuilder return api; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java index 002e6e7cd..f029bd5da 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java @@ -2,7 +2,7 @@ import java.util.stream.Collectors; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.codegen.statetype.STBranchActionBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -10,7 +10,7 @@ public class GoSTBranchActionBuilder extends STBranchActionBuilder { @Override - public String build(STStateChanAPIBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out + public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out { EState succ = curr.getSuccessor(a); return @@ -23,7 +23,7 @@ public String build(STStateChanAPIBuilder api, EState curr, EAction a) // FIXME } @Override - public String getActionName(STStateChanAPIBuilder api, EAction a) + public String getActionName(STStateChanApiBuilder api, EAction a) { return "Branch_" + a.peer; } @@ -35,13 +35,13 @@ public String buildArgs(EAction a) } @Override - public String getReturnType(STStateChanAPIBuilder api, EState curr, EState succ) + public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) { return api.cb.getCaseStateChanName(api, curr); } @Override - public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { return //"tmp := " + api.getChannelName(api, a) + ".Read()\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java index 60fd7d7c2..a93f72a7d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java @@ -1,7 +1,7 @@ package org.scribble.ext.go.codegen.statetype.go; import org.scribble.codegen.statetype.STBranchStateBuilder; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.model.endpoint.EState; public class GoSTBranchStateBuilder extends STBranchStateBuilder @@ -12,11 +12,11 @@ public GoSTBranchStateBuilder(GoSTBranchActionBuilder bb) } @Override - public String getPreamble(STStateChanAPIBuilder api, EState s) + public String getPreamble(STStateChanApiBuilder api, EState s) { /*String ename = getBranchEnumType(api, s); List as = s.getActions();*/ - return GoSTStateChanAPIBuilder.getStateChanPremable(api, s) /*+ "\n" + return GoSTStateChanApiBuilder.getStateChanPremable(api, s) /*+ "\n" + "\n" + "type " + ename + " int\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java index 4fb9e0452..4a99f4db6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java @@ -3,7 +3,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.codegen.statetype.STCaseActionBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -12,7 +12,7 @@ public class GoSTCaseActionBuilder extends STCaseActionBuilder { @Override - public String getActionName(STStateChanAPIBuilder api, EAction a) + public String getActionName(STStateChanApiBuilder api, EAction a) { return "Recv_" + a.peer + "_" + a.mid; } @@ -25,7 +25,7 @@ public String buildArgs(EAction a) } @Override - public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { return IntStream.range(0, a.payload.elems.size()) @@ -41,7 +41,7 @@ public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EStat } @Override - public String getStateChanType(STStateChanAPIBuilder api, EState curr, EAction a) + public String getStateChanType(STStateChanApiBuilder api, EState curr, EAction a) { return GoSTCaseBuilder.getOpTypeName(api, curr, a.mid); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java index fa0562fc2..6b805ba0f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java @@ -5,7 +5,7 @@ import java.util.stream.Collectors; import org.scribble.codegen.statetype.STCaseBuilder; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.main.RuntimeScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.type.name.MessageId; @@ -17,13 +17,13 @@ public GoSTCaseBuilder(GoSTCaseActionBuilder cb) super(cb); } - protected static String getCaseActionName(STStateChanAPIBuilder api, EState s) + protected static String getCaseActionName(STStateChanApiBuilder api, EState s) { return api.getStateChanName(s) + "_Case"; } @Override - public String getCaseStateChanName(STStateChanAPIBuilder api, EState s) + public String getCaseStateChanName(STStateChanApiBuilder api, EState s) { String name = api.getStateChanName(s) + "_Cases"; // Should be "private" or not, corresponding to GSTStateChanAPIBuilder.makeSTStateName @@ -32,10 +32,10 @@ public String getCaseStateChanName(STStateChanAPIBuilder api, EState s) } @Override - public String getPreamble(STStateChanAPIBuilder api, EState s) + public String getPreamble(STStateChanApiBuilder api, EState s) { String casename = getCaseActionName(api, s); - return GoSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + return GoSTStateChanApiBuilder.getPackageDecl(api) + "\n" + "\n" + "import \"org/scribble/runtime/net\"\n" // Some parts duplicated from GSTStateChanAPIBuilder + "\n" @@ -54,7 +54,7 @@ public String getPreamble(STStateChanAPIBuilder api, EState s) private static Map seen = new HashMap<>(); // FIXME HACK - protected static String getOpTypeName(STStateChanAPIBuilder api, EState s, MessageId mid) + protected static String getOpTypeName(STStateChanApiBuilder api, EState s, MessageId mid) { String op = mid.toString(); char c = op.charAt(0); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java index b39678c05..c38eb8d80 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java @@ -1,6 +1,6 @@ package org.scribble.ext.go.codegen.statetype.go; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.codegen.statetype.STEndStateBuilder; import org.scribble.model.endpoint.EState; @@ -12,18 +12,18 @@ public GoSTEndStateBuilder() } @Override - public String build(STStateChanAPIBuilder api, EState s) + public String build(STStateChanApiBuilder api, EState s) { return getPreamble(api, s); } @Override - public String getPreamble(STStateChanAPIBuilder api, EState s) + public String getPreamble(STStateChanApiBuilder api, EState s) { //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); String tname = api.getStateChanName(s); String res = - GoSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + GoSTStateChanApiBuilder.getPackageDecl(api) + "\n" + "\n" + "import \"org/scribble/runtime/net\"\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java index 2ac14cec1..4ea4f2bac 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java @@ -1,6 +1,6 @@ package org.scribble.ext.go.codegen.statetype.go; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.codegen.statetype.STOutputStateBuilder; import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.model.endpoint.EState; @@ -13,8 +13,8 @@ public GoSTOutputStateBuilder(STSendActionBuilder sb) } @Override - public String getPreamble(STStateChanAPIBuilder api, EState s) + public String getPreamble(STStateChanApiBuilder api, EState s) { - return GoSTStateChanAPIBuilder.getStateChanPremable(api, s); + return GoSTStateChanApiBuilder.getStateChanPremable(api, s); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java index 2681ac34f..9714047ad 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java @@ -3,7 +3,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -12,7 +12,7 @@ public class GoSTReceiveActionBuilder extends STReceiveActionBuilder { @Override - public String getActionName(STStateChanAPIBuilder api, EAction a) + public String getActionName(STStateChanApiBuilder api, EAction a) { return "Recv_" + a.peer + "_" + a.mid; } @@ -25,7 +25,7 @@ public String buildArgs(EAction a) } @Override - public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { //String chan = api.getChannelName(api, a); return diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java index 1d7632ee2..4cb024216 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveStateBuilder.java @@ -1,6 +1,6 @@ package org.scribble.ext.go.codegen.statetype.go; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STReceiveStateBuilder; import org.scribble.model.endpoint.EState; @@ -13,7 +13,7 @@ public GoSTReceiveStateBuilder(STReceiveActionBuilder rb) } @Override - public String getPreamble(STStateChanAPIBuilder api, EState s) + public String getPreamble(STStateChanApiBuilder api, EState s) { //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); return api.bb.getPreamble(api, s); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java index 03f11b712..49730100b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java @@ -3,7 +3,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -12,7 +12,7 @@ public class GoSTSendActionBuilder extends STSendActionBuilder { @Override - public String getActionName(STStateChanAPIBuilder api, EAction a) + public String getActionName(STStateChanApiBuilder api, EAction a) { return "Send_" + a.peer + "_" + a.mid; } @@ -25,7 +25,7 @@ public String buildArgs(EAction a) } @Override - public String buildBody(STStateChanAPIBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { //String chan = api.getChannelName(api, a); return diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionApiBuilder.java similarity index 94% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionApiBuilder.java index ae89cb33d..13e7fa935 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSessionApiBuilder.java @@ -17,11 +17,11 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; -public class GoSTSessionAPIBuilder +public class GoSTSessionApiBuilder { - private GoSTStateChanAPIBuilder api; + private GoSTStateChanApiBuilder api; - public GoSTSessionAPIBuilder(GoSTStateChanAPIBuilder api) + public GoSTSessionApiBuilder(GoSTStateChanApiBuilder api) { this.api = api; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java similarity index 85% rename from scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java index 603bc97c5..5e0621bd2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanAPIBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java @@ -3,7 +3,7 @@ import java.util.Map; import org.scribble.codegen.statetype.STActionBuilder; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.main.Job; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; @@ -11,11 +11,11 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; -public class GoSTStateChanAPIBuilder extends STStateChanAPIBuilder +public class GoSTStateChanApiBuilder extends STStateChanApiBuilder { private int counter = 1; - public GoSTStateChanAPIBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) + public GoSTStateChanApiBuilder(Job job, GProtocolName gpn, Role role, EGraph graph) { super(job, gpn, role, graph, new GoSTOutputStateBuilder(new GoSTSendActionBuilder()), @@ -56,19 +56,19 @@ public String getFilePath(String filename) @Override public Map buildSessionAPI() // FIXME: factor out { - return new GoSTSessionAPIBuilder(this).buildSessionAPI(); + return new GoSTSessionApiBuilder(this).buildSessionAPI(); } - protected static String getPackageDecl(STStateChanAPIBuilder api) + protected static String getPackageDecl(STStateChanApiBuilder api) { return "package " + api.getPackage(); } - protected static String getStateChanPremable(STStateChanAPIBuilder api, EState s) + protected static String getStateChanPremable(STStateChanApiBuilder api, EState s) { String tname = api.getStateChanName(s); String res = - GoSTStateChanAPIBuilder.getPackageDecl(api) + "\n" + GoSTStateChanApiBuilder.getPackageDecl(api) + "\n" + "\n" + "import \"org/scribble/runtime/net\"\n" + "\n" @@ -104,7 +104,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b } @Override - public String getChannelName(STStateChanAPIBuilder api, EAction a) + public String getChannelName(STStateChanApiBuilder api, EAction a) { return ////"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index 9c5450c27..c2ab88584 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -9,7 +9,7 @@ import org.scribble.model.endpoint.EGraph; import org.scribble.type.name.GProtocolName; -// Duplicated from org.scribble.ext.go.codegen.statetype.go.GoStEndpointApiGenerator +// Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTEndpointApiGenerator public class ParamCoreSTEndpointApiGenerator { public final Job job; @@ -23,8 +23,8 @@ public ParamCoreSTEndpointApiGenerator(Job job) public Map generateGoApi(GProtocolName fullname, ParamActualRole self, EGraph egraph) throws ScribbleException { this.job.debugPrintln("\n[param-core] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); - ParamCoreSTStateChanAPIBuilder apigen - = new ParamCoreSTStateChanAPIBuilder(this.job, fullname, self, egraph); + ParamCoreSTStateChanApiBuilder apigen + = new ParamCoreSTStateChanApiBuilder(this.job, fullname, self, egraph); Map api = apigen.build(); // filepath -> source api.putAll(apigen.buildSessionAPI()); return api; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java deleted file mode 100644 index a8cc1f79d..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanAPIBuilder.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.scribble.ext.go.core.codegen.statetype; - -import java.util.Map; - -import org.scribble.codegen.statetype.STActionBuilder; -import org.scribble.codegen.statetype.STStateChanAPIBuilder; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.main.Job; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.GProtocolName; - -// Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder -public class ParamCoreSTStateChanAPIBuilder extends STStateChanAPIBuilder -{ - //private int counter = 1; - - // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later - public ParamCoreSTStateChanAPIBuilder(Job job, GProtocolName gpn, ParamActualRole role, EGraph graph) - { - super(job, gpn, role, graph, - null, //new GoSTOutputStateBuilder(new GoSTSendActionBuilder()), - null, //new GoSTReceiveStateBuilder(new GoSTReceiveActionBuilder()), - null, //new GoSTBranchStateBuilder(new GoSTBranchActionBuilder()), - null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), - null); //new GoSTEndStateBuilder()); - - throw new RuntimeException("[param-core] TODO:"); - } - - protected ParamActualRole getSelf() - { - return (ParamActualRole) this.getSelf(); - } - - @Override - public String getPackage() - { - throw new RuntimeException("[param-core] TODO:"); - //return this.gpn.getSimpleName().toString(); - } - - @Override - protected String makeSTStateName(EState s) - { - throw new RuntimeException("[param-core] TODO:"); - /*if (s.isTerminal()) - { - return "_EndState"; - } - String name = this.gpn.getSimpleName() + "_" + role + "_" + this.counter++; - //return (s.id == this.graph.init.id) ? name : "_" + name; // For "private" non-initial state channels - return name;*/ - } - - @Override - public String getFilePath(String filename) - { - throw new RuntimeException("[param-core] TODO:"); - /*if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go - { - filename = "$" + filename.substring(1); - } - return this.gpn.toString().replaceAll("\\.", "/") + "/" + filename + ".go";*/ - } - - @Override - public Map buildSessionAPI() // FIXME: factor out - { - throw new RuntimeException("[param-core] TODO:"); - //return new GoSTSessionAPIBuilder(this).buildSessionAPI(); - } - - protected static String getPackageDecl(STStateChanAPIBuilder api) - { - throw new RuntimeException("[param-core] TODO: "); - //return "package " + api.getPackage(); - } - - protected static String getStateChanPremable(STStateChanAPIBuilder api, EState s) - { - throw new RuntimeException("[param-core] TODO: "); - /*String tname = api.getStateChanName(s); - String res = - ParamSTStateChanAPIBuilder.getPackageDecl(api) + "\n" - + "\n" - + "import \"org/scribble/runtime/net\"\n" - + "\n" - + "type " + tname + " struct{\n" - + "ep *net.MPSTEndpoint\n" // FIXME: factor out - + "state *net.LinearResource\n" // FIXME: EndSocket special case? // FIXME: only seems to work as a pointer (something to do with method calls via value recievers? is it copying the value before calling the function?) - + "}"; - - if (s.id == api.graph.init.id) - { - res += - "\n\n" - + "func New" + tname + "(ep *_Endpoint" + api.gpn.getSimpleName() + "_" + api.role + ") *" + tname + " {\n" // FIXME: factor out - + "ep." + api.role + ".SetInit()\n" - + "return &" + tname + " { ep: ep." + api.role + ", state: &net.LinearResource { } }\n" - + "}"; - } - - return res;*/ - } - - @Override - public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here because action builder hierarchy not suitable (extended by action kind, not by target language) - { - throw new RuntimeException("[param-core] TODO: "); - /*EState succ = curr.getSuccessor(a); - return - "func (s *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(a) - + ") *" + ab.getReturnType(this, curr, succ) + " {\n" - + "s.state.Use()\n" - + ab.buildBody(this, curr, a, succ) + "\n" - + "}";*/ - } - - @Override - public String getChannelName(STStateChanAPIBuilder api, EAction a) - { - throw new RuntimeException("[param-core] TODO: "); - /*return - ////"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; - //"s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; - null;*/ - } - - @Override - public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) // FIXME: refactor action builders as interfaces and use generic parameter for kind - { - throw new RuntimeException("[param-core] TODO: "); - /*String res = ""; - - if (succ.isTerminal()) - { - res += "s.ep.SetDone()\n"; - } - res += "return &" + ab.getReturnType(this, curr, succ) + "{ ep: s.ep"; - if (!succ.isTerminal()) - { - res += ", state: &net.LinearResource {}"; // FIXME: EndSocket LinearResource special case - } - res += " }"; - - return res;*/ - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java new file mode 100644 index 000000000..1c729639a --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -0,0 +1,241 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.scribble.codegen.statetype.STActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; +import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.main.Job; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.GProtocolName; + +// Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder +public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder +{ + private int counter = 1; + + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later + public ParamCoreSTStateChanApiBuilder(Job job, GProtocolName gpn, ParamActualRole role, EGraph graph) + { + super(job, gpn, role, graph, + new ParamCoreSTOutputStateBuilder(new ParamCoreSTSendActionBuilder()), + null, //new GoSTReceiveStateBuilder(new GoSTReceiveActionBuilder()), + null, //new GoSTBranchStateBuilder(new GoSTBranchActionBuilder()), + null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), + new ParamCoreSTEndStateBuilder()); + + //throw new RuntimeException("[param-core] TODO:"); + } + + protected ParamActualRole getSelf() + { + return (ParamActualRole) this.getSelf(); + } + + @Override + public String getPackage() + { + //throw new RuntimeException("[param-core] TODO:"); + return this.gpn.getSimpleName().toString(); + } + + @Override + protected String makeSTStateName(EState s) + { + //throw new RuntimeException("[param-core] TODO:"); + if (s.isTerminal()) + { + return "_EndState"; + } + String name = this.gpn.getSimpleName() + "_" + role + "_" + this.counter++; + //return (s.id == this.graph.init.id) ? name : "_" + name; // For "private" non-initial state channels + return name; + } + + @Override + public String getFilePath(String filename) + { + //throw new RuntimeException("[param-core] TODO:"); + if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go + { + filename = "$" + filename.substring(1); + } + return this.gpn.toString().replaceAll("\\.", "/") + "/" + filename + ".go"; + } + + @Override + public Map buildSessionAPI() // FIXME: factor out + { + //throw new RuntimeException("[param-core] TODO:"); + return new ParamCoreSTSessionApiBuilder(this).buildSessionAPI(); + } + + protected static String getPackageDecl(STStateChanApiBuilder api) + { + //throw new RuntimeException("[param-core] TODO: "); + return "package " + api.getPackage(); + } + + protected static String getStateChanPremable(STStateChanApiBuilder api, EState s) + { + //throw new RuntimeException("[param-core] TODO: "); + String tname = api.getStateChanName(s); + String res = + ParamCoreSTStateChanApiBuilder.getPackageDecl(api) + "\n" + + "\n" + + "import \"org/scribble/runtime/net\"\n" + + "\n" + + "type " + tname + " struct{\n" + + "ep *net.MPSTEndpoint\n" // FIXME: factor out + + "state *net.LinearResource\n" // FIXME: EndSocket special case? // FIXME: only seems to work as a pointer (something to do with method calls via value recievers? is it copying the value before calling the function?) + + "}"; + + if (s.id == api.graph.init.id) + { + res += + "\n\n" + + "func New" + tname + "(ep *_Endpoint" + api.gpn.getSimpleName() + "_" + api.role + ") *" + tname + " {\n" // FIXME: factor out + + "ep." + api.role + ".SetInit()\n" + + "return &" + tname + " { ep: ep." + api.role + ", state: &net.LinearResource { } }\n" + + "}"; + } + + return res; + } + + @Override + public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here because action builder hierarchy not suitable (extended by action kind, not by target language) + { + //throw new RuntimeException("[param-core] TODO: "); + EState succ = curr.getSuccessor(a); + return + "func (s *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(a) + + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + + "s.state.Use()\n" + + ab.buildBody(this, curr, a, succ) + "\n" + + "}"; + } + + @Override + public String getChannelName(STStateChanApiBuilder api, EAction a) + { + //throw new RuntimeException("[param-core] TODO: "); + return + //"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; + "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; + } + + @Override + public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) // FIXME: refactor action builders as interfaces and use generic parameter for kind + { + //throw new RuntimeException("[param-core] TODO: "); + String res = ""; + + if (succ.isTerminal()) + { + res += "s.ep.SetDone()\n"; + } + res += "return &" + ab.getReturnType(this, curr, succ) + "{ ep: s.ep"; + if (!succ.isTerminal()) + { + res += ", state: &net.LinearResource {}"; // FIXME: EndSocket LinearResource special case + } + res += " }"; + + return res; + } + + @Override + public Map build() // filepath -> source + { + Map api = new HashMap<>(); + Set states = new LinkedHashSet<>(); + states.add(this.graph.init); + states.addAll(MState.getReachableStates(this.graph.init)); + for (EState s : states) + { + switch (getStateKind(s)) + { + case CROSS_SEND: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; + case CROSS_RECEIVE: + { + if (s.getActions().size() > 1) + { + api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out + } + else + { + api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); + } + break; + } + case DOT_SEND: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case DOT_RECEIVE: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case MULTICHOICES_RECEIVE: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket + default: throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + } + } + return api; + } + + + // FIXME: make ParamCoreEState + enum ParamCoreEStateKind { CROSS_SEND, CROSS_RECEIVE, DOT_SEND, DOT_RECEIVE, MULTICHOICES_RECEIVE, TERMINAL } + + protected static ParamCoreEStateKind getStateKind(EState s) + { + List as = s.getActions(); + if (as.isEmpty()) + { + return ParamCoreEStateKind.TERMINAL; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossSend)) + { + return ParamCoreEStateKind.CROSS_SEND; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossReceive)) + { + return ParamCoreEStateKind.CROSS_RECEIVE; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotSend)) + { + return ParamCoreEStateKind.DOT_SEND; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotReceive)) + { + return ParamCoreEStateKind.DOT_RECEIVE; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEMultiChoicesReceive)) + { + return ParamCoreEStateKind.MULTICHOICES_RECEIVE; + } + else + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + } + } +} diff --git a/scribble-go/src/test/scrib/param/cgo18/Reduce.scr b/scribble-go/src/test/scrib/param/cgo18/Reduce.scr index d72e7604b..c525c2e19 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Reduce.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Reduce.scr @@ -25,14 +25,14 @@ global protocol Reduce( role M(N) distrib(intarray) from M[1 .. 1] to W[1..8*N]; // These ranges seem to fail - redl1(intarray) from W[1 .. N] to R[1..1]; - redl1(intarray) from W[ N+1..2*N] to R[2..2]; - redl1(intarray) from W[2*N+1..3*N] to R[3..3]; - redl1(intarray) from W[3*N+1..4*N] to R[4..4]; - redl1(intarray) from W[4*N+1..5*N] to R[5..5]; - redl1(intarray) from W[5*N+1..6*N] to R[6..6]; - redl1(intarray) from W[6*N+1..7*N] to R[7..7]; - redl1(intarray) from W[7*N+1..8*N] to R[8..8]; + redl1(intarray) from W[1 .. N] to R[1..1]; + redl1(intarray) from W[ N +1..2*N] to R[2..2]; + redl1(intarray) from W[(2*N)+1..3*N] to R[3..3]; + redl1(intarray) from W[(3*N)+1..4*N] to R[4..4]; + redl1(intarray) from W[(4*N)+1..5*N] to R[5..5]; + redl1(intarray) from W[(5*N)+1..6*N] to R[6..6]; + redl1(intarray) from W[(6*N)+1..7*N] to R[7..7]; + redl1(intarray) from W[(7*N)+1..8*N] to R[8..8]; /* Can we simplify this? */ redl2(intarray) dot R[5..8] to R[1..4]; diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 17ff8c5c4..aa195ef1c 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -37,10 +37,14 @@ message passing // encode "multi-choices" by local role(thread) forking/joining? for dynamic join/leave use param-value dependency? (run-time checked?) */ -global protocol P1(role A(n), role B(n)) +// Add a scribble version and time/date to API output header + +//* +global protocol Proto1(role A(n), role B(n)) { - 1() from A[1..1] to B[1..n]; + 1() from A[1..1] to B[1..n+1]; } +//*/ /* global protocol P1(role A(N), role B(N)) From 5bc064d90e0ba1c34fb8a0422da33bb0d71eba9c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 2 Sep 2017 11:28:51 +0100 Subject: [PATCH 109/433] Added missing files. --- .../statetype/ParamCoreSTApiGenConstants.java | 22 +++++ .../statetype/ParamCoreSTEndStateBuilder.java | 35 +++++++ .../ParamCoreSTOutputStateBuilder.java | 20 ++++ .../ParamCoreSTSendActionBuilder.java | 56 +++++++++++ .../ParamCoreSTSessionApiBuilder.java | 99 +++++++++++++++++++ 5 files changed, 232 insertions(+) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTOutputStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java new file mode 100644 index 000000000..044e2af09 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java @@ -0,0 +1,22 @@ +package org.scribble.ext.go.core.codegen.statetype; + +public class ParamCoreSTApiGenConstants +{ + public static final String GO_SCRIBBLERUNTIME_PACKAGE = "org/scribble/runtime/net"; + + public static final String GO_ENDPOINT_TYPE = "session.Endpoint"; // net.MPSTEndpoint; + public static final String GO_ENDPOINT_PROTO = "Proto"; + public static final String GO_ENDPOINT_ERR = "Err"; + public static final String GO_ENDPOINT_WRITE = "Write"; + + public static final String GO_LINEARRESOURCE_TYPE = "session.LinearResource"; // net.LinearResource + + public static final String GO_SCHAN_ENDPOINT = "endpoint"; // ep; + public static final String GO_SCHAN_LINEARRESOURCE = "resource"; // state + + public static final String GO_IO_FUN_RECEIVER = "s"; + + public static final String GO_CROSS_SEND_FUN_PREFIX = "Send"; + public static final String GO_CROSS_SEND_FUN_ARG = "arg"; + +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java new file mode 100644 index 000000000..db63203a9 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java @@ -0,0 +1,35 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import org.scribble.codegen.statetype.STEndStateBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; + +public class ParamCoreSTEndStateBuilder extends STEndStateBuilder +{ + public ParamCoreSTEndStateBuilder() + { + + } + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + return getPreamble(api, s); + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); + String tname = api.getStateChanName(s); + String res = + ParamCoreSTStateChanApiBuilder.getPackageDecl(api) + "\n" + + "\n" + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + + "\n" + + "type " + tname + " struct{\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" // FIXME: factor out + + "}"; + return res; // No LinearResource + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTOutputStateBuilder.java new file mode 100644 index 000000000..070ace3a1 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTOutputStateBuilder.java @@ -0,0 +1,20 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import org.scribble.codegen.statetype.STOutputStateBuilder; +import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; + +public class ParamCoreSTOutputStateBuilder extends STOutputStateBuilder +{ + public ParamCoreSTOutputStateBuilder(STSendActionBuilder sb) + { + super(sb); + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + return ParamCoreSTStateChanApiBuilder.getStateChanPremable(api, s); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java new file mode 100644 index 000000000..bb87da877 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -0,0 +1,56 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class ParamCoreSTSendActionBuilder extends STSendActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" + a.peer + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + + i + " " + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + String sEpWrite = + //s.ep.Write + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITE; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR; + return + sEpWrite + + "(" + + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", \"" + a.mid + "\")\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> sEpWrite + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n" + + "if " + sEpErr + " != nil {\n" + + "return nil" + + "}\n" + + buildReturn(api, curr, succ); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java new file mode 100644 index 000000000..ae1507990 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -0,0 +1,99 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.scribble.ast.Module; +import org.scribble.ast.ProtocolDecl; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.EStateKind; +import org.scribble.type.kind.Global; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +public class ParamCoreSTSessionApiBuilder +{ + private ParamCoreSTStateChanApiBuilder api; + + public ParamCoreSTSessionApiBuilder(ParamCoreSTStateChanApiBuilder api) + { + this.api = api; + } + + //@Override + public Map buildSessionAPI() // FIXME: factor out + { + Module mod = api.job.getContext().getModule(api.gpn.getPrefix()); + GProtocolName simpname = api.gpn.getSimpleName(); + ProtocolDecl gpd = mod.getProtocolDecl(simpname); + + List roles = gpd.header.roledecls.getRoles(); + Set instates = new HashSet<>(); + Predicate f = (s) -> s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT; + if (f.test(api.graph.init)) + { + instates.add(api.graph.init); + } + instates.addAll(MState.getReachableStates(api.graph.init).stream().filter(f).collect(Collectors.toSet())); + + Map res = new HashMap<>(); + String dir = api.gpn.toString().replaceAll("\\.", "/") + "/"; + + // roles + String sessclass = + "package " + api.getPackage() + "\n" // FIXME: factor out + + "\n" + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + + "\n" + + roles.stream().map(r -> + "type _" + r + " struct { }\n" + + "\n" + + "func (*_" + r +") GetRoleName() string {\n" + + "return \"" + r + "\"\n" + + "}\n" + + "\n" + + "var __" + r + " *_" + r + "\n" + + "\n" + + "func new" + r + "() *_" + r + " {\n" // FIXME: not concurrent + + "if __" + r + " == nil {\n" + + "__"+ r + " = &_" + r + "{}\n" + + "}\n" + + "return __" + r + "\n" + + "}" + ).collect(Collectors.joining("\n\n")) + "\n" + + "\n" + + "type " + simpname + " struct {\n" + + roles.stream().map(r -> r + " *_" + r).collect(Collectors.joining("\n")) + "\n" // FIXME: role constants should be pointers? + + "}\n" + + "\n" + + "func New" + simpname + "() *" + simpname + "{\n" + + "return &" + simpname + "{ " + roles.stream().map(r -> "new" + r + "()").collect(Collectors.joining(", ")) + " }\n" + + "}"; + + // Protocol and role specific endpoints + Function epTypeName = r -> "_Endpoint" + simpname + "_" + r; + sessclass += + roles.stream().map(r -> + "\n\n" + + "type " + epTypeName.apply(r) + " struct {\n" // FIXME: factor out + + r + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + "}\n" + + "\n" + + "func New" + epTypeName.apply(r) + "(P *" + simpname + ") *" + epTypeName.apply(r) + "{\n" + + "return &" + epTypeName.apply(r) + " { " + r + ": " + + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "(P, P." + r + ") }\n" + + "}" + ).collect(Collectors.joining("")); + + res.put(dir + simpname + ".go", sessclass); + + return res; + } +} From a2632eb20b97ee26824a9106a8c0e21fac61299f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 2 Sep 2017 11:36:26 +0100 Subject: [PATCH 110/433] Set ANTLR version to 3.5.2 in root pom.xml. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3169330a9..de8b6b7e9 100644 --- a/pom.xml +++ b/pom.xml @@ -55,7 +55,7 @@ - 3.4 + 3.5.2 1.2.14 1.9.9 4.11 From 3998842534c7d53b0eb0ec399a5e0b5d1074d3e8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 2 Sep 2017 20:26:28 +0100 Subject: [PATCH 111/433] Continued on param-core API gen. --- .../statetype/STStateChanApiBuilder.java | 4 +- .../scribble/ext/go/cli/ParamCommandLine.java | 10 +- .../statetype/go/GoEndpointApiGenerator.java | 2 +- .../statetype/go/GoSTBranchStateBuilder.java | 2 +- .../codegen/statetype/go/GoSTCaseBuilder.java | 2 +- .../statetype/go/GoSTEndStateBuilder.java | 2 +- .../statetype/go/GoSTOutputStateBuilder.java | 2 +- .../statetype/go/GoSTStateChanApiBuilder.java | 10 +- .../statetype/ParamCoreSTApiGenConstants.java | 18 +++- .../statetype/ParamCoreSTEndStateBuilder.java | 6 +- .../ParamCoreSTEndpointApiGenerator.java | 93 ++++++++++++++++-- .../ParamCoreSTOutputStateBuilder.java | 2 +- .../ParamCoreSTSendActionBuilder.java | 17 ++-- .../ParamCoreSTSessionApiBuilder.java | 96 ++++++++++--------- .../ParamCoreSTStateChanApiBuilder.java | 88 +++++++++-------- .../src/test/scrib/param/tmp/ParamTest.scr | 3 +- 16 files changed, 235 insertions(+), 122 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java index 8281423d0..914c7300e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java @@ -58,7 +58,7 @@ protected STStateChanApiBuilder(Job job, GProtocolName gpn, Role role, EGraph gr this.eb = eb; } - public abstract Map buildSessionAPI(); // filepath -> source // FIXME: factor out + //public abstract Map buildSessionAPI(); // filepath -> source // FIXME: factor out public Map build() // filepath -> source { @@ -94,7 +94,7 @@ public Map build() // filepath -> source public abstract String getFilePath(String name); - public abstract String getPackage(); + //public abstract String getPackage(); public String getStateChanName(EState s) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 4f80b63f2..2250ec5f4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -149,13 +149,15 @@ else if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_API_GEN)) String simpname = this.paramArgs.get(ParamCLArgFlag.PARAM)[0]; GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); Role role = checkRoleArg(jcontext, fullname, args[i]); - //for (Set ranges : this.P0.get(role).keySet()) - for (ParamActualRole ranges : this.P0.get(role).keySet()) + /*for (ParamActualRole ranges : this.P0.get(role).keySet()) { EGraph efsm = this.E0.get(role).get(ranges); - Map goClasses = new ParamCoreSTEndpointApiGenerator(job).generateGoApi(fullname, ranges, efsm); + Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, ranges, efsm).build(); outputClasses(goClasses); - } + }*/ + Map actuals = this.E0.get(role); + Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, role, actuals).build(); + outputClasses(goClasses); } } else diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java index 0661a833d..ebd802e3b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoEndpointApiGenerator.java @@ -8,7 +8,7 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; -public class GoEndpointApiGenerator +public class GoEndpointApiGenerator // FIXME: make base STEndpointApiGenerator { public final Job job; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java index a93f72a7d..215e5d7a5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchStateBuilder.java @@ -16,7 +16,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) { /*String ename = getBranchEnumType(api, s); List as = s.getActions();*/ - return GoSTStateChanApiBuilder.getStateChanPremable(api, s) /*+ "\n" + return GoSTStateChanApiBuilder.getStateChanPremable((GoSTStateChanApiBuilder) api, s) /*+ "\n" + "\n" + "type " + ename + " int\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java index 6b805ba0f..b9bc0fe53 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseBuilder.java @@ -35,7 +35,7 @@ public String getCaseStateChanName(STStateChanApiBuilder api, EState s) public String getPreamble(STStateChanApiBuilder api, EState s) { String casename = getCaseActionName(api, s); - return GoSTStateChanApiBuilder.getPackageDecl(api) + "\n" + return GoSTStateChanApiBuilder.getPackageDecl((GoSTStateChanApiBuilder) api) + "\n" + "\n" + "import \"org/scribble/runtime/net\"\n" // Some parts duplicated from GSTStateChanAPIBuilder + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java index c38eb8d80..6edde534b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTEndStateBuilder.java @@ -23,7 +23,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); String tname = api.getStateChanName(s); String res = - GoSTStateChanApiBuilder.getPackageDecl(api) + "\n" + GoSTStateChanApiBuilder.getPackageDecl((GoSTStateChanApiBuilder) api) + "\n" + "\n" + "import \"org/scribble/runtime/net\"\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java index 4ea4f2bac..41d86523c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTOutputStateBuilder.java @@ -15,6 +15,6 @@ public GoSTOutputStateBuilder(STSendActionBuilder sb) @Override public String getPreamble(STStateChanApiBuilder api, EState s) { - return GoSTStateChanApiBuilder.getStateChanPremable(api, s); + return GoSTStateChanApiBuilder.getStateChanPremable((GoSTStateChanApiBuilder) api, s); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java index 5e0621bd2..2f07a027e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java @@ -25,7 +25,7 @@ public GoSTStateChanApiBuilder(Job job, GProtocolName gpn, Role role, EGraph gra new GoSTEndStateBuilder()); } - @Override + //@Override public String getPackage() { return this.gpn.getSimpleName().toString(); @@ -38,7 +38,7 @@ protected String makeSTStateName(EState s) { return "_EndState"; } - String name = this.gpn.getSimpleName() + "_" + role + "_" + this.counter++; + String name = this.gpn.getSimpleName() + "_" + this.role + "_" + this.counter++; //return (s.id == this.graph.init.id) ? name : "_" + name; // For "private" non-initial state channels return name; } @@ -53,18 +53,18 @@ public String getFilePath(String filename) return this.gpn.toString().replaceAll("\\.", "/") + "/" + filename + ".go"; } - @Override + //@Override public Map buildSessionAPI() // FIXME: factor out { return new GoSTSessionApiBuilder(this).buildSessionAPI(); } - protected static String getPackageDecl(STStateChanApiBuilder api) + protected static String getPackageDecl(GoSTStateChanApiBuilder api) { return "package " + api.getPackage(); } - protected static String getStateChanPremable(STStateChanApiBuilder api, EState s) + protected static String getStateChanPremable(GoSTStateChanApiBuilder api, EState s) { String tname = api.getStateChanName(s); String res = diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java index 044e2af09..751b3dd82 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java @@ -2,14 +2,30 @@ public class ParamCoreSTApiGenConstants { - public static final String GO_SCRIBBLERUNTIME_PACKAGE = "org/scribble/runtime/net"; + //public static final String GO_SCRIBBLERUNTIME_PACKAGE = "org/scribble/runtime/net"; + public static final String GO_SCRIBBLERUNTIME_SESSION_PACKAGE = "github.com/scribble/go-runtime/session"; + public static final String GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE = "github.com/scribble/go-runtime/session/param"; + public static final String GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE = "github.com/scribble/go-runtime/transport"; + public static final String GO_SCRIBBLERUNTIME_SHM_PACKAGE = "github.com/scribble/go-runtime/transport/shm"; public static final String GO_ENDPOINT_TYPE = "session.Endpoint"; // net.MPSTEndpoint; + public static final String GO_ENDPOINT_CONSTRUCTOR = "session.NewEndpoint"; public static final String GO_ENDPOINT_PROTO = "Proto"; public static final String GO_ENDPOINT_ERR = "Err"; public static final String GO_ENDPOINT_WRITE = "Write"; + public static final String GO_ENDPOINT_STARTPROTOCOL = "StartProtocol"; + public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; + public static final String GO_ENDPOINT_FINALISE = "Finalise"; + + public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; + + public static final String GO_ROLE_TYPE = "session.Role"; + public static final String GO_ROLE_CONSTRUCTOR = "session.NewRole"; + + public static final String GO_PARAMROLE_TYPE = "session.ParamRole"; public static final String GO_LINEARRESOURCE_TYPE = "session.LinearResource"; // net.LinearResource + public static final String GO_LINEARRESOURCE_USE = "Use"; // net.LinearResource public static final String GO_SCHAN_ENDPOINT = "endpoint"; // ep; public static final String GO_SCHAN_LINEARRESOURCE = "resource"; // state diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java index db63203a9..3627c1223 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java @@ -20,12 +20,14 @@ public String build(STStateChanApiBuilder api, EState s) @Override public String getPreamble(STStateChanApiBuilder api, EState s) { + ParamCoreSTStateChanApiBuilder schangen = (ParamCoreSTStateChanApiBuilder) api; //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); String tname = api.getStateChanName(s); String res = - ParamCoreSTStateChanApiBuilder.getPackageDecl(api) + "\n" + schangen.apigen.generateRootPackageDecl() + "\n" + "\n" - + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + + schangen.apigen.generateScribbleRuntimeImports() + "\n" + "\n" + "type " + tname + " struct{\n" + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" // FIXME: factor out diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index c2ab88584..c98487c42 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -1,33 +1,108 @@ package org.scribble.ext.go.core.codegen.statetype; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator; import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.main.Job; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTEndpointApiGenerator public class ParamCoreSTEndpointApiGenerator { public final Job job; + public final GProtocolName proto; + public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral + public final Map actuals; + //public final EGraph graph; - public ParamCoreSTEndpointApiGenerator(Job job) + public ParamCoreSTEndpointApiGenerator(Job job, GProtocolName fullname, Role self, Map actuals) { this.job = job; + this.proto = fullname; + this.self = self; + this.actuals = Collections.unmodifiableMap(actuals); + //this.graph = graph; } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later - public Map generateGoApi(GProtocolName fullname, ParamActualRole self, EGraph egraph) throws ScribbleException + public Map build() throws ScribbleException { - this.job.debugPrintln("\n[param-core] Running " + StateChannelApiGenerator.class + " for " + fullname + "@" + self); - ParamCoreSTStateChanApiBuilder apigen - = new ParamCoreSTStateChanApiBuilder(this.job, fullname, self, egraph); - Map api = apigen.build(); // filepath -> source - api.putAll(apigen.buildSessionAPI()); - return api; + Map res = new HashMap<>(); // filepath -> source + res.putAll(buildSessionApi()); + for (Entry actual : this.actuals.entrySet()) + { + res.putAll(buildStateChannelApi(actual.getKey(), actual.getValue())); + } + return res; } + //@Override + public Map buildSessionApi() // FIXME: factor out + { + this.job.debugPrintln("\n[param-core] Running " + ParamCoreSTSessionApiBuilder.class + " for " + this.proto + "@" + this.self); + //throw new RuntimeException("[param-core] TODO:"); + return new ParamCoreSTSessionApiBuilder(this).build(); + } + + public Map buildStateChannelApi(ParamActualRole actual, EGraph graph) // FIXME: factor out + { + this.job.debugPrintln("\n[param-core] Running " + ParamCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + this.self); + return new ParamCoreSTStateChanApiBuilder(this, actual, graph).build(); + } + + public String getGeneratedEndpointType() + { + /*return "Endpoint_" + this.proto.getSimpleName() + "_" + //+ getGeneratedActualRoleName(); // No: endpoint covers all actual roles of this role name + + this.self;*/ + return getGeneratedEndpointType(this.proto.getSimpleName(), this.self); + } + + public static String getGeneratedEndpointType(GProtocolName simpname, Role r) + { + return "Endpoint_" + simpname + "_" + r; + } + + public static String getGeneratedActualRoleName(ParamActualRole actual) + { + return actual.getName() + + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); + } + + //@Override + public String getRootPackage() // Derives only from proto name + { + //throw new RuntimeException("[param-core] TODO:"); + return this.proto.getSimpleName().toString(); + } + + public String generateRootPackageDecl() + { + //throw new RuntimeException("[param-core] TODO: "); + return "package " + getRootPackage(); + } + + //@Override + public List getScribbleRuntimeImports() // FIXME: factor up + { + return Stream.of( + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE, + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE + //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + ).collect(Collectors.toList()); + } + + public String generateScribbleRuntimeImports() + { + return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n")); + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTOutputStateBuilder.java index 070ace3a1..31fef28ae 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTOutputStateBuilder.java @@ -15,6 +15,6 @@ public ParamCoreSTOutputStateBuilder(STSendActionBuilder sb) @Override public String getPreamble(STStateChanApiBuilder api, EState s) { - return ParamCoreSTStateChanApiBuilder.getStateChanPremable(api, s); + return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index bb87da877..25d614458 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -3,8 +3,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -40,17 +40,18 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //"s.ep.Err" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR; + return sEpWrite - + "(" - + sEpProto + + "(..TODO..)\n" + /*+ "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", \"" + a.mid + "\")\n" + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> sEpWrite + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", arg" + i + ")") - .collect(Collectors.joining("\n")) + "\n" - + "if " + sEpErr + " != nil {\n" - + "return nil" - + "}\n" + .mapToObj(i -> sEpWrite + "(..TODO..)") //+ sEpProto + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n"*/ + /*+ "if " + sEpErr + " != nil {\n" + + "return nil\n" + + "}\n"*/ + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index ae1507990..75cc1e02f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -1,59 +1,67 @@ package org.scribble.ext.go.core.codegen.statetype; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Predicate; import java.util.stream.Collectors; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.model.MState; -import org.scribble.model.endpoint.EState; -import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; -public class ParamCoreSTSessionApiBuilder +// Cf. STStateChanApiBuilder +public class ParamCoreSTSessionApiBuilder // FIXME: make base STSessionApiBuilder { - private ParamCoreSTStateChanApiBuilder api; + //private ParamCoreSTStateChanApiBuilder api; + private ParamCoreSTEndpointApiGenerator apigen; - public ParamCoreSTSessionApiBuilder(ParamCoreSTStateChanApiBuilder api) + //public ParamCoreSTSessionApiBuilder(ParamCoreSTStateChanApiBuilder api) + public ParamCoreSTSessionApiBuilder(ParamCoreSTEndpointApiGenerator apigen) { - this.api = api; + this.apigen = apigen; } //@Override - public Map buildSessionAPI() // FIXME: factor out + public Map build() // FIXME: factor out { - Module mod = api.job.getContext().getModule(api.gpn.getPrefix()); - GProtocolName simpname = api.gpn.getSimpleName(); + Module mod = this.apigen.job.getContext().getModule(this.apigen.proto.getPrefix()); + GProtocolName simpname = this.apigen.proto.getSimpleName(); ProtocolDecl gpd = mod.getProtocolDecl(simpname); - List roles = gpd.header.roledecls.getRoles(); - Set instates = new HashSet<>(); - Predicate f = (s) -> s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT; - if (f.test(api.graph.init)) + + /*Set instates = new HashSet<>(); + Predicate f = s -> s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT; + if (f.test(this.apigen.graph.init)) { - instates.add(api.graph.init); + instates.add(this.apigen.graph.init); } - instates.addAll(MState.getReachableStates(api.graph.init).stream().filter(f).collect(Collectors.toSet())); - - Map res = new HashMap<>(); - String dir = api.gpn.toString().replaceAll("\\.", "/") + "/"; + instates.addAll(MState.getReachableStates(this.apigen.graph.init).stream().filter(f).collect(Collectors.toSet()));*/ // roles - String sessclass = - "package " + api.getPackage() + "\n" // FIXME: factor out - + "\n" - + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + String sessPack = + //"package " + this.apigen.getRootPackage() + "\n" // FIXME: factor out + this.apigen.generateRootPackageDecl() + "\n" + "\n" - + roles.stream().map(r -> - "type _" + r + " struct { }\n" + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + + this.apigen.generateScribbleRuntimeImports() + "\n"; + + sessPack += "\n\n" + + "type " + simpname + " struct {\n" + + roles.stream().map(r -> r + " " + ParamCoreSTApiGenConstants.GO_ROLE_TYPE + "\n").collect(Collectors.joining("")) + // Just need role name constants for now -- params not fixed until endpoint creation + + "}\n" + + "\n" + + "func New" + simpname + "() " + simpname + " {\n" + + "return " + simpname + "{ " + roles.stream().map(r -> ParamCoreSTApiGenConstants.GO_ROLE_CONSTRUCTOR + + "(\"" + r + "\")").collect(Collectors.joining(", ")) + " }\n" + // Singleton types? + + "}\n"; + + /*sessPack += + roles.stream().map(r -> + "type _" + r + " struct { }\n" + "\n" + "func (*_" + r +") GetRoleName() string {\n" + "return \"" + r + "\"\n" @@ -68,21 +76,13 @@ public Map buildSessionAPI() // FIXME: factor out + "return __" + r + "\n" + "}" ).collect(Collectors.joining("\n\n")) + "\n" - + "\n" - + "type " + simpname + " struct {\n" - + roles.stream().map(r -> r + " *_" + r).collect(Collectors.joining("\n")) + "\n" // FIXME: role constants should be pointers? - + "}\n" - + "\n" - + "func New" + simpname + "() *" + simpname + "{\n" - + "return &" + simpname + "{ " + roles.stream().map(r -> "new" + r + "()").collect(Collectors.joining(", ")) + " }\n" - + "}"; + + "\n";*/ // Protocol and role specific endpoints - Function epTypeName = r -> "_Endpoint" + simpname + "_" + r; - sessclass += + /*Function epTypeName = r -> "_Endpoint" + simpname + "_" + r; + sessPack += roles.stream().map(r -> - "\n\n" - + "type " + epTypeName.apply(r) + " struct {\n" // FIXME: factor out + "\n\ntype " + epTypeName.apply(r) + " struct {\n" // FIXME: factor out + r + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "}\n" + "\n" @@ -90,10 +90,20 @@ public Map buildSessionAPI() // FIXME: factor out + "return &" + epTypeName.apply(r) + " { " + r + ": " + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "(P, P." + r + ") }\n" + "}" + ).collect(Collectors.joining(""));*/ + sessPack += "\n" + + roles.stream().map(r -> + "\n" + + "func New" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r) + "(p " + simpname + ") (*" + + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + ", " + ParamCoreSTApiGenConstants.GO_FINALISER_TYPE + ") {\n" + + "ep := " + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")\n" + + "return ep, ep." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINALISE + "\n" + + "}\n" ).collect(Collectors.joining("")); - res.put(dir + simpname + ".go", sessclass); - + String dir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; + Map res = new HashMap<>(); + res.put(dir + simpname + ".go", sessPack); return res; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index 1c729639a..4a1545e0c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -14,22 +14,25 @@ import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.main.Job; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.GProtocolName; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder { + protected final ParamCoreSTEndpointApiGenerator apigen; + public final ParamActualRole actual; // this.apigen.self.equals(this.actual.getName()) + //public final EGraph graph; + private int counter = 1; // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later - public ParamCoreSTStateChanApiBuilder(Job job, GProtocolName gpn, ParamActualRole role, EGraph graph) + // actual.getName().equals(this.role) + public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, ParamActualRole actual, EGraph graph) { - super(job, gpn, role, graph, + super(apigen.job, apigen.proto, apigen.self, graph, new ParamCoreSTOutputStateBuilder(new ParamCoreSTSendActionBuilder()), null, //new GoSTReceiveStateBuilder(new GoSTReceiveActionBuilder()), null, //new GoSTBranchStateBuilder(new GoSTBranchActionBuilder()), @@ -37,6 +40,8 @@ public ParamCoreSTStateChanApiBuilder(Job job, GProtocolName gpn, ParamActualRol new ParamCoreSTEndStateBuilder()); //throw new RuntimeException("[param-core] TODO:"); + this.apigen = apigen; + this.actual = actual; } protected ParamActualRole getSelf() @@ -44,12 +49,12 @@ protected ParamActualRole getSelf() return (ParamActualRole) this.getSelf(); } - @Override + /*@Override public String getPackage() { //throw new RuntimeException("[param-core] TODO:"); return this.gpn.getSimpleName().toString(); - } + }*/ @Override protected String makeSTStateName(EState s) @@ -59,9 +64,9 @@ protected String makeSTStateName(EState s) { return "_EndState"; } - String name = this.gpn.getSimpleName() + "_" + role + "_" + this.counter++; - //return (s.id == this.graph.init.id) ? name : "_" + name; // For "private" non-initial state channels - return name; + return this.apigen.proto.getSimpleName() + "_" + + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + + "_" + this.counter++; } @Override @@ -74,41 +79,36 @@ public String getFilePath(String filename) } return this.gpn.toString().replaceAll("\\.", "/") + "/" + filename + ".go"; } - - @Override - public Map buildSessionAPI() // FIXME: factor out - { - //throw new RuntimeException("[param-core] TODO:"); - return new ParamCoreSTSessionApiBuilder(this).buildSessionAPI(); - } - protected static String getPackageDecl(STStateChanApiBuilder api) + public String getActualRoleName() { - //throw new RuntimeException("[param-core] TODO: "); - return "package " + api.getPackage(); + return this.apigen.self.toString(); } - - protected static String getStateChanPremable(STStateChanApiBuilder api, EState s) + + protected String getStateChanPremable(EState s) { //throw new RuntimeException("[param-core] TODO: "); - String tname = api.getStateChanName(s); + String tname = this.getStateChanName(s); String res = - ParamCoreSTStateChanApiBuilder.getPackageDecl(api) + "\n" + this.apigen.generateRootPackageDecl() + "\n" + "\n" - + "import \"org/scribble/runtime/net\"\n" + + this.apigen.generateScribbleRuntimeImports() + "\n" + "\n" + "type " + tname + " struct{\n" - + "ep *net.MPSTEndpoint\n" // FIXME: factor out - + "state *net.LinearResource\n" // FIXME: EndSocket special case? // FIXME: only seems to work as a pointer (something to do with method calls via value recievers? is it copying the value before calling the function?) - + "}"; + + "ep *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + "state *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + "}\n"; - if (s.id == api.graph.init.id) + if (s.id == this.graph.init.id) { - res += - "\n\n" - + "func New" + tname + "(ep *_Endpoint" + api.gpn.getSimpleName() + "_" + api.role + ") *" + tname + " {\n" // FIXME: factor out - + "ep." + api.role + ".SetInit()\n" - + "return &" + tname + " { ep: ep." + api.role + ", state: &net.LinearResource { } }\n" + res += "\n" + + "func New" + tname + "(ep *" + //+ this.apigen.getGeneratedEndpointType() + + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + + ") *" + tname + " {\n" // FIXME: factor out + + "ep." + this.role + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_STARTPROTOCOL + "()\n" + + "return &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")}\n" + "}"; } @@ -121,10 +121,12 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b //throw new RuntimeException("[param-core] TODO: "); EState succ = curr.getSuccessor(a); return - "func (s *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(a) - + ") *" + ab.getReturnType(this, curr, succ) + " {\n" - + "s.state.Use()\n" + "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(a) + + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + ab.buildBody(this, curr, a, succ) + "\n" + "}"; } @@ -142,18 +144,22 @@ public String getChannelName(STStateChanApiBuilder api, EAction a) public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) // FIXME: refactor action builders as interfaces and use generic parameter for kind { //throw new RuntimeException("[param-core] TODO: "); + String sEp = + //"s.ep" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; String res = ""; if (succ.isTerminal()) { - res += "s.ep.SetDone()\n"; + res += sEp + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINISHPROTOCOL + "()\n"; } - res += "return &" + ab.getReturnType(this, curr, succ) + "{ ep: s.ep"; + res += "return &" + ab.getReturnType(this, curr, succ) + "{ " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; if (!succ.isTerminal()) { - res += ", state: &net.LinearResource {}"; // FIXME: EndSocket LinearResource special case + res += ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + ": &new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case } - res += " }"; + res += " }\n"; return res; } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index aa195ef1c..6fcc5aeec 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -42,7 +42,8 @@ message passing //* global protocol Proto1(role A(n), role B(n)) { - 1() from A[1..1] to B[1..n+1]; + 1() from A[1..1] to B[1..n]; + 2() from A[1..1] to B[1..n]; } //*/ From 86b57c4d21577283bad3a709aef8d2bd92caded9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 2 Sep 2017 20:34:42 +0100 Subject: [PATCH 112/433] Continued. --- .../statetype/ParamCoreSTApiGenConstants.java | 3 + .../ParamCoreSTReceiveActionBuilder.java | 57 +++++++++++++++++++ .../ParamCoreSTReceiveStateBuilder.java | 20 +++++++ .../ParamCoreSTSendActionBuilder.java | 4 +- .../ParamCoreSTStateChanApiBuilder.java | 2 +- 5 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveStateBuilder.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java index 751b3dd82..ca2da6eb8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java @@ -13,6 +13,7 @@ public class ParamCoreSTApiGenConstants public static final String GO_ENDPOINT_PROTO = "Proto"; public static final String GO_ENDPOINT_ERR = "Err"; public static final String GO_ENDPOINT_WRITE = "Write"; + public static final String GO_ENDPOINT_READ = "Read"; public static final String GO_ENDPOINT_STARTPROTOCOL = "StartProtocol"; public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; public static final String GO_ENDPOINT_FINALISE = "Finalise"; @@ -34,5 +35,7 @@ public class ParamCoreSTApiGenConstants public static final String GO_CROSS_SEND_FUN_PREFIX = "Send"; public static final String GO_CROSS_SEND_FUN_ARG = "arg"; + public static final String GO_CROSS_RECEIVE_FUN_PREFIX = "Recv"; + public static final String GO_CROSS_RECEIVE_FUN_ARG = "arg"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java new file mode 100644 index 000000000..0f8d3ae85 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -0,0 +1,57 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STReceiveActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class ParamCoreSTReceiveActionBuilder extends STReceiveActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + a.peer + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + + i + " *" + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + String sEpRecv = + //s.ep.Write + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READ; + /*String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + return + sEpRecv + + "(..TODO..)\n" + /*+ "(" + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", \"" + a.mid + "\")\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> sEpWrite + "(..TODO..)") //+ sEpProto + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n"*/ + /*+ "if " + sEpErr + " != nil {\n" + + "return nil\n" + + "}\n"*/ + + buildReturn(api, curr, succ); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveStateBuilder.java new file mode 100644 index 000000000..14bda71ff --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveStateBuilder.java @@ -0,0 +1,20 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import org.scribble.codegen.statetype.STReceiveActionBuilder; +import org.scribble.codegen.statetype.STReceiveStateBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; + +public class ParamCoreSTReceiveStateBuilder extends STReceiveStateBuilder +{ + public ParamCoreSTReceiveStateBuilder(STReceiveActionBuilder sb) + { + super(sb); + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 25d614458..8df7a3a55 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -32,14 +32,14 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //s.ep.Write ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITE; - String sEpProto = + /*String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; String sEpErr = //"s.ep.Err" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ return sEpWrite diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index 4a1545e0c..a2e3b652b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -34,7 +34,7 @@ public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, Pa { super(apigen.job, apigen.proto, apigen.self, graph, new ParamCoreSTOutputStateBuilder(new ParamCoreSTSendActionBuilder()), - null, //new GoSTReceiveStateBuilder(new GoSTReceiveActionBuilder()), + new ParamCoreSTReceiveStateBuilder(new ParamCoreSTReceiveActionBuilder()), null, //new GoSTBranchStateBuilder(new GoSTBranchActionBuilder()), null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), new ParamCoreSTEndStateBuilder()); From bab422c230def13d7ebfa362703ab4281a484d95 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 2 Sep 2017 21:19:12 +0100 Subject: [PATCH 113/433] Continued on param-core API gen. --- .../statetype/ParamCoreSTReceiveActionBuilder.java | 8 +++++--- .../codegen/statetype/ParamCoreSTSendActionBuilder.java | 8 +++++--- .../codegen/statetype/ParamCoreSTSessionApiBuilder.java | 5 +++-- .../codegen/statetype/ParamCoreSTStateChanApiBuilder.java | 8 ++++++++ scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 2 +- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 0f8d3ae85..c50faf57c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -5,6 +5,7 @@ import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -14,7 +15,9 @@ public class ParamCoreSTReceiveActionBuilder extends STReceiveActionBuilder @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + a.peer + "_" + a.mid; + return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; } @Override @@ -30,8 +33,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { String sEpRecv = //s.ep.Write - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READ; + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READ; /*String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 8df7a3a55..6b37c56ce 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -5,6 +5,7 @@ import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -14,7 +15,9 @@ public class ParamCoreSTSendActionBuilder extends STSendActionBuilder @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" + a.peer + "_" + a.mid; + return ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; } @Override @@ -30,8 +33,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { String sEpWrite = //s.ep.Write - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITE; + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITE; /*String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 75cc1e02f..5f2145730 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -47,7 +47,7 @@ public Map build() // FIXME: factor out //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + this.apigen.generateScribbleRuntimeImports() + "\n"; - sessPack += "\n\n" + sessPack += "\n" + "type " + simpname + " struct {\n" + roles.stream().map(r -> r + " " + ParamCoreSTApiGenConstants.GO_ROLE_TYPE + "\n").collect(Collectors.joining("")) // Just need role name constants for now -- params not fixed until endpoint creation @@ -94,7 +94,8 @@ public Map build() // FIXME: factor out sessPack += "\n" + roles.stream().map(r -> "\n" - + "func New" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r) + "(p " + simpname + ") (*" + + "func New" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r) + + "(p " + simpname + ", params map[string]int) (*" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + ", " + ParamCoreSTApiGenConstants.GO_FINALISER_TYPE + ") {\n" + "ep := " + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")\n" + "return ep, ep." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINALISE + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index a2e3b652b..fdfc8eb8d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -14,6 +14,7 @@ import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; @@ -48,6 +49,13 @@ protected ParamActualRole getSelf() { return (ParamActualRole) this.getSelf(); } + + // Not actual roles; param roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName + public static String getGeneratedParamRoleName(ParamRole r) + { + return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); + } + /*@Override public String getPackage() diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 6fcc5aeec..ac2d27068 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -43,7 +43,7 @@ message passing global protocol Proto1(role A(n), role B(n)) { 1() from A[1..1] to B[1..n]; - 2() from A[1..1] to B[1..n]; + 2() from B[1..n] to B[1..1]; } //*/ From b121a6d8fa03074bd1eb77de2723a35dd1e2ab0d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 2 Sep 2017 21:38:12 +0100 Subject: [PATCH 114/433] Minor. --- .../core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index fdfc8eb8d..b1361a17e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -167,7 +167,7 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) / res += ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": &new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case } - res += " }\n"; + res += " }"; return res; } From 6e7ef288923611e762675a481e8880288c65c125 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 4 Sep 2017 15:48:14 +0100 Subject: [PATCH 115/433] Minor to param-core Session API gen. --- .../statetype/ParamCoreSTSessionApiBuilder.java | 2 +- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 5f2145730..73f8e0308 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -97,7 +97,7 @@ public Map build() // FIXME: factor out + "func New" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r) + "(p " + simpname + ", params map[string]int) (*" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + ", " + ParamCoreSTApiGenConstants.GO_FINALISER_TYPE + ") {\n" - + "ep := " + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")\n" + + "ep := " + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ", params)\n" + "return ep, ep." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINALISE + "\n" + "}\n" ).collect(Collectors.joining("")); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index ac2d27068..e1fff175a 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -35,12 +35,21 @@ message passing // encode "multi-choices" by local role(thread) forking/joining? for dynamic join/leave use param-value dependency? (run-time checked?) + +// statechan interfaces -- use Go's structural typing, individual action funs -- combine with select-branch style */ + // Add a scribble version and time/date to API output header -//* -global protocol Proto1(role A(n), role B(n)) +global protocol Proto1(role A(n, m), role B(n, m)) +{ + 1() from A[1..1] to B[n..n]; + 2() from A[1..1] to B[m..m]; +} + +/* +global protocol Proto1(role A(n), role B(n)) // Testing API gen { 1() from A[1..1] to B[1..n]; 2() from B[1..n] to B[1..1]; From f6ad0f89ba6744b476154333f2c1adf2b83d0a8e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 5 Sep 2017 14:05:22 +0100 Subject: [PATCH 116/433] Minor. --- .../src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java | 1 + 1 file changed, 1 insertion(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 2250ec5f4..8e382b56f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -44,6 +44,7 @@ import org.scribble.type.name.Role; import org.scribble.util.ScribParserException; +// N.B. this is the CL for both -goapi and param-core extensions public class ParamCommandLine extends CommandLine { protected final Map paramArgs; // Maps each flag to list of associated argument values From 3ebcbd7b0becccb1028ade09be98167bb68e9f97 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 5 Sep 2017 18:09:19 +0100 Subject: [PATCH 117/433] Separated original -goapi CL from param-core CL (more specifically, separated the MainContexts). --- .../scribble/ext/go/cli/ParamCLArgFlag.java | 9 - .../scribble/ext/go/cli/ParamCLArgParser.java | 74 +-- .../scribble/ext/go/cli/ParamCommandLine.java | 406 +------------- .../ext/go/core/cli/ParamCoreCLArgFlag.java | 12 + .../ext/go/core/cli/ParamCoreCLArgParser.java | 173 ++++++ .../ext/go/core/cli/ParamCoreCommandLine.java | 503 ++++++++++++++++++ .../go/core/main/ParamCoreMainContext.java | 66 +++ .../ext/go/main/ParamMainContext.java | 16 +- 8 files changed, 757 insertions(+), 502 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java index 7295535fd..236fe39cf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java @@ -2,15 +2,6 @@ public enum ParamCLArgFlag { - // Unique flags - PARAM, - - // Non-unique flags - // Non-unique flags GO_API_GEN, - - PARAM_CORE_EFSM, - PARAM_CORE_EFSM_PNG, - PARAM_CORE_API_GEN, } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java index eb8defaf2..8ee2a2422 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java @@ -9,32 +9,18 @@ public class ParamCLArgParser extends CLArgParser { - // Unique flags - public static final String PARAM_FLAG = "-param"; - // Non-unique flags public static final String GO_API_GEN_FLAG = "-goapi"; - - public static final String PARAM_CORE_EFSM_FLAG = "-param-fsm"; - public static final String PARAM_CORE_EFSM_PNG_FLAG = "-param-fsmpng"; - public static final String PARAM_CORE_API_GEN_FLAG = "-param-api"; - private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); - { - ParamCLArgParser.PARAM_UNIQUE_FLAGS.put(ParamCLArgParser.PARAM_FLAG, ParamCLArgFlag.PARAM); - } + //private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); private static final Map PARAM_NON_UNIQUE_FLAGS = new HashMap<>(); { - ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.PARAM_CORE_EFSM_FLAG, ParamCLArgFlag.PARAM_CORE_EFSM); - ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.PARAM_CORE_EFSM_PNG_FLAG, ParamCLArgFlag.PARAM_CORE_EFSM_PNG); ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.GO_API_GEN_FLAG, ParamCLArgFlag.GO_API_GEN); - ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.PARAM_CORE_API_GEN_FLAG, ParamCLArgFlag.PARAM_CORE_API_GEN); } private static final Map PARAM_FLAGS = new HashMap<>(); { - ParamCLArgParser.PARAM_FLAGS.putAll(ParamCLArgParser.PARAM_UNIQUE_FLAGS); ParamCLArgParser.PARAM_FLAGS.putAll(ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS); } @@ -65,24 +51,12 @@ protected int parseFlag(int i) throws CommandLineException String flag = this.args[i]; switch (flag) { - // Unique flags - - case ParamCLArgParser.PARAM_FLAG: - { - return paramParseParam(i); - } - - // Non-unique flags case ParamCLArgParser.GO_API_GEN_FLAG: { return goParseProtoAndRoleArgs(flag, i); } - - case ParamCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); - case ParamCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); - case ParamCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParseRoleArg(flag, i); // Base CL @@ -94,52 +68,6 @@ protected int parseFlag(int i) throws CommandLineException } } - private int paramParseParam(int i) throws CommandLineException - { - if ((i + 1) >= this.args.length) - { - throw new CommandLineException("Missing simple global protocol name argument."); - } - String proto = this.args[++i]; - paramCheckAndAddUniqueFlag(ParamCLArgParser.PARAM_FLAG, new String[] { proto }); - return i; - } - - private void paramCheckAndAddUniqueFlag(String flag, String[] args) throws CommandLineException - { - ParamCLArgFlag argFlag = ParamCLArgParser.PARAM_UNIQUE_FLAGS.get(flag); - if (this.paramParsed.containsKey(argFlag)) - { - throw new CommandLineException("Duplicate flag: " + flag); - } - this.paramParsed.put(argFlag, args); - } - - private int paramParseRoleArg(String f, int i) throws CommandLineException - { - ParamCLArgFlag flag = ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); - if ((i + 1) >= this.args.length) - { - throw new CommandLineException("Missing role argument"); - } - String role = this.args[++i]; - goConcatArgs(flag, role); - return i; - } - - protected int paramParseRoleAndFileArgs(String f, int i) throws CommandLineException - { - ParamCLArgFlag flag = ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); - if ((i + 2) >= this.args.length) - { - throw new CommandLineException("Missing role/file arguments"); - } - String role = this.args[++i]; - String png = this.args[++i]; - goConcatArgs(flag, role, png); - return i; - } - // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java index 8e382b56f..319ed6f29 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java @@ -1,38 +1,18 @@ package org.scribble.ext.go.cli; import java.nio.file.Path; -import java.util.Collection; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.stream.Collectors; -import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; import org.scribble.cli.CLArgFlag; import org.scribble.cli.CommandLine; import org.scribble.cli.CommandLineException; import org.scribble.ext.go.codegen.statetype.go.GoEndpointApiGenerator; -import org.scribble.ext.go.core.ast.ParamCoreAstFactory; -import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.global.ParamCoreGProtocolDeclTranslator; -import org.scribble.ext.go.core.ast.global.ParamCoreGType; import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEGraphBuilder; import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.main.ParamException; -import org.scribble.ext.go.main.ParamJob; import org.scribble.ext.go.main.ParamMainContext; -import org.scribble.ext.go.type.index.ParamIndexVar; -import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; import org.scribble.main.JobContext; @@ -51,10 +31,8 @@ public class ParamCommandLine extends CommandLine // HACK: store in (Core) Job/JobContext? protected GProtocolDecl gpd; - //protected Map, ParamCoreLType>> P0; protected Map> P0; - //protected Map, EGraph>> E0; // FIXME: make a "proper role" for param APIs - protected Map> E0; // FIXME: make a "proper role" for param APIs + protected Map> E0; //protected ParamCoreSModel model; public ParamCommandLine(String... args) throws CommandLineException @@ -113,19 +91,6 @@ public static void main(String[] args) throws CommandLineException, AntlrSourceE new ParamCommandLine(args).run(); } - @Override - protected void doValidationTasks(Job job) throws ParamCoreSyntaxException, AntlrSourceException, ScribParserException, CommandLineException - { - if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM)) - { - doParamCoreValidationTasks((ParamJob) job); - } - else - { - super.doValidationTasks(job); - } - } - @Override protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, CommandLineException { @@ -141,378 +106,9 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co outputClasses(goClasses); } } - else if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_API_GEN)) - { - JobContext jcontext = job.getContext(); - String[] args = this.paramArgs.get(ParamCLArgFlag.PARAM_CORE_API_GEN); - for (int i = 0; i < args.length; i += 1) - { - String simpname = this.paramArgs.get(ParamCLArgFlag.PARAM)[0]; - GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); - Role role = checkRoleArg(jcontext, fullname, args[i]); - /*for (ParamActualRole ranges : this.P0.get(role).keySet()) - { - EGraph efsm = this.E0.get(role).get(ranges); - Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, ranges, efsm).build(); - outputClasses(goClasses); - }*/ - Map actuals = this.E0.get(role); - Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, role, actuals).build(); - outputClasses(goClasses); - } - } else { super.doNonAttemptableOutputTasks(job); } } - - private void doParamCoreValidationTasks(ParamJob j) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException - { - /*if (this.args.containsKey(CLArgFlag.PROJECT)) // HACK - // modules/f17/src/test/scrib/demo/fase17/AppD.scr in [default] mode bug --- projection/EFSM not properly formed if this if is commented ???? - { - - }*/ - - paramCorePreContextBuilding(j); - - GProtocolName simpname = new GProtocolName(this.paramArgs.get(ParamCLArgFlag.PARAM)[0]); - if (simpname.toString().equals("[ParamCoreAllTest]")) // HACK: ParamCoreAllTest - { - paramCoreParseAndCheckWF(j); // Includes base passes - } - else - { - paramCoreParseAndCheckWF(j, simpname); // Includes base passes - } - - // FIXME? param-core FSM building only used for param-core validation -- output tasks, e.g., -api, will still use default Scribble FSMs - // -- but the FSMs should be the same? -- no: action assertions treated differently in core than base - } - - - // Refactor into Param(Core)Job? - // Following methods are for assrt-*core* - - private void paramCorePreContextBuilding(ParamJob job) throws ScribbleException - { - job.runContextBuildingPasses(); - - //job.runVisitorPassOnParsedModules(RecRemover.class); // FIXME: Integrate into main passes? Do before unfolding? - // FIXME: no -- revise to support annots - } - - // Pre: assrtPreContextBuilding(job) - private void paramCoreParseAndCheckWF(ParamJob job) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException - { - Module main = job.getContext().getMainModule(); - for (GProtocolDecl gpd : main.getGlobalProtocolDecls()) - { - if (!gpd.isAuxModifier()) - { - paramCoreParseAndCheckWF(job, gpd.getHeader().getDeclName()); // decl name is simple name - } - } - } - - // Pre: paramCorePreContextBuilding(job) - private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException - { - Module main = job.getContext().getMainModule(); - if (!main.hasProtocolDecl(simpname)) - { - throw new ParamException("[param-core] Global protocol not found: " + simpname); - } - this.gpd = (GProtocolDecl) main.getProtocolDecl(simpname); - - ParamCoreAstFactory af = new ParamCoreAstFactory(); - ParamCoreGType gt = new ParamCoreGProtocolDeclTranslator(job, af).translate(this.gpd); - - job.debugPrintln("\n[param-core] Translated:\n " + gt); - - if (!gt.isWellFormed(job, gpd)) - { - throw new ParamException("[param-core] Global type not well-formed:\n " + gt); - } - - //Map>> - Map> - protoRoles = getProtoRoles(job, gt); - - job.debugPrintln("\n[param-core] Computed roles: " + protoRoles); - - this.P0 = new HashMap<>(); - for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? - { - //for (Set ranges : protoRoles.get(r)) - for (ParamActualRole ranges : protoRoles.get(r)) - { - //ParamCoreLType lt = gt.project(af, r, ranges); - ParamCoreLType lt = gt.project(af, ranges); - //Map, ParamCoreLType> tmp = P0.get(r); - Map tmp = P0.get(r); - if (tmp == null) - { - tmp = new HashMap<>(); - P0.put(r, tmp); - } - tmp.put(ranges, lt); - - job.debugPrintln("\n[param-core] Projected onto " + r + " for " + ranges + ":\n " + lt); - } - } - - ParamCoreEGraphBuilder builder = new ParamCoreEGraphBuilder(job); - this.E0 = new HashMap<>(); - for (Role r : P0.keySet()) - { - //for (Set ranges : this.P0.get(r).keySet()) - for (ParamActualRole ranges : this.P0.get(r).keySet()) - { - EGraph g = builder.build(this.P0.get(r).get(ranges)); - //Map, EGraph> tmp = this.E0.get(r); - Map tmp = this.E0.get(r); - if (tmp == null) - { - tmp = new HashMap<>(); - this.E0.put(r, tmp); - } - tmp.put(ranges, g); - - job.debugPrintln("\n[param-core] Built endpoint graph for " - //+ r + " for " - + ranges + ":\n" + g.toDot()); - } - } - - /*assrtCoreValidate(job, simpname, gpd.isExplicitModifier());//, this.E0); // TODO - - /*if (!job.fair) - { - Map U0 = new HashMap<>(); - for (Role r : E0.keySet()) - { - EState u = E0.get(r).unfairTransform(); - U0.put(r, u); - - job.debugPrintln - //System.out.println - ("\n[param-core] Unfair transform for " + r + ":\n" + u.toDot()); - } - - //validate(job, gpd.isExplicitModifier(), U0, true); //TODO - }*/ - - //((ParamJob) job).runF17ProjectionPasses(); // projections not built on demand; cf. models - - //return gt; - } - - // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? - - //..HERE FIXME ActualParam -- ParamRange is now already a Set - - private //Map>> - Map> - getProtoRoles(ParamJob job, ParamCoreGType gt) - { - Set prs = gt.getParamRoles(); - - Map> map - = prs.stream() - .map(x -> x.getName()) - .distinct() - .collect(Collectors.toMap(x -> x, x -> prs.stream().filter(y -> y.getName().equals(x)).collect(Collectors.toSet()))); - - Map>> powersets = map.keySet().stream().collect(Collectors.toMap(k -> k, k -> new HashSet<>())); - for (Role n : map.keySet()) - { - Set> tmp = powersets.get(n); - Set todo = new HashSet<>(map.get(n)); - while (!todo.isEmpty()) - { - Iterator i = todo.iterator(); - ParamRole next = i.next(); - i.remove(); - Set range = new HashSet<>(); - //range.add(next.range); - range.add(next.ranges.iterator().next()); - if (!tmp.contains(next)) - { - tmp.addAll(tmp.stream().map(t -> - { - Set ggg = new HashSet<>(); - ggg.addAll(t); - ggg.add(range.iterator().next()); - return ggg; - }).collect(Collectors.toSet())); - tmp.add(range); - } - } - } - - //Map>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); - Map> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); - for (Role r : powersets.keySet()) - { - Set> powset = powersets.get(r); - int i = 1; - int size = powset.size(); - - job.debugPrintln("\n[param-core] Ranges powerset for " + r + ": " + powset); - - for (Set cand : powset) - { - Set coset = powset.stream().filter(f -> f.stream().noneMatch(g -> cand.contains(g))).flatMap(Collection::stream).collect(Collectors.toSet()); - - String z3 = ""; - - if (cand.size() > 0) - { - z3 += cand.stream().map(c -> "(and (>= id " + c.start.toSmt2Formula() + ") (<= id " + c.end.toSmt2Formula() + ")" - + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") - + ")") - .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); - } - - if (coset.size() > 0) - { - if (cand.size() > 0) - { - z3 = "(and " + z3 + " "; - } - z3 += coset.stream().map(c -> "(and (not (and (>= id " + c.start.toSmt2Formula() + ") (<= id " + c.end.toSmt2Formula() + ")))" - + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") - + ")") - .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); - if (cand.size() > 0) - { - z3 += ")"; - } - } - - //Set actuals - Set actuals - = cand.stream().flatMap(c -> c.getVars().stream()).collect(Collectors.toSet()); - actuals.addAll(coset.stream().flatMap(c -> c.getVars().stream()).collect(Collectors.toSet())); - //if (!actuals.isEmpty()) - { - z3 = "(exists ((id Int) " - + actuals.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) - + ") " + z3 + ")"; - } - - z3 = //"(declare-const id Int)\n - "(assert " + z3 + ")"; - - job.debugPrintln("\n[param-core] Candidate (" + i++ + "/" + size + "): " + cand); - job.debugPrintln("[param-core] Co-set: " + coset); - job.debugPrintln("[param-core] Running Z3 on:\n" + z3); - - if (Z3Wrapper.checkSat(job, this.gpd, z3)) - { - //protoRoles.get(r).add(cand); - protoRoles.get(r).add(new ParamActualRole(r.toString(), cand, coset)); - } - } - } - return protoRoles; - } - - // FIXME: factor out -- cf. super.doAttemptableOutputTasks - @Override - protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleException - { - if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_EFSM)) - { - String[] args = this.paramArgs.get(ParamCLArgFlag.PARAM_CORE_EFSM); - for (int i = 0; i < args.length; i += 1) - { - Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); - this.E0.get(role).entrySet().forEach(e -> - { - String out = e.getValue().toDot(); - System.out.println("\n" + role + " " + e.getKey() + ":\n" + out); // Endpoint graphs are "inlined" (a single graph is built) - }); - } - } - if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_EFSM_PNG)) - { - String[] args = this.paramArgs.get(ParamCLArgFlag.PARAM_CORE_EFSM_PNG); - for (int i = 0; i < args.length; i += 2) - { - Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); - String png = args[i+1]; - //for (Entry, EGraph> e : this.E0.get(role).entrySet()) - for (Entry e : this.E0.get(role).entrySet()) - { - String out = e.getValue().init.toDot(); - runDot(out, png); - } - } - } - /*if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_MODEL)) - { - System.out.println("\n" + model.toDot()); - } - if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_MODEL_PNG)) - { - String[] arg = this.paramArgs.get(ParamCLArgFlag.PARAM_CORE_MODEL_PNG); - String png = arg[0]; - runDot(model.toDot(), png); - }*/ - } - - /*private void assrtCoreValidate(Job job, GProtocolName simpname, boolean isExplicit, - //Map E0, - boolean... unfair) throws ScribbleException, CommandLineException - { - this.model = new ParamCoreSModelBuilder(job.sf).build(this.E0, isExplicit); - - job.debugPrintln("\n[param-core] Built model:\n" + this.model.toDot()); - - if (unfair.length == 0 || !unfair[0]) - { - ParamCoreSafetyErrors serrs = this.model.getSafetyErrors(job, simpname); // job just for debug printing - if (serrs.isSafe()) - { - job.debugPrintln("\n[param-core] Protocol safe."); - } - else - { - throw new ParamException("[param-core] Protocol not safe:\n" + serrs); - } - } - - /*F17ProgressErrors perrs = m.getProgressErrors(); - if (perrs.satisfiesProgress()) - { - job.debugPrintln - //System.out.println - ("\n[f17] " + ((unfair.length == 0) ? "Fair protocol" : "Protocol") + " satisfies progress."); - } - else - { - - // FIXME: refactor eventual reception as 1-bounded stable check - Set staberrs = m.getStableErrors(); - if (perrs.eventualReception.isEmpty()) - { - if (!staberrs.isEmpty()) - { - throw new RuntimeException("[f17] 1-stable check failure: " + staberrs); - } - } - else - { - if (staberrs.isEmpty()) - { - throw new RuntimeException("[f17] 1-stable check failure: " + perrs); - } - } - - throw new F17Exception("\n[f17] " + ((unfair.length == 0) ? "Fair protocol" : "Protocol") + " violates progress.\n" + perrs); - }* / - }*/ } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java new file mode 100644 index 000000000..58fd90f05 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java @@ -0,0 +1,12 @@ +package org.scribble.ext.go.core.cli; + +public enum ParamCoreCLArgFlag +{ + // Unique flags + PARAM, + + // Non-unique flags + PARAM_CORE_EFSM, + PARAM_CORE_EFSM_PNG, + PARAM_CORE_API_GEN, +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java new file mode 100644 index 000000000..0a9e550f9 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java @@ -0,0 +1,173 @@ +package org.scribble.ext.go.core.cli; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.scribble.cli.CLArgParser; +import org.scribble.cli.CommandLineException; + +public class ParamCoreCLArgParser extends CLArgParser +{ + // Unique flags + public static final String PARAM_FLAG = "-param"; + + // Non-unique flags + public static final String GO_API_GEN_FLAG = "-goapi"; + + public static final String PARAM_CORE_EFSM_FLAG = "-param-fsm"; + public static final String PARAM_CORE_EFSM_PNG_FLAG = "-param-fsmpng"; + public static final String PARAM_CORE_API_GEN_FLAG = "-param-api"; + + private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); + { + ParamCoreCLArgParser.PARAM_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_FLAG, ParamCoreCLArgFlag.PARAM); + } + + private static final Map PARAM_NON_UNIQUE_FLAGS = new HashMap<>(); + { + ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_CORE_EFSM_FLAG, ParamCoreCLArgFlag.PARAM_CORE_EFSM); + ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG, ParamCoreCLArgFlag.PARAM_CORE_EFSM_PNG); + ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_CORE_API_GEN_FLAG, ParamCoreCLArgFlag.PARAM_CORE_API_GEN); + } + + private static final Map PARAM_FLAGS = new HashMap<>(); + { + ParamCoreCLArgParser.PARAM_FLAGS.putAll(ParamCoreCLArgParser.PARAM_UNIQUE_FLAGS); + ParamCoreCLArgParser.PARAM_FLAGS.putAll(ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS); + } + + private final Map paramParsed = new HashMap<>(); + + public ParamCoreCLArgParser(String[] args) throws CommandLineException + { + super(args); // Assigns this.args and calls parseArgs + } + + public Map getParamArgs() throws CommandLineException + { + //super.parseArgs(); // Needed + return this.paramParsed; + } + + @Override + protected boolean isFlag(String arg) + { + return ParamCoreCLArgParser.PARAM_FLAGS.containsKey(arg) || super.isFlag(arg); + } + + // Pre: i is the index of the current flag to parse + // Post: i is the index of the last argument parsed -- parseArgs does the index increment to the next current flag + @Override + protected int parseFlag(int i) throws CommandLineException + { + String flag = this.args[i]; + switch (flag) + { + // Unique flags + + case ParamCoreCLArgParser.PARAM_FLAG: + { + return paramParseParam(i); + } + + + // Non-unique flags + + case ParamCoreCLArgParser.GO_API_GEN_FLAG: + { + return goParseProtoAndRoleArgs(flag, i); + } + + case ParamCoreCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); + case ParamCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); + case ParamCoreCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParseRoleArg(flag, i); + + + // Base CL + + default: + { + return super.parseFlag(i); + } + } + } + + private int paramParseParam(int i) throws CommandLineException + { + if ((i + 1) >= this.args.length) + { + throw new CommandLineException("Missing simple global protocol name argument."); + } + String proto = this.args[++i]; + paramCheckAndAddUniqueFlag(ParamCoreCLArgParser.PARAM_FLAG, new String[] { proto }); + return i; + } + + private void paramCheckAndAddUniqueFlag(String flag, String[] args) throws CommandLineException + { + ParamCoreCLArgFlag argFlag = ParamCoreCLArgParser.PARAM_UNIQUE_FLAGS.get(flag); + if (this.paramParsed.containsKey(argFlag)) + { + throw new CommandLineException("Duplicate flag: " + flag); + } + this.paramParsed.put(argFlag, args); + } + + private int paramParseRoleArg(String f, int i) throws CommandLineException + { + ParamCoreCLArgFlag flag = ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + if ((i + 1) >= this.args.length) + { + throw new CommandLineException("Missing role argument"); + } + String role = this.args[++i]; + goConcatArgs(flag, role); + return i; + } + + protected int paramParseRoleAndFileArgs(String f, int i) throws CommandLineException + { + ParamCoreCLArgFlag flag = ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + if ((i + 2) >= this.args.length) + { + throw new CommandLineException("Missing role/file arguments"); + } + String role = this.args[++i]; + String png = this.args[++i]; + goConcatArgs(flag, role, png); + return i; + } + + // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag + private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException + { + ParamCoreCLArgFlag flag = ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + if ((i + 2) >= this.args.length) + { + throw new CommandLineException("Missing protocol/role arguments"); + } + String proto = this.args[++i]; + String role = this.args[++i]; + goConcatArgs(flag, proto, role); + return i; + } + + // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag + private void goConcatArgs(ParamCoreCLArgFlag flag, String... toAdd) + { + String[] args = this.paramParsed.get(flag); + if (args == null) + { + args = Arrays.copyOf(toAdd, toAdd.length); + } + else + { + String[] tmp = new String[args.length + toAdd.length]; + System.arraycopy(args, 0, tmp, 0, args.length); + System.arraycopy(toAdd, 0, tmp, args.length, toAdd.length); + args = tmp; + } + this.paramParsed.put(flag, args); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java new file mode 100644 index 000000000..c3cbe0ca6 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java @@ -0,0 +1,503 @@ +package org.scribble.ext.go.core.cli; + +import java.nio.file.Path; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.ast.Module; +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.cli.CLArgFlag; +import org.scribble.cli.CommandLine; +import org.scribble.cli.CommandLineException; +import org.scribble.ext.go.core.ast.ParamCoreAstFactory; +import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; +import org.scribble.ext.go.core.ast.global.ParamCoreGProtocolDeclTranslator; +import org.scribble.ext.go.core.ast.global.ParamCoreGType; +import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; +import org.scribble.ext.go.core.main.ParamCoreMainContext; +import org.scribble.ext.go.core.model.endpoint.ParamCoreEGraphBuilder; +import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.ParamException; +import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.util.Z3Wrapper; +import org.scribble.main.AntlrSourceException; +import org.scribble.main.Job; +import org.scribble.main.JobContext; +import org.scribble.main.ScribbleException; +import org.scribble.main.resource.DirectoryResourceLocator; +import org.scribble.main.resource.ResourceLocator; +import org.scribble.model.endpoint.EGraph; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; +import org.scribble.util.ScribParserException; + +// N.B. this is the CL for both -goapi and param-core extensions +public class ParamCoreCommandLine extends CommandLine +{ + protected final Map paramArgs; // Maps each flag to list of associated argument values + + // HACK: store in (Core) Job/JobContext? + protected GProtocolDecl gpd; + protected Map> P0; + protected Map> E0; + //protected ParamCoreSModel model; + + public ParamCoreCommandLine(String... args) throws CommandLineException + { + this(new ParamCoreCLArgParser(args)); + } + + private ParamCoreCommandLine(ParamCoreCLArgParser p) throws CommandLineException + { + super(p); // calls p.parse() + if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) + { + // FIXME: should be fine + throw new RuntimeException("[param] Inline modules not supported:\n" + this.args.get(CLArgFlag.INLINE_MAIN_MOD)); + } + // FIXME? Duplicated from core + if (!this.args.containsKey(CLArgFlag.MAIN_MOD)) + { + throw new CommandLineException("No main module has been specified\r\n"); + } + this.paramArgs = p.getParamArgs(); + } + + @Override + protected ParamCoreMainContext newMainContext() throws ScribParserException, ScribbleException + { + boolean debug = this.args.containsKey(CLArgFlag.VERBOSE); // TODO: factor out with CommandLine (cf. MainContext fields) + boolean useOldWF = this.args.containsKey(CLArgFlag.OLD_WF); + boolean noLiveness = this.args.containsKey(CLArgFlag.NO_LIVENESS); + boolean minEfsm = this.args.containsKey(CLArgFlag.LTSCONVERT_MIN); + boolean fair = this.args.containsKey(CLArgFlag.FAIR); + boolean noLocalChoiceSubjectCheck = this.args.containsKey(CLArgFlag.NO_LOCAL_CHOICE_SUBJECT_CHECK); + boolean noAcceptCorrelationCheck = this.args.containsKey(CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); + boolean noValidation = this.args.containsKey(CLArgFlag.NO_VALIDATION); + + List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) + ? CommandLine.parseImportPaths(this.args.get(CLArgFlag.IMPORT_PATH)[0]) + : Collections.emptyList(); + ResourceLocator locator = new DirectoryResourceLocator(impaths); + if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) + { + /*return new ParamMainContext(debug, locator, this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0], useOldWF, noLiveness, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, solver);*/ + throw new RuntimeException("[param] Shouldn't get in here:\n" + this.args.get(CLArgFlag.INLINE_MAIN_MOD)[0]); // Checked in constructor + } + else + { + Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); + return new ParamCoreMainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + } + } + + public static void main(String[] args) throws CommandLineException, AntlrSourceException + { + new ParamCoreCommandLine(args).run(); + } + + @Override + protected void doValidationTasks(Job job) throws ParamCoreSyntaxException, AntlrSourceException, ScribParserException, CommandLineException + { + if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM)) + { + doParamCoreValidationTasks((ParamJob) job); + } + else + { + super.doValidationTasks(job); + } + } + + @Override + protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, CommandLineException + { + if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM_CORE_API_GEN)) + { + JobContext jcontext = job.getContext(); + String[] args = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_API_GEN); + for (int i = 0; i < args.length; i += 1) + { + String simpname = this.paramArgs.get(ParamCoreCLArgFlag.PARAM)[0]; + GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); + Role role = checkRoleArg(jcontext, fullname, args[i]); + /*for (ParamActualRole ranges : this.P0.get(role).keySet()) + { + EGraph efsm = this.E0.get(role).get(ranges); + Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, ranges, efsm).build(); + outputClasses(goClasses); + }*/ + Map actuals = this.E0.get(role); + Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, role, actuals).build(); + outputClasses(goClasses); + } + } + else + { + super.doNonAttemptableOutputTasks(job); + } + } + + private void doParamCoreValidationTasks(ParamJob j) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + { + /*if (this.args.containsKey(CLArgFlag.PROJECT)) // HACK + // modules/f17/src/test/scrib/demo/fase17/AppD.scr in [default] mode bug --- projection/EFSM not properly formed if this if is commented ???? + { + + }*/ + + paramCorePreContextBuilding(j); + + GProtocolName simpname = new GProtocolName(this.paramArgs.get(ParamCoreCLArgFlag.PARAM)[0]); + if (simpname.toString().equals("[ParamCoreAllTest]")) // HACK: ParamCoreAllTest + { + paramCoreParseAndCheckWF(j); // Includes base passes + } + else + { + paramCoreParseAndCheckWF(j, simpname); // Includes base passes + } + + // FIXME? param-core FSM building only used for param-core validation -- output tasks, e.g., -api, will still use default Scribble FSMs + // -- but the FSMs should be the same? -- no: action assertions treated differently in core than base + } + + + // Refactor into Param(Core)Job? + // Following methods are for assrt-*core* + + private void paramCorePreContextBuilding(ParamJob job) throws ScribbleException + { + job.runContextBuildingPasses(); + + //job.runVisitorPassOnParsedModules(RecRemover.class); // FIXME: Integrate into main passes? Do before unfolding? + // FIXME: no -- revise to support annots + } + + // Pre: assrtPreContextBuilding(job) + private void paramCoreParseAndCheckWF(ParamJob job) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + { + Module main = job.getContext().getMainModule(); + for (GProtocolDecl gpd : main.getGlobalProtocolDecls()) + { + if (!gpd.isAuxModifier()) + { + paramCoreParseAndCheckWF(job, gpd.getHeader().getDeclName()); // decl name is simple name + } + } + } + + // Pre: paramCorePreContextBuilding(job) + private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + { + Module main = job.getContext().getMainModule(); + if (!main.hasProtocolDecl(simpname)) + { + throw new ParamException("[param-core] Global protocol not found: " + simpname); + } + this.gpd = (GProtocolDecl) main.getProtocolDecl(simpname); + + ParamCoreAstFactory af = new ParamCoreAstFactory(); + ParamCoreGType gt = new ParamCoreGProtocolDeclTranslator(job, af).translate(this.gpd); + + job.debugPrintln("\n[param-core] Translated:\n " + gt); + + if (!gt.isWellFormed(job, gpd)) + { + throw new ParamException("[param-core] Global type not well-formed:\n " + gt); + } + + //Map>> + Map> + protoRoles = getProtoRoles(job, gt); + + job.debugPrintln("\n[param-core] Computed roles: " + protoRoles); + + this.P0 = new HashMap<>(); + for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? + { + //for (Set ranges : protoRoles.get(r)) + for (ParamActualRole ranges : protoRoles.get(r)) + { + //ParamCoreLType lt = gt.project(af, r, ranges); + ParamCoreLType lt = gt.project(af, ranges); + //Map, ParamCoreLType> tmp = P0.get(r); + Map tmp = P0.get(r); + if (tmp == null) + { + tmp = new HashMap<>(); + P0.put(r, tmp); + } + tmp.put(ranges, lt); + + job.debugPrintln("\n[param-core] Projected onto " + r + " for " + ranges + ":\n " + lt); + } + } + + ParamCoreEGraphBuilder builder = new ParamCoreEGraphBuilder(job); + this.E0 = new HashMap<>(); + for (Role r : P0.keySet()) + { + //for (Set ranges : this.P0.get(r).keySet()) + for (ParamActualRole ranges : this.P0.get(r).keySet()) + { + EGraph g = builder.build(this.P0.get(r).get(ranges)); + //Map, EGraph> tmp = this.E0.get(r); + Map tmp = this.E0.get(r); + if (tmp == null) + { + tmp = new HashMap<>(); + this.E0.put(r, tmp); + } + tmp.put(ranges, g); + + job.debugPrintln("\n[param-core] Built endpoint graph for " + //+ r + " for " + + ranges + ":\n" + g.toDot()); + } + } + + /*assrtCoreValidate(job, simpname, gpd.isExplicitModifier());//, this.E0); // TODO + + /*if (!job.fair) + { + Map U0 = new HashMap<>(); + for (Role r : E0.keySet()) + { + EState u = E0.get(r).unfairTransform(); + U0.put(r, u); + + job.debugPrintln + //System.out.println + ("\n[param-core] Unfair transform for " + r + ":\n" + u.toDot()); + } + + //validate(job, gpd.isExplicitModifier(), U0, true); //TODO + }*/ + + //((ParamJob) job).runF17ProjectionPasses(); // projections not built on demand; cf. models + + //return gt; + } + + // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? + + //..HERE FIXME ActualParam -- ParamRange is now already a Set + + private //Map>> + Map> + getProtoRoles(ParamJob job, ParamCoreGType gt) + { + Set prs = gt.getParamRoles(); + + Map> map + = prs.stream() + .map(x -> x.getName()) + .distinct() + .collect(Collectors.toMap(x -> x, x -> prs.stream().filter(y -> y.getName().equals(x)).collect(Collectors.toSet()))); + + Map>> powersets = map.keySet().stream().collect(Collectors.toMap(k -> k, k -> new HashSet<>())); + for (Role n : map.keySet()) + { + Set> tmp = powersets.get(n); + Set todo = new HashSet<>(map.get(n)); + while (!todo.isEmpty()) + { + Iterator i = todo.iterator(); + ParamRole next = i.next(); + i.remove(); + Set range = new HashSet<>(); + //range.add(next.range); + range.add(next.ranges.iterator().next()); + if (!tmp.contains(next)) + { + tmp.addAll(tmp.stream().map(t -> + { + Set ggg = new HashSet<>(); + ggg.addAll(t); + ggg.add(range.iterator().next()); + return ggg; + }).collect(Collectors.toSet())); + tmp.add(range); + } + } + } + + //Map>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); + Map> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); + for (Role r : powersets.keySet()) + { + Set> powset = powersets.get(r); + int i = 1; + int size = powset.size(); + + job.debugPrintln("\n[param-core] Ranges powerset for " + r + ": " + powset); + + for (Set cand : powset) + { + Set coset = powset.stream().filter(f -> f.stream().noneMatch(g -> cand.contains(g))).flatMap(Collection::stream).collect(Collectors.toSet()); + + String z3 = ""; + + if (cand.size() > 0) + { + z3 += cand.stream().map(c -> "(and (>= id " + c.start.toSmt2Formula() + ") (<= id " + c.end.toSmt2Formula() + ")" + + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") + + ")") + .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); + } + + if (coset.size() > 0) + { + if (cand.size() > 0) + { + z3 = "(and " + z3 + " "; + } + z3 += coset.stream().map(c -> "(and (not (and (>= id " + c.start.toSmt2Formula() + ") (<= id " + c.end.toSmt2Formula() + ")))" + + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") + + ")") + .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); + if (cand.size() > 0) + { + z3 += ")"; + } + } + + //Set actuals + Set actuals + = cand.stream().flatMap(c -> c.getVars().stream()).collect(Collectors.toSet()); + actuals.addAll(coset.stream().flatMap(c -> c.getVars().stream()).collect(Collectors.toSet())); + //if (!actuals.isEmpty()) + { + z3 = "(exists ((id Int) " + + actuals.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + + ") " + z3 + ")"; + } + + z3 = //"(declare-const id Int)\n + "(assert " + z3 + ")"; + + job.debugPrintln("\n[param-core] Candidate (" + i++ + "/" + size + "): " + cand); + job.debugPrintln("[param-core] Co-set: " + coset); + job.debugPrintln("[param-core] Running Z3 on:\n" + z3); + + if (Z3Wrapper.checkSat(job, this.gpd, z3)) + { + //protoRoles.get(r).add(cand); + protoRoles.get(r).add(new ParamActualRole(r.toString(), cand, coset)); + } + } + } + return protoRoles; + } + + // FIXME: factor out -- cf. super.doAttemptableOutputTasks + @Override + protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleException + { + if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM_CORE_EFSM)) + { + String[] args = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_EFSM); + for (int i = 0; i < args.length; i += 1) + { + Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); + this.E0.get(role).entrySet().forEach(e -> + { + String out = e.getValue().toDot(); + System.out.println("\n" + role + " " + e.getKey() + ":\n" + out); // Endpoint graphs are "inlined" (a single graph is built) + }); + } + } + if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM_CORE_EFSM_PNG)) + { + String[] args = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_EFSM_PNG); + for (int i = 0; i < args.length; i += 2) + { + Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); + String png = args[i+1]; + //for (Entry, EGraph> e : this.E0.get(role).entrySet()) + for (Entry e : this.E0.get(role).entrySet()) + { + String out = e.getValue().init.toDot(); + runDot(out, png); + } + } + } + /*if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_MODEL)) + { + System.out.println("\n" + model.toDot()); + } + if (this.paramArgs.containsKey(ParamCLArgFlag.PARAM_CORE_MODEL_PNG)) + { + String[] arg = this.paramArgs.get(ParamCLArgFlag.PARAM_CORE_MODEL_PNG); + String png = arg[0]; + runDot(model.toDot(), png); + }*/ + } + + /*private void assrtCoreValidate(Job job, GProtocolName simpname, boolean isExplicit, + //Map E0, + boolean... unfair) throws ScribbleException, CommandLineException + { + this.model = new ParamCoreSModelBuilder(job.sf).build(this.E0, isExplicit); + + job.debugPrintln("\n[param-core] Built model:\n" + this.model.toDot()); + + if (unfair.length == 0 || !unfair[0]) + { + ParamCoreSafetyErrors serrs = this.model.getSafetyErrors(job, simpname); // job just for debug printing + if (serrs.isSafe()) + { + job.debugPrintln("\n[param-core] Protocol safe."); + } + else + { + throw new ParamException("[param-core] Protocol not safe:\n" + serrs); + } + } + + /*F17ProgressErrors perrs = m.getProgressErrors(); + if (perrs.satisfiesProgress()) + { + job.debugPrintln + //System.out.println + ("\n[f17] " + ((unfair.length == 0) ? "Fair protocol" : "Protocol") + " satisfies progress."); + } + else + { + + // FIXME: refactor eventual reception as 1-bounded stable check + Set staberrs = m.getStableErrors(); + if (perrs.eventualReception.isEmpty()) + { + if (!staberrs.isEmpty()) + { + throw new RuntimeException("[f17] 1-stable check failure: " + staberrs); + } + } + else + { + if (staberrs.isEmpty()) + { + throw new RuntimeException("[f17] 1-stable check failure: " + perrs); + } + } + + throw new F17Exception("\n[f17] " + ((unfair.length == 0) ? "Fair protocol" : "Protocol") + " violates progress.\n" + perrs); + }* / + }*/ +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java new file mode 100644 index 000000000..b766a6b73 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java @@ -0,0 +1,66 @@ +package org.scribble.ext.go.core.main; + +import java.nio.file.Path; + +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.ast.ParamAstFactoryImpl; +import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; +import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactoryImpl; +import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.parser.scribble.ParamAntlrToScribParser; +import org.scribble.ext.go.parser.scribble.ParamScribbleAntlrWrapper; +import org.scribble.main.MainContext; +import org.scribble.main.ScribbleException; +import org.scribble.main.resource.ResourceLocator; +import org.scribble.parser.scribble.ScribbleAntlrWrapper; +import org.scribble.util.ScribParserException; + +public class ParamCoreMainContext extends MainContext +{ + // Load main module from file system + public ParamCoreMainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, + boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation) + throws ScribParserException, ScribbleException + { + super(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + } + + @Override + public ParamJob newJob() + { + return new ParamJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, + this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, + this.af, this.ef, this.sf); + } + + @Override + protected ScribbleAntlrWrapper newAntlrParser() + { + return new ParamScribbleAntlrWrapper(); + } + + @Override + protected ParamAntlrToScribParser newScribParser() + { + return new ParamAntlrToScribParser(); + } + + @Override + protected ParamAstFactory newAstFactory() + { + return new ParamAstFactoryImpl(); + } + + @Override + protected ParamCoreEModelFactory newEModelFactory() + { + return new ParamCoreEModelFactoryImpl(); // HACK FIXME + } + + /*@Override + protected SModelFactory newSModelFactory() + { + //return new ParamSModelFactoryImpl(); + return new ParamCoreSModelFactoryImpl(); // HACK FIXME + }*/ +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java index ebc4ccc70..4381e788d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java @@ -4,8 +4,6 @@ import org.scribble.ext.go.ast.ParamAstFactory; import org.scribble.ext.go.ast.ParamAstFactoryImpl; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactoryImpl; import org.scribble.ext.go.parser.scribble.ParamAntlrToScribParser; import org.scribble.ext.go.parser.scribble.ParamScribbleAntlrWrapper; import org.scribble.main.MainContext; @@ -44,21 +42,9 @@ protected ParamAntlrToScribParser newScribParser() return new ParamAntlrToScribParser(); } + @Override protected ParamAstFactory newAstFactory() { return new ParamAstFactoryImpl(); } - - @Override - protected ParamCoreEModelFactory newEModelFactory() - { - return new ParamCoreEModelFactoryImpl(); // HACK FIXME - } - - /*@Override - protected SModelFactory newSModelFactory() - { - //return new ParamSModelFactoryImpl(); - return new ParamCoreSModelFactoryImpl(); // HACK FIXME - }*/ } From 4a75b88a858999bc7231547476dd8cf8de8741dc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 5 Sep 2017 18:11:30 +0100 Subject: [PATCH 118/433] Minor. --- .../java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java index c3cbe0ca6..dcb36ffdf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java @@ -418,7 +418,7 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce this.E0.get(role).entrySet().forEach(e -> { String out = e.getValue().toDot(); - System.out.println("\n" + role + " " + e.getKey() + ":\n" + out); // Endpoint graphs are "inlined" (a single graph is built) + System.out.println("\nEndpoint FSM for " + e.getKey() + ":\n" + out); // Endpoint graphs are "inlined" (a single graph is built) }); } } From b730a303ae825d051611bbd93f19e40785ca09d0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 5 Sep 2017 18:19:57 +0100 Subject: [PATCH 119/433] Minor. --- scribble-go/src/test/scrib/param/cgo18/Auction.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/Reduce.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/Ring.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr | 2 +- scribble-go/src/test/scrib/param/cgo18/SumEuler.scr | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/Auction.scr b/scribble-go/src/test/scrib/param/cgo18/Auction.scr index 39ab4156c..917a8f4ec 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Auction.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Auction.scr @@ -1,5 +1,5 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java -//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Auction.scr -param Proto1 +//$ bin/scribblec-param.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Auction.scr -param Proto1 module param.cgo18.Auction; diff --git a/scribble-go/src/test/scrib/param/cgo18/Reduce.scr b/scribble-go/src/test/scrib/param/cgo18/Reduce.scr index c525c2e19..5a2fbd950 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Reduce.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Reduce.scr @@ -1,5 +1,5 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java -//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SumEuler.scr -param Proto1 +//$ bin/scribblec-param.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SumEuler.scr -param Proto1 module param.cgo18.Reduce; diff --git a/scribble-go/src/test/scrib/param/cgo18/Ring.scr b/scribble-go/src/test/scrib/param/cgo18/Ring.scr index 5848c3861..f8de7a20c 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Ring.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Ring.scr @@ -1,5 +1,5 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java -//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Ring.scr -param Proto1 +//$ bin/scribblec-param.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Ring.scr -param Proto1 module param.cgo18.Ring; diff --git a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr index 4e91b708a..ddfd1c2ea 100644 --- a/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr +++ b/scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr @@ -1,5 +1,5 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java -//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr -param Proto1 -param-fsm B +//$ bin/scribblec-param.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/ScatterGather.scr -param Proto1 -param-fsm B module param.cgo18.ScatterGather; diff --git a/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr b/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr index 2ae66b379..5e5d8b383 100644 --- a/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr +++ b/scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr @@ -1,5 +1,5 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java -//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr -param Proto1 +//$ bin/scribblec-param.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SpectralNorm.scr -param Proto1 module param.cgo18.SpectralNorm; diff --git a/scribble-go/src/test/scrib/param/cgo18/SumEuler.scr b/scribble-go/src/test/scrib/param/cgo18/SumEuler.scr index 8c34cf13d..6532bdde3 100644 --- a/scribble-go/src/test/scrib/param/cgo18/SumEuler.scr +++ b/scribble-go/src/test/scrib/param/cgo18/SumEuler.scr @@ -1,5 +1,5 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java -//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SumEuler.scr -param Proto1 +//$ bin/scribblec-param.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/SumEuler.scr -param Proto1 module param.cgo18.SumEuler; From 2dc81ba10c03eea90bfaec0427be7561bb42a02f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Sep 2017 14:05:57 +0100 Subject: [PATCH 120/433] Renamed base Go API gen stuff to Go back to "Go" prefix. --- .../{ParamCLArgFlag.java => GoCLArgFlag.java} | 2 +- ...ramCLArgParser.java => GoCLArgParser.java} | 24 ++++----- ...ramCommandLine.java => GoCommandLine.java} | 22 ++++---- .../go/core/ast/global/ParamCoreGChoice.java | 4 +- .../ext/go/core/ast/global/ParamCoreGEnd.java | 4 +- .../ast/global/ParamCoreGMultiChoices.java | 4 +- .../ext/go/core/ast/global/ParamCoreGRec.java | 4 +- .../go/core/ast/global/ParamCoreGRecVar.java | 4 +- .../go/core/ast/global/ParamCoreGType.java | 4 +- .../ext/go/core/cli/ParamCoreCommandLine.java | 20 ++++---- .../main/ParamCoreException.java} | 16 +++--- .../go/core/main/ParamCoreMainContext.java | 6 +-- .../endpoint/ParamCoreEGraphBuilder.java | 6 +-- .../ext/go/main/{ParamJob.java => GoJob.java} | 4 +- .../scribble/ext/go/main/GoMainContext.java | 27 ++++++++++ .../ext/go/main/ParamMainContext.java | 50 ------------------- .../org/scribble/ext/go/util/Z3Wrapper.java | 4 +- .../src/test/scrib/param/tmp/ParamTest.scr | 46 ++++++++++++++++- 18 files changed, 135 insertions(+), 116 deletions(-) rename scribble-go/src/main/java/org/scribble/ext/go/cli/{ParamCLArgFlag.java => GoCLArgFlag.java} (72%) rename scribble-go/src/main/java/org/scribble/ext/go/cli/{ParamCLArgParser.java => GoCLArgParser.java} (68%) rename scribble-go/src/main/java/org/scribble/ext/go/cli/{ParamCommandLine.java => GoCommandLine.java} (83%) rename scribble-go/src/main/java/org/scribble/ext/go/{main/ParamException.java => core/main/ParamCoreException.java} (62%) rename scribble-go/src/main/java/org/scribble/ext/go/main/{ParamJob.java => GoJob.java} (94%) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgFlag.java similarity index 72% rename from scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java rename to scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgFlag.java index 236fe39cf..7f06a0583 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgFlag.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgFlag.java @@ -1,6 +1,6 @@ package org.scribble.ext.go.cli; -public enum ParamCLArgFlag +public enum GoCLArgFlag { // Non-unique flags GO_API_GEN, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java similarity index 68% rename from scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java rename to scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java index 8ee2a2422..71af4bd05 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCLArgParser.java @@ -7,31 +7,31 @@ import org.scribble.cli.CLArgParser; import org.scribble.cli.CommandLineException; -public class ParamCLArgParser extends CLArgParser +public class GoCLArgParser extends CLArgParser { // Non-unique flags public static final String GO_API_GEN_FLAG = "-goapi"; //private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); - private static final Map PARAM_NON_UNIQUE_FLAGS = new HashMap<>(); + private static final Map PARAM_NON_UNIQUE_FLAGS = new HashMap<>(); { - ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCLArgParser.GO_API_GEN_FLAG, ParamCLArgFlag.GO_API_GEN); + GoCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(GoCLArgParser.GO_API_GEN_FLAG, GoCLArgFlag.GO_API_GEN); } - private static final Map PARAM_FLAGS = new HashMap<>(); + private static final Map PARAM_FLAGS = new HashMap<>(); { - ParamCLArgParser.PARAM_FLAGS.putAll(ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS); + GoCLArgParser.PARAM_FLAGS.putAll(GoCLArgParser.PARAM_NON_UNIQUE_FLAGS); } - private final Map paramParsed = new HashMap<>(); + private final Map paramParsed = new HashMap<>(); - public ParamCLArgParser(String[] args) throws CommandLineException + public GoCLArgParser(String[] args) throws CommandLineException { super(args); // Assigns this.args and calls parseArgs } - public Map getParamArgs() throws CommandLineException + public Map getParamArgs() throws CommandLineException { //super.parseArgs(); // Needed return this.paramParsed; @@ -40,7 +40,7 @@ public Map getParamArgs() throws CommandLineException @Override protected boolean isFlag(String arg) { - return ParamCLArgParser.PARAM_FLAGS.containsKey(arg) || super.isFlag(arg); + return GoCLArgParser.PARAM_FLAGS.containsKey(arg) || super.isFlag(arg); } // Pre: i is the index of the current flag to parse @@ -53,7 +53,7 @@ protected int parseFlag(int i) throws CommandLineException { // Non-unique flags - case ParamCLArgParser.GO_API_GEN_FLAG: + case GoCLArgParser.GO_API_GEN_FLAG: { return goParseProtoAndRoleArgs(flag, i); } @@ -71,7 +71,7 @@ protected int parseFlag(int i) throws CommandLineException // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException { - ParamCLArgFlag flag = ParamCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + GoCLArgFlag flag = GoCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); if ((i + 2) >= this.args.length) { throw new CommandLineException("Missing protocol/role arguments"); @@ -83,7 +83,7 @@ private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException } // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag - private void goConcatArgs(ParamCLArgFlag flag, String... toAdd) + private void goConcatArgs(GoCLArgFlag flag, String... toAdd) { String[] args = this.paramParsed.get(flag); if (args == null) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java similarity index 83% rename from scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java rename to scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java index 319ed6f29..c6b2f3010 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/ParamCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java @@ -12,7 +12,7 @@ import org.scribble.ext.go.codegen.statetype.go.GoEndpointApiGenerator; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.main.ParamMainContext; +import org.scribble.ext.go.main.GoMainContext; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; import org.scribble.main.JobContext; @@ -25,9 +25,9 @@ import org.scribble.util.ScribParserException; // N.B. this is the CL for both -goapi and param-core extensions -public class ParamCommandLine extends CommandLine +public class GoCommandLine extends CommandLine { - protected final Map paramArgs; // Maps each flag to list of associated argument values + protected final Map paramArgs; // Maps each flag to list of associated argument values // HACK: store in (Core) Job/JobContext? protected GProtocolDecl gpd; @@ -35,12 +35,12 @@ public class ParamCommandLine extends CommandLine protected Map> E0; //protected ParamCoreSModel model; - public ParamCommandLine(String... args) throws CommandLineException + public GoCommandLine(String... args) throws CommandLineException { - this(new ParamCLArgParser(args)); + this(new GoCLArgParser(args)); } - private ParamCommandLine(ParamCLArgParser p) throws CommandLineException + private GoCommandLine(GoCLArgParser p) throws CommandLineException { super(p); // calls p.parse() if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) @@ -57,7 +57,7 @@ private ParamCommandLine(ParamCLArgParser p) throws CommandLineException } @Override - protected ParamMainContext newMainContext() throws ScribParserException, ScribbleException + protected GoMainContext newMainContext() throws ScribParserException, ScribbleException { boolean debug = this.args.containsKey(CLArgFlag.VERBOSE); // TODO: factor out with CommandLine (cf. MainContext fields) boolean useOldWF = this.args.containsKey(CLArgFlag.OLD_WF); @@ -81,23 +81,23 @@ protected ParamMainContext newMainContext() throws ScribParserException, Scribbl else { Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); - return new ParamMainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, + return new GoMainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); } } public static void main(String[] args) throws CommandLineException, AntlrSourceException { - new ParamCommandLine(args).run(); + new GoCommandLine(args).run(); } @Override protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, CommandLineException { - if (this.paramArgs.containsKey(ParamCLArgFlag.GO_API_GEN)) + if (this.paramArgs.containsKey(GoCLArgFlag.GO_API_GEN)) { JobContext jcontext = job.getContext(); - String[] args = this.paramArgs.get(ParamCLArgFlag.GO_API_GEN); + String[] args = this.paramArgs.get(GoCLArgFlag.GO_API_GEN); for (int i = 0; i < args.length; i += 2) { GProtocolName fullname = checkGlobalProtocolArg(jcontext, args[i]); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index efee053a5..0ff0b8929 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -21,7 +21,7 @@ import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.ParamBinIndexExpr; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexFactory; @@ -43,7 +43,7 @@ public ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest } @Override - public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, GProtocolDecl gpd) { // src (i.e., choice subj) range size=1 for non-unary choices enforced by ParamScribble.g syntax // Directed choice check by ParamCoreGProtocolDeclTranslator ensures all dests (including ranges) are (syntactically) the same diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java index fafc74450..ca8eb0a27 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java @@ -10,7 +10,7 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; @@ -24,7 +24,7 @@ private ParamCoreGEnd() } @Override - public boolean isWellFormed(ParamJob job, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, GProtocolDecl gpd) { return true; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java index 837a3bbdc..5c736a54f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java @@ -19,7 +19,7 @@ import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.type.kind.Global; @@ -47,7 +47,7 @@ private static LinkedHashMap foo(List { - boolean isWellFormed(ParamJob job, GProtocolDecl gpd); + boolean isWellFormed(GoJob job, GProtocolDecl gpd); // FIXME: clarify, Role subj is used as "role name" //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java index dcb36ffdf..230001c2b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java @@ -24,12 +24,12 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; import org.scribble.ext.go.core.main.ParamCoreMainContext; +import org.scribble.ext.go.core.main.ParamCoreException; import org.scribble.ext.go.core.model.endpoint.ParamCoreEGraphBuilder; import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.main.ParamException; -import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.main.AntlrSourceException; @@ -115,7 +115,7 @@ protected void doValidationTasks(Job job) throws ParamCoreSyntaxException, Antlr { if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM)) { - doParamCoreValidationTasks((ParamJob) job); + doParamCoreValidationTasks((GoJob) job); } else { @@ -152,7 +152,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co } } - private void doParamCoreValidationTasks(ParamJob j) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + private void doParamCoreValidationTasks(GoJob j) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException { /*if (this.args.containsKey(CLArgFlag.PROJECT)) // HACK // modules/f17/src/test/scrib/demo/fase17/AppD.scr in [default] mode bug --- projection/EFSM not properly formed if this if is commented ???? @@ -180,7 +180,7 @@ private void doParamCoreValidationTasks(ParamJob j) throws ParamCoreSyntaxExcept // Refactor into Param(Core)Job? // Following methods are for assrt-*core* - private void paramCorePreContextBuilding(ParamJob job) throws ScribbleException + private void paramCorePreContextBuilding(GoJob job) throws ScribbleException { job.runContextBuildingPasses(); @@ -189,7 +189,7 @@ private void paramCorePreContextBuilding(ParamJob job) throws ScribbleException } // Pre: assrtPreContextBuilding(job) - private void paramCoreParseAndCheckWF(ParamJob job) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + private void paramCoreParseAndCheckWF(GoJob job) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException { Module main = job.getContext().getMainModule(); for (GProtocolDecl gpd : main.getGlobalProtocolDecls()) @@ -202,12 +202,12 @@ private void paramCoreParseAndCheckWF(ParamJob job) throws ParamCoreSyntaxExcept } // Pre: paramCorePreContextBuilding(job) - private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException { Module main = job.getContext().getMainModule(); if (!main.hasProtocolDecl(simpname)) { - throw new ParamException("[param-core] Global protocol not found: " + simpname); + throw new ParamCoreException("[param-core] Global protocol not found: " + simpname); } this.gpd = (GProtocolDecl) main.getProtocolDecl(simpname); @@ -218,7 +218,7 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro if (!gt.isWellFormed(job, gpd)) { - throw new ParamException("[param-core] Global type not well-formed:\n " + gt); + throw new ParamCoreException("[param-core] Global type not well-formed:\n " + gt); } //Map>> @@ -300,7 +300,7 @@ private void paramCoreParseAndCheckWF(ParamJob job, GProtocolName simpname) thro private //Map>> Map> - getProtoRoles(ParamJob job, ParamCoreGType gt) + getProtoRoles(GoJob job, ParamCoreGType gt) { Set prs = gt.getParamRoles(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamException.java b/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreException.java similarity index 62% rename from scribble-go/src/main/java/org/scribble/ext/go/main/ParamException.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreException.java index b441bb5e0..1421ef4e9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamException.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreException.java @@ -1,10 +1,10 @@ -package org.scribble.ext.go.main; +package org.scribble.ext.go.core.main; import org.antlr.runtime.tree.CommonTree; import org.scribble.main.ScribbleException; //public class AssrtException extends Exception -public class ParamException extends ScribbleException +public class ParamCoreException extends ScribbleException { /** @@ -12,37 +12,37 @@ public class ParamException extends ScribbleException */ private static final long serialVersionUID = 1L; - public ParamException() + public ParamCoreException() { // TODO Auto-generated constructor stub } - public ParamException(String arg0) + public ParamCoreException(String arg0) { super(arg0); // TODO Auto-generated constructor stub } - public ParamException(Throwable arg0) + public ParamCoreException(Throwable arg0) { super(arg0); // TODO Auto-generated constructor stub } - public ParamException(String arg0, Throwable arg1) + public ParamCoreException(String arg0, Throwable arg1) { super(arg0, arg1); // TODO Auto-generated constructor stub } - public ParamException(String message, Throwable cause, boolean enableSuppression, + public ParamCoreException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); // TODO Auto-generated constructor stub } - public ParamException(CommonTree blame, String arg0) + public ParamCoreException(CommonTree blame, String arg0) { super(blame, arg0); // TODO Auto-generated constructor stub diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java index b766a6b73..36a18977d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java @@ -6,7 +6,7 @@ import org.scribble.ext.go.ast.ParamAstFactoryImpl; import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactoryImpl; -import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.parser.scribble.ParamAntlrToScribParser; import org.scribble.ext.go.parser.scribble.ParamScribbleAntlrWrapper; import org.scribble.main.MainContext; @@ -26,9 +26,9 @@ public ParamCoreMainContext(boolean debug, ResourceLocator locator, Path mainpat } @Override - public ParamJob newJob() + public GoJob newJob() { - return new ParamJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, + return new GoJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, this.af, this.ef, this.sf); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java index 2ea6be3a6..b244ecf22 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java @@ -16,7 +16,7 @@ import org.scribble.ext.go.core.ast.local.ParamCoreLRec; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; @@ -29,10 +29,10 @@ public class ParamCoreEGraphBuilder { - private final ParamJob job; + private final GoJob job; private final EGraphBuilderUtil util; // Not using any features for unguarded choice/recursion/continue (recursion manually tracked here) - public ParamCoreEGraphBuilder(ParamJob job) + public ParamCoreEGraphBuilder(GoJob job) { this.job = job; this.util = new EGraphBuilderUtil(job.ef); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamJob.java b/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java similarity index 94% rename from scribble-go/src/main/java/org/scribble/ext/go/main/ParamJob.java rename to scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java index cb7408098..c13c993ec 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamJob.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java @@ -9,9 +9,9 @@ import org.scribble.model.global.SModelFactory; import org.scribble.type.name.ModuleName; -public class ParamJob extends Job +public class GoJob extends Job { - public ParamJob(boolean debug, Map parsed, ModuleName main, + public GoJob(boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, AstFactory af, EModelFactory ef, SModelFactory sf) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java new file mode 100644 index 000000000..32acb2264 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java @@ -0,0 +1,27 @@ +package org.scribble.ext.go.main; + +import java.nio.file.Path; + +import org.scribble.main.MainContext; +import org.scribble.main.ScribbleException; +import org.scribble.main.resource.ResourceLocator; +import org.scribble.util.ScribParserException; + +public class GoMainContext extends MainContext +{ + // Load main module from file system + public GoMainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, + boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation) + throws ScribParserException, ScribbleException + { + super(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + } + + @Override + public GoJob newJob() + { + return new GoJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, + this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, + this.af, this.ef, this.sf); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java deleted file mode 100644 index 4381e788d..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/ParamMainContext.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.scribble.ext.go.main; - -import java.nio.file.Path; - -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.ParamAstFactoryImpl; -import org.scribble.ext.go.parser.scribble.ParamAntlrToScribParser; -import org.scribble.ext.go.parser.scribble.ParamScribbleAntlrWrapper; -import org.scribble.main.MainContext; -import org.scribble.main.ScribbleException; -import org.scribble.main.resource.ResourceLocator; -import org.scribble.parser.scribble.ScribbleAntlrWrapper; -import org.scribble.util.ScribParserException; - -public class ParamMainContext extends MainContext -{ - // Load main module from file system - public ParamMainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation) - throws ScribParserException, ScribbleException - { - super(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); - } - - @Override - public ParamJob newJob() - { - return new ParamJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, - this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, - this.af, this.ef, this.sf); - } - - @Override - protected ScribbleAntlrWrapper newAntlrParser() - { - return new ParamScribbleAntlrWrapper(); - } - - @Override - protected ParamAntlrToScribParser newScribParser() - { - return new ParamAntlrToScribParser(); - } - - @Override - protected ParamAstFactory newAstFactory() - { - return new ParamAstFactoryImpl(); - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index 97e2b0df0..a7970fe6d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -4,7 +4,7 @@ import java.util.Arrays; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ext.go.main.ParamJob; +import org.scribble.ext.go.main.GoJob; import org.scribble.main.ScribbleException; import org.scribble.util.ScribUtil; @@ -13,7 +13,7 @@ public class Z3Wrapper { // Based on CommandLine::runDot, JobContext::runAut, etc - public static boolean checkSat(ParamJob job, GProtocolDecl gpd, String smt2) //throws ScribbleException + public static boolean checkSat(GoJob job, GProtocolDecl gpd, String smt2) //throws ScribbleException { String tmpName = gpd.header.name + ".smt2.tmp"; File tmp = new File(tmpName); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index e1fff175a..bd1ca0bd3 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -9,7 +9,9 @@ module assrt.tmp.ParamTest; type "int" from "..." as int; -//type "string" from "..." as string; +type "string" from "..." as string; +type "TwoBuyer.Address" from "scrib/twobuyer/TwoBuyer/TwoBuyer/types.go" as Address; +type "TwoBuyer.Date" from "scrib/twobuyer/TwoBuyer/TwoBuyer/types.go" as Date; @@ -42,11 +44,51 @@ message passing // Add a scribble version and time/date to API output header + +// paramterisation subsumes multicast + + +global protocol Proto1(role A(n), role B(n), role S(n)) +{ + title(string) from A[1..1] to S[1..1]; + quote(int) from S[1..1] to A[1..1]; + quote(int) from S[1..1] to B[1..n]; + share(int) from A[1..1] to B[1..n]; + choice at B[1] + { + ok(Address) from B[1..1] to S[1..1]; + (Date) from S[1..1] to B[1..1]; + choice at B[1] + { + ok() from B[1..1] to B[2..n]; + } + or + { + quit() from B[1..1] to B[2..n]; + } + } + or + { + quit() from B[1..1] to S[1..1]; + choice at B[1] + { + ok() from B[1..1] to B[2..n]; + } + or + { + quit() from B[1..1] to B[2..n]; + } + } +} + +/* global protocol Proto1(role A(n, m), role B(n, m)) { - 1() from A[1..1] to B[n..n]; + 1() from A[1..1] to B[n..n]; // Testing actual role "naming" 2() from A[1..1] to B[m..m]; } +//*/ + /* global protocol Proto1(role A(n), role B(n)) // Testing API gen From 97e2b191219cf1adae54939293b2bd8e1a14a8e1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Sep 2017 16:52:52 +0100 Subject: [PATCH 121/433] Revising param-core API gen for latest runtime interface. --- .../statetype/ParamCoreSTApiGenConstants.java | 2 + .../statetype/ParamCoreSTEndStateBuilder.java | 3 +- .../ParamCoreSTEndpointApiGenerator.java | 3 +- .../ParamCoreSTReceiveActionBuilder.java | 10 ++-- .../ParamCoreSTSendActionBuilder.java | 9 ++- .../ParamCoreSTSessionApiBuilder.java | 55 +++++++++++-------- .../ParamCoreSTStateChanApiBuilder.java | 3 +- 7 files changed, 49 insertions(+), 36 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java index ca2da6eb8..b41bfbbd5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java @@ -30,6 +30,8 @@ public class ParamCoreSTApiGenConstants public static final String GO_SCHAN_ENDPOINT = "endpoint"; // ep; public static final String GO_SCHAN_LINEARRESOURCE = "resource"; // state + + public static final String GO_SCHAN_END_TYPE = "EndState"; public static final String GO_IO_FUN_RECEIVER = "s"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java index 3627c1223..1f3d5a798 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java @@ -27,7 +27,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) schangen.apigen.generateRootPackageDecl() + "\n" + "\n" //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" - + schangen.apigen.generateScribbleRuntimeImports() + "\n" + //+ schangen.apigen.generateScribbleRuntimeImports() + "\n" + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "\n" + "type " + tname + " struct{\n" + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" // FIXME: factor out diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index c98487c42..c56a63361 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -69,7 +69,8 @@ public String getGeneratedEndpointType() public static String getGeneratedEndpointType(GProtocolName simpname, Role r) { - return "Endpoint_" + simpname + "_" + r; + //return "Endpoint_" + simpname + "_" + r; + return simpname + "_" + r; } public static String getGeneratedActualRoleName(ParamActualRole actual) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index c50faf57c..2629bfcb3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -31,9 +31,8 @@ public String buildArgs(EAction a) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { - String sEpRecv = - //s.ep.Write - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READ; + /*String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READ;*/ /*String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." @@ -44,8 +43,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ return - sEpRecv - + "(..TODO..)\n" + //sEpRecv + "(..TODO..)\n" /*+ "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", \"" + a.mid + "\")\n" + IntStream.range(0, a.payload.elems.size()) @@ -54,6 +52,6 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - + buildReturn(api, curr, succ); + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 6b37c56ce..f96d5249f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -31,9 +31,9 @@ public String buildArgs(EAction a) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { - String sEpWrite = + /*String sEpWrite = //s.ep.Write - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITE; + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITE;*/ /*String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." @@ -44,8 +44,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ return - sEpWrite - + "(..TODO..)\n" + //sEpWrite + "(..TODO..)\n" /*+ "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", \"" + a.mid + "\")\n" + IntStream.range(0, a.payload.elems.size()) @@ -54,6 +53,6 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - + buildReturn(api, curr, succ); + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 73f8e0308..31ad9da2a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -53,8 +53,8 @@ public Map build() // FIXME: factor out // Just need role name constants for now -- params not fixed until endpoint creation + "}\n" + "\n" - + "func New" + simpname + "() " + simpname + " {\n" - + "return " + simpname + "{ " + roles.stream().map(r -> ParamCoreSTApiGenConstants.GO_ROLE_CONSTRUCTOR + + "func New" + simpname + "() *" + simpname + " {\n" + + "return &" + simpname + "{ " + roles.stream().map(r -> ParamCoreSTApiGenConstants.GO_ROLE_CONSTRUCTOR + "(\"" + r + "\")").collect(Collectors.joining(", ")) + " }\n" // Singleton types? + "}\n"; @@ -79,28 +79,39 @@ public Map build() // FIXME: factor out + "\n";*/ // Protocol and role specific endpoints - /*Function epTypeName = r -> "_Endpoint" + simpname + "_" + r; + //Function epTypeName = r -> "_Endpoint" + simpname + "_" + r; sessPack += roles.stream().map(r -> - "\n\ntype " + epTypeName.apply(r) + " struct {\n" // FIXME: factor out - + r + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" - + "}\n" - + "\n" - + "func New" + epTypeName.apply(r) + "(P *" + simpname + ") *" + epTypeName.apply(r) + "{\n" - + "return &" + epTypeName.apply(r) + " { " + r + ": " - + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "(P, P." + r + ") }\n" - + "}" - ).collect(Collectors.joining(""));*/ - sessPack += "\n" + - roles.stream().map(r -> - "\n" - + "func New" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r) - + "(p " + simpname + ", params map[string]int) (*" - + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + ", " + ParamCoreSTApiGenConstants.GO_FINALISER_TYPE + ") {\n" - + "ep := " + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ", params)\n" - + "return ep, ep." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINALISE + "\n" - + "}\n" - ).collect(Collectors.joining("")); + { + String epTypeName = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); + return + "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out + + "proto *" + simpname + "\n" + + this.apigen.actuals.keySet().stream().filter(a -> a.getName().equals(r)).map(a -> + { + String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); + return "sub_" + actualName + " func(*" + actualName + "_1) *" + + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + "\n"; + }).collect(Collectors.joining("")) + + "params map[string]int\n" + + "}\n" + + "\n" + + "func (p *" + simpname + ") New" + epTypeName + + "(params map[string]int) (*" + epTypeName + ") {\n" + + "return &" + epTypeName + "{ p, params }\n" + + "}\n" + + "\n" + + this.apigen.actuals.keySet().stream().filter(a -> a.getName().equals(r)).map(a -> + { + String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); + return + "\nfunc (r *" + epTypeName + ") " + + "Register_" + actualName + + "(impl func(*" + actualName + "_1) *" + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + ") {\n" + + "r.sub_" + actualName + " = impl\n" + + "}\n"; + }).collect(Collectors.joining("")); + }).collect(Collectors.joining("")); String dir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; Map res = new HashMap<>(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index b1361a17e..b4a519ec0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -70,7 +70,8 @@ protected String makeSTStateName(EState s) //throw new RuntimeException("[param-core] TODO:"); if (s.isTerminal()) { - return "_EndState"; + //return "_EndState"; + return ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; } return this.apigen.proto.getSimpleName() + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) From fb13ef56232775f17e0d4cefc3b0fc4107465ca0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Sep 2017 19:24:15 +0100 Subject: [PATCH 122/433] Continued. Compilable Go version. --- .../statetype/ParamCoreSTEndpointApiGenerator.java | 4 ++-- .../codegen/statetype/ParamCoreSTSessionApiBuilder.java | 7 ++++--- .../codegen/statetype/ParamCoreSTStateChanApiBuilder.java | 8 ++++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index c56a63361..03c6e71f8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -96,8 +96,8 @@ public String generateRootPackageDecl() public List getScribbleRuntimeImports() // FIXME: factor up { return Stream.of( - ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE, - ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE ).collect(Collectors.toList()); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 31ad9da2a..8e4af4d16 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -90,7 +90,7 @@ public Map build() // FIXME: factor out + this.apigen.actuals.keySet().stream().filter(a -> a.getName().equals(r)).map(a -> { String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); - return "sub_" + actualName + " func(*" + actualName + "_1) *" + return "sub_" + actualName + " func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + "\n"; }).collect(Collectors.joining("")) + "params map[string]int\n" @@ -98,7 +98,7 @@ public Map build() // FIXME: factor out + "\n" + "func (p *" + simpname + ") New" + epTypeName + "(params map[string]int) (*" + epTypeName + ") {\n" - + "return &" + epTypeName + "{ p, params }\n" + + "return &" + epTypeName + "{ proto: p, params: params }\n" + "}\n" + "\n" + this.apigen.actuals.keySet().stream().filter(a -> a.getName().equals(r)).map(a -> @@ -107,7 +107,8 @@ public Map build() // FIXME: factor out return "\nfunc (r *" + epTypeName + ") " + "Register_" + actualName - + "(impl func(*" + actualName + "_1) *" + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + ") {\n" + + "(impl func(*" + simpname + "_" + actualName + "_1) *" // FIXME: factor out with above + + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + ") {\n" + "r.sub_" + actualName + " = impl\n" + "}\n"; }).collect(Collectors.joining("")); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index b4a519ec0..aa7433ba3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -104,8 +104,8 @@ protected String getStateChanPremable(EState s) + this.apigen.generateScribbleRuntimeImports() + "\n" + "\n" + "type " + tname + " struct{\n" - + "ep *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" - + "state *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + "}\n"; if (s.id == this.graph.init.id) @@ -115,7 +115,7 @@ protected String getStateChanPremable(EState s) //+ this.apigen.getGeneratedEndpointType() + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + ") *" + tname + " {\n" // FIXME: factor out - + "ep." + this.role + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_STARTPROTOCOL + "()\n" + //+ "ep." + this.role + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_STARTPROTOCOL + "()\n" + "return &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")}\n" + "}"; @@ -166,7 +166,7 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) / if (!succ.isTerminal()) { res += ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE - + ": &new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case + + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case } res += " }"; From cc0e4e1f681dac926004f38db9d4ce4902fd81cc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Sep 2017 20:21:54 +0100 Subject: [PATCH 123/433] Continued. --- .../statetype/ParamCoreSTApiGenConstants.java | 6 ++--- .../statetype/ParamCoreSTEndStateBuilder.java | 9 ++++---- .../ParamCoreSTSessionApiBuilder.java | 10 ++++++--- .../ParamCoreSTStateChanApiBuilder.java | 22 ++++++++++++++----- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java index b41bfbbd5..95e066493 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java @@ -28,10 +28,10 @@ public class ParamCoreSTApiGenConstants public static final String GO_LINEARRESOURCE_TYPE = "session.LinearResource"; // net.LinearResource public static final String GO_LINEARRESOURCE_USE = "Use"; // net.LinearResource - public static final String GO_SCHAN_ENDPOINT = "endpoint"; // ep; - public static final String GO_SCHAN_LINEARRESOURCE = "resource"; // state + public static final String GO_SCHAN_ENDPOINT = "ept"; // ep; + public static final String GO_SCHAN_LINEARRESOURCE = "res"; // state - public static final String GO_SCHAN_END_TYPE = "EndState"; + public static final String GO_SCHAN_END_TYPE = "End"; public static final String GO_IO_FUN_RECEIVER = "s"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java index 1f3d5a798..df20e35e1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndStateBuilder.java @@ -26,12 +26,13 @@ public String getPreamble(STStateChanApiBuilder api, EState s) String res = schangen.apigen.generateRootPackageDecl() + "\n" + "\n" - //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" - //+ schangen.apigen.generateScribbleRuntimeImports() + "\n" - + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + ////+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + ////+ schangen.apigen.generateScribbleRuntimeImports() + "\n" + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "\n" + "type " + tname + " struct{\n" - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" // FIXME: factor out + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" // FIXME: factor out + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(api.gpn.getSimpleName(), api.role) + "\n" // FIXME: factor out + "}"; return res; // No LinearResource } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 8e4af4d16..b3fe89b74 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -91,14 +91,17 @@ public Map build() // FIXME: factor out { String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); return "sub_" + actualName + " func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName - + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + "\n"; + //+ ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + "\n"; + + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; }).collect(Collectors.joining("")) + "params map[string]int\n" + + "ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "}\n" + "\n" + "func (p *" + simpname + ") New" + epTypeName + "(params map[string]int) (*" + epTypeName + ") {\n" - + "return &" + epTypeName + "{ proto: p, params: params }\n" + + "return &" + epTypeName + "{ proto: p, params: params, ept: " + + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p , p." + r + ")}\n" + "}\n" + "\n" + this.apigen.actuals.keySet().stream().filter(a -> a.getName().equals(r)).map(a -> @@ -108,7 +111,8 @@ public Map build() // FIXME: factor out "\nfunc (r *" + epTypeName + ") " + "Register_" + actualName + "(impl func(*" + simpname + "_" + actualName + "_1) *" // FIXME: factor out with above - + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + ") {\n" + //+ ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + ") {\n" + + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ") {\n" + "r.sub_" + actualName + " = impl\n" + "}\n"; }).collect(Collectors.joining("")); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index aa7433ba3..2f12ef850 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -19,6 +19,7 @@ import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.GProtocolName; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder @@ -70,13 +71,19 @@ protected String makeSTStateName(EState s) //throw new RuntimeException("[param-core] TODO:"); if (s.isTerminal()) { - //return "_EndState"; - return ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; + ////return "_EndState"; + //return ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; + return makeEndStateName(this.apigen.proto.getSimpleName(), this.actual); } return this.apigen.proto.getSimpleName() + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_" + this.counter++; } + + public static String makeEndStateName(GProtocolName simpname, ParamActualRole r) + { + return simpname + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(r) + "_" + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; + } @Override public String getFilePath(String filename) @@ -98,13 +105,15 @@ protected String getStateChanPremable(EState s) { //throw new RuntimeException("[param-core] TODO: "); String tname = this.getStateChanName(s); + String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(this.apigen.proto.getSimpleName(), this.actual.getName()); String res = this.apigen.generateRootPackageDecl() + "\n" + "\n" + this.apigen.generateScribbleRuntimeImports() + "\n" + "\n" + "type " + tname + " struct{\n" - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + "}\n"; @@ -112,8 +121,9 @@ protected String getStateChanPremable(EState s) { res += "\n" + "func New" + tname + "(ep *" - //+ this.apigen.getGeneratedEndpointType() - + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + ////+ this.apigen.getGeneratedEndpointType() + //+ ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + + epType + ") *" + tname + " {\n" // FIXME: factor out //+ "ep." + this.role + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_STARTPROTOCOL + "()\n" + "return &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" @@ -160,7 +170,7 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) / if (succ.isTerminal()) { - res += sEp + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINISHPROTOCOL + "()\n"; + res += sEp + ".ept." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINISHPROTOCOL + "()\n"; } res += "return &" + ab.getReturnType(this, curr, succ) + "{ " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; if (!succ.isTerminal()) From aba6192c806ec42de8d557cd98775c5affe90281 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Sep 2017 23:10:47 +0100 Subject: [PATCH 124/433] Continued. --- .../ext/go/core/cli/ParamCoreCommandLine.java | 10 ++++++--- .../ParamCoreSTEndpointApiGenerator.java | 13 ++++++++---- .../ParamCoreSTSessionApiBuilder.java | 21 ++++++++++++------- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java index 230001c2b..c8b707306 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java @@ -23,8 +23,8 @@ import org.scribble.ext.go.core.ast.global.ParamCoreGType; import org.scribble.ext.go.core.ast.local.ParamCoreLType; import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; -import org.scribble.ext.go.core.main.ParamCoreMainContext; import org.scribble.ext.go.core.main.ParamCoreException; +import org.scribble.ext.go.core.main.ParamCoreMainContext; import org.scribble.ext.go.core.model.endpoint.ParamCoreEGraphBuilder; import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRange; @@ -141,8 +141,12 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, ranges, efsm).build(); outputClasses(goClasses); }*/ - Map actuals = this.E0.get(role); - Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, role, actuals).build(); + + /*job.debugPrintln("\n[param-core] Running " + ParamCoreSTSessionApiBuilder.class + " for " + fullname); + + Map goClasses = new ParamCoreSTSessionApiBuilder((GoJob) job, fullname, this.E0).build();*/ + //Map actuals = this.E0.get(role); + Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, role, this.E0).build(); outputClasses(goClasses); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index 03c6e71f8..c17c0b0fe 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -21,24 +21,29 @@ public class ParamCoreSTEndpointApiGenerator public final Job job; public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral - public final Map actuals; + //public final Map actuals; + public final Map> actuals; //public final EGraph graph; - public ParamCoreSTEndpointApiGenerator(Job job, GProtocolName fullname, Role self, Map actuals) + //public final Map> all; + + public ParamCoreSTEndpointApiGenerator(Job job, GProtocolName fullname, Role self, //Map actuals) + Map> actuals) { this.job = job; this.proto = fullname; this.self = self; this.actuals = Collections.unmodifiableMap(actuals); //this.graph = graph; + //this.all = Collections.unmodifiableMap(all); } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later public Map build() throws ScribbleException { Map res = new HashMap<>(); // filepath -> source - res.putAll(buildSessionApi()); - for (Entry actual : this.actuals.entrySet()) + res.putAll(buildSessionApi()); + for (Entry actual : this.actuals.get(this.self).entrySet()) { res.putAll(buildStateChannelApi(actual.getKey(), actual.getValue())); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index b3fe89b74..c0c0cc0d2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -14,13 +14,14 @@ // Cf. STStateChanApiBuilder public class ParamCoreSTSessionApiBuilder // FIXME: make base STSessionApiBuilder { - //private ParamCoreSTStateChanApiBuilder api; private ParamCoreSTEndpointApiGenerator apigen; + + //private final Map> actuals; - //public ParamCoreSTSessionApiBuilder(ParamCoreSTStateChanApiBuilder api) - public ParamCoreSTSessionApiBuilder(ParamCoreSTEndpointApiGenerator apigen) + public ParamCoreSTSessionApiBuilder(ParamCoreSTEndpointApiGenerator apigen)//, Map> actuals) { this.apigen = apigen; + //this.actuals = Collections.unmodifiableMap(actuals); } //@Override @@ -87,10 +88,13 @@ public Map build() // FIXME: factor out return "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out + "proto *" + simpname + "\n" - + this.apigen.actuals.keySet().stream().filter(a -> a.getName().equals(r)).map(a -> + + this.apigen.actuals.get(r).keySet().stream() + //.filter(a -> a.getName().equals(r)) + .map(a -> + //+ this.apigen.actuals.entrySet().stream().flatMap(e -> e.getValue().keySet().stream()).map(a -> { String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); - return "sub_" + actualName + " func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + return "Sub_" + actualName + " func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName //+ ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + "\n"; + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; }).collect(Collectors.joining("")) @@ -104,7 +108,10 @@ public Map build() // FIXME: factor out + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p , p." + r + ")}\n" + "}\n" + "\n" - + this.apigen.actuals.keySet().stream().filter(a -> a.getName().equals(r)).map(a -> + + this.apigen.actuals.get(r).keySet().stream() + //.filter(a -> a.getName().equals(r)) + .map(a -> + //+ this.apigen.actuals.entrySet().stream().flatMap(e -> e.getValue().keySet().stream()).map(a -> { String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); return @@ -113,7 +120,7 @@ public Map build() // FIXME: factor out + "(impl func(*" + simpname + "_" + actualName + "_1) *" // FIXME: factor out with above //+ ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + ") {\n" + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ") {\n" - + "r.sub_" + actualName + " = impl\n" + + "r.Sub_" + actualName + " = impl\n" + "}\n"; }).collect(Collectors.joining("")); }).collect(Collectors.joining("")); From ff7a89bbcd0c2c0ce8b0840efd71759d94e694f0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Sep 2017 23:36:00 +0100 Subject: [PATCH 125/433] Continued. --- .../statetype/ParamCoreSTSessionApiBuilder.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index c0c0cc0d2..ad980cbd7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -7,6 +7,8 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; +import org.scribble.ext.go.ast.ParamRoleDecl; +import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; @@ -85,6 +87,9 @@ public Map build() // FIXME: factor out roles.stream().map(r -> { String epTypeName = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); + List vars = + gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(r)) + .flatMap(rd -> ((ParamRoleDecl) rd).params.stream()).collect(Collectors.toList()); return "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out + "proto *" + simpname + "\n" @@ -103,9 +108,15 @@ public Map build() // FIXME: factor out + "}\n" + "\n" + "func (p *" + simpname + ") New" + epTypeName - + "(params map[string]int) (*" + epTypeName + ") {\n" - + "return &" + epTypeName + "{ proto: p, params: params, ept: " - + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p , p." + r + ")}\n" + //+ "(params map[string]int) + + "(" + + vars.stream().map(v -> v + " int").collect(Collectors.joining(", ")) + ")" + + "(*" + epTypeName + ") {\n" + + "return &" + epTypeName + "{ proto: p, params: " + //+ "params," + + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining()) + "}, " + + "ept: " + + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" + "}\n" + "\n" + this.apigen.actuals.get(r).keySet().stream() From c8bcd5bcf274e97708725b208325fbbc309d59ab Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Sep 2017 23:57:25 +0100 Subject: [PATCH 126/433] Continued. --- .../ParamCoreSTReceiveActionBuilder.java | 48 +++++++++++++++---- .../ParamCoreSTSendActionBuilder.java | 48 +++++++++++++++---- .../ParamCoreSTSessionApiBuilder.java | 5 +- 3 files changed, 78 insertions(+), 23 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 2629bfcb3..ec5b59bdd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -1,11 +1,17 @@ package org.scribble.ext.go.core.codegen.statetype; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -31,27 +37,49 @@ public String buildArgs(EAction a) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { - /*String sEpRecv = - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READ;*/ - /*String sEpProto = + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READ; + String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; - String sEpErr = + /*String sEpErr = //"s.ep.Err" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[" + e + "]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; return - //sEpRecv + "(..TODO..)\n" - /*+ "(" + sEpProto - + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", \"" + a.mid + "\")\n" + sEpRecv + + "(" + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "\"" + a.mid + "\")\n" + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> sEpWrite + "(..TODO..)") //+ sEpProto + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", arg" + i + ")") - .collect(Collectors.joining("\n")) + "\n"*/ + .mapToObj(i -> sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n" /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - buildReturn(api, curr, succ); + + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index f96d5249f..56204e4d1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -1,11 +1,17 @@ package org.scribble.ext.go.core.codegen.statetype; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -31,28 +37,50 @@ public String buildArgs(EAction a) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { - /*String sEpWrite = + String sEpWrite = //s.ep.Write - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITE;*/ - /*String sEpProto = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITE; + String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; - String sEpErr = + /*String sEpErr = //"s.ep.Err" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[" + e + "]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; return - //sEpWrite + "(..TODO..)\n" - /*+ "(" + sEpProto - + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", \"" + a.mid + "\")\n" + sEpWrite + + "(" + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "\"" + a.mid + "\")\n" + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> sEpWrite + "(..TODO..)") //+ sEpProto + ".(*" + api.gpn.getSimpleName() +")." + a.peer + ", arg" + i + ")") - .collect(Collectors.joining("\n")) + "\n"*/ + .mapToObj(i -> sEpWrite + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n" /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - buildReturn(api, curr, succ); + + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index ad980cbd7..cf7578ba5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -92,7 +92,7 @@ public Map build() // FIXME: factor out .flatMap(rd -> ((ParamRoleDecl) rd).params.stream()).collect(Collectors.toList()); return "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out - + "proto *" + simpname + "\n" + + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " *" + simpname + "\n" + this.apigen.actuals.get(r).keySet().stream() //.filter(a -> a.getName().equals(r)) .map(a -> @@ -112,13 +112,12 @@ public Map build() // FIXME: factor out + "(" + vars.stream().map(v -> v + " int").collect(Collectors.joining(", ")) + ")" + "(*" + epTypeName + ") {\n" - + "return &" + epTypeName + "{ proto: p, params: " + + "return &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p, params: " //+ "params," + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining()) + "}, " + "ept: " + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" + "}\n" - + "\n" + this.apigen.actuals.get(r).keySet().stream() //.filter(a -> a.getName().equals(r)) .map(a -> From 64dacdedac0c95afb853eaa587fa50f4f0c05ea2 Mon Sep 17 00:00:00 2001 From: dcastrop Date: Thu, 7 Sep 2017 13:45:18 +0100 Subject: [PATCH 127/433] Htcat proto --- .../src/test/scrib/param/cgo18/Htcat.scr | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 scribble-go/src/test/scrib/param/cgo18/Htcat.scr diff --git a/scribble-go/src/test/scrib/param/cgo18/Htcat.scr b/scribble-go/src/test/scrib/param/cgo18/Htcat.scr new file mode 100644 index 000000000..841475a1d --- /dev/null +++ b/scribble-go/src/test/scrib/param/cgo18/Htcat.scr @@ -0,0 +1,46 @@ +//Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java +//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d +//scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/cgo18/Htcat.scr -param Proto1 + +module param.cgo18.Htcat; + + +type "cat" from "..." as cat; +type "int" from "..." as int; +type "frag" from "..." as frag; +type "err" from "..." as err; + + +global protocol Htcat(role M(n), role W(n)) +{ + get(cat) from M[1..1] to W[1..n]; + + do HtcatProto(M, W); +} + +aux global protocol HtcatProto(role M, role W) +{ + choice at M[1] + { + cont() from M[1..1] to W[1..n]; + + choices at W[i:1..n] + { + register(frag) from W[i] to M[1..1]; + do HtcatProto(M, W); + } or + { + cancel(err) from W[i] to M[1..1]; + do HtcatProto(M, W); + } or + { + lastFragment(int) from W[i] to M[1..1]; + do HtcatProto(M, W); + } + + } or + { + stop() from M[1..1] to W[1..n]; + } +} + From a7963dcd55f30cbc2d60ac0eb3e425d7ece35d45 Mon Sep 17 00:00:00 2001 From: dcastrop Date: Thu, 7 Sep 2017 16:39:19 +0100 Subject: [PATCH 128/433] Are Reduce.scr Indices wrong? --- .../src/test/scrib/param/cgo18/Reduce.scr | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/scribble-go/src/test/scrib/param/cgo18/Reduce.scr b/scribble-go/src/test/scrib/param/cgo18/Reduce.scr index d72e7604b..7b2237e78 100644 --- a/scribble-go/src/test/scrib/param/cgo18/Reduce.scr +++ b/scribble-go/src/test/scrib/param/cgo18/Reduce.scr @@ -22,17 +22,17 @@ global protocol Reduce( role M(N) W[log n][0] --> M */ - distrib(intarray) from M[1 .. 1] to W[1..8*N]; + distrib(intarray) from M[1..1] to W[1..8*N]; // These ranges seem to fail - redl1(intarray) from W[1 .. N] to R[1..1]; - redl1(intarray) from W[ N+1..2*N] to R[2..2]; - redl1(intarray) from W[2*N+1..3*N] to R[3..3]; - redl1(intarray) from W[3*N+1..4*N] to R[4..4]; - redl1(intarray) from W[4*N+1..5*N] to R[5..5]; - redl1(intarray) from W[5*N+1..6*N] to R[6..6]; - redl1(intarray) from W[6*N+1..7*N] to R[7..7]; - redl1(intarray) from W[7*N+1..8*N] to R[8..8]; + redl1(intarray) from W[1..N] to R[1..1]; + redl1(intarray) from W[N+1..2*N] to R[2..2]; + redl1(intarray) from W[(2*N)+1..3*N] to R[3..3]; + redl1(intarray) from W[(3*N)+1..4*N] to R[4..4]; + redl1(intarray) from W[(4*N)+1..5*N] to R[5..5]; + redl1(intarray) from W[(5*N)+1..6*N] to R[6..6]; + redl1(intarray) from W[(6*N)+1..7*N] to R[7..7]; + redl1(intarray) from W[(7*N)+1..8*N] to R[8..8]; /* Can we simplify this? */ redl2(intarray) dot R[5..8] to R[1..4]; From 446481bab0f5fc736b43cb930c3dbe4fe1a0186c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 7 Sep 2017 17:32:19 +0100 Subject: [PATCH 129/433] Revised param-core actual/param role naming scheme. --- .../statetype/ParamCoreSTEndpointApiGenerator.java | 12 ++++++++++-- .../statetype/ParamCoreSTReceiveActionBuilder.java | 4 ++-- .../statetype/ParamCoreSTSendActionBuilder.java | 4 ++-- .../statetype/ParamCoreSTSessionApiBuilder.java | 11 +++++++---- .../statetype/ParamCoreSTStateChanApiBuilder.java | 9 ++++++++- .../ext/go/type/index/ParamBinIndexExpr.java | 6 ++++++ .../scribble/ext/go/type/index/ParamIndexExpr.java | 2 ++ .../scribble/ext/go/type/index/ParamIndexInt.java | 6 ++++++ .../scribble/ext/go/type/index/ParamIndexVar.java | 6 ++++++ 9 files changed, 49 insertions(+), 11 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index c17c0b0fe..fa793fd19 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -9,6 +9,7 @@ import java.util.stream.Stream; import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRange; import org.scribble.main.Job; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; @@ -78,10 +79,17 @@ public static String getGeneratedEndpointType(GProtocolName simpname, Role r) return simpname + "_" + r; } + // Doesn't use coranges -- same as getGeneratedParamRoleName? public static String getGeneratedActualRoleName(ParamActualRole actual) { - return actual.getName() - + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); + /*return actual.getName() + + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ + if (actual.ranges.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + actual); + } + ParamRange g = actual.ranges.iterator().next(); + return actual.getName() + "_" + g.start + "To" + g.end; } //@Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index ec5b59bdd..4cc5dbe0a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -67,7 +67,7 @@ else if (e instanceof ParamIndexVar) } }; return - sEpRecv + /* sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " @@ -80,6 +80,6 @@ else if (e instanceof ParamIndexVar) /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - + buildReturn(api, curr, succ); + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 56204e4d1..33d2d4dc8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -68,7 +68,7 @@ else if (e instanceof ParamIndexVar) } }; return - sEpWrite + /* sEpWrite + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " @@ -81,6 +81,6 @@ else if (e instanceof ParamIndexVar) /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - + buildReturn(api, curr, succ); + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index cf7578ba5..0965b03c7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -99,8 +99,10 @@ public Map build() // FIXME: factor out //+ this.apigen.actuals.entrySet().stream().flatMap(e -> e.getValue().keySet().stream()).map(a -> { String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); - return "Sub_" + actualName + " func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + /*return "Sub_" + actualName + " func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName //+ ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + "\n"; + + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n";*/ + return actualName + "s map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; }).collect(Collectors.joining("")) + "params map[string]int\n" @@ -125,12 +127,13 @@ public Map build() // FIXME: factor out { String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); return - "\nfunc (r *" + epTypeName + ") " + "\nfunc (ep *" + epTypeName + ") " + "Register_" + actualName - + "(impl func(*" + simpname + "_" + actualName + "_1) *" // FIXME: factor out with above + + "(i int, impl func(*" + simpname + "_" + actualName + "_1) *" // FIXME: factor out with above //+ ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE + ") {\n" + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ") {\n" - + "r.Sub_" + actualName + " = impl\n" + //+ "ep.Sub_" + actualName + " = impl\n" + + "ep." + actualName + "s[i] = impl\n" + "}\n"; }).collect(Collectors.joining("")); }).collect(Collectors.joining("")); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index 2f12ef850..b65343ba6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -14,6 +14,7 @@ import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; @@ -54,7 +55,13 @@ protected ParamActualRole getSelf() // Not actual roles; param roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName public static String getGeneratedParamRoleName(ParamRole r) { - return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); + //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); + if (r.ranges.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + r); + } + ParamRange g = r.ranges.iterator().next(); + return r.getName() + "_" + g.start + "To" + g.end; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java index 57975facc..35d58d31f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java @@ -37,6 +37,12 @@ protected ParamBinIndexExpr(Op op, ParamIndexExpr left, ParamIndexExpr right) this.op = op; } + @Override + public String toGoString() + { + throw new RuntimeException("[param-core] TODO: " + this); + } + @Override public String toSmt2Formula() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java index 5e00ddcd4..122d0e31f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java @@ -9,6 +9,8 @@ public boolean isConstant() return false; } + public abstract String toGoString(); + public abstract Set getVars(); public abstract String toSmt2Formula(); // Cf. toString -- but can be useful to separate, for debugging (and printing) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java index 792b38215..fc5c7c81b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java @@ -18,6 +18,12 @@ public boolean isConstant() { return true; } + + @Override + public String toGoString() + { + return toString(); + } @Override public String toSmt2Formula() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java index af4338797..5e835ea13 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java @@ -19,6 +19,12 @@ public ParamRoleParam toRoleParam() { return new ParamRoleParam(this.name); } + + @Override + public String toGoString() + { + return this.name; + } @Override public String toSmt2Formula() From bd7372c221c1f7fc8d3aa6a628e0beb980653d07 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 7 Sep 2017 17:35:49 +0100 Subject: [PATCH 130/433] Added back param-core basic Write/Read generation. Generates compilable Go except for Write/Read index args. --- .../codegen/statetype/ParamCoreSTReceiveActionBuilder.java | 6 +++--- .../codegen/statetype/ParamCoreSTSendActionBuilder.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 4cc5dbe0a..84b4b1132 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -59,7 +59,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat else if (e instanceof ParamIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[" + e + "]"; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[\"" + e + "\"]"; } else { @@ -67,7 +67,7 @@ else if (e instanceof ParamIndexVar) } }; return - /* sEpRecv + sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " @@ -80,6 +80,6 @@ else if (e instanceof ParamIndexVar) /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - buildReturn(api, curr, succ); + + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 33d2d4dc8..56204e4d1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -68,7 +68,7 @@ else if (e instanceof ParamIndexVar) } }; return - /* sEpWrite + sEpWrite + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " @@ -81,6 +81,6 @@ else if (e instanceof ParamIndexVar) /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - buildReturn(api, curr, succ); + + buildReturn(api, curr, succ); } } From 33de5a075f0639bef34efe8aed4763462d5341a9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 7 Sep 2017 17:47:03 +0100 Subject: [PATCH 131/433] Minor fix to param-core API gen. --- .../go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 56204e4d1..1a01c3acd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -60,7 +60,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat else if (e instanceof ParamIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[" + e + "]"; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[\"" + e + "\"]"; } else { From 5f8d0b8aeeb311ae00e3eaa05f8c041344ed6be2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 7 Sep 2017 18:09:31 +0100 Subject: [PATCH 132/433] Changed param-core API gen for init stat chan constructor. --- .../statetype/ParamCoreSTStateChanApiBuilder.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index b65343ba6..93697ede8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -21,6 +21,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder @@ -111,8 +112,10 @@ public String getActualRoleName() protected String getStateChanPremable(EState s) { //throw new RuntimeException("[param-core] TODO: "); + Role r = this.actual.getName(); + GProtocolName simpname = this.apigen.proto.getSimpleName(); String tname = this.getStateChanName(s); - String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(this.apigen.proto.getSimpleName(), this.actual.getName()); + String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); String res = this.apigen.generateRootPackageDecl() + "\n" + "\n" @@ -127,11 +130,10 @@ protected String getStateChanPremable(EState s) if (s.id == this.graph.init.id) { res += "\n" - + "func New" + tname + "(ep *" - ////+ this.apigen.getGeneratedEndpointType() - //+ ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE - + epType - + ") *" + tname + " {\n" // FIXME: factor out + + "func (ep *" + epType + ") New" + //+ tname + + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1" // cf. makeSTStateName + + "() *" + tname + " {\n" // FIXME: factor out //+ "ep." + this.role + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_STARTPROTOCOL + "()\n" + "return &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")}\n" From 9bf5471991e64d73feb7a66d50ee1d5e400312fa Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 7 Sep 2017 21:38:30 +0100 Subject: [PATCH 133/433] Added param-core API gen for branching. --- .../ext/go/ast/ParamAstFactoryImpl.java | 146 +----------------- .../scribble/ext/go/ast/ParamRoleDecl.java | 5 + .../ParamCoreSTBranchActionBuilder.java | 104 +++++++++++++ .../ParamCoreSTBranchStateBuilder.java | 94 +++++++++++ .../ParamCoreSTReceiveActionBuilder.java | 4 +- .../ParamCoreSTSendActionBuilder.java | 4 +- .../ParamCoreSTStateChanApiBuilder.java | 63 +++++--- 7 files changed, 255 insertions(+), 165 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index fb4320e96..a61e33c18 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -32,157 +32,19 @@ public GProtocolDecl GProtocolDecl(CommonTree source, List blocks) - { - GChoice gc = new GChoice(source, subj, blocks); - gc = del(gc, new AssrtGChoiceDel()); - return gc; - } - - /*@Override - public GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) - { - GRecursion gr = new GRecursion(source, recvar, block); - gr = del(gr, new AssrtGRecursionDel()); - return gr; - }* / - - @Override - public AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier) - { - AmbigNameNode ann = new AmbigNameNode(source, identifier); - ann = (AmbigNameNode) ann.del(new AssrtAmbigNameNodeDel()); - return ann; - } - - @Override - public LProjectionDecl LProjectionDecl(CommonTree source, List mods, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def) - { - LProjectionDecl lpd = new LProjectionDecl(source, mods, header, def); - lpd = del(lpd, new AssrtLProjectionDeclDel(fullname, self)); - return lpd; - } - - @Override - public LProtocolDef LProtocolDef(CommonTree source, LProtocolBlock block) - { - LProtocolDef lpd = new LProtocolDef(source, block); - lpd = del(lpd, new AssrtLProtocolDefDel()); - return lpd; - } - - - @Override - public LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List dests) - { - LReceive ls = new LReceive(source, src, msg, dests); // FIXME: AssrtLReceive with assertion? - ls = del(ls, new AssrtLReceiveDel()); - return ls; - } - - @Override - public LProtocolBlock LProtocolBlock(CommonTree source, LInteractionSeq seq) - { - LProtocolBlock lpb = new LProtocolBlock(source, seq); - lpb = del(lpb, new AssrtLProtocolBlockDel()); - return lpb; - } - - /* // Cf. GMessageTransfer -- empty-annotation sends still created as AssrtLSend, with null assertion -- but AssrtLSendDel still needed - * // No: not needed, because all globals made as Assrts, so projections are always Assrts - @Override - public AssrtLSend LSend(CommonTree source, RoleNode src, MessageNode msg, List dests) - { - //LSend ls = new LSend(source, src, msg, dests); - AssrtLSend ls = new AssrtLSend(source, src, msg, dests); - ls = del(ls, new AssrtLSendDel()); - return ls; }*/ - - /*@Override - public AssrtLConnect LConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dests) - { - AssrtLConnect ls = new AssrtLConnect(source, src, msg, dests); - ls = del(ls, new AssrtLConnectDel()); - return ls; - }* / // Returning new node classes in place of existing -- FIXME: do for GMessageTransfer and GChoice - // Still used by parsing for empty annotation/assertion nodes -- but we return an Assrt node - // Easier to make all global as Assrt nodes, to avoid cast checks in, e.g., AssrtGProtocolDeclDel::leaveProjection (for GProtocolHeader), and so all projections will be Assrt kinds only - - @Override - public AssrtGProtocolHeader GProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) - { - // Alternative is to make parsing return all as AssrtGProtocolHeader directly - AssrtGProtocolHeader gpb = new AssrtGProtocolHeader(source, name, roledecls, paramdecls); - gpb = del(gpb, createDefaultDelegate()); // Annots handled directly by AssrtAnnotationChecker Def enter/exit - return gpb; - } - - // Same pattern as for GProtocolHeader - // Non-annotated message transfers still created as AssrtGMessageTransfer -- null assertion, but AssrtGMessageTransferDel is still needed (why?) - @Override - public AssrtGMessageTransfer GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List dests) - { - AssrtGMessageTransfer gmt = new AssrtGMessageTransfer(source, src, msg, dests); - gmt = del(gmt, new AssrtGMessageTransferDel()); - return gmt; - } - - @Override - public AssrtGConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest) // Cf. AssrtAstFactoryImpl::GMessageTransfer - { - AssrtGConnect gc = new AssrtGConnect(source, src, msg, dest); - gc = del(gc, new AssrtGConnectDel()); - return gc; - } - @Override - public GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block) + public ParamRoleDecl RoleDecl(CommonTree source, RoleNode namenode) { - AssrtGRecursion gr = new AssrtGRecursion(source, recvar, block); - gr = del(gr, new AssrtGRecursionDel()); - return gr; - } - - @Override - public AssrtGContinue GContinue(CommonTree source, RecVarNode recvar) - { - AssrtGContinue gc = new AssrtGContinue(source, recvar); - gc = del(gc, new AssrtGContinueDel()); - return gc; + ParamRoleDecl rd = new ParamRoleDecl(source, namenode); + rd = del(rd, new RoleDeclDel()); + return rd; } - @Override - public AssrtGDo GDo(CommonTree source, RoleArgList roleinstans, NonRoleArgList arginstans, GProtocolNameNode proto) - { - AssrtGDo gd = new AssrtGDo(source, roleinstans, arginstans, proto); - gd = del(gd, new AssrtGDoDel()); - return gd; - } - */ // Explicitly creating new Assrt nodes diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java index d789fdbca..6904856fb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java @@ -20,6 +20,11 @@ public class ParamRoleDecl extends RoleDecl //public final List params; public final List params; + public ParamRoleDecl(CommonTree source, RoleNode name) + { + this(source, name, Collections.emptyList()); + } + //public ParamRoleDecl(CommonTree source, RoleNode name, List params) public ParamRoleDecl(CommonTree source, RoleNode name, List params) // Separating params from base RoleNode better for subprotos? { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java new file mode 100644 index 000000000..884321c3f --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -0,0 +1,104 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STBranchActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class ParamCoreSTBranchActionBuilder extends STBranchActionBuilder +{ + /*@Override + public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out + { + EState succ = curr.getSuccessor(a); + return + "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + + buildArgs(a) + + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: Return type is interface, so no need for *return (unlike other state chans) + + "s.state.Use()\n" + + buildBody(api, curr, a, succ) + "\n" + + "}"; + }*/ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + + i + " *" + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + } + + /*@Override + public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) + { + return api.cb.getCaseStateChanName(api, curr); + }*/ + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READ; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + return + /*sEpRecv + + "(" + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "\"" + a.mid + "\")\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n" + /*+ "if " + sEpErr + " != nil {\n" + + "return nil\n" + + "}\n"*/ + //buildReturn(api, curr, succ); + "return s._" + a.mid + "_Chan"; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java new file mode 100644 index 000000000..a41be52bc --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -0,0 +1,94 @@ +package org.scribble.ext.go.core.codegen.statetype; + +import java.util.stream.Collectors; + +import org.scribble.codegen.statetype.STBranchStateBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.endpoint.actions.EReceive; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +public class ParamCoreSTBranchStateBuilder extends STBranchStateBuilder +{ + public ParamCoreSTBranchStateBuilder(ParamCoreSTBranchActionBuilder bb) + { + super(bb); + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + //return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); + ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; + Role r = apigen.actual.getName(); + GProtocolName simpname = apigen.apigen.proto.getSimpleName(); + String tname = apigen.getStateChanName(s); + String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); + String res = + apigen.apigen.generateRootPackageDecl() + "\n" + + "\n" + + apigen.apigen.generateScribbleRuntimeImports() + "\n" + + "\n" + + "type " + tname + " struct{\n" + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") + .collect(Collectors.joining("")) + + "}\n"; + + res += "\n" + + "func (ep *" + epType + ") New" + + tname + + "() *" + tname + " {\n" // FIXME: factor out + + "s := &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan *" + apigen.getStateChanName(s.getSuccessor(a))+ ")") + .collect(Collectors.joining(", ")) + + "}\n" + + "go s.foo()\n" + + "return s\n" + + "}\n"; + + res += "\n" + + "func (s *" + tname + ") foo() {\n" + + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + "var op string = \"\"\n" + + "if " + + s.getActions().stream().map(a -> + { + String sEp = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + return + "op == \"" + a.mid + "\" {\n" + + "s." + "_" + a.mid + "_Chan <- " + + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" + + "}"; + }).collect(Collectors.joining(" else if ")) + "\n" + + "}\n"; + return res; + } + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + String out = getPreamble(api, s); + + for (EAction a : s.getActions()) + { + out += "\n\n"; + if (a instanceof EReceive) // FIXME: factor out action kind + { + out += this.bb.build(api, s, a); // Getting 1 checks non-unary + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + + return out; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 84b4b1132..d65f072ec 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -67,7 +67,7 @@ else if (e instanceof ParamIndexVar) } }; return - sEpRecv + /*sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " @@ -80,6 +80,6 @@ else if (e instanceof ParamIndexVar) /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - + buildReturn(api, curr, succ); + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 1a01c3acd..f7f24e139 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -68,7 +68,7 @@ else if (e instanceof ParamIndexVar) } }; return - sEpWrite + /*sEpWrite + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " @@ -81,6 +81,6 @@ else if (e instanceof ParamIndexVar) /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - + buildReturn(api, curr, succ); + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index 93697ede8..c119b109f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -39,7 +39,7 @@ public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, Pa super(apigen.job, apigen.proto, apigen.self, graph, new ParamCoreSTOutputStateBuilder(new ParamCoreSTSendActionBuilder()), new ParamCoreSTReceiveStateBuilder(new ParamCoreSTReceiveActionBuilder()), - null, //new GoSTBranchStateBuilder(new GoSTBranchActionBuilder()), + new ParamCoreSTBranchStateBuilder(new ParamCoreSTBranchActionBuilder()), null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), new ParamCoreSTEndStateBuilder()); @@ -146,17 +146,30 @@ protected String getStateChanPremable(EState s) @Override public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here because action builder hierarchy not suitable (extended by action kind, not by target language) { - //throw new RuntimeException("[param-core] TODO: "); EState succ = curr.getSuccessor(a); - return - "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(a) - + ") *" + ab.getReturnType(this, curr, succ) + " {\n" - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE - + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" - + ab.buildBody(this, curr, a, succ) + "\n" - + "}"; + if (getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1) + { + return + "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(a) + + ") chan *" + ab.getReturnType(this, curr, succ) + " {\n" + + ab.buildBody(this, curr, a, succ) + "\n" + + "}"; + } + else + { + //throw new RuntimeException("[param-core] TODO: "); + return + "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(a) + + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + ab.buildBody(this, curr, a, succ) + "\n" + + "}"; + } } @Override @@ -181,15 +194,27 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) / { res += sEp + ".ept." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINISHPROTOCOL + "()\n"; } - res += "return &" + ab.getReturnType(this, curr, succ) + "{ " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; - if (!succ.isTerminal()) + res += "return " + getSuccStateChan(ab, curr, succ, sEp); + return res; + } + + public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) + { + if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) + { + return "New" + getStateChanName(succ) + "()"; + } + else { - res += ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE - + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case + String res = "&" + ab.getReturnType(this, curr, succ) + "{ " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; + if (!succ.isTerminal()) + { + res += ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case + } + res += " }"; + return res; } - res += " }"; - - return res; } @Override @@ -209,7 +234,7 @@ public Map build() // filepath -> source if (s.getActions().size() > 1) { api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); - api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out + //api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out } else { From 14d04c85db34ee52669a11262e6f2756ecbf28f3 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Sat, 26 Aug 2017 23:04:04 +0100 Subject: [PATCH 134/433] Ignore IntelliJ module files. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index c6aa4d053..af1bb6d1a 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,6 @@ scribble-core/src/test/scrib/test/test9/ bin/scribblec.sh permissions-fix.sh +# IntelliJ metadata +*.iml +.idea/ From 26f3f24ccf8a8271135ed375c9d029e0526753bd Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Fri, 8 Sep 2017 04:07:57 +0100 Subject: [PATCH 135/433] Generate (de-)serialisation loop. --- .../statetype/ParamCoreSTApiGenConstants.java | 6 ++++-- .../ParamCoreSTEndpointApiGenerator.java | 2 ++ .../ParamCoreSTReceiveActionBuilder.java | 9 +++++++++ .../statetype/ParamCoreSTSendActionBuilder.java | 15 ++++++++++++--- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java index 95e066493..15929d9f3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java @@ -7,13 +7,15 @@ public class ParamCoreSTApiGenConstants public static final String GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE = "github.com/scribble/go-runtime/session/param"; public static final String GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE = "github.com/scribble/go-runtime/transport"; public static final String GO_SCRIBBLERUNTIME_SHM_PACKAGE = "github.com/scribble/go-runtime/transport/shm"; + public static final String GO_SCRIBBLERUNTIME_BYTES_PACKAGE = "bytes"; + public static final String GO_SCRIBBLERUNTIME_GOB_PACKAGE = "encoding/gob"; public static final String GO_ENDPOINT_TYPE = "session.Endpoint"; // net.MPSTEndpoint; public static final String GO_ENDPOINT_CONSTRUCTOR = "session.NewEndpoint"; public static final String GO_ENDPOINT_PROTO = "Proto"; public static final String GO_ENDPOINT_ERR = "Err"; - public static final String GO_ENDPOINT_WRITE = "Write"; - public static final String GO_ENDPOINT_READ = "Read"; + public static final String GO_ENDPOINT_WRITE = "WriteAll"; + public static final String GO_ENDPOINT_READ = "ReadAll"; public static final String GO_ENDPOINT_STARTPROTOCOL = "StartProtocol"; public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; public static final String GO_ENDPOINT_FINALISE = "Finalise"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index fa793fd19..731bf0c00 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -112,6 +112,8 @@ public List getScribbleRuntimeImports() // FIXME: factor up ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE ).collect(Collectors.toList()); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 84b4b1132..576c09e68 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -77,6 +77,15 @@ else if (e instanceof ParamIndexVar) + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + "arg" + i + ")") .collect(Collectors.joining("\n")) + "\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + "\tvar decoded "+a.payload.elems.get(0)+"\n" + + "\tif err := gob.NewDecoder(bytes.NewReader(b[i-"+foo.apply(g.start)+"])).Decode(&decoded); err != nil {\n\t\t" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Self.Name())\n" + + "\t}\n" + + "\tdata[i-"+foo.apply(g.start)+"] = decoded\n" + + "}\n" + + "*arg0 = reduceFn(data)" /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 1a01c3acd..90762aec6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -67,8 +67,17 @@ else if (e instanceof ParamIndexVar) throw new RuntimeException("[param-core] TODO: " + e); } }; - return - sEpWrite + return + "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + "\tvar buf bytes.Buffer\n" + + "\tif err := gob.NewDecoder(&buf).Encode(splitFn(arg0, i); err != nil {\n\t\t" // only arg0 + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Errors <- session.SerialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Self.Name())\n" + + "\t}\n" + + "\tb[i-"+foo.apply(g.start)+"] = buf.Bytes()\n" + + "}\n" + + sEpWrite + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " @@ -77,7 +86,7 @@ else if (e instanceof ParamIndexVar) .mapToObj(i -> sEpWrite + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + "arg" + i + ")") - .collect(Collectors.joining("\n")) + "\n" + .collect(Collectors.joining("\n")) + "\n" /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ From 9b9e97554dfda4a19ff5021e77dc2104ccb8afc6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 10 Sep 2017 23:30:46 +0100 Subject: [PATCH 136/433] Added Write/ReadAlll to param-core API gen. --- .../statetype/ParamCoreSTApiGenConstants.java | 5 ++- .../ParamCoreSTBranchActionBuilder.java | 2 +- .../ParamCoreSTEndpointApiGenerator.java | 4 +- .../ParamCoreSTReceiveActionBuilder.java | 28 ++++++++++-- .../ParamCoreSTSendActionBuilder.java | 43 ++++++++++++------- .../ParamCoreSTStateChanApiBuilder.java | 5 +++ 6 files changed, 64 insertions(+), 23 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java index 15929d9f3..de0bc5d88 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java @@ -14,11 +14,12 @@ public class ParamCoreSTApiGenConstants public static final String GO_ENDPOINT_CONSTRUCTOR = "session.NewEndpoint"; public static final String GO_ENDPOINT_PROTO = "Proto"; public static final String GO_ENDPOINT_ERR = "Err"; - public static final String GO_ENDPOINT_WRITE = "WriteAll"; - public static final String GO_ENDPOINT_READ = "ReadAll"; + public static final String GO_ENDPOINT_WRITEALL = "WriteAll"; + public static final String GO_ENDPOINT_READALL = "ReadAll"; public static final String GO_ENDPOINT_STARTPROTOCOL = "StartProtocol"; public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; public static final String GO_ENDPOINT_FINALISE = "Finalise"; + public static final String GO_ENDPOINT_ENDPOINT = "ept"; public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java index 884321c3f..a5a8d5e1a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -56,7 +56,7 @@ public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { String sEpRecv = - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READ; + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index 731bf0c00..02639d342 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -112,8 +112,8 @@ public List getScribbleRuntimeImports() // FIXME: factor up ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE - ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE - ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE + //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, + //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE ).collect(Collectors.toList()); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 55abe0b69..2d282006f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -31,14 +31,19 @@ public String buildArgs(EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " *" + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + + i + " *" + a.payload.elems.get(i) + + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" + ).collect(Collectors.joining(", ")); } @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { String sEpRecv = - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READ; + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." @@ -89,6 +94,23 @@ else if (e instanceof ParamIndexVar) /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ - buildReturn(api, curr, succ); + + "b := " + sEpRecv + "(" + sEpProto + ".B, " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "data := make([]int, " + foo.apply(g.end) + ")\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "var decoded int\n" + + "if err := gob.NewDecoder(bytes.NewReader(b[i-1])).Decode(&decoded); err != nil {\n" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Self.Name())\n" + + "}\n" + + "data[i-1] = decoded\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n" // FIXME: arg0 + + + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 5dc8a5be9..d6deb6eac 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -31,7 +31,9 @@ public String buildArgs(EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG - + i + " " + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + + i + " " + a.payload.elems.get(i) + + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " int, i" + i + " int) int" + ).collect(Collectors.joining(", ")); } @Override @@ -39,7 +41,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { String sEpWrite = //s.ep.Write - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITE; + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." @@ -68,26 +72,35 @@ else if (e instanceof ParamIndexVar) } }; return - "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)" + "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" - + "\tvar buf bytes.Buffer\n" - + "\tif err := gob.NewDecoder(&buf).Encode(splitFn(arg0, i); err != nil {\n\t\t" // only arg0 - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Errors <- session.SerialiseFailed(err, \"" + getActionName(api, a) +"\", " - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Self.Name())\n" - + "\t}\n" - + "\tb[i-"+foo.apply(g.start)+"] = buf.Bytes()\n" - + "}\n" + + "\tvar buf bytes.Buffer\n" + + "\tif err := gob.NewEncoder(&buf).Encode(splitFn0(arg0, i)); err != nil {\n\t\t" // only arg0 + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Errors <- session.SerialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Self.Name())\n" + + "\t}\n" + + "\tb[i-"+foo.apply(g.start)+"] = buf.Bytes()\n" + + "}\n" + sEpWrite + "(" + sEpProto - + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + //+ ".(*" + api.gpn.getSimpleName() +")" + + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " - + "\"" + a.mid + "\")\n" - + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> sEpWrite + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + //+ "\"" + a.mid + "\"" + + "b" + + ")\n" + /*+ IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> sEpWrite + "(" + sEpProto + //+ ".(*" + api.gpn.getSimpleName() +")." + + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + "arg" + i + ")") - .collect(Collectors.joining("\n")) + "\n" + .collect(Collectors.joining("\n")) + "\n"*/ /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index c119b109f..e6452536a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; @@ -120,6 +122,9 @@ protected String getStateChanPremable(EState s) this.apigen.generateRootPackageDecl() + "\n" + "\n" + this.apigen.generateScribbleRuntimeImports() + "\n" + + (s.isTerminal() ? "" : + Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE).map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + "\n" + "type " + tname + " struct{\n" //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" From fe2b2eb9fff7ba329af417674b4d7577e49d7c78 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 10 Sep 2017 23:57:50 +0100 Subject: [PATCH 137/433] Fixed "actual roles" index map in endpoint construction for param-core API gen. --- .../ParamCoreSTSessionApiBuilder.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 0965b03c7..27bea8b63 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -114,11 +114,21 @@ public Map build() // FIXME: factor out + "(" + vars.stream().map(v -> v + " int").collect(Collectors.joining(", ")) + ")" + "(*" + epTypeName + ") {\n" - + "return &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p, params: " - //+ "params," - + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining()) + "}, " - + "ept: " - + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" + + "return &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p, " + + + this.apigen.actuals.get(r).keySet().stream() + .map(a -> + { + String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); + return actualName + "s: make(map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ")"; + }).collect(Collectors.joining(", ")) + ", " + + + "params: " + //+ "params," + + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining()) + "}, " + + "ept: " + + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" + "}\n" + this.apigen.actuals.get(r).keySet().stream() //.filter(a -> a.getName().equals(r)) From a0d4952afc788440ef164171e3cd0e95d8eb6a71 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Mon, 11 Sep 2017 01:57:36 +0100 Subject: [PATCH 138/433] Register implementation with role definition. A new sub-role is added when a new implementation is registered at index i. --- .../go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java | 1 + 1 file changed, 1 insertion(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 27bea8b63..ec41bfc29 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -144,6 +144,7 @@ public Map build() // FIXME: factor out + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ") {\n" //+ "ep.Sub_" + actualName + " = impl\n" + "ep." + actualName + "s[i] = impl\n" + + "ep.Proto."+actualName+".(session.ParamRole).Register(i)\n" + "}\n"; }).collect(Collectors.joining("")); }).collect(Collectors.joining("")); From 2edeea88d9fd0646486de17ee8beb85e9970b2fe Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Mon, 11 Sep 2017 02:12:46 +0100 Subject: [PATCH 139/433] Use a more appropriate Role constructor. Use an empty ParamRole instead of an empty Role. --- .../go/core/codegen/statetype/ParamCoreSTApiGenConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java index de0bc5d88..f93787e5d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java @@ -24,7 +24,7 @@ public class ParamCoreSTApiGenConstants public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; public static final String GO_ROLE_TYPE = "session.Role"; - public static final String GO_ROLE_CONSTRUCTOR = "session.NewRole"; + public static final String GO_ROLE_CONSTRUCTOR = "session.NewPRole"; public static final String GO_PARAMROLE_TYPE = "session.ParamRole"; From 27e339d3cef946513ac1837cd77b57775c046db9 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Mon, 11 Sep 2017 03:00:50 +0100 Subject: [PATCH 140/433] Fix hard coded receive role. Replace hard coded receive role with remote role name. --- .../core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 2d282006f..2aa4302ea 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -95,7 +95,7 @@ else if (e instanceof ParamIndexVar) + "return nil\n" + "}\n"*/ - "b := " + sEpRecv + "(" + sEpProto + ".B, " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + "b := " + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + "data := make([]int, " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + "var decoded int\n" From 7a03ebd5bf6f645316ee083ce66749dfe6ce7158 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Sep 2017 13:12:34 +0100 Subject: [PATCH 141/433] Adding Read/WriteAll and explicit serialization to param-core branch API gen. --- .../ParamCoreSTBranchActionBuilder.java | 24 +++++- .../ParamCoreSTBranchStateBuilder.java | 74 ++++++++++++++++--- .../ParamCoreSTReceiveActionBuilder.java | 10 +-- .../ParamCoreSTSendActionBuilder.java | 3 + .../ParamCoreSTStateChanApiBuilder.java | 4 +- 5 files changed, 93 insertions(+), 22 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java index a5a8d5e1a..45833b695 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -43,7 +43,9 @@ public String buildArgs(EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " *" + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + + i + " *" + a.payload.elems.get(i) + + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" + ).collect(Collectors.joining(", ")); } /*@Override @@ -55,7 +57,7 @@ public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { - String sEpRecv = + /*String sEpRecv = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; String sEpProto = //"s.ep.Proto" @@ -99,6 +101,22 @@ else if (e instanceof ParamIndexVar) + "return nil\n" + "}\n"*/ //buildReturn(api, curr, succ); - "return s._" + a.mid + "_Chan"; + + "data := make([]int, " + foo.apply(g.end) + ")\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + + "var decoded int\n" + + "if err := gob.NewDecoder(bytes.NewReader(s.data[i-1])).Decode(&decoded); err != nil {\n" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Self.Name())\n" + + "}\n" + + "data[i-1] = decoded\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n" // FIXME: arg0 + + + "return s._" + a.mid + "_Chan"; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index a41be52bc..3ddb04896 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -1,9 +1,16 @@ package org.scribble.ext.go.core.codegen.statetype; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.endpoint.actions.EReceive; @@ -20,6 +27,16 @@ public ParamCoreSTBranchStateBuilder(ParamCoreSTBranchActionBuilder bb) @Override public String getPreamble(STStateChanApiBuilder api, EState s) { + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + //return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; Role r = apigen.actual.getName(); @@ -30,6 +47,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) apigen.apigen.generateRootPackageDecl() + "\n" + "\n" + apigen.apigen.generateScribbleRuntimeImports() + "\n" + + Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) + .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n")) + "\n" + "type " + tname + " struct{\n" //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" @@ -37,6 +56,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") .collect(Collectors.joining("")) + + "data [][]byte\n" + "}\n"; res += "\n" @@ -54,20 +74,50 @@ public String getPreamble(STStateChanApiBuilder api, EState s) res += "\n" + "func (s *" + tname + ") foo() {\n" - + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" - + "var op string = \"\"\n" - + "if " + + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"; + + ParamRole peer = (ParamRole) s.getActions().iterator().next().peer; + ParamRange g = peer.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + res += + "b := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "var op string = \"\"\n"; // FIXME: read label + + res += + "b = " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "s.data = b\n"; + // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + + res+= "if " + s.getActions().stream().map(a -> - { - String sEp = - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; - return - "op == \"" + a.mid + "\" {\n" - + "s." + "_" + a.mid + "_Chan <- " - + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" - + "}"; - }).collect(Collectors.joining(" else if ")) + "\n" + { + String sEp = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + return + "op == \"" + a.mid + "\" {\n" + + "s." + "_" + a.mid + "_Chan <- " + + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" + + "}"; + }).collect(Collectors.joining(" else if ")) + "\n" + "}\n"; + return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 2aa4302ea..88c4c6f04 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -97,14 +97,14 @@ else if (e instanceof ParamIndexVar) "b := " + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + "data := make([]int, " + foo.apply(g.end) + ")\n" - + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var decoded int\n" + "if err := gob.NewDecoder(bytes.NewReader(b[i-1])).Decode(&decoded); err != nil {\n" - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Self.Name())\n" + "}\n" + "data[i-1] = decoded\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index d6deb6eac..2b9b0b3df 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -86,6 +86,9 @@ else if (e instanceof ParamIndexVar) + "\tb[i-"+foo.apply(g.start)+"] = buf.Bytes()\n" + "}\n" + + // FIXME: write label + + sEpWrite + "(" + sEpProto //+ ".(*" + api.gpn.getSimpleName() +")" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index e6452536a..9d077825d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -123,8 +123,8 @@ protected String getStateChanPremable(EState s) + "\n" + this.apigen.generateScribbleRuntimeImports() + "\n" + (s.isTerminal() ? "" : - Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, - ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE).map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) + .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + "\n" + "type " + tname + " struct{\n" //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" From f43751dcc798e8124d67e6eeda90655efbc98745 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Sep 2017 14:47:27 +0100 Subject: [PATCH 142/433] go-runtime test/scattergather working. --- .../core/codegen/statetype/ParamCoreSTApiGenConstants.java | 2 +- .../codegen/statetype/ParamCoreSTSessionApiBuilder.java | 6 +++--- .../codegen/statetype/ParamCoreSTStateChanApiBuilder.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java index f93787e5d..de6ab1310 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java @@ -19,7 +19,7 @@ public class ParamCoreSTApiGenConstants public static final String GO_ENDPOINT_STARTPROTOCOL = "StartProtocol"; public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; public static final String GO_ENDPOINT_FINALISE = "Finalise"; - public static final String GO_ENDPOINT_ENDPOINT = "ept"; + public static final String GO_ENDPOINT_ENDPOINT = "Ept"; public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index ec41bfc29..0e7bd8c56 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -106,7 +106,7 @@ public Map build() // FIXME: factor out + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; }).collect(Collectors.joining("")) + "params map[string]int\n" - + "ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "}\n" + "\n" + "func (p *" + simpname + ") New" + epTypeName @@ -127,7 +127,7 @@ public Map build() // FIXME: factor out + "params: " //+ "params," + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining()) + "}, " - + "ept: " + + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ": " + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" + "}\n" + this.apigen.actuals.get(r).keySet().stream() @@ -144,7 +144,7 @@ public Map build() // FIXME: factor out + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ") {\n" //+ "ep.Sub_" + actualName + " = impl\n" + "ep." + actualName + "s[i] = impl\n" - + "ep.Proto."+actualName+".(session.ParamRole).Register(i)\n" + + "ep.Proto."+ r +".(session.ParamRole).Register(i)\n" + "}\n"; }).collect(Collectors.joining("")); }).collect(Collectors.joining("")); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index 9d077825d..da77a7467 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -197,7 +197,7 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) / if (succ.isTerminal()) { - res += sEp + ".ept." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINISHPROTOCOL + "()\n"; + res += sEp + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINISHPROTOCOL + "()\n"; } res += "return " + getSuccStateChan(ab, curr, succ, sEp); return res; From 03650201cdb7abf12034c6c6d475726eb3f36257 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Sep 2017 17:40:09 +0100 Subject: [PATCH 143/433] Added peer range map to endpoints in param-core API gen. --- .../ParamCoreSTSessionApiBuilder.java | 52 +++++++++++++++++-- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 0e7bd8c56..e5e45967e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -3,12 +3,18 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.stream.Collectors; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ext.go.ast.ParamRoleDecl; +import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EGraph; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; @@ -106,6 +112,7 @@ public Map build() // FIXME: factor out + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; }).collect(Collectors.joining("")) + "params map[string]int\n" + + "peers map[session.Role] func(*" + epTypeName + ") (int, int)\n" + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "}\n" + "\n" @@ -114,7 +121,7 @@ public Map build() // FIXME: factor out + "(" + vars.stream().map(v -> v + " int").collect(Collectors.joining(", ")) + ")" + "(*" + epTypeName + ") {\n" - + "return &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p, " + + "ep := &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p,\n" + this.apigen.actuals.get(r).keySet().stream() .map(a -> @@ -122,13 +129,50 @@ public Map build() // FIXME: factor out String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); return actualName + "s: make(map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ")"; - }).collect(Collectors.joining(", ")) + ", " + }).collect(Collectors.joining(", ")) + ",\n" + "params: " //+ "params," - + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining()) + "}, " - + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ": " + + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining()) + "},\n" + + + "peers: " + + "make(map[session.Role] func(*" + epTypeName + ") (int, int)),\n" + + + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ": " + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" + + + this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(r)) + .map(e -> + { + Map tmp = e.getValue(); + if (tmp.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + tmp); + } + ParamActualRole peer = tmp.keySet().iterator().next(); + ParamRange g = peer.ranges.iterator().next(); + Function foo = ee -> + { + if (ee instanceof ParamIndexInt) + { + return ee.toString(); + } + else if (ee instanceof ParamIndexVar) + { + return "ep.params[\"" + ee + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + ee); + } + }; + return + "ep.peers[p." + peer.getName() + "] = func (ep *" + epTypeName + ") (int, int) {\n" + + "return " + foo.apply(g.start) + ", " + foo.apply(g.end) + "\n" + + "}\n"; + }).collect(Collectors.joining("")) + + + "return ep" + "}\n" + this.apigen.actuals.get(r).keySet().stream() //.filter(a -> a.getName().equals(r)) From 2dc39982b5acee18a5d04bcc506d22be2d701bff Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Sep 2017 17:46:18 +0100 Subject: [PATCH 144/433] Minor. --- .../go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index e5e45967e..5403afb0e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -172,7 +172,7 @@ else if (ee instanceof ParamIndexVar) + "}\n"; }).collect(Collectors.joining("")) - + "return ep" + + "return ep\n" + "}\n" + this.apigen.actuals.get(r).keySet().stream() //.filter(a -> a.getName().equals(r)) From 32ec776432308d4efa13a8dc0904772bca451b42 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Sep 2017 18:02:58 +0100 Subject: [PATCH 145/433] Added op write/read actions to param-core API gen. Output compiles but deadlocks. --- .../statetype/ParamCoreSTReceiveActionBuilder.java | 4 +++- .../statetype/ParamCoreSTSendActionBuilder.java | 10 +++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 88c4c6f04..15bb56471 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -94,8 +94,10 @@ else if (e instanceof ParamIndexVar) /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ + + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" // Discard op - "b := " + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "b := " + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + "data := make([]int, " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var decoded int\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 2b9b0b3df..dc61688fc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -72,7 +72,15 @@ else if (e instanceof ParamIndexVar) } }; return - "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + "lbl := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for range lbl {\n" + + "lbl = append(lbl, []byte(\"" + a.mid + "\"))\n" + + "}\n" + + sEpWrite + "(" + sEpProto + "." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "lbl)\n" + + + "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + "\tvar buf bytes.Buffer\n" + "\tif err := gob.NewEncoder(&buf).Encode(splitFn0(arg0, i)); err != nil {\n\t\t" // only arg0 From dff576f610558230c2608e290a0aca8e9f04d51c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Sep 2017 20:37:13 +0100 Subject: [PATCH 146/433] Continued. --- .../codegen/statetype/ParamCoreSTBranchStateBuilder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index 3ddb04896..f4f057c99 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -97,7 +97,11 @@ else if (e instanceof ParamIndexVar) res += "b := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "var op string = \"\"\n"; // FIXME: read label + + "var decoded string\n" + + "if err := gob.NewDecoder(bytes.NewReader(b[0])).Decode(&decoded); err != nil {\n" // All ops should be the same + + "s.ept.Ept.Errors <- session.DeserialiseFailed(err, \"state " + s.id + "\", s.ept.Ept.Self.Name())\n" + + "}\n" + + "var op string = decoded\n"; // FIXME: cast for safety? res += "b = " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " From 6440f0a3f00878da3a79db68dabc75f796d50d50 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Sep 2017 21:19:49 +0100 Subject: [PATCH 147/433] Made constructor name for init branch states consistent with other state kinds in param-core API gen. --- .../core/codegen/statetype/ParamCoreSTBranchStateBuilder.java | 3 ++- .../core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index f4f057c99..e7ad4082a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -61,7 +61,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) res += "\n" + "func (ep *" + epType + ") New" - + tname + + ((s.id != api.graph.init.id) ? tname + : ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(((ParamCoreSTStateChanApiBuilder) api).actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + "() *" + tname + " {\n" // FIXME: factor out + "s := &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index da77a7467..705106528 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -207,7 +207,8 @@ public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, Str { if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { - return "New" + getStateChanName(succ) + "()"; + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + + "New" + getStateChanName(succ) + "()"; } else { From 66cf6dd4c03b748b397ab141d7ebe85371da48a9 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Tue, 12 Sep 2017 03:36:43 +0100 Subject: [PATCH 148/433] Fixes incorrect label send. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - slice should not be modified when ranging over it. - do not use append on slices preallocated with make. - rename lbl → labels to be clear. --- .../statetype/ParamCoreSTSendActionBuilder.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index dc61688fc..f920df261 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -71,15 +71,15 @@ else if (e instanceof ParamIndexVar) throw new RuntimeException("[param-core] TODO: " + e); } }; - return - "lbl := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" - + "for range lbl {\n" - + "lbl = append(lbl, []byte(\"" + a.mid + "\"))\n" - + "}\n" + return + "labels := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <=" + foo.apply(g.end) + "; i++ {\n" + + "\tlabels[i-" + foo.apply(g.start) + "] = []byte(\"" + a.mid + "\")\n" + + "}\n" + sEpWrite + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " - + "lbl)\n" - + + "labels)\n" + + "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + "\tvar buf bytes.Buffer\n" From 2ce1d71fd0a6efe83a2dacc569a25580b5105994 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Tue, 12 Sep 2017 03:42:48 +0100 Subject: [PATCH 149/433] Typo: missing space. --- .../go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index f920df261..863dbd3de 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -73,7 +73,7 @@ else if (e instanceof ParamIndexVar) }; return "labels := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" - + "for i := " + foo.apply(g.start) + "; i <=" + foo.apply(g.end) + "; i++ {\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + "\tlabels[i-" + foo.apply(g.start) + "] = []byte(\"" + a.mid + "\")\n" + "}\n" + sEpWrite + "(" + sEpProto + "." + r.getName() + ", " From da5f4cdb031cf28ebd5d6b272fc1b0c34dd06c4c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 12 Sep 2017 11:05:29 +0100 Subject: [PATCH 150/433] Fixed param-core branch API gen -- payload data receipt sync'd via internal channel, and removed reduceFn (singleton choice subj). --- .../statetype/ParamCoreSTBranchActionBuilder.java | 14 ++++++++------ .../statetype/ParamCoreSTBranchStateBuilder.java | 7 ++++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java index 45833b695..ad4294345 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -44,7 +44,7 @@ public String buildArgs(EAction a) return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + i + " *" + a.payload.elems.get(i) - + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" + //+ ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" // No: singleton choice subj (not multichoices) ).collect(Collectors.joining(", ")); } @@ -103,9 +103,10 @@ else if (e instanceof ParamIndexVar) //buildReturn(api, curr, succ); "data := make([]int, " + foo.apply(g.end) + ")\n" - + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + //+ "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var decoded int\n" - + "if err := gob.NewDecoder(bytes.NewReader(s.data[i-1])).Decode(&decoded); err != nil {\n" + + "bs := <-s.data\n" + + "if err := gob.NewDecoder(bytes.NewReader(bs[0])).Decode(&decoded); err != nil {\n" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," @@ -113,9 +114,10 @@ else if (e instanceof ParamIndexVar) + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Self.Name())\n" + "}\n" - + "data[i-1] = decoded\n" - + "}\n" - + "*arg0 = reduceFn0(data)\n" // FIXME: arg0 + + "data[0] = decoded\n" + //+ "}\n" + //+ "*arg0 = reduceFn0(data)\n" // FIXME: arg0 + + "*arg0 = data[0]\n" + "return s._" + a.mid + "_Chan"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index e7ad4082a..a51f2a61b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -56,7 +56,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") .collect(Collectors.joining("")) - + "data [][]byte\n" + + "data chan [][]byte\n" + "}\n"; res += "\n" @@ -67,7 +67,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "s := &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan *" + apigen.getStateChanName(s.getSuccessor(a))+ ")") - .collect(Collectors.joining(", ")) + .collect(Collectors.joining(", ")) + ", " + + "data: make(chan [][]byte)" + "}\n" + "go s.foo()\n" + "return s\n" @@ -107,7 +108,7 @@ else if (e instanceof ParamIndexVar) res += "b = " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "s.data = b\n"; + + "s.data <- b\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args res+= "if " From c7b73f30158f888e5cb4f6f44e029bb5ba82b39e Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Tue, 12 Sep 2017 13:30:53 +0100 Subject: [PATCH 151/433] Make remote peer params usable by Endpoint. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - peer is changed from map to func(...) (int, int) → map to struct{int, int}. - Add a registration loop for the remote role parameters. --- .../statetype/ParamCoreSTSessionApiBuilder.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 5403afb0e..b137894e4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -112,7 +112,7 @@ public Map build() // FIXME: factor out + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; }).collect(Collectors.joining("")) + "params map[string]int\n" - + "peers map[session.Role] func(*" + epTypeName + ") (int, int)\n" + + "peers map[session.Role]struct{Start int; End int}\n" + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "}\n" + "\n" @@ -121,6 +121,7 @@ public Map build() // FIXME: factor out + "(" + vars.stream().map(v -> v + " int").collect(Collectors.joining(", ")) + ")" + "(*" + epTypeName + ") {\n" + + "ep := &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p,\n" + this.apigen.actuals.get(r).keySet().stream() @@ -136,7 +137,7 @@ public Map build() // FIXME: factor out + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining()) + "},\n" + "peers: " - + "make(map[session.Role] func(*" + epTypeName + ") (int, int)),\n" + + "make(map[session.Role]struct{Start int; End int}),\n" + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ": " + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" @@ -167,8 +168,9 @@ else if (ee instanceof ParamIndexVar) } }; return - "ep.peers[p." + peer.getName() + "] = func (ep *" + epTypeName + ") (int, int) {\n" - + "return " + foo.apply(g.start) + ", " + foo.apply(g.end) + "\n" + "ep.peers[p." + peer.getName() + "] = struct{Start int; End int}{" + foo.apply(g.start) + ", " + foo.apply(g.end) + "}\n" + + "for i := ep.peers[p." + peer.getName() + "].Start; i <= ep.peers[p." + peer.getName() + "].End; i++ {\n" + + "\tp." + peer.getName() + ".(session.ParamRole).Register(i)\n" + "}\n"; }).collect(Collectors.joining("")) From f0326878970ddd44ad67fd0315395780da1c9a79 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Tue, 12 Sep 2017 15:16:08 +0100 Subject: [PATCH 152/433] Branch label does not need decoding. Branch label is always string and a []byte is directly casted to string. --- .../statetype/ParamCoreSTBranchStateBuilder.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index a51f2a61b..438e62eb2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -97,16 +97,12 @@ else if (e instanceof ParamIndexVar) } }; res += - "b := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + "label := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "var decoded string\n" - + "if err := gob.NewDecoder(bytes.NewReader(b[0])).Decode(&decoded); err != nil {\n" // All ops should be the same - + "s.ept.Ept.Errors <- session.DeserialiseFailed(err, \"state " + s.id + "\", s.ept.Ept.Self.Name())\n" - + "}\n" - + "var op string = decoded\n"; // FIXME: cast for safety? + + "var op string = string(label[0])\n"; // FIXME: cast for safety? res += - "b = " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + "b := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + "s.data <- b\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args From ce830ab3a0231e999cabfb552359215b40521c16 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Tue, 12 Sep 2017 15:38:16 +0100 Subject: [PATCH 153/433] Fixes blocking problem. - Close data channel when passed on to correct branch. - If data channel is closed, blocking stops but return nil channel so select will not pick this branch. --- .../core/codegen/statetype/ParamCoreSTBranchActionBuilder.java | 3 ++- .../core/codegen/statetype/ParamCoreSTBranchStateBuilder.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java index ad4294345..d9fdb5f2f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -105,7 +105,8 @@ else if (e instanceof ParamIndexVar) "data := make([]int, " + foo.apply(g.end) + ")\n" //+ "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var decoded int\n" - + "bs := <-s.data\n" + + "bs, open := <-s.data\n" + + "if !open { return nil } // do not select this branch. \n" + "if err := gob.NewDecoder(bytes.NewReader(bs[0])).Decode(&decoded); err != nil {\n" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index a51f2a61b..f05cbe652 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -108,7 +108,8 @@ else if (e instanceof ParamIndexVar) res += "b = " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "s.data <- b\n"; + + "s.data <- b\n" + + "close(s.data) // no more data, don't block.\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args res+= "if " From c3cea4bec4020767f3c20663a44f6af48ca27b28 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 12 Sep 2017 17:27:53 +0100 Subject: [PATCH 154/433] Fix for multi-param actual roles in param-core API gen. --- .../go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index b137894e4..7c3ff4ce9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -134,7 +134,7 @@ public Map build() // FIXME: factor out + "params: " //+ "params," - + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining()) + "},\n" + + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining(", ")) + "},\n" + "peers: " + "make(map[session.Role]struct{Start int; End int}),\n" From 9887bf4bd4e00dcdaa4637810b0762d5892b14c6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 12 Sep 2017 18:01:57 +0100 Subject: [PATCH 155/433] Fixed a bug for recursive init branch state in param-core API gen. --- .../codegen/statetype/ParamCoreSTStateChanApiBuilder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index 705106528..0cde5e02a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -208,7 +208,11 @@ public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, Str if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + - "New" + getStateChanName(succ) + "()"; + "New" + //+ getStateChanName(succ) + + ((succ.id != this.graph.init.id) ? getStateChanName(succ) + : ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + + "()"; } else { From 4b172531aceb60b003229af2482512bfec88f8eb Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Tue, 12 Sep 2017 23:12:22 +0100 Subject: [PATCH 156/433] Select-Branch fix. Select branch uses channel closing as a signal to notify Recv* functions if their branch was selected by the message label. - If selected, return the channel which delivers the next state. - If not selected, return nil chan which will not be selected. --- .../ParamCoreSTBranchActionBuilder.java | 12 +++++----- .../ParamCoreSTBranchStateBuilder.java | 22 +++++++++++-------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java index d9fdb5f2f..c16e4bdec 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -101,12 +101,14 @@ else if (e instanceof ParamIndexVar) + "return nil\n" + "}\n"*/ //buildReturn(api, curr, succ); - - "data := make([]int, " + foo.apply(g.end) + ")\n" + "ch, selected := <-s._" + a.mid + "_Chan\n" + + "if !selected {\n" + + "\treturn nil // select ignores nilchan\n" + + "}\n" + + "data := make([]int, " + foo.apply(g.end) + ")\n" //+ "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var decoded int\n" - + "bs, open := <-s.data\n" - + "if !open { return nil } // do not select this branch. \n" + + "bs := <-s.data\n" + "if err := gob.NewDecoder(bytes.NewReader(bs[0])).Decode(&decoded); err != nil {\n" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT @@ -120,6 +122,6 @@ else if (e instanceof ParamIndexVar) //+ "*arg0 = reduceFn0(data)\n" // FIXME: arg0 + "*arg0 = data[0]\n" - + "return s._" + a.mid + "_Chan"; + + "return ch"; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index 605861899..8a7ac73bb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -54,7 +54,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" - + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") .collect(Collectors.joining("")) + "data chan [][]byte\n" + "}\n"; @@ -66,9 +66,9 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "() *" + tname + " {\n" // FIXME: factor out + "s := &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " - + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan *" + apigen.getStateChanName(s.getSuccessor(a))+ ")") + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan chan *" + apigen.getStateChanName(s.getSuccessor(a))+ ", 1)") .collect(Collectors.joining(", ")) + ", " - + "data: make(chan [][]byte)" + + "data: make(chan [][]byte, 1)" + "}\n" + "go s.foo()\n" + "return s\n" @@ -99,13 +99,12 @@ else if (e instanceof ParamIndexVar) res += "label := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "var op string = string(label[0])\n"; // FIXME: cast for safety? + + "op := string(label[0])\n"; // FIXME: cast for safety? res += "b := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "s.data <- b\n" - + "close(s.data) // no more data, don't block.\n"; + + "s.data <- b\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args res+= "if " @@ -114,9 +113,14 @@ else if (e instanceof ParamIndexVar) String sEp = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; return - "op == \"" + a.mid + "\" {\n" - + "s." + "_" + a.mid + "_Chan <- " - + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" + "op == \"" + a.mid + "\" {\n" + + "\tch := make(chan *" + apigen.getStateChanName(s.getSuccessor(a)) + ", 1)\n" + + "\tch <- " + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" + + "\ts._" + a.mid + "_Chan <- ch\n" + + "\t" + s.getActions().stream() + .filter(otheract -> otheract.mid != a.mid) + .map(otheract -> { return "close(s._" + otheract.mid + "_Chan)"; }) + .collect(Collectors.joining("\n\t")) + "\n" + "}"; }).collect(Collectors.joining(" else if ")) + "\n" + "}\n"; From 57ca8f1f667a8228f0d8ec2011dfb07268023800 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Tue, 12 Sep 2017 23:22:43 +0100 Subject: [PATCH 157/433] Use recv-only chan to avoid misuse of return val. --- .../core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index 0cde5e02a..018ed0cd0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -158,7 +158,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(a) - + ") chan *" + ab.getReturnType(this, curr, succ) + " {\n" + + ") <-chan *" + ab.getReturnType(this, curr, succ) + " {\n" + ab.buildBody(this, curr, a, succ) + "\n" + "}"; } From 5a15b6253ed329100d7346a4c2ce4e2f8f2f2bff Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 13 Sep 2017 15:32:12 +0100 Subject: [PATCH 158/433] Hacked in -nocopy option for param-core (API gen). --- .../ext/go/core/cli/ParamCoreCLArgFlag.java | 4 ++- .../ext/go/core/cli/ParamCoreCLArgParser.java | 29 ++++++++-------- .../ext/go/core/cli/ParamCoreCommandLine.java | 10 +++--- .../ParamCoreSTReceiveActionBuilder.java | 17 ++++++++-- .../ParamCoreSTSendActionBuilder.java | 33 ++++++++++++++----- .../ParamCoreSTStateChanApiBuilder.java | 3 +- .../go/core/main/ParamCoreMainContext.java | 7 ++-- .../java/org/scribble/ext/go/main/GoJob.java | 5 ++- .../scribble/ext/go/main/GoMainContext.java | 2 +- 9 files changed, 75 insertions(+), 35 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java index 58fd90f05..dcf7f752f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java @@ -3,7 +3,9 @@ public enum ParamCoreCLArgFlag { // Unique flags - PARAM, + PARAM_CORE_PARAM, + + PARAM_CORE_NO_COPY, // Non-unique flags PARAM_CORE_EFSM, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java index 0a9e550f9..c745c1af6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java @@ -10,18 +10,18 @@ public class ParamCoreCLArgParser extends CLArgParser { // Unique flags - public static final String PARAM_FLAG = "-param"; + public static final String PARAM_CORE_PARAM_FLAG = "-param"; + public static final String PARAM_CORE_NOCOPY_FLAG = "-nocopy"; // Non-unique flags - public static final String GO_API_GEN_FLAG = "-goapi"; - public static final String PARAM_CORE_EFSM_FLAG = "-param-fsm"; public static final String PARAM_CORE_EFSM_PNG_FLAG = "-param-fsmpng"; public static final String PARAM_CORE_API_GEN_FLAG = "-param-api"; private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); { - ParamCoreCLArgParser.PARAM_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_FLAG, ParamCoreCLArgFlag.PARAM); + ParamCoreCLArgParser.PARAM_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_CORE_PARAM_FLAG, ParamCoreCLArgFlag.PARAM_CORE_PARAM); + ParamCoreCLArgParser.PARAM_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG, ParamCoreCLArgFlag.PARAM_CORE_NO_COPY); } private static final Map PARAM_NON_UNIQUE_FLAGS = new HashMap<>(); @@ -66,19 +66,14 @@ protected int parseFlag(int i) throws CommandLineException { // Unique flags - case ParamCoreCLArgParser.PARAM_FLAG: + case ParamCoreCLArgParser.PARAM_CORE_PARAM_FLAG: { return paramParseParam(i); } + case ParamCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG: return paramParseNoCopy(i); // Non-unique flags - - case ParamCoreCLArgParser.GO_API_GEN_FLAG: - { - return goParseProtoAndRoleArgs(flag, i); - } - case ParamCoreCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); case ParamCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); case ParamCoreCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParseRoleArg(flag, i); @@ -100,7 +95,13 @@ private int paramParseParam(int i) throws CommandLineException throw new CommandLineException("Missing simple global protocol name argument."); } String proto = this.args[++i]; - paramCheckAndAddUniqueFlag(ParamCoreCLArgParser.PARAM_FLAG, new String[] { proto }); + paramCheckAndAddUniqueFlag(ParamCoreCLArgParser.PARAM_CORE_PARAM_FLAG, new String[] { proto }); + return i; + } + + private int paramParseNoCopy(int i) throws CommandLineException + { + paramCheckAndAddUniqueFlag(ParamCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG, new String[] { }); return i; } @@ -139,7 +140,7 @@ protected int paramParseRoleAndFileArgs(String f, int i) throws CommandLineExcep return i; } - // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag + /*// FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException { ParamCoreCLArgFlag flag = ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); @@ -151,7 +152,7 @@ private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException String role = this.args[++i]; goConcatArgs(flag, proto, role); return i; - } + }*/ // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag private void goConcatArgs(ParamCoreCLArgFlag flag, String... toAdd) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java index c8b707306..140c90de1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java @@ -87,6 +87,8 @@ protected ParamCoreMainContext newMainContext() throws ScribParserException, Scr boolean noAcceptCorrelationCheck = this.args.containsKey(CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); boolean noValidation = this.args.containsKey(CLArgFlag.NO_VALIDATION); + boolean noCopy = this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM_CORE_NO_COPY); + List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) ? CommandLine.parseImportPaths(this.args.get(CLArgFlag.IMPORT_PATH)[0]) : Collections.emptyList(); @@ -101,7 +103,7 @@ protected ParamCoreMainContext newMainContext() throws ScribParserException, Scr { Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); return new ParamCoreMainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, noCopy); } } @@ -113,7 +115,7 @@ public static void main(String[] args) throws CommandLineException, AntlrSourceE @Override protected void doValidationTasks(Job job) throws ParamCoreSyntaxException, AntlrSourceException, ScribParserException, CommandLineException { - if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM)) + if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM_CORE_PARAM)) { doParamCoreValidationTasks((GoJob) job); } @@ -132,7 +134,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co String[] args = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_API_GEN); for (int i = 0; i < args.length; i += 1) { - String simpname = this.paramArgs.get(ParamCoreCLArgFlag.PARAM)[0]; + String simpname = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_PARAM)[0]; GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); Role role = checkRoleArg(jcontext, fullname, args[i]); /*for (ParamActualRole ranges : this.P0.get(role).keySet()) @@ -166,7 +168,7 @@ private void doParamCoreValidationTasks(GoJob j) throws ParamCoreSyntaxException paramCorePreContextBuilding(j); - GProtocolName simpname = new GProtocolName(this.paramArgs.get(ParamCoreCLArgFlag.PARAM)[0]); + GProtocolName simpname = new GProtocolName(this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_PARAM)[0]); if (simpname.toString().equals("[ParamCoreAllTest]")) // HACK: ParamCoreAllTest { paramCoreParseAndCheckWF(j); // Includes base passes diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 15bb56471..49e3172b8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -9,6 +9,7 @@ import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexInt; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -95,9 +96,19 @@ else if (e instanceof ParamIndexVar) + "return nil\n" + "}\n"*/ - sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" // Discard op + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" // Discard op - + "b := " + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + (((GoJob) api.job).noCopy + ? + "b := " + sEpRecv + "Raw(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + + "for i := 0; i < len(b); i++ {\n" + + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n" + : + "b := " + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + "data := make([]int, " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var decoded int\n" @@ -111,7 +122,7 @@ else if (e instanceof ParamIndexVar) + "}\n" + "data[i-1] = decoded\n" + "}\n" - + "*arg0 = reduceFn0(data)\n" // FIXME: arg0 + + "*arg0 = reduceFn0(data)\n") // FIXME: arg0 + buildReturn(api, curr, succ); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 863dbd3de..c446d7f21 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -9,6 +9,7 @@ import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexInt; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -72,15 +73,34 @@ else if (e instanceof ParamIndexVar) } }; return + + (((GoJob) api.job).noCopy + ? + "labels := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "tmp := \"" + a.mid + "\"\n" + + "\tlabels[i-" + foo.apply(g.start) + "] = &tmp\n" + + "}\n" + : "labels := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + "\tlabels[i-" + foo.apply(g.start) + "] = []byte(\"" + a.mid + "\")\n" - + "}\n" - + sEpWrite + "(" + sEpProto + "." + r.getName() + ", " + + "}\n") + + + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + "labels)\n" - + "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + (((GoJob) api.job).noCopy + ? + "b := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end)+"; i++ {\n" + + "tmp := splitFn0(arg0, i)\n" + + "\tb[i-"+foo.apply(g.start)+"] = &tmp\n" + + "}\n" + : + "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + "\tvar buf bytes.Buffer\n" + "\tif err := gob.NewEncoder(&buf).Encode(splitFn0(arg0, i)); err != nil {\n\t\t" // only arg0 @@ -92,12 +112,9 @@ else if (e instanceof ParamIndexVar) + ".Self.Name())\n" + "\t}\n" + "\tb[i-"+foo.apply(g.start)+"] = buf.Bytes()\n" - + "}\n" - - - // FIXME: write label + + "}\n") - + sEpWrite + + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + "(" + sEpProto //+ ".(*" + api.gpn.getSimpleName() +")" + "." + r.getName() + ", " diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index 018ed0cd0..a6f6ac9d4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -18,6 +18,7 @@ import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; @@ -122,7 +123,7 @@ protected String getStateChanPremable(EState s) this.apigen.generateRootPackageDecl() + "\n" + "\n" + this.apigen.generateScribbleRuntimeImports() + "\n" - + (s.isTerminal() ? "" : + + (s.isTerminal() || ((GoJob) apigen.job).noCopy ? "" : Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java index 36a18977d..a40cc942e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java @@ -17,12 +17,15 @@ public class ParamCoreMainContext extends MainContext { + protected final boolean noCopy; + // Load main module from file system public ParamCoreMainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation) + boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean noCopy) throws ScribParserException, ScribbleException { super(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); + this.noCopy = noCopy; } @Override @@ -30,7 +33,7 @@ public GoJob newJob() { return new GoJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, - this.af, this.ef, this.sf); + this.af, this.ef, this.sf, this.noCopy); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java b/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java index c13c993ec..687901d3d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java @@ -11,12 +11,15 @@ public class GoJob extends Job { + public final boolean noCopy; + public GoJob(boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, - AstFactory af, EModelFactory ef, SModelFactory sf) + AstFactory af, EModelFactory ef, SModelFactory sf, boolean noCopy) { super(debug, parsed, main, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, af, ef, sf); + this.noCopy = noCopy; } /*// FIXME: move to MainContext::newJob? diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java index 32acb2264..6aaacdcb9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java @@ -22,6 +22,6 @@ public GoJob newJob() { return new GoJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, - this.af, this.ef, this.sf); + this.af, this.ef, this.sf, false); } } From 04ef6a970430ced0681dbaa3cd33f63fef35a3c8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 13 Sep 2017 16:17:01 +0100 Subject: [PATCH 159/433] Updated param-core branch API gen following previous hacks. --- .../ParamCoreSTBranchActionBuilder.java | 27 ++++++++++-------- .../ParamCoreSTBranchStateBuilder.java | 28 +++++++++++++++---- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java index c16e4bdec..fe64710f0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -1,17 +1,12 @@ package org.scribble.ext.go.core.codegen.statetype; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.scribble.codegen.statetype.STBranchActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.main.GoJob; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -68,7 +63,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ - ParamRole r = (ParamRole) a.peer; + /*ParamRole r = (ParamRole) a.peer; ParamRange g = r.ranges.iterator().next(); Function foo = e -> { @@ -85,7 +80,7 @@ else if (e instanceof ParamIndexVar) { throw new RuntimeException("[param-core] TODO: " + e); } - }; + };*/ return /*sEpRecv + "(" + sEpProto @@ -105,11 +100,16 @@ else if (e instanceof ParamIndexVar) + "if !selected {\n" + "\treturn nil // select ignores nilchan\n" + "}\n" - + "data := make([]int, " + foo.apply(g.end) + ")\n" + //+ "data := make([]int, " + foo.apply(g.end) + ")\n" //+ "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var decoded int\n" + "bs := <-s.data\n" - + "if err := gob.NewDecoder(bytes.NewReader(bs[0])).Decode(&decoded); err != nil {\n" + + + ((((GoJob) api.job).noCopy) + ? + "decoded = *bs[0].(*" + a.payload.elems.get(0) + ")\n" + : + "if err := gob.NewDecoder(bytes.NewReader(bs[0])).Decode(&decoded); err != nil {\n" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," @@ -117,10 +117,13 @@ else if (e instanceof ParamIndexVar) + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Self.Name())\n" + "}\n" - + "data[0] = decoded\n" + //+ "data[0] = decoded\n" //+ "}\n" + ) + //+ "*arg0 = reduceFn0(data)\n" // FIXME: arg0 - + "*arg0 = data[0]\n" + // + "*arg0 = data[0]\n" + + "*arg0 = decoded\n" + "return ch"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index 8a7ac73bb..5102afa7f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -8,6 +8,7 @@ import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexInt; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -47,8 +48,11 @@ public String getPreamble(STStateChanApiBuilder api, EState s) apigen.apigen.generateRootPackageDecl() + "\n" + "\n" + apigen.apigen.generateScribbleRuntimeImports() + "\n" - + Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) - .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n")) + + + (((GoJob) api.job).noCopy ? "" : + Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) + .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + + "\n" + "type " + tname + " struct{\n" //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" @@ -56,7 +60,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") .collect(Collectors.joining("")) - + "data chan [][]byte\n" + + (((GoJob) apigen.job).noCopy ? "data chan []interface{}" : "data chan [][]byte\n" ) + "}\n"; res += "\n" @@ -68,7 +72,9 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan chan *" + apigen.getStateChanName(s.getSuccessor(a))+ ", 1)") .collect(Collectors.joining(", ")) + ", " - + "data: make(chan [][]byte, 1)" + + + "data: make(chan " + (((GoJob) api.job).noCopy ? "[]interface{}" : "[][]byte") + ", 1)" + + "}\n" + "go s.foo()\n" + "return s\n" @@ -96,13 +102,25 @@ else if (e instanceof ParamIndexVar) throw new RuntimeException("[param-core] TODO: " + e); } }; + + if (((GoJob) apigen.job).noCopy) + { + res += + "label := " + sEpRecv + "Raw(" + sEpProto + "." + peer.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "op := *label[0].(*string)\n"; // FIXME: cast for safety? + } + else + { res += "label := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + "op := string(label[0])\n"; // FIXME: cast for safety? + } res += - "b := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + "b := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + peer.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + "s.data <- b\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args From b732d3de3e52d8311c6963f2a28f7f9997ac3f59 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Wed, 13 Sep 2017 20:23:18 +0100 Subject: [PATCH 160/433] Embed Endpoint in Role struct. Embedding Endpoint in Role struct allows Connect/Accept functions to be called directly from a Role. Also moved from Role fields to Endpoint: - role.params into Endpoint.Params - role.peers into Endpoint.Peers --- .../statetype/ParamCoreSTApiGenConstants.java | 2 +- .../ParamCoreSTBranchActionBuilder.java | 2 +- .../ParamCoreSTBranchStateBuilder.java | 2 +- .../ParamCoreSTReceiveActionBuilder.java | 2 +- .../ParamCoreSTSendActionBuilder.java | 2 +- .../ParamCoreSTSessionApiBuilder.java | 19 +++++-------------- 6 files changed, 10 insertions(+), 19 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java index de6ab1310..dff127cfa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTApiGenConstants.java @@ -19,7 +19,7 @@ public class ParamCoreSTApiGenConstants public static final String GO_ENDPOINT_STARTPROTOCOL = "StartProtocol"; public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; public static final String GO_ENDPOINT_FINALISE = "Finalise"; - public static final String GO_ENDPOINT_ENDPOINT = "Ept"; + public static final String GO_ENDPOINT_ENDPOINT = "Endpoint"; public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java index fe64710f0..f44b14eb2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -74,7 +74,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat else if (e instanceof ParamIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[\"" + e + "\"]"; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index 5102afa7f..d4f0b8a92 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -95,7 +95,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) else if (e instanceof ParamIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[\"" + e + "\"]"; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 49e3172b8..c3e60d04d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -65,7 +65,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat else if (e instanceof ParamIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[\"" + e + "\"]"; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index c446d7f21..d8c63499c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -65,7 +65,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat else if (e instanceof ParamIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".params[\"" + e + "\"]"; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 7c3ff4ce9..0f7051762 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -111,9 +111,7 @@ public Map build() // FIXME: factor out return actualName + "s map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; }).collect(Collectors.joining("")) - + "params map[string]int\n" - + "peers map[session.Role]struct{Start int; End int}\n" - + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "}\n" + "\n" + "func (p *" + simpname + ") New" + epTypeName @@ -131,14 +129,6 @@ public Map build() // FIXME: factor out return actualName + "s: make(map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ")"; }).collect(Collectors.joining(", ")) + ",\n" - - + "params: " - //+ "params," - + "map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining(", ")) + "},\n" - - + "peers: " - + "make(map[session.Role]struct{Start int; End int}),\n" - + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ": " + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" @@ -160,7 +150,7 @@ public Map build() // FIXME: factor out } else if (ee instanceof ParamIndexVar) { - return "ep.params[\"" + ee + "\"]"; + return "ep.Params[\"" + ee + "\"]"; } else { @@ -168,8 +158,9 @@ else if (ee instanceof ParamIndexVar) } }; return - "ep.peers[p." + peer.getName() + "] = struct{Start int; End int}{" + foo.apply(g.start) + ", " + foo.apply(g.end) + "}\n" - + "for i := ep.peers[p." + peer.getName() + "].Start; i <= ep.peers[p." + peer.getName() + "].End; i++ {\n" + "ep.Params = map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining(", ")) + "}\n" + + "ep.Peers[p." + peer.getName() + "] = struct{Start int; End int}{" + foo.apply(g.start) + ", " + foo.apply(g.end) + "}\n" + + "for i := ep." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Peers[p." + peer.getName() + "].Start; i <= ep.Peers[p." + peer.getName() + "].End; i++ {\n" + "\tp." + peer.getName() + ".(session.ParamRole).Register(i)\n" + "}\n"; }).collect(Collectors.joining("")) From 4b8229ad70a84292890081c22e4c51ce46a83c29 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 14 Sep 2017 17:52:47 +0100 Subject: [PATCH 161/433] Hacking in empty payload actions for -nocopy param-core API gen. --- .../ParamCoreSTBranchActionBuilder.java | 27 ++++++--- .../ParamCoreSTBranchStateBuilder.java | 18 ++++-- .../ParamCoreSTReceiveActionBuilder.java | 57 +++++++++++-------- .../ParamCoreSTSendActionBuilder.java | 19 +++++-- 4 files changed, 80 insertions(+), 41 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java index fe64710f0..c85ff2b0e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -81,7 +81,8 @@ else if (e instanceof ParamIndexVar) throw new RuntimeException("[param-core] TODO: " + e); } };*/ - return + + String res = /*sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " @@ -99,13 +100,23 @@ else if (e instanceof ParamIndexVar) "ch, selected := <-s._" + a.mid + "_Chan\n" + "if !selected {\n" + "\treturn nil // select ignores nilchan\n" - + "}\n" + + "}\n"; + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + + res += //+ "data := make([]int, " + foo.apply(g.end) + ")\n" //+ "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args - + "var decoded int\n" - + "bs := <-s.data\n" - - + ((((GoJob) api.job).noCopy) + "var decoded int\n" + + "bs := <-s.data\n"; + + res += + ((((GoJob) api.job).noCopy) ? "decoded = *bs[0].(*" + a.payload.elems.get(0) + ")\n" : @@ -123,8 +134,10 @@ else if (e instanceof ParamIndexVar) //+ "*arg0 = reduceFn0(data)\n" // FIXME: arg0 // + "*arg0 = data[0]\n" - + "*arg0 = decoded\n" + + "*arg0 = decoded\n"; + } + return res + "return ch"; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index 5102afa7f..3f8c98a76 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.core.codegen.statetype; +import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -118,12 +119,17 @@ else if (e instanceof ParamIndexVar) + "op := string(label[0])\n"; // FIXME: cast for safety? } - res += - "b := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") - + "(" + sEpProto + "." + peer.getName() + ", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "s.data <- b\n"; - // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + List as = s.getActions(); + boolean allEmpty = as.stream().allMatch(a -> a.payload.elems.isEmpty()); + if (!allEmpty) // FIXME: + { + res += + "b := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + peer.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "s.data <- b\n"; + // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + } res+= "if " + s.getActions().stream().map(a -> diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 49e3172b8..3c5933425 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -72,7 +72,6 @@ else if (e instanceof ParamIndexVar) throw new RuntimeException("[param-core] TODO: " + e); } }; - return /*sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " @@ -96,34 +95,44 @@ else if (e instanceof ParamIndexVar) + "return nil\n" + "}\n"*/ + String res = sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") - + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" // Discard op - - + (((GoJob) api.job).noCopy + + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n"; // Discard op + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + res += + (((GoJob) api.job).noCopy ? - "b := " + sEpRecv + "Raw(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" - + "for i := 0; i < len(b); i++ {\n" - + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" - + "}\n" - + "*arg0 = reduceFn0(data)\n" + "b := " + sEpRecv + "Raw(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + + "for i := 0; i < len(b); i++ {\n" + + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n" : - "b := " + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "data := make([]int, " + foo.apply(g.end) + ")\n" - + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args - + "var decoded int\n" - + "if err := gob.NewDecoder(bytes.NewReader(b[i-1])).Decode(&decoded); err != nil {\n" - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "b := " + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "data := make([]int, " + foo.apply(g.end) + ")\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + + "var decoded int\n" + + "if err := gob.NewDecoder(bytes.NewReader(b[i-1])).Decode(&decoded); err != nil {\n" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Self.Name())\n" - + "}\n" - + "data[i-1] = decoded\n" - + "}\n" - + "*arg0 = reduceFn0(data)\n") // FIXME: arg0 + + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Self.Name())\n" + + "}\n" + + "data[i-1] = decoded\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n"); // FIXME: arg0 + } + return res + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index c446d7f21..4ce83f83a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -72,8 +72,8 @@ else if (e instanceof ParamIndexVar) throw new RuntimeException("[param-core] TODO: " + e); } }; - return + String res = (((GoJob) api.job).noCopy ? "labels := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" @@ -90,9 +90,16 @@ else if (e instanceof ParamIndexVar) + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " - + "labels)\n" + + "labels)\n"; - + (((GoJob) api.job).noCopy + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + res += + (((GoJob) api.job).noCopy ? "b := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end)+"; i++ {\n" @@ -121,7 +128,7 @@ else if (e instanceof ParamIndexVar) + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " //+ "\"" + a.mid + "\"" + "b" - + ")\n" + + ")\n"; /*+ IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> sEpWrite + "(" + sEpProto //+ ".(*" + api.gpn.getSimpleName() +")." @@ -132,6 +139,10 @@ else if (e instanceof ParamIndexVar) /*+ "if " + sEpErr + " != nil {\n" + "return nil\n" + "}\n"*/ + } + + return + res + buildReturn(api, curr, succ); } } From 337b2de3ad09d18cd7989411b62737a233b713f9 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Thu, 14 Sep 2017 23:20:10 +0100 Subject: [PATCH 162/433] Optimise branch handler. - foo() is converted from a goroutine to an ordinary function call. - foo() must be called after s is initialised and before returning s, all channels in foo() are unbuffered so once ReadAll is complete, s is returned immediately. - Although both data channel and selection channels are all buffered, ensure data are sent to the selection channels then data channels to preserve order of receive in the Recv_* methods. --- .../ParamCoreSTBranchStateBuilder.java | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index cdc20b751..13a21c23a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -77,7 +77,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "data: make(chan " + (((GoJob) api.job).noCopy ? "[]interface{}" : "[][]byte") + ", 1)" + "}\n" - + "go s.foo()\n" + + "s.foo()\n" + "return s\n" + "}\n"; @@ -126,28 +126,39 @@ else if (e instanceof ParamIndexVar) res += "b := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + "(" + sEpProto + "." + peer.getName() + ", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "s.data <- b\n"; - // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n"; + // See below for sending b to s.data + // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args } - - res+= "if " + + res+= "switch op {\n" + s.getActions().stream().map(a -> { String sEp = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; return - "op == \"" + a.mid + "\" {\n" - + "\tch := make(chan *" + apigen.getStateChanName(s.getSuccessor(a)) + ", 1)\n" - + "\tch <- " + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" - + "\ts._" + a.mid + "_Chan <- ch\n" - + "\t" + s.getActions().stream() + "\tcase \"" + a.mid + "\":\n" + + "\t\tch := make(chan *" + apigen.getStateChanName(s.getSuccessor(a)) + ", 1)\n" + + "\t\tch <- " + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" + + "\t\ts._" + a.mid + "_Chan <- ch\n" + + "\t\t" + s.getActions().stream() .filter(otheract -> otheract.mid != a.mid) .map(otheract -> { return "close(s._" + otheract.mid + "_Chan)"; }) - .collect(Collectors.joining("\n\t")) + "\n" - + "}"; - }).collect(Collectors.joining(" else if ")) + "\n" - + "}\n"; + .collect(Collectors.joining("\n\t")) + "\n"; + }).collect(Collectors.joining("\n")) + + "\n" + + "\tdefault:\n" // default case captures unrecognised choice label + + "\t\t" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + + "Errors <- session.UnknownChoiceLabelError{Label: op}\n" + + "\t}\n"; // End of switch + + if (!allEmpty) + { + // b is result of a sEpRecv/sEpRecvRaw + res += "\ts.data <- b\n"; + } + + res += "}\n"; // End of func foo return res; } From 7870d4e846e19f92d0c5c481f93d5dc7b9fd1527 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 26 Oct 2017 18:20:15 +0100 Subject: [PATCH 163/433] Minor. --- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index bd1ca0bd3..9d3e31e1c 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -48,6 +48,14 @@ message passing // paramterisation subsumes multicast + +global protocol Proto1(role A(n,m), role B(n,m)) +{ + 0() dot A[1..n] to B[(m*2)+1..(m*2)+n]; +} + + +/* global protocol Proto1(role A(n), role B(n), role S(n)) { title(string) from A[1..1] to S[1..1]; @@ -80,6 +88,7 @@ global protocol Proto1(role A(n), role B(n), role S(n)) } } } +*/ /* global protocol Proto1(role A(n, m), role B(n, m)) From a1a9371784a407e93a21442c511965255534a9c4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 4 Dec 2017 16:21:45 +0000 Subject: [PATCH 164/433] Revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../ext/go/core/cli/ParamCoreCommandLine.java | 3 +- .../ParamCoreSTApiGenConstants.java | 47 +++ .../ParamCoreSTBranchActionBuilder.java | 143 ++++++++ .../ParamCoreSTBranchStateBuilder.java | 176 ++++++++++ .../ParamCoreSTEndStateBuilder.java | 41 +++ .../ParamCoreSTEndpointApiGenerator.java | 126 +++++++ .../ParamCoreSTOutputStateBuilder.java | 20 ++ .../ParamCoreSTReceiveActionBuilder.java | 138 ++++++++ .../ParamCoreSTReceiveStateBuilder.java | 20 ++ .../ParamCoreSTSendActionBuilder.java | 160 +++++++++ .../ParamCoreSTSessionApiBuilder.java | 219 ++++++++++++ .../ParamCoreSTStateChanApiBuilder.java | 312 ++++++++++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 2 +- 13 files changed, 1405 insertions(+), 2 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java index 140c90de1..2575c6ba1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java @@ -22,7 +22,8 @@ import org.scribble.ext.go.core.ast.global.ParamCoreGProtocolDeclTranslator; import org.scribble.ext.go.core.ast.global.ParamCoreGType; import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; +//import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; +import org.scribble.ext.go.core.codegen.statetype2.ParamCoreSTEndpointApiGenerator; import org.scribble.ext.go.core.main.ParamCoreException; import org.scribble.ext.go.core.main.ParamCoreMainContext; import org.scribble.ext.go.core.model.endpoint.ParamCoreEGraphBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java new file mode 100644 index 000000000..af159cff9 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java @@ -0,0 +1,47 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +public class ParamCoreSTApiGenConstants +{ + //public static final String GO_SCRIBBLERUNTIME_PACKAGE = "org/scribble/runtime/net"; + public static final String GO_SCRIBBLERUNTIME_SESSION_PACKAGE = "github.com/nickng/scribble-go-runtime/runtime/session"; + public static final String GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE = "github.com/scribble/go-runtime/session/param"; + public static final String GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE = "github.com/nickng/scribble-go-runtime/runtime/transport"; + public static final String GO_SCRIBBLERUNTIME_SHM_PACKAGE = "github.com/scribble/go-runtime/transport/shm"; + public static final String GO_SCRIBBLERUNTIME_BYTES_PACKAGE = "bytes"; + public static final String GO_SCRIBBLERUNTIME_GOB_PACKAGE = "encoding/gob"; + + public static final String GO_ENDPOINT_TYPE = "session.Endpoint"; // net.MPSTEndpoint; + public static final String GO_ENDPOINT_CONSTRUCTOR = "session.NewEndpoint"; + public static final String GO_ENDPOINT_PROTO = "Proto"; + public static final String GO_ENDPOINT_ERR = "Err"; + public static final String GO_ENDPOINT_WRITEALL = "Send"; + public static final String GO_ENDPOINT_READALL = "ReadAll"; + public static final String GO_ENDPOINT_STARTPROTOCOL = "StartProtocol"; + public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; + public static final String GO_ENDPOINT_FINALISE = "Finalise"; + //public static final String GO_ENDPOINT_ENDPOINT = "Endpoint"; + public static final String GO_ENDPOINT_ENDPOINT = "ept"; + + public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; + + public static final String GO_ROLE_TYPE = "session.Role"; + public static final String GO_ROLE_CONSTRUCTOR = "session.NewPRole"; + + public static final String GO_PARAMROLE_TYPE = "session.ParamRole"; + + public static final String GO_LINEARRESOURCE_TYPE = "session.LinearResource"; // net.LinearResource + public static final String GO_LINEARRESOURCE_USE = "Use"; // net.LinearResource + + public static final String GO_SCHAN_ENDPOINT = "ept"; // ep; + public static final String GO_SCHAN_LINEARRESOURCE = "res"; // state + + public static final String GO_SCHAN_END_TYPE = "End"; + + public static final String GO_IO_FUN_RECEIVER = "s"; + + public static final String GO_CROSS_SEND_FUN_PREFIX = "Send"; + public static final String GO_CROSS_SEND_FUN_ARG = "arg"; + public static final String GO_CROSS_RECEIVE_FUN_PREFIX = "Recv"; + public static final String GO_CROSS_RECEIVE_FUN_ARG = "arg"; + +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java new file mode 100644 index 000000000..e518a6f07 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java @@ -0,0 +1,143 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STBranchActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.main.GoJob; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class ParamCoreSTBranchActionBuilder extends STBranchActionBuilder +{ + /*@Override + public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out + { + EState succ = curr.getSuccessor(a); + return + "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + + buildArgs(a) + + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: Return type is interface, so no need for *return (unlike other state chans) + + "s.state.Use()\n" + + buildBody(api, curr, a, succ) + "\n" + + "}"; + }*/ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + + i + " *" + a.payload.elems.get(i) + //+ ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" // No: singleton choice subj (not multichoices) + ).collect(Collectors.joining(", ")); + } + + /*@Override + public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) + { + return api.cb.getCaseStateChanName(api, curr); + }*/ + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + /*String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + /*ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + };*/ + + String res = + /*sEpRecv + + "(" + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "\"" + a.mid + "\")\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n" + /*+ "if " + sEpErr + " != nil {\n" + + "return nil\n" + + "}\n"*/ + //buildReturn(api, curr, succ); + "ch, selected := <-s._" + a.mid + "_Chan\n" + + "if !selected {\n" + + "\treturn nil // select ignores nilchan\n" + + "}\n"; + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + + res += + //+ "data := make([]int, " + foo.apply(g.end) + ")\n" + //+ "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var decoded int\n" + + "bs := <-s.data\n"; + + res += + ((((GoJob) api.job).noCopy) + ? + "decoded = *bs[0].(*" + a.payload.elems.get(0) + ")\n" + : + "if err := gob.NewDecoder(bytes.NewReader(bs[0])).Decode(&decoded); err != nil {\n" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Self.Name())\n" + + "}\n" + //+ "data[0] = decoded\n" + //+ "}\n" + ) + + //+ "*arg0 = reduceFn0(data)\n" // FIXME: arg0 + // + "*arg0 = data[0]\n" + + "*arg0 = decoded\n"; + } + + return res + + "return ch"; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java new file mode 100644 index 000000000..26ddc319d --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -0,0 +1,176 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.codegen.statetype.STBranchStateBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.endpoint.actions.EReceive; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +public class ParamCoreSTBranchStateBuilder extends STBranchStateBuilder +{ + public ParamCoreSTBranchStateBuilder(ParamCoreSTBranchActionBuilder bb) + { + super(bb); + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + + //return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); + ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; + Role r = apigen.actual.getName(); + GProtocolName simpname = apigen.apigen.proto.getSimpleName(); + String tname = apigen.getStateChanName(s); + //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); + String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, apigen.actual); + String res = + apigen.apigen.generateRootPackageDecl() + "\n" + + "\n" + + apigen.apigen.generateScribbleRuntimeImports() + "\n" + + + (((GoJob) api.job).noCopy ? "" : + Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) + .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + + + "\n" + + "type " + tname + " struct{\n" + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") + .collect(Collectors.joining("")) + + (((GoJob) apigen.job).noCopy ? "data chan []interface{}" : "data chan [][]byte\n" ) + + "}\n"; + + res += "\n" + + "func (ep *" + epType + ") New" + + ((s.id != api.graph.init.id) ? tname + : ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(((ParamCoreSTStateChanApiBuilder) api).actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + + "() *" + tname + " {\n" // FIXME: factor out + + "s := &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan chan *" + apigen.getStateChanName(s.getSuccessor(a))+ ", 1)") + .collect(Collectors.joining(", ")) + ", " + + + "data: make(chan " + (((GoJob) api.job).noCopy ? "[]interface{}" : "[][]byte") + ", 1)" + + + "}\n" + + "go s.foo()\n" + + "return s\n" + + "}\n"; + + res += "\n" + + "func (s *" + tname + ") foo() {\n" + + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"; + + ParamRole peer = (ParamRole) s.getActions().iterator().next().peer; + ParamRange g = peer.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + + if (((GoJob) apigen.job).noCopy) + { + res += + "label := " + sEpRecv + "Raw(" + sEpProto + "." + peer.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "op := *label[0].(*string)\n"; // FIXME: cast for safety? + } + else + { + res += + "label := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "op := string(label[0])\n"; // FIXME: cast for safety? + } + + List as = s.getActions(); + boolean allEmpty = as.stream().allMatch(a -> a.payload.elems.isEmpty()); + if (!allEmpty) // FIXME: + { + res += + "b := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + peer.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "s.data <- b\n"; + // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + } + + res+= "if " + + s.getActions().stream().map(a -> + { + String sEp = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + return + "op == \"" + a.mid + "\" {\n" + + "\tch := make(chan *" + apigen.getStateChanName(s.getSuccessor(a)) + ", 1)\n" + + "\tch <- " + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" + + "\ts._" + a.mid + "_Chan <- ch\n" + + "\t" + s.getActions().stream() + .filter(otheract -> otheract.mid != a.mid) + .map(otheract -> { return "close(s._" + otheract.mid + "_Chan)"; }) + .collect(Collectors.joining("\n\t")) + "\n" + + "}"; + }).collect(Collectors.joining(" else if ")) + "\n" + + "}\n"; + + return res; + } + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + String out = getPreamble(api, s); + + for (EAction a : s.getActions()) + { + out += "\n\n"; + if (a instanceof EReceive) // FIXME: factor out action kind + { + out += this.bb.build(api, s, a); // Getting 1 checks non-unary + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + + return out; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndStateBuilder.java new file mode 100644 index 000000000..d6eed153f --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndStateBuilder.java @@ -0,0 +1,41 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import org.scribble.codegen.java.endpointapi.ApiGen; +import org.scribble.codegen.statetype.STEndStateBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; + +public class ParamCoreSTEndStateBuilder extends STEndStateBuilder +{ + public ParamCoreSTEndStateBuilder() + { + + } + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + return getPreamble(api, s); + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + ParamCoreSTStateChanApiBuilder schangen = (ParamCoreSTStateChanApiBuilder) api; + //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); + String tname = api.getStateChanName(s); + String res = + schangen.apigen.generateRootPackageDecl() + "\n" + + "\n" + ////+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + ////+ schangen.apigen.generateScribbleRuntimeImports() + "\n" + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + + "\n" + + "type " + tname + " struct{\n" + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" // FIXME: factor out + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(api.gpn.getSimpleName(), api.role) + "\n" // FIXME: factor out + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out + + "}"; + return res; // No LinearResource + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java new file mode 100644 index 000000000..a7a0feae0 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java @@ -0,0 +1,126 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.main.Job; +import org.scribble.main.ScribbleException; +import org.scribble.model.endpoint.EGraph; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +// Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTEndpointApiGenerator +public class ParamCoreSTEndpointApiGenerator +{ + public final Job job; + public final GProtocolName proto; + public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral + //public final Map actuals; + public final Map> actuals; + //public final EGraph graph; + + //public final Map> all; + + public ParamCoreSTEndpointApiGenerator(Job job, GProtocolName fullname, Role self, //Map actuals) + Map> actuals) + { + this.job = job; + this.proto = fullname; + this.self = self; + this.actuals = Collections.unmodifiableMap(actuals); + //this.graph = graph; + //this.all = Collections.unmodifiableMap(all); + } + + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later + public Map build() throws ScribbleException + { + Map res = new HashMap<>(); // filepath -> source + res.putAll(buildSessionApi()); + for (Entry actual : this.actuals.get(this.self).entrySet()) + { + res.putAll(buildStateChannelApi(actual.getKey(), actual.getValue())); + } + return res; + } + + //@Override + public Map buildSessionApi() // FIXME: factor out + { + this.job.debugPrintln("\n[param-core] Running " + ParamCoreSTSessionApiBuilder.class + " for " + this.proto + "@" + this.self); + //throw new RuntimeException("[param-core] TODO:"); + return new ParamCoreSTSessionApiBuilder(this).build(); + } + + public Map buildStateChannelApi(ParamActualRole actual, EGraph graph) // FIXME: factor out + { + this.job.debugPrintln("\n[param-core] Running " + ParamCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + this.self); + return new ParamCoreSTStateChanApiBuilder(this, actual, graph).build(); + } + + /*public String getGeneratedEndpointType() + { + /*return "Endpoint_" + this.proto.getSimpleName() + "_" + //+ getGeneratedActualRoleName(); // No: endpoint covers all actual roles of this role name + + this.self;* / + return getGeneratedEndpointType(this.proto.getSimpleName(), this.self); + }*/ + + //public static String getGeneratedEndpointType(GProtocolName simpname, Role r) + public static String getGeneratedEndpointType(GProtocolName simpname, ParamActualRole r) + { + //return "Endpoint_" + simpname + "_" + r; + return simpname + "_" + getGeneratedActualRoleName(r); + } + + // Doesn't use coranges -- same as getGeneratedParamRoleName? + public static String getGeneratedActualRoleName(ParamActualRole actual) + { + /*return actual.getName() + + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ + if (actual.ranges.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + actual); + } + ParamRange g = actual.ranges.iterator().next(); + return actual.getName() + "_" + g.start + "To" + g.end; + } + + //@Override + public String getRootPackage() // Derives only from proto name + { + //throw new RuntimeException("[param-core] TODO:"); + return this.proto.getSimpleName().toString(); + } + + public String generateRootPackageDecl() + { + //throw new RuntimeException("[param-core] TODO: "); + return "package " + getRootPackage(); + } + + //@Override + public List getScribbleRuntimeImports() // FIXME: factor up + { + return Stream.of( + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + ////ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE + //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + + //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, + //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE + ).collect(Collectors.toList()); + } + + public String generateScribbleRuntimeImports() + { + return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java new file mode 100644 index 000000000..64c012462 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java @@ -0,0 +1,20 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import org.scribble.codegen.statetype.STOutputStateBuilder; +import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; + +public class ParamCoreSTOutputStateBuilder extends STOutputStateBuilder +{ + public ParamCoreSTOutputStateBuilder(STSendActionBuilder sb) + { + super(sb); + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java new file mode 100644 index 000000000..a0103e7f4 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -0,0 +1,138 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STReceiveActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class ParamCoreSTReceiveActionBuilder extends STReceiveActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + + i + " *" + a.payload.elems.get(i) + + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" + ).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + /*sEpRecv + + "(" + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "\"" + a.mid + "\")\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + "\tvar decoded "+a.payload.elems.get(0)+"\n" + + "\tif err := gob.NewDecoder(bytes.NewReader(b[i-"+foo.apply(g.start)+"])).Decode(&decoded); err != nil {\n\t\t" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Self.Name())\n" + + "\t}\n" + + "\tdata[i-"+foo.apply(g.start)+"] = decoded\n" + + "}\n" + + "*arg0 = reduceFn(data)" + /*+ "if " + sEpErr + " != nil {\n" + + "return nil\n" + + "}\n"*/ + + String res = + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n"; // Discard op + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + res += + (((GoJob) api.job).noCopy + ? + "b := " + sEpRecv + "Raw(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + + "for i := 0; i < len(b); i++ {\n" + + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n" + : + "b := " + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "data := make([]int, " + foo.apply(g.end) + ")\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + + "var decoded int\n" + + "if err := gob.NewDecoder(bytes.NewReader(b[i-1])).Decode(&decoded); err != nil {\n" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Self.Name())\n" + + "}\n" + + "data[i-1] = decoded\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n"); // FIXME: arg0 + } + + return res + + buildReturn(api, curr, succ); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java new file mode 100644 index 000000000..b9fe67f99 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java @@ -0,0 +1,20 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import org.scribble.codegen.statetype.STReceiveActionBuilder; +import org.scribble.codegen.statetype.STReceiveStateBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; + +public class ParamCoreSTReceiveStateBuilder extends STReceiveStateBuilder +{ + public ParamCoreSTReceiveStateBuilder(STReceiveActionBuilder sb) + { + super(sb); + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java new file mode 100644 index 000000000..9258497a6 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -0,0 +1,160 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class ParamCoreSTSendActionBuilder extends STSendActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + + i + " " + a.payload.elems.get(i) + + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " int, i" + i + " int) int" + ).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + String sEpWrite = + //s.ep.Write + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; + + ".Conn"; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + + /*String res = + (((GoJob) api.job).noCopy + ? + "labels := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "tmp := \"" + a.mid + "\"\n" + + "\tlabels[i-" + foo.apply(g.start) + "] = &tmp\n" + + "}\n" + : + "labels := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "\tlabels[i-" + foo.apply(g.start) + "] = []byte(\"" + a.mid + "\")\n" + + "}\n") + + + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "labels)\n"; + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + res += + (((GoJob) api.job).noCopy + ? + "b := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end)+"; i++ {\n" + + "tmp := splitFn0(arg0, i)\n" + + "\tb[i-"+foo.apply(g.start)+"] = &tmp\n" + + "}\n" + : + "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + "\tvar buf bytes.Buffer\n" + + "\tif err := gob.NewEncoder(&buf).Encode(splitFn0(arg0, i)); err != nil {\n\t\t" // only arg0 + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Errors <- session.SerialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Self.Name())\n" + + "\t}\n" + + "\tb[i-"+foo.apply(g.start)+"] = buf.Bytes()\n" + + "}\n") + + + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + + "." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + //+ "\"" + a.mid + "\"" + + "b" + + ")\n"; + }*/ + + String res = + //st1.Use() + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + sEpWrite + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "\"" + a.mid + "\"" + ")\n" + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + sEpWrite + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "splitFn0(arg0, i)" + ")\n" + + "}\n"; + + /*for i, v := range pl { + st1.ept.Conn[Worker][i].Send(a.mid) + st1.ept.Conn[Worker][i].Send(v) + }*/ + + return + res + + buildReturn(api, curr, succ); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java new file mode 100644 index 000000000..033bc9b80 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -0,0 +1,219 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.ast.Module; +import org.scribble.ast.ProtocolDecl; +import org.scribble.ext.go.ast.ParamRoleDecl; +import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.type.kind.Global; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +// Cf. STStateChanApiBuilder +public class ParamCoreSTSessionApiBuilder // FIXME: make base STSessionApiBuilder +{ + private ParamCoreSTEndpointApiGenerator apigen; + + //private final Map> actuals; + + public ParamCoreSTSessionApiBuilder(ParamCoreSTEndpointApiGenerator apigen)//, Map> actuals) + { + this.apigen = apigen; + //this.actuals = Collections.unmodifiableMap(actuals); + } + + //@Override + public Map build() // FIXME: factor out + { + Module mod = this.apigen.job.getContext().getModule(this.apigen.proto.getPrefix()); + GProtocolName simpname = this.apigen.proto.getSimpleName(); + ProtocolDecl gpd = mod.getProtocolDecl(simpname); + List roles = gpd.header.roledecls.getRoles(); + + /*Set instates = new HashSet<>(); + Predicate f = s -> s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT; + if (f.test(this.apigen.graph.init)) + { + instates.add(this.apigen.graph.init); + } + instates.addAll(MState.getReachableStates(this.apigen.graph.init).stream().filter(f).collect(Collectors.toSet()));*/ + + // roles + String sessPack = + //"package " + this.apigen.getRootPackage() + "\n" // FIXME: factor out + this.apigen.generateRootPackageDecl() + "\n" + + "\n" + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + + this.apigen.generateScribbleRuntimeImports() + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; + + + sessPack += "\n" + + "type " + simpname + " struct {\n" + + roles.stream().map(r -> r + " " + ParamCoreSTApiGenConstants.GO_ROLE_TYPE + "\n").collect(Collectors.joining("")) + // Just need role name constants for now -- params not fixed until endpoint creation + + "}\n" + + "\n" + + "func New" + simpname + "() *" + simpname + " {\n" + + "return &" + simpname + "{ " + roles.stream().map(r -> ParamCoreSTApiGenConstants.GO_ROLE_CONSTRUCTOR + + "(\"" + r + "\")").collect(Collectors.joining(", ")) + " }\n" + // Singleton types? + + "}\n"; + + + /*sessPack += + roles.stream().map(r -> + "type _" + r + " struct { }\n" + + "\n" + + "func (*_" + r +") GetRoleName() string {\n" + + "return \"" + r + "\"\n" + + "}\n" + + "\n" + + "var __" + r + " *_" + r + "\n" + + "\n" + + "func new" + r + "() *_" + r + " {\n" // FIXME: not concurrent + + "if __" + r + " == nil {\n" + + "__"+ r + " = &_" + r + "{}\n" + + "}\n" + + "return __" + r + "\n" + + "}" + ).collect(Collectors.joining("\n\n")) + "\n" + + "\n";*/ + + // Protocol and role specific endpoints + //Function epTypeName = r -> "_Endpoint" + simpname + "_" + r; + sessPack += + roles.stream().map(rfoo -> + { + Set actuals = this.apigen.actuals.get(rfoo).keySet(); + return + actuals.stream().map(actual -> + { + String epTypeName = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, actual); + List decls = + gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(actual.getName())) + .map(rd -> (ParamRoleDecl) rd).collect(Collectors.toList()); + if (decls.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + actual); + } + List vars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); + //.flatMap(rd -> ((ParamRoleDecl) rd).params.stream()).collect(Collectors.toList()); + + if (actual.ranges.size() > 1) + { + throw new RuntimeException("TODO: " + actual); + } + ParamRange g = actual.ranges.iterator().next(); + + return + "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out + + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " *" + simpname + "\n" + /*+ this.apigen.actuals.get(r).keySet().stream() + .map(a -> + { + String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); + return actualName + "s map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; + }).collect(Collectors.joining(""))*/ + + "session.LinearResource\n" + + "ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + "Params map[string]int\n" + + "}\n" + + "\n" + + + + "func (p *" + simpname + ") New" + epTypeName + + "(" + + "self int" + + vars.stream().map(v -> ", " + v + " int").collect(Collectors.joining("")) + ")" + + "(*" + epTypeName + ") {\n" + + /*+ "ep := &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p,\n" + + + this.apigen.actuals.get(r).keySet().stream() + .map(a -> + { + String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); + return actualName + "s: make(map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ")"; + }).collect(Collectors.joining(", ")) + ",\n" + + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ": " + + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" + + + this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(r)) + .map(e -> + { + Map tmp = e.getValue(); + if (tmp.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + tmp); + } + ParamActualRole peer = tmp.keySet().iterator().next(); + ParamRange g = peer.ranges.iterator().next(); + Function foo = ee -> + { + if (ee instanceof ParamIndexInt) + { + return ee.toString(); + } + else if (ee instanceof ParamIndexVar) + { + return "ep.Params[\"" + ee + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + ee); + } + }; + return + "ep.Params = map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining(", ")) + "}\n" + + "ep.Peers[p." + peer.getName() + "] = struct{Start int; End int}{" + foo.apply(g.start) + ", " + foo.apply(g.end) + "}\n" + + "for i := ep." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Peers[p." + peer.getName() + "].Start; i <= ep.Peers[p." + peer.getName() + "].End; i++ {\n" + + "\tp." + peer.getName() + ".(session.ParamRole).Register(i)\n" + + "}\n"; + }).collect(Collectors.joining("")) + + + "return ep\n"*/ + + "conns := make(map[session.Role][]transport.Channel)\n" + + "conns[p." + actual.getName() + "] = make([]transport.Channel, " + g.end + "-" + g.start + ")\n" // FIXME: start index 1 + + "params := make(map[string]int)\n" + + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) + + "return &" + epTypeName + "{p, session.LinearResource{}, &session.Endpoint{self, -1, conns}, params}\n" // FIXME: numRoles + + "}\n" + + /*+ this.apigen.actuals.get(r).keySet().stream() + .map(a -> + { + String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); + return + "\nfunc (ep *" + epTypeName + ") " + + "Register_" + actualName + + "(i int, impl func(*" + simpname + "_" + actualName + "_1) *" // FIXME: factor out with above + + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ") {\n" + + "ep." + actualName + "s[i] = impl\n" + + "ep.Proto."+ r +".(session.ParamRole).Register(i)\n" + + "}\n"; + }).collect(Collectors.joining(""));*/ + + + + "\nfunc (ini *" + epTypeName + ") Init() (*" + epTypeName + "_1) {\n" + + "ini.Use()\n" + + "return &" + epTypeName + "_1{session.LinearResource{}, ini.ept}\n" + + "}"; + }).collect(Collectors.joining("")); + }).collect(Collectors.joining("\n")); + + String dir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; + Map res = new HashMap<>(); + res.put(dir + simpname + ".go", sessPack); + return res; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java new file mode 100644 index 000000000..963e237e6 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -0,0 +1,312 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.codegen.statetype.STActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; +import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +// Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder +public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder +{ + protected final ParamCoreSTEndpointApiGenerator apigen; + public final ParamActualRole actual; // this.apigen.self.equals(this.actual.getName()) + //public final EGraph graph; + + private int counter = 1; + + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later + // actual.getName().equals(this.role) + public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, ParamActualRole actual, EGraph graph) + { + super(apigen.job, apigen.proto, apigen.self, graph, + new ParamCoreSTOutputStateBuilder(new ParamCoreSTSendActionBuilder()), + new ParamCoreSTReceiveStateBuilder(new ParamCoreSTReceiveActionBuilder()), + new ParamCoreSTBranchStateBuilder(new ParamCoreSTBranchActionBuilder()), + null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), + new ParamCoreSTEndStateBuilder()); + + //throw new RuntimeException("[param-core] TODO:"); + this.apigen = apigen; + this.actual = actual; + } + + protected ParamActualRole getSelf() + { + return (ParamActualRole) this.getSelf(); + } + + // Not actual roles; param roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName + public static String getGeneratedParamRoleName(ParamRole r) + { + //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); + if (r.ranges.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + r); + } + ParamRange g = r.ranges.iterator().next(); + return r.getName() + "_" + g.start + "To" + g.end; + } + + + /*@Override + public String getPackage() + { + //throw new RuntimeException("[param-core] TODO:"); + return this.gpn.getSimpleName().toString(); + }*/ + + @Override + protected String makeSTStateName(EState s) + { + //throw new RuntimeException("[param-core] TODO:"); + if (s.isTerminal()) + { + ////return "_EndState"; + //return ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; + return makeEndStateName(this.apigen.proto.getSimpleName(), this.actual); + } + return this.apigen.proto.getSimpleName() + "_" + + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + + "_" + this.counter++; + } + + public static String makeEndStateName(GProtocolName simpname, ParamActualRole r) + { + return simpname + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(r) + "_" + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; + } + + @Override + public String getFilePath(String filename) + { + //throw new RuntimeException("[param-core] TODO:"); + if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go + { + filename = "$" + filename.substring(1); + } + return this.gpn.toString().replaceAll("\\.", "/") + "/" + filename + ".go"; + } + + public String getActualRoleName() + { + return this.apigen.self.toString(); + } + + protected String getStateChanPremable(EState s) + { + //throw new RuntimeException("[param-core] TODO: "); + Role r = this.actual.getName(); + GProtocolName simpname = this.apigen.proto.getSimpleName(); + String tname = this.getStateChanName(s); + //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); + String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, this.actual); + String res = + this.apigen.generateRootPackageDecl() + "\n" + + "\n" + + this.apigen.generateScribbleRuntimeImports() + "\n" + + /*+ (s.isTerminal() || ((GoJob) apigen.job).noCopy ? "" : + Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) + .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + + "\n"*/ + + + "type " + tname + " struct{\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + + "}\n"; + + if (s.id == this.graph.init.id) + { + res += "\n" + + "func (ep *" + epType + ") New" + + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1" // cf. makeSTStateName + + "() *" + tname + " {\n" // FIXME: factor out + + "return &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")}\n" + + "}"; + } + + return res; + } + + @Override + public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here because action builder hierarchy not suitable (extended by action kind, not by target language) + { + EState succ = curr.getSuccessor(a); + if (getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1) + { + return + "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(a) + + ") <-chan *" + ab.getReturnType(this, curr, succ) + " {\n" + + ab.buildBody(this, curr, a, succ) + "\n" + + "}"; + } + else + { + //throw new RuntimeException("[param-core] TODO: "); + return + "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(a) + + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + ab.buildBody(this, curr, a, succ) + "\n" + + "}"; + } + } + + @Override + public String getChannelName(STStateChanApiBuilder api, EAction a) + { + //throw new RuntimeException("[param-core] TODO: "); + return + //"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; + "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; + } + + @Override + public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) // FIXME: refactor action builders as interfaces and use generic parameter for kind + { + //throw new RuntimeException("[param-core] TODO: "); + String sEp = + //"s.ep" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + String res = ""; + + /*if (succ.isTerminal()) // FIXME + { + res += sEp + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINISHPROTOCOL + "()\n"; + }*/ + + res += "return " + getSuccStateChan(ab, curr, succ, sEp); + return res; + } + + public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) + { + if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + + "New" + //+ getStateChanName(succ) + + ((succ.id != this.graph.init.id) ? getStateChanName(succ) + : ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + + "()"; + } + else + { + String res = "&" + ab.getReturnType(this, curr, succ) + "{ " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; + if (!succ.isTerminal()) + { + res += ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case + } + res += " }"; + return res; + } + } + + @Override + public Map build() // filepath -> source + { + Map api = new HashMap<>(); + Set states = new LinkedHashSet<>(); + states.add(this.graph.init); + states.addAll(MState.getReachableStates(this.graph.init)); + for (EState s : states) + { + switch (getStateKind(s)) + { + case CROSS_SEND: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; + case CROSS_RECEIVE: + { + if (s.getActions().size() > 1) + { + api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + //api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out + } + else + { + api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); + } + break; + } + case DOT_SEND: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case DOT_RECEIVE: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case MULTICHOICES_RECEIVE: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket + default: throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + } + } + return api; + } + + + // FIXME: make ParamCoreEState + enum ParamCoreEStateKind { CROSS_SEND, CROSS_RECEIVE, DOT_SEND, DOT_RECEIVE, MULTICHOICES_RECEIVE, TERMINAL } + + protected static ParamCoreEStateKind getStateKind(EState s) + { + List as = s.getActions(); + if (as.isEmpty()) + { + return ParamCoreEStateKind.TERMINAL; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossSend)) + { + return ParamCoreEStateKind.CROSS_SEND; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossReceive)) + { + return ParamCoreEStateKind.CROSS_RECEIVE; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotSend)) + { + return ParamCoreEStateKind.DOT_SEND; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotReceive)) + { + return ParamCoreEStateKind.DOT_RECEIVE; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEMultiChoicesReceive)) + { + return ParamCoreEStateKind.MULTICHOICES_RECEIVE; + } + else + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + } + } +} diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 9d3e31e1c..224d0748e 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -1,5 +1,5 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java -//$ bin/scribblec-go.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/tmp/ParamTest.scr -V -param Proto1 +//$ bin/scribblec-param.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/tmp/ParamTest.scr -V -param Proto1 // http://sandbox.kidstrythisathome.com/erdos/ From b9a4d16c26a51d8713bc2b645b15048431417cea Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 4 Dec 2017 16:35:09 +0000 Subject: [PATCH 165/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../statetype2/ParamCoreSTSessionApiBuilder.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index 033bc9b80..3905b65da 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -123,7 +123,7 @@ public Map build() // FIXME: factor out return actualName + "s map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; }).collect(Collectors.joining(""))*/ - + "session.LinearResource\n" + + "*session.LinearResource\n" + "ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "Params map[string]int\n" + "}\n" @@ -182,11 +182,11 @@ else if (ee instanceof ParamIndexVar) }).collect(Collectors.joining("")) + "return ep\n"*/ - + "conns := make(map[session.Role][]transport.Channel)\n" - + "conns[p." + actual.getName() + "] = make([]transport.Channel, " + g.end + "-" + g.start + ")\n" // FIXME: start index 1 + + "conns := make(map[string][]transport.Channel)\n" + + "conns[p." + actual.getName() + ".Name()] = make([]transport.Channel, " + g.end + "-" + g.start + ")\n" // FIXME: start index 1 + "params := make(map[string]int)\n" + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) - + "return &" + epTypeName + "{p, session.LinearResource{}, &session.Endpoint{self, -1, conns}, params}\n" // FIXME: numRoles + + "return &" + epTypeName + "{p, &session.LinearResource{}, &session.Endpoint{self, -1, conns}, params}\n" // FIXME: numRoles + "}\n" /*+ this.apigen.actuals.get(r).keySet().stream() @@ -206,7 +206,7 @@ else if (ee instanceof ParamIndexVar) + "\nfunc (ini *" + epTypeName + ") Init() (*" + epTypeName + "_1) {\n" + "ini.Use()\n" - + "return &" + epTypeName + "_1{session.LinearResource{}, ini.ept}\n" + + "return &" + epTypeName + "_1{&session.LinearResource{}, ini}\n" + "}"; }).collect(Collectors.joining("")); }).collect(Collectors.joining("\n")); From af1f377ae81bf231239e3585d13c24983f36e120 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 4 Dec 2017 16:52:26 +0000 Subject: [PATCH 166/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../ParamCoreSTApiGenConstants.java | 2 +- .../ParamCoreSTReceiveActionBuilder.java | 34 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java index af159cff9..12ee88f53 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java @@ -15,7 +15,7 @@ public class ParamCoreSTApiGenConstants public static final String GO_ENDPOINT_PROTO = "Proto"; public static final String GO_ENDPOINT_ERR = "Err"; public static final String GO_ENDPOINT_WRITEALL = "Send"; - public static final String GO_ENDPOINT_READALL = "ReadAll"; + public static final String GO_ENDPOINT_READALL = "Recv"; public static final String GO_ENDPOINT_STARTPROTOCOL = "StartProtocol"; public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; public static final String GO_ENDPOINT_FINALISE = "Finalise"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index a0103e7f4..e9e5ea582 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -44,7 +44,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." @@ -95,9 +95,10 @@ else if (e instanceof ParamIndexVar) + "return nil\n" + "}\n"*/ - String res = + /*String res = sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") - + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n"; // Discard op + + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n"; // Discard op*/ + String res = ""; if (!a.payload.elems.isEmpty()) { @@ -108,27 +109,26 @@ else if (e instanceof ParamIndexVar) res += (((GoJob) api.job).noCopy ? - "b := " + sEpRecv + "Raw(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + "for i := 0; i < len(b); i++ {\n" + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" + "}\n" + "*arg0 = reduceFn0(data)\n" : - "b := " + sEpRecv + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "data := make([]int, " + foo.apply(g.end) + ")\n" + "data := make([]int, " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args - + "var decoded int\n" - + "if err := gob.NewDecoder(bytes.NewReader(b[i-1])).Decode(&decoded); err != nil {\n" - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Self.Name())\n" + + "var lab string\n" + + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "&lab" + ")\n" + + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "&data[i]" + ")\n" + "}\n" - + "data[i-1] = decoded\n" - + "}\n" + "*arg0 = reduceFn0(data)\n"); // FIXME: arg0 } From 647c2e2e156d59da51d2bd388869764279144e26 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 4 Dec 2017 17:12:54 +0000 Subject: [PATCH 167/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../statetype2/ParamCoreSTSessionApiBuilder.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index 3905b65da..dc155dbee 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -52,7 +52,8 @@ public Map build() // FIXME: factor out + "\n" //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + this.apigen.generateScribbleRuntimeImports() - + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n" + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; sessPack += "\n" @@ -130,6 +131,19 @@ public Map build() // FIXME: factor out + "\n" + + "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, addr, port string) error {\n" + + "ini.ept.Conn[rolename.Name()][id-1] = tcp.NewConnection(addr, port).Accept().(*tcp.Conn)\n" + + "return nil\n" + + "}\n" + + "\n" + + "func (ini *" + epTypeName + ") Connect(rolename session.Role, id int, addr, port string) error {\n" + + "ini.ept.Conn[rolename.Name()][id-1] = tcp.NewConnection(addr, port).Connect()\n" + + "return nil\n" + + "}\n" + + "\n" + + + + "func (p *" + simpname + ") New" + epTypeName + "(" + "self int" + From 1a5316b2997ae4685349dbf51b1f6c36f7ede2e5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 4 Dec 2017 17:42:22 +0000 Subject: [PATCH 168/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../statetype2/ParamCoreSTReceiveActionBuilder.java | 6 +++--- .../codegen/statetype2/ParamCoreSTSendActionBuilder.java | 4 ++-- .../codegen/statetype2/ParamCoreSTSessionApiBuilder.java | 8 +++++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index e9e5ea582..498cde391 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -119,15 +119,15 @@ else if (e instanceof ParamIndexVar) + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" + sEpRecv - + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + ")\n" + sEpRecv - + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " - + "&data[i]" + ")\n" + + "&data[i-1]" + ")\n" + "}\n" + "*arg0 = reduceFn0(data)\n"); // FIXME: arg0 } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index 9258497a6..4dae7d31e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -136,13 +136,13 @@ else if (e instanceof ParamIndexVar) "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + sEpWrite - + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "\"" + a.mid + "\"" + ")\n" //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + sEpWrite - + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "splitFn0(arg0, i)" + ")\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index dc155dbee..f780fe33f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -197,7 +197,13 @@ else if (ee instanceof ParamIndexVar) + "return ep\n"*/ + "conns := make(map[string][]transport.Channel)\n" - + "conns[p." + actual.getName() + ".Name()] = make([]transport.Channel, " + g.end + "-" + g.start + ")\n" // FIXME: start index 1 + + + + this.apigen.actuals.keySet().stream().filter(e -> !e.equals(actual.getName())) + .map(peer -> "conns[p." + peer + ".Name()] = make([]transport.Channel, " + g.end + "-" + g.start + "+1)\n") // FIXME: start index 1 + .collect(Collectors.joining("")) + + + "params := make(map[string]int)\n" + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) + "return &" + epTypeName + "{p, &session.LinearResource{}, &session.Endpoint{self, -1, conns}, params}\n" // FIXME: numRoles From 8bd2802516700fad663a55e627d68779453cde68 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 4 Dec 2017 20:46:15 +0000 Subject: [PATCH 169/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java index 12ee88f53..e4cfdbbb4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java @@ -25,7 +25,7 @@ public class ParamCoreSTApiGenConstants public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; public static final String GO_ROLE_TYPE = "session.Role"; - public static final String GO_ROLE_CONSTRUCTOR = "session.NewPRole"; + public static final String GO_ROLE_CONSTRUCTOR = "session.NewRole"; public static final String GO_PARAMROLE_TYPE = "session.ParamRole"; From 97d31a3ab16fe0820bfe30dc83171f645566aa7d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 5 Dec 2017 18:56:40 +0000 Subject: [PATCH 170/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index f780fe33f..23c4347ab 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -206,7 +206,7 @@ else if (ee instanceof ParamIndexVar) + "params := make(map[string]int)\n" + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) - + "return &" + epTypeName + "{p, &session.LinearResource{}, &session.Endpoint{self, -1, conns}, params}\n" // FIXME: numRoles + + "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, -1, conns), params}\n" // FIXME: numRoles + "}\n" /*+ this.apigen.actuals.get(r).keySet().stream() From 392a3b392bbcabf6ece05a62cba5e9ad10ce3846 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 5 Dec 2017 20:48:39 +0000 Subject: [PATCH 171/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../codegen/statetype2/ParamCoreSTSessionApiBuilder.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index 23c4347ab..8d8f3e091 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -199,8 +199,10 @@ else if (ee instanceof ParamIndexVar) + "conns := make(map[string][]transport.Channel)\n" - + this.apigen.actuals.keySet().stream().filter(e -> !e.equals(actual.getName())) - .map(peer -> "conns[p." + peer + ".Name()] = make([]transport.Channel, " + g.end + "-" + g.start + "+1)\n") // FIXME: start index 1 + + this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(actual.getName())) + .map(e -> "conns[p." + e.getKey() + ".Name()] = make([]transport.Channel, " + + e.getValue().keySet().iterator().next().ranges.iterator().next().end + "-" // FIXME: e.getValues().size() > 1 + + e.getValue().keySet().iterator().next().ranges.iterator().next().start + "+1)\n") // FIXME: start index 1 .collect(Collectors.joining("")) From c64ba7df590ad17c27e94e0310bea264d7179498 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Dec 2017 18:08:27 +0000 Subject: [PATCH 172/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../ParamCoreSTBranchStateBuilder.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index 26ddc319d..5e5629556 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -32,8 +32,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) String sEpRecv = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." @@ -62,7 +62,10 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") .collect(Collectors.joining("")) - + (((GoJob) apigen.job).noCopy ? "data chan []interface{}" : "data chan [][]byte\n" ) + + (((GoJob) apigen.job).noCopy ? "data chan []interface{}" : + //"data chan [][]byte\n" + "data chan int\n" + ) + "}\n"; res += "\n" @@ -75,7 +78,10 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan chan *" + apigen.getStateChanName(s.getSuccessor(a))+ ", 1)") .collect(Collectors.joining(", ")) + ", " - + "data: make(chan " + (((GoJob) api.job).noCopy ? "[]interface{}" : "[][]byte") + ", 1)" + + "data: make(chan " + (((GoJob) api.job).noCopy ? "[]interface{}" : + //"[][]byte" + " int" + ) + ", 1)" + "}\n" + "go s.foo()\n" @@ -84,7 +90,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) res += "\n" + "func (s *" + tname + ") foo() {\n" - + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"; + + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + "var op string\n"; ParamRole peer = (ParamRole) s.getActions().iterator().next().peer; ParamRange g = peer.ranges.iterator().next(); @@ -115,9 +122,7 @@ else if (e instanceof ParamIndexVar) else { res += - "label := " + sEpRecv + "(" + sEpProto + "." + peer.getName() + ", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "op := string(label[0])\n"; // FIXME: cast for safety? + sEpRecv + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&op)\n"; // g.end = g.start } List as = s.getActions(); @@ -125,9 +130,9 @@ else if (e instanceof ParamIndexVar) if (!allEmpty) // FIXME: { res += - "b := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") - + "(" + sEpProto + "." + peer.getName() + ", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + "var b int\n" + + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&b)\n" + "s.data <- b\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args } From e7c9a10ee8333ca045ea2349adbfa3ef2fd93043 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 6 Dec 2017 18:55:20 +0000 Subject: [PATCH 173/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../statetype2/ParamCoreSTBranchActionBuilder.java | 14 +++----------- .../statetype2/ParamCoreSTBranchStateBuilder.java | 4 +--- .../statetype2/ParamCoreSTSessionApiBuilder.java | 8 ++++++-- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java index e518a6f07..7e8f772db 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java @@ -112,29 +112,21 @@ else if (e instanceof ParamIndexVar) res += //+ "data := make([]int, " + foo.apply(g.end) + ")\n" //+ "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args - "var decoded int\n" - + "bs := <-s.data\n"; + ""; res += ((((GoJob) api.job).noCopy) ? "decoded = *bs[0].(*" + a.payload.elems.get(0) + ")\n" : - "if err := gob.NewDecoder(bytes.NewReader(bs[0])).Decode(&decoded); err != nil {\n" - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) + "\"," - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Self.Name())\n" - + "}\n" + "" //+ "data[0] = decoded\n" //+ "}\n" ) //+ "*arg0 = reduceFn0(data)\n" // FIXME: arg0 // + "*arg0 = data[0]\n" - + "*arg0 = decoded\n"; + + "*arg0 = <- s.data\n"; } return res diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index 5e5629556..da021bdf9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -51,9 +51,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "\n" + apigen.apigen.generateScribbleRuntimeImports() + "\n" - + (((GoJob) api.job).noCopy ? "" : - Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) - .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + //+ (((GoJob) api.job).noCopy ? "" : Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + "\n" + "type " + tname + " struct{\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index 8d8f3e091..aa8eecf8e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -12,6 +12,7 @@ import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; @@ -112,7 +113,7 @@ public Map build() // FIXME: factor out { throw new RuntimeException("TODO: " + actual); } - ParamRange g = actual.ranges.iterator().next(); + //ParamRange g = actual.ranges.iterator().next(); return "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out @@ -228,7 +229,10 @@ else if (ee instanceof ParamIndexVar) + "\nfunc (ini *" + epTypeName + ") Init() (*" + epTypeName + "_1) {\n" + "ini.Use()\n" - + "return &" + epTypeName + "_1{&session.LinearResource{}, ini}\n" + + + ((this.apigen.actuals.get(rfoo).get(actual).init.getStateKind() == EStateKind.POLY_INPUT) + ? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" + : "return &" + epTypeName + "_1{&session.LinearResource{}, ini}\n") + "}"; }).collect(Collectors.joining("")); }).collect(Collectors.joining("\n")); From 49ef719c00ede0cd4b31b4caaae96da9e90ef512 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 10 Dec 2017 15:36:27 +0000 Subject: [PATCH 174/433] Added err logging to param-core API gen. --- .../statetype2/ParamCoreSTBranchStateBuilder.java | 12 +++++++++--- .../statetype2/ParamCoreSTReceiveActionBuilder.java | 12 ++++++++---- .../statetype2/ParamCoreSTSendActionBuilder.java | 12 ++++++++---- .../statetype2/ParamCoreSTStateChanApiBuilder.java | 1 + 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index da021bdf9..d7db2d441 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -50,6 +50,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) apigen.apigen.generateRootPackageDecl() + "\n" + "\n" + apigen.apigen.generateScribbleRuntimeImports() + "\n" + + "import \"log\"\n" //+ (((GoJob) api.job).noCopy ? "" : Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) @@ -120,7 +121,10 @@ else if (e instanceof ParamIndexVar) else { res += - sEpRecv + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&op)\n"; // g.end = g.start + "if err := " + sEpRecv + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + + foo.apply(g.start) + "-1].Recv(&op); err != nil {\n" // g.end = g.start + + "log.Fatal(err)\n" + + "}\n"; } List as = s.getActions(); @@ -129,8 +133,10 @@ else if (e instanceof ParamIndexVar) { res += "var b int\n" - + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") - + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&b)\n" + + "if err := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&b); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + "s.data <- b\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index 498cde391..96e2e0ca5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -118,16 +118,20 @@ else if (e instanceof ParamIndexVar) "data := make([]int, " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" - + sEpRecv + + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " - + "&lab" + ")\n" - + sEpRecv + + "&lab" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " - + "&data[i-1]" + ")\n" + + "&data[i-1]" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + "}\n" + "*arg0 = reduceFn0(data)\n"); // FIXME: arg0 } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index 4dae7d31e..fc02c14c1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -135,17 +135,21 @@ else if (e instanceof ParamIndexVar) //st1.Use() "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + sEpWrite + + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " - + "\"" + a.mid + "\"" + ")\n" + + "\"" + a.mid + "\"" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + sEpWrite + + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " - + "splitFn0(arg0, i)" + ")\n" + + "splitFn0(arg0, i)" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + "}\n"; /*for i, v := range pl { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index 963e237e6..ac4a29397 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -124,6 +124,7 @@ protected String getStateChanPremable(EState s) this.apigen.generateRootPackageDecl() + "\n" + "\n" + this.apigen.generateScribbleRuntimeImports() + "\n" + + "import \"log\"\n" /*+ (s.isTerminal() || ((GoJob) apigen.job).noCopy ? "" : Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) From 5431514492935f564bc0bef52a14919d688087f2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 10 Dec 2017 16:04:03 +0000 Subject: [PATCH 175/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../codegen/statetype2/ParamCoreSTReceiveActionBuilder.java | 3 ++- .../core/codegen/statetype2/ParamCoreSTSendActionBuilder.java | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index 96e2e0ca5..8192e2e58 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -33,7 +33,8 @@ public String buildArgs(EAction a) return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + i + " *" + a.payload.elems.get(i) - + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" + + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + + " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index fc02c14c1..859fd9dda 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -9,7 +9,6 @@ import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexInt; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -33,7 +32,7 @@ public String buildArgs(EAction a) return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + a.payload.elems.get(i) - + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " int, i" + i + " int) int" + + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + a.payload.elems.get(i) + ", i" + i + " int) " + a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } From 32089b10990fe6f05211cb9336c4ca09abf4c33d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 10 Dec 2017 16:13:07 +0000 Subject: [PATCH 176/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../codegen/statetype2/ParamCoreSTBranchActionBuilder.java | 3 ++- .../codegen/statetype2/ParamCoreSTBranchStateBuilder.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java index 7e8f772db..669350829 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java @@ -9,6 +9,7 @@ import org.scribble.ext.go.main.GoJob; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; public class ParamCoreSTBranchActionBuilder extends STBranchActionBuilder { @@ -126,7 +127,7 @@ else if (e instanceof ParamIndexVar) //+ "*arg0 = reduceFn0(data)\n" // FIXME: arg0 // + "*arg0 = data[0]\n" - + "*arg0 = <- s.data\n"; + + "*arg0 = (<-s.data).(" + ((DataType) a.payload.elems.get(0)).getSimpleName() + ")\n"; } return res diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index d7db2d441..d2f08409d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -63,7 +63,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) .collect(Collectors.joining("")) + (((GoJob) apigen.job).noCopy ? "data chan []interface{}" : //"data chan [][]byte\n" - "data chan int\n" + "data chan interface{}\n" ) + "}\n"; @@ -79,7 +79,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "data: make(chan " + (((GoJob) api.job).noCopy ? "[]interface{}" : //"[][]byte" - " int" + " interface{}" ) + ", 1)" + "}\n" From 270ffadcd9531560a61666d73c7ab331bed2fe0f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 10 Dec 2017 18:06:10 +0000 Subject: [PATCH 177/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../ParamCoreSTApiGenConstants.java | 1 + .../ParamCoreSTReceiveActionBuilder.java | 8 +- .../ParamCoreSTReceiveStateBuilder.java | 27 +++- .../ParamCoreSTReduceActionBuilder.java | 144 ++++++++++++++++++ .../ParamCoreSTStateChanApiBuilder.java | 9 +- 5 files changed, 179 insertions(+), 10 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java index e4cfdbbb4..bc4d4477f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java @@ -41,6 +41,7 @@ public class ParamCoreSTApiGenConstants public static final String GO_CROSS_SEND_FUN_PREFIX = "Send"; public static final String GO_CROSS_SEND_FUN_ARG = "arg"; + public static final String GO_CROSS_REDUCE_FUN_PREFIX = "Reduce"; public static final String GO_CROSS_RECEIVE_FUN_PREFIX = "Recv"; public static final String GO_CROSS_RECEIVE_FUN_ARG = "arg"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index 8192e2e58..b1b746335 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -32,9 +32,7 @@ public String buildArgs(EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " *" + a.payload.elems.get(i) - + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i - + " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) + + i + " *[]" + a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } @@ -116,7 +114,7 @@ else if (e instanceof ParamIndexVar) + "}\n" + "*arg0 = reduceFn0(data)\n" : - "data := make([]int, " + foo.apply(g.end) + ")\n" + "data := make([]" + a.payload.elems.get(0) + ", " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" + "if err := " + sEpRecv @@ -134,7 +132,7 @@ else if (e instanceof ParamIndexVar) + "log.Fatal(err)\n" + "}\n" + "}\n" - + "*arg0 = reduceFn0(data)\n"); // FIXME: arg0 + + "*arg0 = data\n"); // FIXME: arg0 } return res diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java index b9fe67f99..3e1b1f7fc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java @@ -1,15 +1,21 @@ package org.scribble.ext.go.core.codegen.statetype2; +import java.util.List; + import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STReceiveStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; public class ParamCoreSTReceiveStateBuilder extends STReceiveStateBuilder { - public ParamCoreSTReceiveStateBuilder(STReceiveActionBuilder sb) + public final ParamCoreSTReceiveActionBuilder vb; + + public ParamCoreSTReceiveStateBuilder(STReceiveActionBuilder sb, ParamCoreSTReceiveActionBuilder vb) { super(sb); + this.vb = vb; } @Override @@ -17,4 +23,23 @@ public String getPreamble(STStateChanApiBuilder api, EState s) { return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); } + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + String out = getPreamble(api, s); + + List as = s.getActions(); + if (as.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + as); + } + out += "\n\n"; + out += this.rb.build(api, s, as.get(0)); + out += "\n\n"; + out += this.vb.build(api, s, as.get(0)); + + return out; + } } + diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java new file mode 100644 index 000000000..2c05e3f77 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -0,0 +1,144 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STReceiveActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class ParamCoreSTReduceActionBuilder extends STReceiveActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + //return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + return ParamCoreSTApiGenConstants.GO_CROSS_REDUCE_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + + i + " *" + a.payload.elems.get(i) + + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + + " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) + ).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + /*sEpRecv + + "(" + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "\"" + a.mid + "\")\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + "\tvar decoded "+a.payload.elems.get(0)+"\n" + + "\tif err := gob.NewDecoder(bytes.NewReader(b[i-"+foo.apply(g.start)+"])).Decode(&decoded); err != nil {\n\t\t" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Self.Name())\n" + + "\t}\n" + + "\tdata[i-"+foo.apply(g.start)+"] = decoded\n" + + "}\n" + + "*arg0 = reduceFn(data)" + /*+ "if " + sEpErr + " != nil {\n" + + "return nil\n" + + "}\n"*/ + + /*String res = + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n"; // Discard op*/ + String res = ""; + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + res += + (((GoJob) api.job).noCopy + ? + "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + + "for i := 0; i < len(b); i++ {\n" + + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n" + : + "data := make([]int, " + foo.apply(g.end) + ")\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + + "var lab string\n" + + "if err := " + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "&lab" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "if err := " + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "&data[i-1]" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n"); // FIXME: arg0 + } + + return res + + buildReturn(api, curr, succ); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index ac4a29397..38c0d23fb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -5,8 +5,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; @@ -18,7 +16,6 @@ import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.main.GoJob; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; @@ -33,6 +30,8 @@ public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder public final ParamActualRole actual; // this.apigen.self.equals(this.actual.getName()) //public final EGraph graph; + public final ParamCoreSTReceiveActionBuilder vb; + private int counter = 1; // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later @@ -41,7 +40,7 @@ public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, Pa { super(apigen.job, apigen.proto, apigen.self, graph, new ParamCoreSTOutputStateBuilder(new ParamCoreSTSendActionBuilder()), - new ParamCoreSTReceiveStateBuilder(new ParamCoreSTReceiveActionBuilder()), + new ParamCoreSTReceiveStateBuilder(new ParamCoreSTReduceActionBuilder(), new ParamCoreSTReceiveActionBuilder()), new ParamCoreSTBranchStateBuilder(new ParamCoreSTBranchActionBuilder()), null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), new ParamCoreSTEndStateBuilder()); @@ -49,6 +48,8 @@ public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, Pa //throw new RuntimeException("[param-core] TODO:"); this.apigen = apigen; this.actual = actual; + + this.vb = ((ParamCoreSTReceiveStateBuilder) this.rb).vb; } protected ParamActualRole getSelf() From ac5133dc9777bd76a08f6ef217f85a30378b17ce Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Dec 2017 10:44:00 +0000 Subject: [PATCH 178/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index d2f08409d..86ac21490 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -132,7 +132,7 @@ else if (e instanceof ParamIndexVar) if (!allEmpty) // FIXME: { res += - "var b int\n" + "var b string\n" // HACK? + "if err := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&b); err != nil {\n" + "log.Fatal(err)\n" From d7fc227de678999ba67ad87b281e6d41821bde04 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 11 Dec 2017 22:27:18 +0000 Subject: [PATCH 179/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../statetype2/ParamCoreSTSessionApiBuilder.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index aa8eecf8e..35a246a64 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -116,7 +116,12 @@ public Map build() // FIXME: factor out //ParamRange g = actual.ranges.iterator().next(); return - "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out + + "\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, actual) + ") Ept() *session.Endpoint {\n" + + "return p.ept\n" + + "}\n" + + + "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " *" + simpname + "\n" /*+ this.apigen.actuals.get(r).keySet().stream() .map(a -> @@ -147,8 +152,9 @@ public Map build() // FIXME: factor out + "func (p *" + simpname + ") New" + epTypeName + "(" + - "self int" + - vars.stream().map(v -> ", " + v + " int").collect(Collectors.joining("")) + ")" + vars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + + "self int" + + ")" + "(*" + epTypeName + ") {\n" /*+ "ep := &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p,\n" From e771b9c756258d5377b8e153702efcde2ee31364 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 12 Dec 2017 00:03:55 +0000 Subject: [PATCH 180/433] Continued revising param-core Go API gen for new scribble-go-runtime interfaces. --- .../core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java | 1 + .../go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java | 1 + 2 files changed, 2 insertions(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index 86ac21490..6322cc948 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -133,6 +133,7 @@ else if (e instanceof ParamIndexVar) { res += "var b string\n" // HACK? + //"var b int\n" + "if err := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&b); err != nil {\n" + "log.Fatal(err)\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index 35a246a64..c50aba008 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -235,6 +235,7 @@ else if (ee instanceof ParamIndexVar) + "\nfunc (ini *" + epTypeName + ") Init() (*" + epTypeName + "_1) {\n" + "ini.Use()\n" + + "ini.ept.CheckConnection()\n" + ((this.apigen.actuals.get(rfoo).get(actual).init.getStateKind() == EStateKind.POLY_INPUT) ? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" From c812b2f61853bdb6f43f6817c45e0c42e60d9c2a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 9 Jan 2018 15:25:25 +0000 Subject: [PATCH 181/433] Fixed param-core branch API gen. --- .../ParamCoreSTBranchActionBuilder.java | 58 +++++++++++++++++-- .../ParamCoreSTBranchStateBuilder.java | 28 ++++----- .../src/test/scrib/param/tmp/ParamTest.scr | 55 ++++++++++++++++++ 3 files changed, 123 insertions(+), 18 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java index 669350829..150b9cb76 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java @@ -1,15 +1,20 @@ package org.scribble.ext.go.core.codegen.statetype2; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.scribble.codegen.statetype.STBranchActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; public class ParamCoreSTBranchActionBuilder extends STBranchActionBuilder { @@ -98,11 +103,43 @@ else if (e instanceof ParamIndexVar) + "return nil\n" + "}\n"*/ //buildReturn(api, curr, succ); - "ch, selected := <-s._" + a.mid + "_Chan\n" + //"ch, selected := <-s._" + a.mid + "_Chan\n" + "_, selected := <-s._" + a.mid + "_Chan\n" + "if !selected {\n" + "\treturn nil // select ignores nilchan\n" + "}\n"; + ParamRole peer = (ParamRole) curr.getActions().iterator().next().peer; + ParamRange g = peer.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + + ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; + String sEp = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + if (!a.payload.elems.isEmpty()) { if (a.payload.elems.size() > 1) @@ -123,11 +160,24 @@ else if (e instanceof ParamIndexVar) "" //+ "data[0] = decoded\n" //+ "}\n" - ) + ); //+ "*arg0 = reduceFn0(data)\n" // FIXME: arg0 // + "*arg0 = data[0]\n" - + "*arg0 = (<-s.data).(" + ((DataType) a.payload.elems.get(0)).getSimpleName() + ")\n"; + + //+ "*arg0 = (<-s.data).(" + ((DataType) a.payload.elems.get(0)).getSimpleName() + ")\n"; + + res += + "if err := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&arg0); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "\n" + + "\tch := make(chan *" + apigen.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" + + "\tch <- " + apigen.getSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; + + // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + } return res diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index 6322cc948..17da395b0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -1,9 +1,7 @@ package org.scribble.ext.go.core.codegen.statetype2; -import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; @@ -59,12 +57,12 @@ public String getPreamble(STStateChanApiBuilder api, EState s) //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" - + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan string\n") // chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") .collect(Collectors.joining("")) - + (((GoJob) apigen.job).noCopy ? "data chan []interface{}" : + /*+ (((GoJob) apigen.job).noCopy ? "data chan []interface{}" : //"data chan [][]byte\n" "data chan interface{}\n" - ) + )*/ + "}\n"; res += "\n" @@ -74,13 +72,15 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "() *" + tname + " {\n" // FIXME: factor out + "s := &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " - + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan chan *" + apigen.getStateChanName(s.getSuccessor(a))+ ", 1)") + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan "//chan *" + apigen.getStateChanName(s.getSuccessor(a)) + + "string" + + ", 1)") .collect(Collectors.joining(", ")) + ", " - + "data: make(chan " + (((GoJob) api.job).noCopy ? "[]interface{}" : + /*+ "data: make(chan " + (((GoJob) api.job).noCopy ? "[]interface{}" : //"[][]byte" " interface{}" - ) + ", 1)" + ) + ", 1)"*/ + "}\n" + "go s.foo()\n" @@ -127,7 +127,7 @@ else if (e instanceof ParamIndexVar) + "}\n"; } - List as = s.getActions(); + /*List as = s.getActions(); boolean allEmpty = as.stream().allMatch(a -> a.payload.elems.isEmpty()); if (!allEmpty) // FIXME: { @@ -140,18 +140,18 @@ else if (e instanceof ParamIndexVar) + "}\n" + "s.data <- b\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args - } + }*/ res+= "if " + s.getActions().stream().map(a -> { - String sEp = - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + //String sEp = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; return "op == \"" + a.mid + "\" {\n" - + "\tch := make(chan *" + apigen.getStateChanName(s.getSuccessor(a)) + ", 1)\n" + /*+ "\tch := make(chan *" + apigen.getStateChanName(s.getSuccessor(a)) + ", 1)\n" + "\tch <- " + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" - + "\ts._" + a.mid + "_Chan <- ch\n" + + "\ts._" + a.mid + "_Chan <- ch\n"*/ + + "\ts._" + a.mid + "_Chan <- \"" + a.mid +"\"\n" + "\t" + s.getActions().stream() .filter(otheract -> otheract.mid != a.mid) .map(otheract -> { return "close(s._" + otheract.mid + "_Chan)"; }) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 224d0748e..506f16647 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -48,11 +48,66 @@ message passing // paramterisation subsumes multicast +global protocol Proto1(role A(n, m), role B(n, m)) +{ + 1() from A[1..n] to B[1..m]; // (a) All-to-all, (unary) mult. choices +} + +global protocol Proto2(role A(n), role B(n)) +{ + 1() dot A[1..n] to B[1..n]; // (b) ones-to-ones, (unary) multi. choices +} + + + + + + + + + + + + + + +/*global protocol Proto3(role A(n), role B(n)) +{ + choices at A[i:1..n] + { + 1() dot A[1..n] to B[1..n]; // TODO (b) ones-to-ones, multi. choices + } + or + { + 2() dot A[1..n] to B[1..n]; + } +}*/ + + +/* +global protocol Proto1(role A(n), role B(n)) +{ + choice at A[1] + { + //0() from A[1..n] to B[1..n]; // FIXME when unary-choice -- or OK? + //0() dot A[1..n] to B[1..n]; // FIXME when unary-choice -- or OK? + 0() from A[1..n] to B[1..n]; + } + or + { + 1() from A[1..n] to B[1..n]; + } +} +//*/ + + +/* global protocol Proto1(role A(n,m), role B(n,m)) { 0() dot A[1..n] to B[(m*2)+1..(m*2)+n]; } +*/ /* From 8ec61328bacea35d67a82513e695299f2dc4de09 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 11 Jan 2018 19:13:01 +0000 Subject: [PATCH 182/433] Added param-core API gen []byte hack. --- .../statetype2/ParamCoreSTApiGenConstants.java | 4 ++-- .../ParamCoreSTReceiveActionBuilder.java | 5 +++-- .../ParamCoreSTReduceActionBuilder.java | 8 +++++--- .../statetype2/ParamCoreSTSendActionBuilder.java | 5 +++-- .../statetype2/ParamCoreSTSessionApiBuilder.java | 16 +++++++++++++--- .../ParamCoreSTStateChanApiBuilder.java | 6 ++++++ 6 files changed, 32 insertions(+), 12 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java index bc4d4477f..5d165aa11 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java @@ -3,9 +3,9 @@ public class ParamCoreSTApiGenConstants { //public static final String GO_SCRIBBLERUNTIME_PACKAGE = "org/scribble/runtime/net"; - public static final String GO_SCRIBBLERUNTIME_SESSION_PACKAGE = "github.com/nickng/scribble-go-runtime/runtime/session"; + public static final String GO_SCRIBBLERUNTIME_SESSION_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/session"; public static final String GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE = "github.com/scribble/go-runtime/session/param"; - public static final String GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE = "github.com/nickng/scribble-go-runtime/runtime/transport"; + public static final String GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/transport"; public static final String GO_SCRIBBLERUNTIME_SHM_PACKAGE = "github.com/scribble/go-runtime/transport/shm"; public static final String GO_SCRIBBLERUNTIME_BYTES_PACKAGE = "bytes"; public static final String GO_SCRIBBLERUNTIME_GOB_PACKAGE = "encoding/gob"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index b1b746335..c71b9867f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -32,7 +32,7 @@ public String buildArgs(EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " *[]" + a.payload.elems.get(i) + + i + " *[]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } @@ -114,7 +114,8 @@ else if (e instanceof ParamIndexVar) + "}\n" + "*arg0 = reduceFn0(data)\n" : - "data := make([]" + a.payload.elems.get(0) + ", " + foo.apply(g.end) + ")\n" + "data := make([]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0))//a.payload.elems.get(0) + + ", " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" + "if err := " + sEpRecv diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index 2c05e3f77..43a3cd8c2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -33,9 +33,10 @@ public String buildArgs(EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " *" + a.payload.elems.get(i) + + i + " *" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i - + " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) + //+ " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) + + " []" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) + ") " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) ).collect(Collectors.joining(", ")); } @@ -117,7 +118,8 @@ else if (e instanceof ParamIndexVar) + "}\n" + "*arg0 = reduceFn0(data)\n" : - "data := make([]int, " + foo.apply(g.end) + ")\n" + "data := make([]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) //a.payload.elems.get(0) + + ", " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" + "if err := " + sEpRecv diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index 859fd9dda..fabf1d2db 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -31,8 +31,9 @@ public String buildArgs(EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG - + i + " " + a.payload.elems.get(i) - + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + a.payload.elems.get(i) + ", i" + i + " int) " + a.payload.elems.get(i) + + i + " " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + ", i" + i + " int) " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index c50aba008..15617b14b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -53,8 +53,8 @@ public Map build() // FIXME: factor out + "\n" //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + this.apigen.generateScribbleRuntimeImports() - + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n" - + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; sessPack += "\n" @@ -137,7 +137,7 @@ public Map build() // FIXME: factor out + "\n" - + "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, addr, port string) error {\n" + /*+ "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, addr, port string) error {\n" + "ini.ept.Conn[rolename.Name()][id-1] = tcp.NewConnection(addr, port).Accept().(*tcp.Conn)\n" + "return nil\n" + "}\n" @@ -146,6 +146,16 @@ public Map build() // FIXME: factor out + "ini.ept.Conn[rolename.Name()][id-1] = tcp.NewConnection(addr, port).Connect()\n" + "return nil\n" + "}\n" + + "\n"*/ + + "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, acceptor transport.Transport) error {\n" + + "ini.ept.Conn[rolename.Name()][id-1] = acceptor.Accept()\n" + + "return nil\n" + + "}\n" + + "\n" + + "func (ini *" + epTypeName + ") Request(rolename session.Role, id int, requestor transport.Transport) error {\n" + + "ini.ept.Conn[rolename.Name()][id-1] = requestor.Connect()\n" + + "return nil\n" + + "}\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index 38c0d23fb..3bcf2ce59 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -21,6 +21,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder @@ -275,6 +276,11 @@ public Map build() // filepath -> source return api; } + protected static String batesHack(PayloadElemType t) + { + String tmp = t.toString(); + return (tmp.equals("bates")) ? "[]byte" : tmp; + } // FIXME: make ParamCoreEState enum ParamCoreEStateKind { CROSS_SEND, CROSS_RECEIVE, DOT_SEND, DOT_RECEIVE, MULTICHOICES_RECEIVE, TERMINAL } From 299e5dc068148c0459cf422d90d4087f11839668 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 11 Jan 2018 19:53:09 +0000 Subject: [PATCH 183/433] Separated send/split funs in param-core API gen. --- .../ParamCoreSTApiGenConstants.java | 1 + .../ParamCoreSTOutputStateBuilder.java | 29 +++- .../ParamCoreSTReceiveStateBuilder.java | 1 + .../ParamCoreSTSendActionBuilder.java | 7 +- .../ParamCoreSTSplitActionBuilder.java | 164 ++++++++++++++++++ .../ParamCoreSTStateChanApiBuilder.java | 2 +- 6 files changed, 197 insertions(+), 7 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java index 5d165aa11..cca749986 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java @@ -39,6 +39,7 @@ public class ParamCoreSTApiGenConstants public static final String GO_IO_FUN_RECEIVER = "s"; + public static final String GO_CROSS_SPLIT_FUN_PREFIX = "Split"; public static final String GO_CROSS_SEND_FUN_PREFIX = "Send"; public static final String GO_CROSS_SEND_FUN_ARG = "arg"; public static final String GO_CROSS_REDUCE_FUN_PREFIX = "Reduce"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java index 64c012462..2b04dc405 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java @@ -1,15 +1,22 @@ package org.scribble.ext.go.core.codegen.statetype2; +import java.util.List; + import org.scribble.codegen.statetype.STOutputStateBuilder; import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; public class ParamCoreSTOutputStateBuilder extends STOutputStateBuilder { - public ParamCoreSTOutputStateBuilder(STSendActionBuilder sb) + public final ParamCoreSTSendActionBuilder nb; + + // sb is ParamCoreSTSplitActionBuilder + public ParamCoreSTOutputStateBuilder(STSendActionBuilder sb, ParamCoreSTSendActionBuilder nb) { super(sb); + this.nb = nb; } @Override @@ -17,4 +24,22 @@ public String getPreamble(STStateChanApiBuilder api, EState s) { return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); } -} + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + String out = getPreamble(api, s); + + List as = s.getActions(); + if (as.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + as); + } + out += "\n\n"; + out += this.sb.build(api, s, as.get(0)); + out += "\n\n"; + out += this.nb.build(api, s, as.get(0)); + + return out; + } +} \ No newline at end of file diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java index 3e1b1f7fc..c231465e3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java @@ -12,6 +12,7 @@ public class ParamCoreSTReceiveStateBuilder extends STReceiveStateBuilder { public final ParamCoreSTReceiveActionBuilder vb; + // sb is ParamCoreSTReduceActionBuilder public ParamCoreSTReceiveStateBuilder(STReceiveActionBuilder sb, ParamCoreSTReceiveActionBuilder vb) { super(sb); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index fabf1d2db..b3458565f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -31,9 +31,7 @@ public String buildArgs(EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG - + i + " " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) - + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) - + ", i" + i + " int) " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + i + " []" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } @@ -147,7 +145,8 @@ else if (e instanceof ParamIndexVar) + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " - + "splitFn0(arg0, i)" + "); err != nil {\n" + + "arg0[i]" //+ "splitFn0(arg0, i)" + + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" + "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java new file mode 100644 index 000000000..40824e6c0 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java @@ -0,0 +1,164 @@ +package org.scribble.ext.go.core.codegen.statetype2; + +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class ParamCoreSTSplitActionBuilder extends STSendActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_SPLIT_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + + i + " " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + ", i" + i + " int) " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + ).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + String sEpWrite = + //s.ep.Write + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; + + ".Conn"; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + + /*String res = + (((GoJob) api.job).noCopy + ? + "labels := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "tmp := \"" + a.mid + "\"\n" + + "\tlabels[i-" + foo.apply(g.start) + "] = &tmp\n" + + "}\n" + : + "labels := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "\tlabels[i-" + foo.apply(g.start) + "] = []byte(\"" + a.mid + "\")\n" + + "}\n") + + + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "labels)\n"; + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + res += + (((GoJob) api.job).noCopy + ? + "b := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end)+"; i++ {\n" + + "tmp := splitFn0(arg0, i)\n" + + "\tb[i-"+foo.apply(g.start)+"] = &tmp\n" + + "}\n" + : + "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + "\tvar buf bytes.Buffer\n" + + "\tif err := gob.NewEncoder(&buf).Encode(splitFn0(arg0, i)); err != nil {\n\t\t" // only arg0 + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Errors <- session.SerialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Self.Name())\n" + + "\t}\n" + + "\tb[i-"+foo.apply(g.start)+"] = buf.Bytes()\n" + + "}\n") + + + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + + "." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + //+ "\"" + a.mid + "\"" + + "b" + + ")\n"; + }*/ + + String res = + //st1.Use() + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "if err := " + sEpWrite + + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "\"" + a.mid + "\"" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "if err := " + sEpWrite + + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "splitFn0(arg0, i)" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "}\n"; + + /*for i, v := range pl { + st1.ept.Conn[Worker][i].Send(a.mid) + st1.ept.Conn[Worker][i].Send(v) + }*/ + + return + res + + buildReturn(api, curr, succ); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index 3bcf2ce59..cf2315de0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -40,7 +40,7 @@ public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, ParamActualRole actual, EGraph graph) { super(apigen.job, apigen.proto, apigen.self, graph, - new ParamCoreSTOutputStateBuilder(new ParamCoreSTSendActionBuilder()), + new ParamCoreSTOutputStateBuilder(new ParamCoreSTSplitActionBuilder(), new ParamCoreSTSendActionBuilder()), new ParamCoreSTReceiveStateBuilder(new ParamCoreSTReduceActionBuilder(), new ParamCoreSTReceiveActionBuilder()), new ParamCoreSTBranchStateBuilder(new ParamCoreSTBranchActionBuilder()), null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), From e2aef36d046142540803225c256c1bf0c34addc4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 11 Jan 2018 22:10:57 +0000 Subject: [PATCH 184/433] Added param-core API gen name scheme for general actual roles. --- .../ParamCoreSTEndpointApiGenerator.java | 15 +++++++++++---- .../statetype2/ParamCoreSTSessionApiBuilder.java | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java index a7a0feae0..a02152b25 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java @@ -9,7 +9,6 @@ import java.util.stream.Stream; import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; import org.scribble.main.Job; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; @@ -80,17 +79,25 @@ public static String getGeneratedEndpointType(GProtocolName simpname, ParamActua return simpname + "_" + getGeneratedActualRoleName(r); } - // Doesn't use coranges -- same as getGeneratedParamRoleName? + // Doesn't use coranges -- same as getGeneratedParamRoleName? // Old public static String getGeneratedActualRoleName(ParamActualRole actual) { /*return actual.getName() + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ - if (actual.ranges.size() > 1) + /*if (actual.ranges.size() > 1 || actual.coranges.size() > 0) { throw new RuntimeException("[param-core] TODO: " + actual); } ParamRange g = actual.ranges.iterator().next(); - return actual.getName() + "_" + g.start + "To" + g.end; + return actual.getName() + "_" + g.start + "To" + g.end;*/ + //return + String s = + actual.getName() + "_" + + actual.ranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")) + + (actual.coranges.isEmpty() ? "" : "_not_") + + actual.coranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")); + System.out.println("aaa: " + s); + return s; } //@Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index 15617b14b..3a6214e05 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -219,7 +219,7 @@ else if (ee instanceof ParamIndexVar) + this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(actual.getName())) .map(e -> "conns[p." + e.getKey() + ".Name()] = make([]transport.Channel, " + e.getValue().keySet().iterator().next().ranges.iterator().next().end + "-" // FIXME: e.getValues().size() > 1 - + e.getValue().keySet().iterator().next().ranges.iterator().next().start + "+1)\n") // FIXME: start index 1 + + e.getValue().keySet().iterator().next().ranges.iterator().next().start + "+1)\n") .collect(Collectors.joining("")) From a73d00e92fc8575553b484b2a15d66e564dc0fec Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 11 Jan 2018 22:12:59 +0000 Subject: [PATCH 185/433] Minor. --- .../codegen/statetype2/ParamCoreSTEndpointApiGenerator.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java index a02152b25..43430794b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java @@ -90,14 +90,10 @@ public static String getGeneratedActualRoleName(ParamActualRole actual) } ParamRange g = actual.ranges.iterator().next(); return actual.getName() + "_" + g.start + "To" + g.end;*/ - //return - String s = - actual.getName() + "_" + return actual.getName() + "_" + actual.ranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")) + (actual.coranges.isEmpty() ? "" : "_not_") + actual.coranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")); - System.out.println("aaa: " + s); - return s; } //@Override From d9324bf4f0dd496394de3f5731ffa6cf287e5211 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 12 Jan 2018 16:39:33 +0000 Subject: [PATCH 186/433] Changed param-core API gen for endpoint channel maps. --- .../ParamCoreSTOutputStateBuilder.java | 30 ++++++++++++++----- .../ParamCoreSTSessionApiBuilder.java | 9 ++++-- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java index 2b04dc405..082693cd7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java @@ -7,6 +7,9 @@ import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.endpoint.actions.EDisconnect; +import org.scribble.model.endpoint.actions.ERequest; +import org.scribble.model.endpoint.actions.ESend; public class ParamCoreSTOutputStateBuilder extends STOutputStateBuilder { @@ -30,15 +33,28 @@ public String build(STStateChanApiBuilder api, EState s) { String out = getPreamble(api, s); - List as = s.getActions(); - if (as.size() > 1) + for (EAction a : s.getActions()) { - throw new RuntimeException("Shouldn't get in here: " + as); + out += "\n\n"; + if (a instanceof ESend) // FIXME: factor out action kind + { + out += this.sb.build(api, s, a); + out += "\n\n"; + out += this.nb.build(api, s, a); + } + else if (a instanceof ERequest) + { + throw new RuntimeException("TODO: " + a); + } + else if (a instanceof EDisconnect) + { + throw new RuntimeException("TODO: " + a); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } } - out += "\n\n"; - out += this.sb.build(api, s, as.get(0)); - out += "\n\n"; - out += this.nb.build(api, s, as.get(0)); return out; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index 3a6214e05..0ab4d72d7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -213,13 +213,16 @@ else if (ee instanceof ParamIndexVar) }).collect(Collectors.joining("")) + "return ep\n"*/ - + "conns := make(map[string][]transport.Channel)\n" + //+ "conns := make(map[string][]transport.Channel)\n" + + "conns := make(map[string]map[int]transport.Channel)\n" + this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(actual.getName())) - .map(e -> "conns[p." + e.getKey() + ".Name()] = make([]transport.Channel, " + .map(e -> "conns[p." + e.getKey() + ".Name()] = " + /*+ "make([]transport.Channel, " + e.getValue().keySet().iterator().next().ranges.iterator().next().end + "-" // FIXME: e.getValues().size() > 1 - + e.getValue().keySet().iterator().next().ranges.iterator().next().start + "+1)\n") + + e.getValue().keySet().iterator().next().ranges.iterator().next().start + "+1)\n")*/ + + "make(map[int]transport.Channel)\n") .collect(Collectors.joining("")) From 789d98430bc14988ef41bab0107cac8cac75eea4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 12 Jan 2018 17:35:10 +0000 Subject: [PATCH 187/433] Continued. --- .../core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index 0ab4d72d7..1afabe00d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -109,10 +109,10 @@ public Map build() // FIXME: factor out List vars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); //.flatMap(rd -> ((ParamRoleDecl) rd).params.stream()).collect(Collectors.toList()); - if (actual.ranges.size() > 1) + /*if (actual.ranges.size() > 1) { throw new RuntimeException("TODO: " + actual); - } + }*/ //ParamRange g = actual.ranges.iterator().next(); return From 1a340450c1485c7c84d87debe0af0e3efdb4547f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Jan 2018 16:53:07 +0000 Subject: [PATCH 188/433] Fixed role indices for transport maps in param-core API gen. Removed numRoles from endpoints. --- .../statetype2/ParamCoreSTReceiveActionBuilder.java | 4 ++-- .../codegen/statetype2/ParamCoreSTReduceActionBuilder.java | 4 ++-- .../codegen/statetype2/ParamCoreSTSendActionBuilder.java | 6 +++--- .../codegen/statetype2/ParamCoreSTSessionApiBuilder.java | 7 ++++--- .../codegen/statetype2/ParamCoreSTSplitActionBuilder.java | 4 ++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index c71b9867f..dd81e4b5b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -119,14 +119,14 @@ else if (e instanceof ParamIndexVar) + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" + "if err := " + sEpRecv - + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" + "if err := " + sEpRecv - + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&data[i-1]" + "); err != nil {\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index 43a3cd8c2..bff696884 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -123,14 +123,14 @@ else if (e instanceof ParamIndexVar) + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" + "if err := " + sEpRecv - + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" + "if err := " + sEpRecv - + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&data[i-1]" + "); err != nil {\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index b3458565f..9ad136ca1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -134,7 +134,7 @@ else if (e instanceof ParamIndexVar) "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "if err := " + sEpWrite - + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "\"" + a.mid + "\"" + "); err != nil {\n" @@ -142,10 +142,10 @@ else if (e instanceof ParamIndexVar) + "}\n" //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "if err := " + sEpWrite - + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " - + "arg0[i]" //+ "splitFn0(arg0, i)" + + "arg0[i-1]" //+ "splitFn0(arg0, i)" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index 1afabe00d..c984560be 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -148,12 +148,12 @@ public Map build() // FIXME: factor out + "}\n" + "\n"*/ + "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, acceptor transport.Transport) error {\n" - + "ini.ept.Conn[rolename.Name()][id-1] = acceptor.Accept()\n" + + "ini.ept.Conn[rolename.Name()][id] = acceptor.Accept()\n" + "return nil\n" + "}\n" + "\n" + "func (ini *" + epTypeName + ") Request(rolename session.Role, id int, requestor transport.Transport) error {\n" - + "ini.ept.Conn[rolename.Name()][id-1] = requestor.Connect()\n" + + "ini.ept.Conn[rolename.Name()][id] = requestor.Connect()\n" + "return nil\n" + "}\n" + "\n" @@ -228,7 +228,8 @@ else if (ee instanceof ParamIndexVar) + "params := make(map[string]int)\n" + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) - + "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, -1, conns), params}\n" // FIXME: numRoles + + "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, " //-1, + + "conns), params}\n" // FIXME: numRoles + "}\n" /*+ this.apigen.actuals.get(r).keySet().stream() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java index 40824e6c0..055722e7d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java @@ -136,7 +136,7 @@ else if (e instanceof ParamIndexVar) "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "if err := " + sEpWrite - + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "\"" + a.mid + "\"" + "); err != nil {\n" @@ -144,7 +144,7 @@ else if (e instanceof ParamIndexVar) + "}\n" //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "if err := " + sEpWrite - + "[" + sEpProto + "." + r.getName() + ".Name()][i-1]" + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "splitFn0(arg0, i)" + "); err != nil {\n" From f95a545f0c36ee2efc73b305955be7f863804040 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Jan 2018 01:36:18 +0000 Subject: [PATCH 189/433] Fixing param-core API gen for general actual roles. --- .../ParamCoreSTBranchActionBuilder.java | 2 +- .../ParamCoreSTBranchStateBuilder.java | 2 +- .../ParamCoreSTReceiveActionBuilder.java | 33 +++++++++++++++++-- .../ParamCoreSTReduceActionBuilder.java | 14 +++++--- .../ParamCoreSTSendActionBuilder.java | 6 ++-- .../ParamCoreSTSessionApiBuilder.java | 3 +- .../ParamCoreSTStateChanApiBuilder.java | 3 ++ 7 files changed, 51 insertions(+), 12 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java index 150b9cb76..9dc1b99d8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java @@ -169,7 +169,7 @@ else if (e instanceof ParamIndexVar) res += "if err := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") - + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&arg0); err != nil {\n" + + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "].Recv(&arg0); err != nil {\n" + "log.Fatal(err)\n" + "}\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index 17da395b0..a78d265a3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -122,7 +122,7 @@ else if (e instanceof ParamIndexVar) { res += "if err := " + sEpRecv + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" - + foo.apply(g.start) + "-1].Recv(&op); err != nil {\n" // g.end = g.start + + foo.apply(g.start) + "].Recv(&op); err != nil {\n" // g.end = g.start + "log.Fatal(err)\n" + "}\n"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index dd81e4b5b..ee7a3f031 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -114,7 +114,9 @@ else if (e instanceof ParamIndexVar) + "}\n" + "*arg0 = reduceFn0(data)\n" : - "data := make([]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0))//a.payload.elems.get(0) + //"data := make([]" + "data := make(map[int]" + + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0))//a.payload.elems.get(0) + ", " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" @@ -125,18 +127,43 @@ else if (e instanceof ParamIndexVar) + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" + + "var tmp " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) + "\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " - + "&data[i-1]" + "); err != nil {\n" + //+ "&data[i-1]" + + "&tmp" + + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" + + "data[i-1] = tmp\n" + "}\n" - + "*arg0 = data\n"); // FIXME: arg0 + //+ "*arg0 = data\n"); // FIXME: arg0 + + "*arg0 = " + hackGetValues(ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0))) + "(data)\n"); // FIXME: arg0 } return res + buildReturn(api, curr, succ); } + + protected static String hackGetValues(String t) + { + if (t.equals("int")) + { + return "util.GetValuesInt"; + } + else if (t.equals("string")) + { + return "util.GetValuesString"; + } + else if (t.equals("[]byte")) + { + return "util.GetValuesBates"; + } + else + { + throw new RuntimeException("[TODO] " + t); + } + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index bff696884..e0861fe6a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -118,8 +118,9 @@ else if (e instanceof ParamIndexVar) + "}\n" + "*arg0 = reduceFn0(data)\n" : - "data := make([]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) //a.payload.elems.get(0) - + ", " + foo.apply(g.end) + ")\n" + /*"data := make([]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) //a.payload.elems.get(0) + + ", " + foo.apply(g.end) + ")\n"*/ + "data := make(map[int]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" + "if err := " + sEpRecv @@ -129,15 +130,20 @@ else if (e instanceof ParamIndexVar) + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" + + "var tmp " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) + "\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " - + "&data[i-1]" + "); err != nil {\n" + //+ "&data[i-1]" + + "&tmp" + + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" + + "data[i] = tmp\n" + "}\n" - + "*arg0 = reduceFn0(data)\n"); // FIXME: arg0 + + "*arg0 = reduceFn0(" + + ParamCoreSTReceiveActionBuilder.hackGetValues(ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0))) + "(data))\n"); // FIXME: arg0 } return res diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index 9ad136ca1..810d9edd7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -131,7 +131,8 @@ else if (e instanceof ParamIndexVar) String res = //st1.Use() - "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + "j := 0\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" @@ -145,10 +146,11 @@ else if (e instanceof ParamIndexVar) + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " - + "arg0[i-1]" //+ "splitFn0(arg0, i)" + + "arg0[j]" //+ "splitFn0(arg0, i)" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" + + "j = j+1\n" + "}\n"; /*for i, v := range pl { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index c984560be..ac299e0d3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -217,7 +217,8 @@ else if (ee instanceof ParamIndexVar) + "conns := make(map[string]map[int]transport.Channel)\n" - + this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(actual.getName())) + //+ this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(actual.getName())) + + this.apigen.actuals.entrySet().stream() .map(e -> "conns[p." + e.getKey() + ".Name()] = " /*+ "make([]transport.Channel, " + e.getValue().keySet().iterator().next().ranges.iterator().next().end + "-" // FIXME: e.getValues().size() > 1 diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index cf2315de0..fa658ff72 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -19,6 +19,7 @@ import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.PayloadElemType; @@ -132,6 +133,8 @@ protected String getStateChanPremable(EState s) Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + "\n"*/ + + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + ? "import \"github.com/rhu1/scribble-go-runtime/test/util\"\n" : "") + "type " + tname + " struct{\n" + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" From 401b5c1ee4a998e42eb1918284b086a8be666199 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Jan 2018 02:13:31 +0000 Subject: [PATCH 190/433] Minor. --- .../core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index ac299e0d3..e85fe9a24 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -149,12 +149,12 @@ public Map build() // FIXME: factor out + "\n"*/ + "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, acceptor transport.Transport) error {\n" + "ini.ept.Conn[rolename.Name()][id] = acceptor.Accept()\n" - + "return nil\n" + + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n" + "func (ini *" + epTypeName + ") Request(rolename session.Role, id int, requestor transport.Transport) error {\n" + "ini.ept.Conn[rolename.Name()][id] = requestor.Connect()\n" - + "return nil\n" + + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n" From cb101a6f141fe76be31a0022fe07eea4afa77413 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Jan 2018 20:04:16 +0000 Subject: [PATCH 191/433] Hacked data type imports for param-core API gen. --- .../codegen/statetype/STActionBuilder.java | 2 +- .../org/scribble/ast/PayloadElemList.java | 2 +- .../statetype/go/GoSTBranchActionBuilder.java | 4 +- .../statetype/go/GoSTCaseActionBuilder.java | 2 +- .../go/GoSTReceiveActionBuilder.java | 2 +- .../statetype/go/GoSTSendActionBuilder.java | 2 +- .../statetype/go/GoSTStateChanApiBuilder.java | 2 +- .../ParamCoreSTBranchActionBuilder.java | 2 +- .../ParamCoreSTReceiveActionBuilder.java | 2 +- .../ParamCoreSTSendActionBuilder.java | 2 +- .../ParamCoreSTStateChanApiBuilder.java | 4 +- .../ParamCoreSTBranchActionBuilder.java | 2 +- .../ParamCoreSTReceiveActionBuilder.java | 19 ++--- .../ParamCoreSTReduceActionBuilder.java | 19 ++--- .../ParamCoreSTSendActionBuilder.java | 4 +- .../ParamCoreSTSplitActionBuilder.java | 9 ++- .../ParamCoreSTStateChanApiBuilder.java | 81 ++++++++++++++++--- 17 files changed, 113 insertions(+), 47 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index 29df566b1..823638e04 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -19,7 +19,7 @@ public abstract class STActionBuilder { public abstract String getActionName(STStateChanApiBuilder api, EAction a); - public abstract String buildArgs(EAction a); + public abstract String buildArgs(STStateChanApiBuilder apigen, EAction a); public abstract String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ); public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) diff --git a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java index d6ba1fcce..60ade39d1 100644 --- a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java @@ -84,7 +84,7 @@ public List> getElements() public Payload toPayload() { //List> pts = this.elems.stream().map((pe) -> pe.name.toPayloadType()).collect(Collectors.toList()); - List> pts = this.elems.stream().map((pe) -> pe.toPayloadType()).collect(Collectors.toList()); + List> pts = this.elems.stream().map(pe -> pe.toPayloadType()).collect(Collectors.toList()); return new Payload(pts); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java index f029bd5da..24eb3941d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTBranchActionBuilder.java @@ -15,7 +15,7 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME EState succ = curr.getSuccessor(a); return "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" - + buildArgs(a) + + buildArgs(null, a) + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: Return type is interface, so no need for *return (unlike other state chans) + "s.state.Use()\n" + buildBody(api, curr, a, succ) + "\n" @@ -29,7 +29,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return ""; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java index 4a99f4db6..a7919a510 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTCaseActionBuilder.java @@ -18,7 +18,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> "arg" + i + " *" + a.payload.elems.get(i)).collect(Collectors.joining(", ")); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java index 9714047ad..75d4a6eac 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTReceiveActionBuilder.java @@ -18,7 +18,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> "arg" + i + " *" + a.payload.elems.get(i)).collect(Collectors.joining(", ")); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java index 49730100b..c9c4c0b64 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTSendActionBuilder.java @@ -18,7 +18,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> "arg" + i + " " + a.payload.elems.get(i)).collect(Collectors.joining(", ")); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java index 2f07a027e..7e1044b9d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java @@ -96,7 +96,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b EState succ = curr.getSuccessor(a); return "func (s *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(a) + + ab.buildArgs(this, a) + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + "s.state.Use()\n" + ab.buildBody(this, curr, a, succ) + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java index 52e067f45..be0599722 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -34,7 +34,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index b14fb61dc..701ef79dd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -28,7 +28,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 3e17ec817..c3c69c2d7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -28,7 +28,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index a6f6ac9d4..fd09fc5f5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -158,7 +158,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b return "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(a) + + ab.buildArgs(this, a) + ") <-chan *" + ab.getReturnType(this, curr, succ) + " {\n" + ab.buildBody(this, curr, a, succ) + "\n" + "}"; @@ -169,7 +169,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b return "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(a) + + ab.buildArgs(this, a) + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java index 9dc1b99d8..bb45dc373 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java @@ -40,7 +40,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index ee7a3f031..3f50a4014 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -28,16 +28,16 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " *[]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + i + " *[]" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } @Override - public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, EState succ) { String sEpRecv = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER @@ -106,7 +106,7 @@ else if (e instanceof ParamIndexVar) throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); } res += - (((GoJob) api.job).noCopy + (((GoJob) apigen.job).noCopy ? "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + "for i := 0; i < len(b); i++ {\n" @@ -116,7 +116,7 @@ else if (e instanceof ParamIndexVar) : //"data := make([]" "data := make(map[int]" - + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0))//a.payload.elems.get(0) + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0))//a.payload.elems.get(0) + ", " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" @@ -127,7 +127,7 @@ else if (e instanceof ParamIndexVar) + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "var tmp " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) + "\n" + + "var tmp " + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)) + "\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL @@ -140,11 +140,11 @@ else if (e instanceof ParamIndexVar) + "data[i-1] = tmp\n" + "}\n" //+ "*arg0 = data\n"); // FIXME: arg0 - + "*arg0 = " + hackGetValues(ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0))) + "(data)\n"); // FIXME: arg0 + + "*arg0 = " + hackGetValues(((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0))) + "(data)\n"); // FIXME: arg0 } return res - + buildReturn(api, curr, succ); + + buildReturn(apigen, curr, succ); } protected static String hackGetValues(String t) @@ -163,7 +163,8 @@ else if (t.equals("[]byte")) } else { - throw new RuntimeException("[TODO] " + t); + //throw new RuntimeException("[TODO] " + t); + return t; } } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index e0861fe6a..58c274a66 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -29,19 +29,20 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " *" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + i + " *" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i //+ " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) - + " []" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) + ") " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) + + " []" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) + ") " + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) ).collect(Collectors.joining(", ")); } @Override - public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, EState succ) { String sEpRecv = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER @@ -110,7 +111,7 @@ else if (e instanceof ParamIndexVar) throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); } res += - (((GoJob) api.job).noCopy + (((GoJob) apigen.job).noCopy ? "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + "for i := 0; i < len(b); i++ {\n" @@ -120,7 +121,7 @@ else if (e instanceof ParamIndexVar) : /*"data := make([]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) //a.payload.elems.get(0) + ", " + foo.apply(g.end) + ")\n"*/ - "data := make(map[int]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) + ")\n" + "data := make(map[int]" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" + "if err := " + sEpRecv @@ -130,7 +131,7 @@ else if (e instanceof ParamIndexVar) + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "var tmp " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) + "\n" + + "var tmp " + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)) + "\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL @@ -143,10 +144,10 @@ else if (e instanceof ParamIndexVar) + "data[i] = tmp\n" + "}\n" + "*arg0 = reduceFn0(" - + ParamCoreSTReceiveActionBuilder.hackGetValues(ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0))) + "(data))\n"); // FIXME: arg0 + + ParamCoreSTReceiveActionBuilder.hackGetValues(((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0))) + "(data))\n"); // FIXME: arg0 } return res - + buildReturn(api, curr, succ); + + buildReturn(apigen, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index 810d9edd7..4ffda7c23 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -27,11 +27,11 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG - + i + " []" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + i + " []" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java index 055722e7d..d8dd13642 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java @@ -27,13 +27,14 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(EAction a) + public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG - + i + " " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) - + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) - + ", i" + i + " int) " + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + i + " " + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + ", i" + i + " int) " + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index fa658ff72..74d889fcd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -5,7 +5,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import org.scribble.ast.DataTypeDecl; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; @@ -21,9 +23,9 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.PayloadElemType; -import org.scribble.type.name.Role; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder @@ -36,6 +38,8 @@ public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder private int counter = 1; + private final Set datats; + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later // actual.getName().equals(this.role) public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, ParamActualRole actual, EGraph graph) @@ -52,6 +56,9 @@ public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, Pa this.actual = actual; this.vb = ((ParamCoreSTReceiveStateBuilder) this.rb).vb; + + this.datats = this.apigen.job.getContext().getMainModule().getNonProtocolDecls().stream() + .filter(d -> (d instanceof DataTypeDecl)).map(d -> ((DataTypeDecl) d)).collect(Collectors.toSet()); } protected ParamActualRole getSelf() @@ -115,14 +122,42 @@ public String getActualRoleName() return this.apigen.self.toString(); } + protected String getExtName(DataType t) + { + return datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; // FIXME: make a map + } + + private String makeImportExtName(DataType t) + { + String extName = getExtName(t); + switch (extName) + { + case "int": // FIXME: factor out with batesHack + case "[]int": + case "[][]int": + case "string": + case "[]string": + case "[][]string": + case "byte": + case "[]byte": + case "[][]byte": + { + return ""; + } + default: + return "import " + extName + "\n"; + } + } + protected String getStateChanPremable(EState s) { - //throw new RuntimeException("[param-core] TODO: "); - Role r = this.actual.getName(); + //Role r = this.actual.getName(); + GProtocolName simpname = this.apigen.proto.getSimpleName(); String tname = this.getStateChanName(s); //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, this.actual); + String res = this.apigen.generateRootPackageDecl() + "\n" + "\n" @@ -133,8 +168,14 @@ protected String getStateChanPremable(EState s) Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + "\n"*/ - + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) // FIXME: refactor into state builders ? "import \"github.com/rhu1/scribble-go-runtime/test/util\"\n" : "") + + + ((s.getStateKind() == EStateKind.OUTPUT) + ? s.getActions().stream().flatMap(a -> a.payload.elems.stream()).collect(Collectors.toSet()).stream() + .map(p -> makeImportExtName((DataType) p)) + .collect(Collectors.joining("")) + : "") + "type " + tname + " struct{\n" + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" @@ -164,7 +205,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b return "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(a) + + ab.buildArgs(this, a) + ") <-chan *" + ab.getReturnType(this, curr, succ) + " {\n" + ab.buildBody(this, curr, a, succ) + "\n" + "}"; @@ -175,7 +216,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b return "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(a) + + ab.buildArgs(this, a) + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" @@ -279,10 +320,32 @@ public Map build() // filepath -> source return api; } - protected static String batesHack(PayloadElemType t) + protected String batesHack(PayloadElemType t) { - String tmp = t.toString(); - return (tmp.equals("bates")) ? "[]byte" : tmp; + /*String tmp = t.toString(); + return (tmp.equals("bates")) ? "[]byte" : tmp;*/ + DataType dt = (DataType) t; + String extName = getExtName(dt); + + switch (extName) + { + case "int": + case "[]int": // FIXME: generalise arbitrary dimension array + case "[][]int": + case "string": + case "[]string": + case "[][]string": + case "byte": + case "[]byte": + case "[][]byte": + { + return extName; + } + default: + { + return extName; // FIXME + } + } } // FIXME: make ParamCoreEState From 1b923a25bec500b59066cc499029b68874c64c3b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Jan 2018 23:15:44 +0000 Subject: [PATCH 192/433] Fixed param-core API gen for receive/reduce. --- .../ParamCoreSTReceiveActionBuilder.java | 32 ++++++++++++++++--- .../ParamCoreSTReduceActionBuilder.java | 26 ++++++++++++--- .../ParamCoreSTStateChanApiBuilder.java | 3 +- 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index 3f50a4014..8472ac143 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -3,6 +3,7 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; +import java.util.stream.Stream; import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; @@ -105,6 +106,9 @@ else if (e instanceof ParamIndexVar) { throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); } + + String extName = ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + res += (((GoJob) apigen.job).noCopy ? @@ -116,7 +120,7 @@ else if (e instanceof ParamIndexVar) : //"data := make([]" "data := make(map[int]" - + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0))//a.payload.elems.get(0) + + extName//a.payload.elems.get(0) + ", " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" @@ -127,7 +131,7 @@ else if (e instanceof ParamIndexVar) + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "var tmp " + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)) + "\n" + + "var tmp " + extName + "\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL @@ -140,7 +144,25 @@ else if (e instanceof ParamIndexVar) + "data[i-1] = tmp\n" + "}\n" //+ "*arg0 = data\n"); // FIXME: arg0 - + "*arg0 = " + hackGetValues(((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0))) + "(data)\n"); // FIXME: arg0 + + //+ "*arg0 = " + hackGetValues(extName) + "(data)\n"; // FIXME: arg0 + + //+ ((!Stream.of("int", "string", "[]byte").collect(Collectors.toSet()).contains(extName) + // ? + + "f := func(m map[int] " + extName + ") []" + extName + " {\n" + + "xs := make([]" + extName + ", len(m))\n" + + "keys := make([]int, 0)\n" + + "for k, _ := range m {\n" + + "keys = append(keys, k)\n" + + "}\n" + + "sort.Ints(keys)\n" + + "for i, k := range keys {\n" + + "xs[i] = m[k]\n" + + "}\n" + + "return xs\n" + + "}\n" + + "*arg0 = f(data)\n"); + // : "") } return res @@ -163,8 +185,8 @@ else if (t.equals("[]byte")) } else { - //throw new RuntimeException("[TODO] " + t); - return t; + throw new RuntimeException("[TODO] " + t); + //return t; } } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index 58c274a66..a307eac14 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -110,6 +110,9 @@ else if (e instanceof ParamIndexVar) { throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); } + + String extName = ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + res += (((GoJob) apigen.job).noCopy ? @@ -121,7 +124,7 @@ else if (e instanceof ParamIndexVar) : /*"data := make([]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) //a.payload.elems.get(0) + ", " + foo.apply(g.end) + ")\n"*/ - "data := make(map[int]" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)) + ")\n" + "data := make(map[int]" + extName + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + "var lab string\n" + "if err := " + sEpRecv @@ -131,7 +134,7 @@ else if (e instanceof ParamIndexVar) + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "var tmp " + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)) + "\n" + + "var tmp " + extName + "\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL @@ -143,8 +146,23 @@ else if (e instanceof ParamIndexVar) + "}\n" + "data[i] = tmp\n" + "}\n" - + "*arg0 = reduceFn0(" - + ParamCoreSTReceiveActionBuilder.hackGetValues(((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0))) + "(data))\n"); // FIXME: arg0 + //+ "*arg0 = reduceFn0(" + // + ParamCoreSTReceiveActionBuilder.hackGetValues(((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0))) + "(data))\n"); // FIXME: arg0 + + + "f := func(m map[int] " + extName + ") []" + extName + " {\n" + + + "xs := make([]" + extName + ", len(m))\n" + + "keys := make([]int, 0)\n" + + "for k, _ := range m {\n" + + "keys = append(keys, k)\n" + + "}\n" + + "sort.Ints(keys)\n" // Needed? + + "for i, k := range keys {\n" + + "xs[i] = m[k]\n" + + "}\n" + + "return xs\n" + + "}\n" + + "*arg0 = reduceFn0(f(data))\n"); } return res diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index 74d889fcd..6bffb1cc7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -169,7 +169,8 @@ protected String getStateChanPremable(EState s) .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + "\n"*/ + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) // FIXME: refactor into state builders - ? "import \"github.com/rhu1/scribble-go-runtime/test/util\"\n" : "") + //? "import \"github.com/rhu1/scribble-go-runtime/test/util\"\n" : "") + ? "import \"sort\"\n" : "") + ((s.getStateKind() == EStateKind.OUTPUT) ? s.getActions().stream().flatMap(a -> a.payload.elems.stream()).collect(Collectors.toSet()).stream() From 5ec44755fc1815141b6540694f5d0965f46671e7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Jan 2018 14:50:45 +0000 Subject: [PATCH 193/433] Added I/O skip hack for empty labels to param-core API gen. --- .../ParamCoreSTReceiveActionBuilder.java | 8 +++++--- .../ParamCoreSTReduceActionBuilder.java | 7 +++++-- .../statetype2/ParamCoreSTSendActionBuilder.java | 15 +++++++++++++-- .../statetype2/ParamCoreSTSplitActionBuilder.java | 15 +++++++++++++-- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index 8472ac143..944dab58b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -3,7 +3,6 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; -import java.util.stream.Stream; import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; @@ -123,14 +122,17 @@ else if (e instanceof ParamIndexVar) + extName//a.payload.elems.get(0) + ", " + foo.apply(g.end) + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args - + "var lab string\n" + + + (a.mid.toString().equals("") ? "" : // HACK + "var lab string\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" - + "}\n" + + "}\n") + + "var tmp " + extName + "\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index a307eac14..cab931f34 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -126,14 +126,17 @@ else if (e instanceof ParamIndexVar) + ", " + foo.apply(g.end) + ")\n"*/ "data := make(map[int]" + extName + ")\n" + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args - + "var lab string\n" + + + (a.mid.toString().equals("") ? "" : // HACK + "var lab string\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" - + "}\n" + + "}\n") + + "var tmp " + extName + "\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index 4ffda7c23..cd9d8900b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.core.codegen.statetype2; +import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -38,6 +39,13 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { + List as = curr.getActions(); + if (as.size() > 1 && as.stream().anyMatch(b -> b.mid.toString().equals(""))) // HACK + { + throw new //ParamCoreException + RuntimeException("[param-core] Empty labels not allowed in non-unary choices: " + curr.getActions()); + } + String sEpWrite = //s.ep.Write ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT @@ -133,14 +141,17 @@ else if (e instanceof ParamIndexVar) //st1.Use() "j := 0\n" + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "if err := " + sEpWrite + + (a.mid.toString().equals("") ? "" : // HACK + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "\"" + a.mid + "\"" + "); err != nil {\n" + "log.Fatal(err)\n" - + "}\n" + + "}\n") + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java index d8dd13642..c8a9efec8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.core.codegen.statetype2; +import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -41,6 +42,13 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { + List as = curr.getActions(); + if (as.size() > 1 && as.stream().anyMatch(b -> b.mid.toString().equals(""))) // HACK + { + throw new //ParamCoreException + RuntimeException("[param-core] Empty labels not allowed in non-unary choices: " + curr.getActions()); + } + String sEpWrite = //s.ep.Write ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT @@ -135,14 +143,17 @@ else if (e instanceof ParamIndexVar) String res = //st1.Use() "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "if err := " + sEpWrite + + (a.mid.toString().equals("") ? "" : // HACK + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "\"" + a.mid + "\"" + "); err != nil {\n" + "log.Fatal(err)\n" - + "}\n" + + "}\n") + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" From 2f05d5a21c0100ff10d2175ba93d4572810017d2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 22 Jan 2018 22:12:16 +0000 Subject: [PATCH 194/433] Adding deleg-decls to param-core, for delegation (workaround). --- .../org/scribble/parser/antlr/ParamScribble.g | 37 +++++++-- .../scribble/ext/go/ast/ParamAstFactory.java | 9 +- .../ext/go/ast/ParamAstFactoryImpl.java | 16 ++++ .../ext/go/core/ast/ParamCoreDelegDecl.java | 51 ++++++++++++ .../go/core/ast/global/ParamCoreGChoice.java | 15 ++++ .../ParamCoreGProtocolDeclTranslator.java | 2 +- .../ParamCoreSTOutputStateBuilder.java | 2 - .../ParamCoreSTSendActionBuilder.java | 3 +- .../ParamCoreSTStateChanApiBuilder.java | 14 +++- .../scribble/ParamAntlrToScribParser.java | 11 ++- .../scribble/ast/ParamCoreAntlrModule.java | 82 +++++++++++++++++++ .../scribble/ast/AntlrDataTypeDecl.java | 2 +- .../parser/scribble/ast/AntlrModule.java | 2 +- 13 files changed, 227 insertions(+), 19 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreDelegDecl.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrModule.java diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 4af680106..cee0eadd2 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -65,6 +65,9 @@ tokens DOT_KW = 'dot'; CHOICES_KW = 'choices'; + + PARAM_DELEG_KW = 'deleg'; + /* * Parser output "node types" (corresponding to the various syntactic @@ -170,13 +173,15 @@ tokens LOCALRECEIVE = 'local-receive';*/ - PARAM_BININDEXEXPR = 'PARAM_BININDEXEXPR'; // FIXME: rename bin part - PARAM_ROLEDECL = 'PARAM_ROLEDECL'; + PARAM_BININDEXEXPR = 'PARAM_BININDEXEXPR'; // FIXME: rename bin part + PARAM_ROLEDECL = 'PARAM_ROLEDECL'; PARAM_GLOBALCROSSMESSAGETRANSFER = 'PARAM_GLOBALCROSSMESSAGETRANSFER'; - PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; - PARAM_GLOBALCHOICE = 'PARAM_GLOBALCHOICE'; - PARAM_GLOBALMULTICHOICES = 'PARAM_GLOBALMULTICHOICES'; + PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; + PARAM_GLOBALCHOICE = 'PARAM_GLOBALCHOICE'; + PARAM_GLOBALMULTICHOICES = 'PARAM_GLOBALMULTICHOICES'; PARAM_GLOBALMULTICHOICESTRANSFER = 'PARAM_GLOBALMULTICHOICESTRANSFER'; + //PARAM_DELEGATION = 'PARAM_DELEGATION'; + PARAM_DELEGDECL = 'PARAM_DELEGDECL'; } @@ -327,7 +332,7 @@ IDENTIFIER: fragment SYMBOL: '{' | '}' | '(' | ')' | '[' | ']' | ':' | '/' | '\\' | '.' | '\#' | - '&' | '?' | '!' | UNDERSCORE + '&' | '?' | '!' | UNDERSCORE | '-' ; // Comes after SYMBOL due to an ANTLR syntax highlighting issue involving @@ -407,9 +412,11 @@ messagesignaturename: membername; * Section 3.2.2 Top-level Module Structure */ module: - moduledecl importdecl* datatypedecl* protocoldecl* EOF + //moduledecl importdecl* datatypedecl* protocoldecl* EOF + moduledecl importdecl* datatypedecl* delegdecl* protocoldecl* EOF -> - ^(MODULE moduledecl importdecl* datatypedecl* protocoldecl*) + //^(MODULE moduledecl importdecl* datatypedecl* protocoldecl*) + ^(MODULE moduledecl importdecl* datatypedecl* delegdecl* protocoldecl*) ; @@ -469,6 +476,15 @@ payloadtypedecl: ^(PAYLOADTYPEDECL IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER simplepayloadtypename) ; + +// param-core +delegdecl: + PARAM_DELEG_KW '<' IDENTIFIER '>' EXTIDENTIFIER FROM_KW EXTIDENTIFIER AS_KW simplepayloadtypename ';' +-> + ^(PARAM_DELEGDECL IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER simplepayloadtypename) +; + + messagesignaturedecl: SIG_KW '<' IDENTIFIER '>' EXTIDENTIFIER FROM_KW EXTIDENTIFIER AS_KW simplemessagesignaturename ';' -> @@ -517,6 +533,11 @@ payloadelement: protocolname '@' rolename -> ^(DELEGATION rolename protocolname) + +/*| + protocolname '@' rolename '[' paramindexexpr ']' +-> + ^(PARAM_DELEGATION rolename protocolname) paramindexexpr)*/ ; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java index 23acfa928..438b4e8ef 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java @@ -6,12 +6,14 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.global.ParamGChoice; import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; -import org.scribble.ext.go.ast.global.ParamGMultiChoicesTransfer; import org.scribble.ext.go.ast.global.ParamGMultiChoices; +import org.scribble.ext.go.ast.global.ParamGMultiChoicesTransfer; +import org.scribble.ext.go.core.ast.ParamCoreDelegDecl; import org.scribble.ext.go.type.index.ParamIndexExpr; import org.scribble.ext.go.type.index.ParamIndexVar; @@ -32,4 +34,9 @@ ParamGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, ParamInd ParamIndexExpr start, ParamIndexExpr end, List blocks); ParamGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, ParamIndexVar var, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd); + + + // param-core + + ParamCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java index a61e33c18..0a51a886e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java @@ -6,6 +6,7 @@ import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.MessageNode; import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.RoleDeclDel; import org.scribble.ext.go.ast.global.ParamGChoice; @@ -13,6 +14,7 @@ import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; import org.scribble.ext.go.ast.global.ParamGMultiChoices; import org.scribble.ext.go.ast.global.ParamGMultiChoicesTransfer; +import org.scribble.ext.go.core.ast.ParamCoreDelegDecl; import org.scribble.ext.go.del.global.ParamGChoiceDel; import org.scribble.ext.go.del.global.ParamGMessageTransferDel; import org.scribble.ext.go.del.global.ParamGMultiChoicesDel; @@ -122,4 +124,18 @@ public NameNode SimpleNameNode(CommonTree source, K kind, St return super.SimpleNameNode(source, kind, identifier); } }*/ + + + + // param-core + + // Explicitly creating new Assrt nodes + + public ParamCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) + { + ParamCoreDelegDecl dtd = new ParamCoreDelegDecl(source, schema, extName, extSource, name); + dtd = del(dtd, createDefaultDelegate()); + return dtd; + } + } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreDelegDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreDelegDecl.java new file mode 100644 index 000000000..4bd993a80 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreDelegDecl.java @@ -0,0 +1,51 @@ +package org.scribble.ext.go.core.ast; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.Constants; +import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.qualified.MemberNameNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.type.kind.DataTypeKind; + +// HACK -- extending P@r[e] syntax is not clear yet +public class ParamCoreDelegDecl extends DataTypeDecl +{ + public ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) + { + super(source, schema, extName, extSource, name); + } + + @Override + protected ScribNodeBase copy() + { + return new ParamCoreDelegDecl(this.source, this.schema, this.extName, this.extSource, getNameNode()); + } + + @Override + public ParamCoreDelegDecl clone(AstFactory af) + { + DataTypeNode name = (DataTypeNode) this.name.clone(af); + return ((ParamAstFactory) af).ParamCoreDelegDecl(this.source, this.schema, this.extName, this.extSource, name); + } + + @Override + public ParamCoreDelegDecl reconstruct(String schema, String extName, String extSource, MemberNameNode name) + { + ScribDel del = del(); + ParamCoreDelegDecl dtd = new ParamCoreDelegDecl(this.source, schema, extName, extSource, (DataTypeNode) name); + dtd = (ParamCoreDelegDecl) dtd.del(del); + return dtd; + } + + @Override + public String toString() + { + return "deleg" + " <" + this.schema + "> " + this.extName // FIXME: factor out constant + + " " + Constants.FROM_KW + " " + this.extSource + " " + + Constants.AS_KW + " " + this.name + ";"; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java index 0ff0b8929..3175dd65b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java @@ -28,6 +28,8 @@ import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.type.kind.Global; +import org.scribble.type.name.GDelegationType; +import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; public class ParamCoreGChoice extends ParamCoreChoice implements ParamCoreGType @@ -182,6 +184,19 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro projs.put(a, e.getValue().project(af, subj)); // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) // FIXME: receive assertion projection -- should not be the same as send? + + for (PayloadElemType pet : a.pay.elems) + { + if (pet instanceof GDelegationType) + { + GDelegationType gdt = (GDelegationType) pet; // Payload types come from ParamCoreGProtocolDeclTranslator#parsePayload (toMessage) + System.out.println("aaa: " + this + ", " + gdt.getGlobalProtocol() + ", " + gdt.getRole()); + + // cf. GDelegationElem#project + + //new LProtocolName(); // FIXME: need actual role (not just role name) + } + } } // "Simple" cases diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java index 340aea1ee..c97c38cb6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGProtocolDeclTranslator.java @@ -327,7 +327,7 @@ else if (gmt instanceof ParamGDotMessageTransfer) { /*src = af.ParamRole(srcName, 1, 1); dest = af.ParamRole(destName, 1, 1);*/ - throw new ParamCoreSyntaxException(gmt.getSource(), "[param-core] Not supported: " + gmt.getClass()); + throw new ParamCoreSyntaxException(gmt.getSource(), "[param-core] Not supported: " + gmt.getClass() + "\n " + gmt); } return parseGSimpleInteractionNode(is, rvs, src, kind, a, dest); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java index 082693cd7..1329b345b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java @@ -1,7 +1,5 @@ package org.scribble.ext.go.core.codegen.statetype2; -import java.util.List; - import org.scribble.codegen.statetype.STOutputStateBuilder; import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index cd9d8900b..b290d6a16 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -153,6 +153,7 @@ else if (e instanceof ParamIndexVar) + "}\n") //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + (() ? ... FIXME: delegation: take pointer? send underlying ept? -- don't do (multi)"send"? + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL @@ -162,7 +163,7 @@ else if (e instanceof ParamIndexVar) + "log.Fatal(err)\n" + "}\n" + "j = j+1\n" - + "}\n"; + + "}\n"); /*for i, v := range pl { st1.ept.Conn[Worker][i].Send(a.mid) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index 6bffb1cc7..d207558b6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -124,7 +124,12 @@ public String getActualRoleName() protected String getExtName(DataType t) { - return datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; // FIXME: make a map + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; // FIXME: make a map + } + + protected String getExtSource(DataType t) + { + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extSource; // FIXME: make a map } private String makeImportExtName(DataType t) @@ -145,7 +150,9 @@ private String makeImportExtName(DataType t) return ""; } default: - return "import " + extName + "\n"; + { + return "import \"" + getExtSource(t) + "\"\n"; + } } } @@ -172,12 +179,13 @@ protected String getStateChanPremable(EState s) //? "import \"github.com/rhu1/scribble-go-runtime/test/util\"\n" : "") ? "import \"sort\"\n" : "") - + ((s.getStateKind() == EStateKind.OUTPUT) + + ((s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) ? s.getActions().stream().flatMap(a -> a.payload.elems.stream()).collect(Collectors.toSet()).stream() .map(p -> makeImportExtName((DataType) p)) .collect(Collectors.joining("")) : "") + + "\n" + "type " + tname + " struct{\n" + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java index e72534476..65253de3d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java @@ -7,10 +7,13 @@ import org.scribble.ext.go.parser.scribble.ast.ParamAntlrGChoice; import org.scribble.ext.go.parser.scribble.ast.ParamAntlrGMultiChoices; import org.scribble.ext.go.parser.scribble.ast.ParamAntlrRoleDecl; +import org.scribble.ext.go.parser.scribble.ast.ParamCoreAntlrModule; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGCrossMessageTransfer; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGDotMessageTransfer; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGMultiChoicesTransfer; import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.ScribbleAntlrConstants; +import org.scribble.parser.scribble.ast.AntlrDataTypeDecl; import org.scribble.util.ScribParserException; public class ParamAntlrToScribParser extends AntlrToScribParser @@ -22,7 +25,8 @@ public class ParamAntlrToScribParser extends AntlrToScribParser public static final String PARAM_GLOBALCHOICE_NODE_TYPE = "PARAM_GLOBALCHOICE"; public static final String PARAM_GLOBALMULTICHOICES_NODE_TYPE = "PARAM_GLOBALMULTICHOICES"; public static final String PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE = "PARAM_GLOBALMULTICHOICESTRANSFER"; - + public static final String PARAM_DELEGDECL_NODE_TYPE = "PARAM_DELEGDECL"; + public ParamAntlrToScribParser() { @@ -37,6 +41,9 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException String type = ct.getToken().getText(); // Duplicated from ScribParserUtil.getAntlrNodeType // FIXME: factor out with ParamAntlrPayloadElemList.parsePayloadElem switch (type) { + case ScribbleAntlrConstants.MODULE_NODE_TYPE: + return ParamCoreAntlrModule.parseModule(this, ct, af); + case PARAM_ROLEDECL_NODE_TYPE: return ParamAntlrRoleDecl.parseParamRoleDecl(this, ct, aaf); case PARAM_GLOBALCROSSMESSAGETRANSFER_NODE_TYPE: return ParamAntlrGCrossMessageTransfer.parseParamGCrossMessageTransfer(this, ct, aaf); @@ -48,6 +55,8 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException return ParamAntlrGMultiChoices.parseParamGMultiChoices(this, ct, aaf); case PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE: return ParamAntlrGMultiChoicesTransfer.parseParamGMultiChoicesTransfer(this, ct, aaf); + case PARAM_DELEGDECL_NODE_TYPE: + return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, aaf); default: return super.parse(ct, af); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrModule.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrModule.java new file mode 100644 index 000000000..ccf303b9b --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrModule.java @@ -0,0 +1,82 @@ +package org.scribble.ext.go.parser.scribble.ast; + +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.ImportDecl; +import org.scribble.ast.Module; +import org.scribble.ast.ModuleDecl; +import org.scribble.ast.NonProtocolDecl; +import org.scribble.ast.ProtocolDecl; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.AntlrToScribParserUtil; +import org.scribble.parser.scribble.ScribbleAntlrConstants; +import org.scribble.parser.scribble.ast.AntlrModule; +import org.scribble.util.ScribParserException; + +public class ParamCoreAntlrModule +{ + // Duplicated from AntlrModule + public static Module parseModule(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException + { + ModuleDecl md = (ModuleDecl) parser.parse(AntlrModule.getModuleDeclChild(ct), af); + List> ids = new LinkedList<>(); + List> ptds = new LinkedList<>(); + List> pds = new LinkedList<>(); + for (CommonTree id : getImportDeclChildren(ct)) + { + ImportDecl tmp = (ImportDecl) parser.parse(id, af); + ids.add(tmp); + } + for (CommonTree ptd : getDataTypeDeclChildren(ct)) + { + NonProtocolDecl tmp = (NonProtocolDecl) parser.parse(ptd, af); + ptds.add(tmp); + } + for (CommonTree pd : getProtocolDeclChildren(ct)) + { + ProtocolDecl tmp = (ProtocolDecl) parser.parse(pd, af); + pds.add(tmp); + } + return af.Module(ct, md, ids, ptds, pds); + } + + // FIXME: like this because AntlrNodeType is not conveniently extendable -- need to bypass AntlrToScribParserUtil#getAntlrNodeType + private static final Set IMPORTDECLS = Stream.of(ScribbleAntlrConstants.IMPORTMODULE_NODE_TYPE, + ScribbleAntlrConstants.IMPORTMEMBER_NODE_TYPE).collect(Collectors.toSet()); + private static final Set NONPROTOCOLDECLS = Stream.of(ScribbleAntlrConstants.PAYLOADTYPEDECL_NODE_TYPE, + ScribbleAntlrConstants.MESSAGESIGNATUREDECL_NODE_TYPE, "PARAM_DELEGDECL").collect(Collectors.toSet()); // FIXME: factor out constant + private static final Set PROTOCOLDECLS = Stream.of(ScribbleAntlrConstants.GLOBALPROTOCOLDECL_NODE_TYPE, + ScribbleAntlrConstants.LOCALPROTOCOLDECL_NODE_TYPE).collect(Collectors.toSet()); + + public static List getImportDeclChildren(CommonTree ct) + { + //return filterChildren(ct, AntlrNodeType.IMPORTMODULE, AntlrNodeType.IMPORTMEMBER); + List children = AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); + return children.subList(1, children.size()).stream() + .filter(c -> IMPORTDECLS.contains(c.getToken().getText())) + .collect(Collectors.toList()); + } + + public static List getDataTypeDeclChildren(CommonTree ct) + { + List children = AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); + return children.subList(1, children.size()).stream() + .filter(c -> NONPROTOCOLDECLS.contains(c.getToken().getText())) + .collect(Collectors.toList()); + } + + public static List getProtocolDeclChildren(CommonTree ct) + { + //return filterChildren(ct, AntlrNodeType.GLOBALPROTOCOLDECL, AntlrNodeType.LOCALPROTOCOLDECL); + List children = AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); + return children.subList(1, children.size()).stream() + .filter(c -> PROTOCOLDECLS.contains(c.getToken().getText())) + .collect(Collectors.toList()); + } +} diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrDataTypeDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrDataTypeDecl.java index eb9e80cdd..ee97f1456 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrDataTypeDecl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrDataTypeDecl.java @@ -33,7 +33,7 @@ public static DataTypeDecl parseDataTypeDecl(AntlrToScribParser parser, CommonTr String schema = AntlrSimpleName.getName(tmp1); CommonTree tmp2 = getExtNameChild(ct); String extName = AntlrExtIdentifier.getName(tmp2); - CommonTree tmp3 = getExtNameChild(ct); + CommonTree tmp3 = getSourceChild(ct); String source = AntlrExtIdentifier.getName(tmp3); DataTypeNode alias = AntlrSimpleName.toDataTypeNameNode(getAliasChild(ct), af); // FIXME: EMTPY_ALIAS? return af.DataTypeDecl(ct, schema, extName, source, alias); diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModule.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModule.java index 471e9b9a6..874037093 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModule.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/AntlrModule.java @@ -83,6 +83,6 @@ private static List filterChildren(CommonTree ct, AntlrNodeType... t List tmp = Arrays.asList(types); List children = AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); return children.subList(1, children.size()).stream() - .filter((c) -> tmp.contains(AntlrToScribParserUtil.getAntlrNodeType(c))).collect(Collectors.toList()); + .filter(c -> tmp.contains(AntlrToScribParserUtil.getAntlrNodeType(c))).collect(Collectors.toList()); } } From bbb13fe24f2d0e77f010a4abda6dddf5598d2f5b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Jan 2018 15:38:16 +0000 Subject: [PATCH 195/433] Continued on param-core API gen for delegation. --- .../org/scribble/parser/antlr/ParamScribble.g | 2 +- .../ParamCoreSTApiGenConstants.java | 4 +- .../ParamCoreSTBranchActionBuilder.java | 14 ++++ .../ParamCoreSTOutputStateBuilder.java | 11 ++- .../ParamCoreSTReceiveActionBuilder.java | 5 ++ .../ParamCoreSTReceiveStateBuilder.java | 15 +++- .../ParamCoreSTReduceActionBuilder.java | 76 +++++++++++++++++-- .../ParamCoreSTSendActionBuilder.java | 40 ++++++---- .../ParamCoreSTSplitActionBuilder.java | 29 ++++++- .../ParamCoreSTStateChanApiBuilder.java | 9 +++ .../scribble/ParamAntlrToScribParser.java | 5 +- .../scribble/ast/ParamCoreAntlrDelegDecl.java | 32 ++++++++ 12 files changed, 211 insertions(+), 31 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrDelegDecl.java diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index cee0eadd2..b7b209ba3 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -332,7 +332,7 @@ IDENTIFIER: fragment SYMBOL: '{' | '}' | '(' | ')' | '[' | ']' | ':' | '/' | '\\' | '.' | '\#' | - '&' | '?' | '!' | UNDERSCORE | '-' + '&' | '?' | '!' | UNDERSCORE | '-' | '*' ; // Comes after SYMBOL due to an ANTLR syntax highlighting issue involving diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java index cca749986..ffebb8835 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTApiGenConstants.java @@ -32,8 +32,8 @@ public class ParamCoreSTApiGenConstants public static final String GO_LINEARRESOURCE_TYPE = "session.LinearResource"; // net.LinearResource public static final String GO_LINEARRESOURCE_USE = "Use"; // net.LinearResource - public static final String GO_SCHAN_ENDPOINT = "ept"; // ep; - public static final String GO_SCHAN_LINEARRESOURCE = "res"; // state + public static final String GO_SCHAN_ENDPOINT = "Ept"; // ep; + public static final String GO_SCHAN_LINEARRESOURCE = "Res"; // state public static final String GO_SCHAN_END_TYPE = "End"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java index bb45dc373..91d7edb56 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java @@ -15,6 +15,7 @@ import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; public class ParamCoreSTBranchActionBuilder extends STBranchActionBuilder { @@ -87,6 +88,19 @@ else if (e instanceof ParamIndexVar) throw new RuntimeException("[param-core] TODO: " + e); } };*/ + + if(a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + + boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> + //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem + ((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet)); + if (isDeleg) + { + throw new RuntimeException("[param-core] TODO: " + a); + } String res = /*sEpRecv diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java index 1329b345b..ba2b206b8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTOutputStateBuilder.java @@ -8,6 +8,7 @@ import org.scribble.model.endpoint.actions.EDisconnect; import org.scribble.model.endpoint.actions.ERequest; import org.scribble.model.endpoint.actions.ESend; +import org.scribble.type.name.DataType; public class ParamCoreSTOutputStateBuilder extends STOutputStateBuilder { @@ -37,8 +38,14 @@ public String build(STStateChanApiBuilder api, EState s) if (a instanceof ESend) // FIXME: factor out action kind { out += this.sb.build(api, s, a); - out += "\n\n"; - out += this.nb.build(api, s, a); + + // FIXME: delegation + if (!a.payload.elems.stream() + .anyMatch(pet -> ((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet))) + { + out += "\n\n"; + out += this.nb.build(api, s, a); + } } else if (a instanceof ERequest) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index 944dab58b..36907c0f2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -39,6 +39,11 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) @Override public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, EState succ) { + if(a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + String sEpRecv = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java index c231465e3..9b6954c60 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveStateBuilder.java @@ -7,6 +7,7 @@ import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; public class ParamCoreSTReceiveStateBuilder extends STReceiveStateBuilder { @@ -35,10 +36,18 @@ public String build(STStateChanApiBuilder api, EState s) { throw new RuntimeException("Shouldn't get in here: " + as); } + EAction a = as.get(0); + out += "\n\n"; - out += this.rb.build(api, s, as.get(0)); - out += "\n\n"; - out += this.vb.build(api, s, as.get(0)); + out += this.rb.build(api, s, a); + + // FIXME: delegation + if (!a.payload.elems.stream() + .anyMatch(pet -> ((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet))) + { + out += "\n\n"; + out += this.vb.build(api, s, a); + } return out; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index cab931f34..ba6553306 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -15,6 +15,7 @@ import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; public class ParamCoreSTReduceActionBuilder extends STReceiveActionBuilder { @@ -31,19 +32,35 @@ public String getActionName(STStateChanApiBuilder api, EAction a) @Override public String buildArgs(STStateChanApiBuilder apigen, EAction a) { + DataType[] pet = new DataType[1]; return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " *" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) - + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + + i + " *" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0] = (DataType) a.payload.elems.get(i)) //a.payload.elems.get(i) + + // HACK + + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "" : + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i //+ " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) - + " []" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) + ") " - + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) + + " []" + + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + + ") " + + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + ) + ).collect(Collectors.joining(", ")); } @Override public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, EState succ) { + if(a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + String sEpRecv = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT @@ -99,12 +116,61 @@ else if (e instanceof ParamIndexVar) + "return nil\n" + "}\n"*/ + // FIXME: single arg // Currently never true because of ParamCoreSTOutputStateBuilder + boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> + //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem + ((ParamCoreSTStateChanApiBuilder) apigen).isDelegType((DataType) pet)); + /*String res = sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n"; // Discard op*/ String res = ""; - if (!a.payload.elems.isEmpty()) + if (isDeleg) + { + /*var ept *session.Endpoint + err := conn.Recv(&ept) + if err != nil { + log.Fatalf("Wrong value received..") + } + sesss[i] = &Game_a_Init{ept: ept} // Delegated session initialisation + + st.ept.ConnMu.RUnlock() + return sesss, &ClientA_p_End{}*/ + + String extName = ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + + res = + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + + + (a.mid.toString().equals("") ? "" : // HACK + "var lab string\n" + + "if err := " + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "&lab" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n") + + + "var tmp *" + + extName + "\n" + //extName.substring(0, extName.indexOf('_', extName.indexOf('_', extName.indexOf('_')+1)+1)) + "\n" // FIXME HACK + + + "if err := " + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + //+ "&data[i-1]" + + "&tmp" + + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "arg0 = &" + extName + "{" + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": tmp." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " }\n" + + "}\n"; + + } + else if (!a.payload.elems.isEmpty()) { if (a.payload.elems.size() > 1) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index b290d6a16..f3b945139 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -15,6 +15,7 @@ import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; public class ParamCoreSTSendActionBuilder extends STSendActionBuilder { @@ -37,8 +38,13 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) } @Override - public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, EState succ) { + if(a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + List as = curr.getActions(); if (as.size() > 1 && as.stream().anyMatch(b -> b.mid.toString().equals(""))) // HACK { @@ -137,6 +143,11 @@ else if (e instanceof ParamIndexVar) + ")\n"; }*/ + // FIXME: single arg // Currently never true because of ParamCoreSTOutputStateBuilder + boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> + //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem + ((ParamCoreSTStateChanApiBuilder) apigen).isDelegType((DataType) pet)); + String res = //st1.Use() "j := 0\n" @@ -153,17 +164,20 @@ else if (e instanceof ParamIndexVar) + "}\n") //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + (() ? ... FIXME: delegation: take pointer? send underlying ept? -- don't do (multi)"send"? - + "if err := " + sEpWrite - + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL - + "(" //+ sEpProto + "." + r.getName() + ", " - + "arg0[j]" //+ "splitFn0(arg0, i)" - + "); err != nil {\n" - + "log.Fatal(err)\n" - + "}\n" - + "j = j+1\n" - + "}\n"); + + ((isDeleg) //... FIXME: delegation: take pointer? send underlying ept? -- don't do (multi)"send"? + ? + "log.Fatal(\"TODO\")\n" + : + "if err := " + sEpWrite + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "arg0[j]" //+ "splitFn0(arg0, i)" // FIXME: hardcoded arg0 + + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "j = j+1\n" + + "}\n"); /*for i, v := range pl { st1.ept.Conn[Worker][i].Send(a.mid) @@ -172,6 +186,6 @@ else if (e instanceof ParamIndexVar) return res - + buildReturn(api, curr, succ); + + buildReturn(apigen, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java index c8a9efec8..56b396b12 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java @@ -15,6 +15,7 @@ import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; public class ParamCoreSTSplitActionBuilder extends STSendActionBuilder { @@ -30,18 +31,37 @@ public String getActionName(STStateChanApiBuilder api, EAction a) @Override public String buildArgs(STStateChanApiBuilder apigen, EAction a) { + DataType[] pet = new DataType[1]; return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG - + i + " " + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + i + " " + + // HACK + + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0] = ((DataType) a.payload.elems.get(i)))) ? "*" : "") + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) //a.payload.elems.get(i) + + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " - + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) - + ", i" + i + " int) " + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + // HACK + + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + + ", i" + i + " int) " + + + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + ).collect(Collectors.joining(", ")); } @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { + if(a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + List as = curr.getActions(); if (as.size() > 1 && as.stream().anyMatch(b -> b.mid.toString().equals(""))) // HACK { @@ -153,12 +173,15 @@ else if (e instanceof ParamIndexVar) + "\"" + a.mid + "\"" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n") + + + ((((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) a.payload.elems.get(0))) ? "arg0.Res.Use()\n" : "") //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + + "splitFn0(arg0, i)" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index d207558b6..5a5a467a8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -10,6 +10,7 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.ast.ParamCoreDelegDecl; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; @@ -121,6 +122,11 @@ public String getActualRoleName() { return this.apigen.self.toString(); } + + public boolean isDelegType(DataType t) + { + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof ParamCoreDelegDecl; // FIXME: make a map + } protected String getExtName(DataType t) { @@ -185,6 +191,9 @@ protected String getStateChanPremable(EState s) .collect(Collectors.joining("")) : "") + + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + ? "\nvar _ = sort.Sort\n" : "") + + "\n" + "type " + tname + " struct{\n" + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java index 65253de3d..32570500d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java @@ -7,13 +7,13 @@ import org.scribble.ext.go.parser.scribble.ast.ParamAntlrGChoice; import org.scribble.ext.go.parser.scribble.ast.ParamAntlrGMultiChoices; import org.scribble.ext.go.parser.scribble.ast.ParamAntlrRoleDecl; +import org.scribble.ext.go.parser.scribble.ast.ParamCoreAntlrDelegDecl; import org.scribble.ext.go.parser.scribble.ast.ParamCoreAntlrModule; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGCrossMessageTransfer; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGDotMessageTransfer; import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGMultiChoicesTransfer; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ScribbleAntlrConstants; -import org.scribble.parser.scribble.ast.AntlrDataTypeDecl; import org.scribble.util.ScribParserException; public class ParamAntlrToScribParser extends AntlrToScribParser @@ -55,8 +55,9 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException return ParamAntlrGMultiChoices.parseParamGMultiChoices(this, ct, aaf); case PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE: return ParamAntlrGMultiChoicesTransfer.parseParamGMultiChoicesTransfer(this, ct, aaf); + case PARAM_DELEGDECL_NODE_TYPE: - return AntlrDataTypeDecl.parseDataTypeDecl(this, ct, aaf); + return ParamCoreAntlrDelegDecl.parseDelegDecl(this, ct, aaf); default: return super.parse(ct, af); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrDelegDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrDelegDecl.java new file mode 100644 index 000000000..c8880712e --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrDelegDecl.java @@ -0,0 +1,32 @@ +package org.scribble.ext.go.parser.scribble.ast; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.core.ast.ParamCoreDelegDecl; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.ast.AntlrDataTypeDecl; +import org.scribble.parser.scribble.ast.AntlrExtIdentifier; +import org.scribble.parser.scribble.ast.name.AntlrSimpleName; + +// Duplicated from AntlrDataTypeDecl +public class ParamCoreAntlrDelegDecl +{ + public static final int SCHEMA_CHILD_INDEX = 0; + public static final int EXTNAME_CHILD_INDEX = 1; + public static final int SOURCE_CHILD_INDEX = 2; + public static final int ALIAS_CHILD_INDEX = 3; + + public static ParamCoreDelegDecl parseDelegDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) + { + CommonTree tmp1 = AntlrDataTypeDecl.getSchemaChild(ct); + String schema = AntlrSimpleName.getName(tmp1); + CommonTree tmp2 = AntlrDataTypeDecl.getExtNameChild(ct); + String extName = AntlrExtIdentifier.getName(tmp2); + CommonTree tmp3 = AntlrDataTypeDecl.getSourceChild(ct); + String source = AntlrExtIdentifier.getName(tmp3); + DataTypeNode alias = AntlrSimpleName.toDataTypeNameNode(AntlrDataTypeDecl.getAliasChild(ct), af); // FIXME: EMTPY_ALIAS? + return ((ParamAstFactory) af).ParamCoreDelegDecl(ct, schema, extName, source, alias); + } +} From e521e76ea84f3ebcf45a1487e5afabb1329cf48d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Jan 2018 16:57:36 +0000 Subject: [PATCH 196/433] Added Nick's fix to param-core API gen for [] receives. --- .../codegen/statetype2/ParamCoreSTReceiveActionBuilder.java | 3 +++ .../codegen/statetype2/ParamCoreSTReduceActionBuilder.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index 36907c0f2..827808cf9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -139,6 +139,9 @@ else if (e instanceof ParamIndexVar) + "}\n") + "var tmp " + extName + "\n" + + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK + + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index ba6553306..e6ab7b2fb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -204,6 +204,9 @@ else if (!a.payload.elems.isEmpty()) + "}\n") + "var tmp " + extName + "\n" + + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK + + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL From 1f6e76c18b95eef2bfd8594f081dc44708eafb8b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 23 Jan 2018 17:19:16 +0000 Subject: [PATCH 197/433] Minor. --- .../codegen/statetype2/ParamCoreSTReceiveActionBuilder.java | 3 +-- .../codegen/statetype2/ParamCoreSTReduceActionBuilder.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index 827808cf9..7369ff87b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -139,8 +139,7 @@ else if (e instanceof ParamIndexVar) + "}\n") + "var tmp " + extName + "\n" - - + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index e6ab7b2fb..1c5040a96 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -205,7 +205,7 @@ else if (!a.payload.elems.isEmpty()) + "var tmp " + extName + "\n" - + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" From 22100a6b1fc37639ff5179ab9709bf3d08456e40 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 18 Apr 2018 12:13:07 +0100 Subject: [PATCH 198/433] Minor. --- .../statetype2/ParamCoreSTSessionApiBuilder.java | 2 -- .../ParamCoreSTStateChanApiBuilder.java | 2 +- .../src/test/scrib/param/tmp/ParamTest.scr | 16 +++++++++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index e85fe9a24..690ba2c0c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -10,7 +10,6 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ext.go.ast.ParamRoleDecl; import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.type.index.ParamIndexVar; import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; @@ -56,7 +55,6 @@ public Map build() // FIXME: factor out + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; - sessPack += "\n" + "type " + simpname + " struct {\n" + roles.stream().map(r -> r + " " + ParamCoreSTApiGenConstants.GO_ROLE_TYPE + "\n").collect(Collectors.joining("")) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index 5a5a467a8..63ad91664 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -39,7 +39,7 @@ public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder private int counter = 1; - private final Set datats; + private final Set datats; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later // actual.getName().equals(this.role) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 506f16647..409f39807 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -5,7 +5,7 @@ // http://sandbox.kidstrythisathome.com/erdos/ -module assrt.tmp.ParamTest; +module param.tmp.ParamTest; type "int" from "..." as int; @@ -48,6 +48,19 @@ message passing // paramterisation subsumes multicast + +global protocol Proto1(role A(n)) +{ + /*a() from A[n-1..n-1] to A[n..n]; + b() from A[n-2..n-2] to A[n..n]; + do Proto1(A(n-1)); // FIXME?*/ + + a() dot A[1..1] to A[n..n]; +} + + + +/* global protocol Proto1(role A(n, m), role B(n, m)) { 1() from A[1..n] to B[1..m]; // (a) All-to-all, (unary) mult. choices @@ -57,6 +70,7 @@ global protocol Proto2(role A(n), role B(n)) { 1() dot A[1..n] to B[1..n]; // (b) ones-to-ones, (unary) multi. choices } +//*/ From cec768fc263a87dbb05a9b934d2bbbe3c4d84653 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 21 Apr 2018 10:56:32 +0100 Subject: [PATCH 199/433] Starting next param-core API gen revision. --- .../ext/go/core/cli/ParamCoreCommandLine.java | 3 +- .../ParamCoreSTApiGenConstants.java | 49 +++ .../ParamCoreSTBranchActionBuilder.java | 200 +++++++++ .../ParamCoreSTBranchStateBuilder.java | 186 ++++++++ .../ParamCoreSTEndStateBuilder.java | 41 ++ .../ParamCoreSTEndpointApiGenerator.java | 129 ++++++ .../ParamCoreSTOutputStateBuilder.java | 66 +++ .../ParamCoreSTReceiveActionBuilder.java | 201 +++++++++ .../ParamCoreSTReceiveStateBuilder.java | 55 +++ .../ParamCoreSTReduceActionBuilder.java | 243 +++++++++++ .../ParamCoreSTSendActionBuilder.java | 191 +++++++++ .../ParamCoreSTSessionApiBuilder.java | 265 ++++++++++++ .../ParamCoreSTSplitActionBuilder.java | 199 +++++++++ .../ParamCoreSTStateChanApiBuilder.java | 404 ++++++++++++++++++ 14 files changed, 2231 insertions(+), 1 deletion(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTApiGenConstants.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReduceActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSplitActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java index 2575c6ba1..73b0b3ac2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java @@ -23,7 +23,8 @@ import org.scribble.ext.go.core.ast.global.ParamCoreGType; import org.scribble.ext.go.core.ast.local.ParamCoreLType; //import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; -import org.scribble.ext.go.core.codegen.statetype2.ParamCoreSTEndpointApiGenerator; +//import org.scribble.ext.go.core.codegen.statetype2.ParamCoreSTEndpointApiGenerator; +import org.scribble.ext.go.core.codegen.statetype3.ParamCoreSTEndpointApiGenerator; import org.scribble.ext.go.core.main.ParamCoreException; import org.scribble.ext.go.core.main.ParamCoreMainContext; import org.scribble.ext.go.core.model.endpoint.ParamCoreEGraphBuilder; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTApiGenConstants.java new file mode 100644 index 000000000..86ee292e6 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTApiGenConstants.java @@ -0,0 +1,49 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +public class ParamCoreSTApiGenConstants +{ + //public static final String GO_SCRIBBLERUNTIME_PACKAGE = "org/scribble/runtime/net"; + public static final String GO_SCRIBBLERUNTIME_SESSION_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/session"; + public static final String GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE = "github.com/scribble/go-runtime/session/param"; + public static final String GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/transport"; + public static final String GO_SCRIBBLERUNTIME_SHM_PACKAGE = "github.com/scribble/go-runtime/transport/shm"; + public static final String GO_SCRIBBLERUNTIME_BYTES_PACKAGE = "bytes"; + public static final String GO_SCRIBBLERUNTIME_GOB_PACKAGE = "encoding/gob"; + + public static final String GO_ENDPOINT_TYPE = "session.Endpoint"; // net.MPSTEndpoint; + public static final String GO_ENDPOINT_CONSTRUCTOR = "session.NewEndpoint"; + public static final String GO_ENDPOINT_PROTO = "Proto"; + public static final String GO_ENDPOINT_ERR = "Err"; + public static final String GO_ENDPOINT_WRITEALL = "Send"; + public static final String GO_ENDPOINT_READALL = "Recv"; + public static final String GO_ENDPOINT_STARTPROTOCOL = "StartProtocol"; + public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; + public static final String GO_ENDPOINT_FINALISE = "Finalise"; + //public static final String GO_ENDPOINT_ENDPOINT = "Endpoint"; + public static final String GO_ENDPOINT_ENDPOINT = "ept"; + + public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; + + public static final String GO_ROLE_TYPE = "session.Role"; + public static final String GO_ROLE_CONSTRUCTOR = "session.NewRole"; + + public static final String GO_PARAMROLE_TYPE = "session.ParamRole"; + + public static final String GO_LINEARRESOURCE_TYPE = "session.LinearResource"; // net.LinearResource + public static final String GO_LINEARRESOURCE_USE = "Use"; // net.LinearResource + + public static final String GO_SCHAN_ENDPOINT = "Ept"; // ep; + public static final String GO_SCHAN_LINEARRESOURCE = "Res"; // state + + public static final String GO_SCHAN_END_TYPE = "End"; + + public static final String GO_IO_FUN_RECEIVER = "s"; + + public static final String GO_CROSS_SPLIT_FUN_PREFIX = "Split"; + public static final String GO_CROSS_SEND_FUN_PREFIX = "Send"; + public static final String GO_CROSS_SEND_FUN_ARG = "arg"; + public static final String GO_CROSS_REDUCE_FUN_PREFIX = "Reduce"; + public static final String GO_CROSS_RECEIVE_FUN_PREFIX = "Recv"; + public static final String GO_CROSS_RECEIVE_FUN_ARG = "arg"; + +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java new file mode 100644 index 000000000..eb7dd003b --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java @@ -0,0 +1,200 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STBranchActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; + +public class ParamCoreSTBranchActionBuilder extends STBranchActionBuilder +{ + /*@Override + public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out + { + EState succ = curr.getSuccessor(a); + return + "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + + buildArgs(a) + + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: Return type is interface, so no need for *return (unlike other state chans) + + "s.state.Use()\n" + + buildBody(api, curr, a, succ) + "\n" + + "}"; + }*/ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(STStateChanApiBuilder apigen, EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + + i + " *" + a.payload.elems.get(i) + //+ ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" // No: singleton choice subj (not multichoices) + ).collect(Collectors.joining(", ")); + } + + /*@Override + public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) + { + return api.cb.getCaseStateChanName(api, curr); + }*/ + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + /*String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + /*ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + };*/ + + if(a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + + boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> + //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem + ((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet)); + if (isDeleg) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + + String res = + /*sEpRecv + + "(" + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "\"" + a.mid + "\")\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n" + /*+ "if " + sEpErr + " != nil {\n" + + "return nil\n" + + "}\n"*/ + //buildReturn(api, curr, succ); + //"ch, selected := <-s._" + a.mid + "_Chan\n" + "_, selected := <-s._" + a.mid + "_Chan\n" + + "if !selected {\n" + + "\treturn nil // select ignores nilchan\n" + + "}\n"; + + ParamRole peer = (ParamRole) curr.getActions().iterator().next().peer; + ParamRange g = peer.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + + ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; + String sEp = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + + res += + //+ "data := make([]int, " + foo.apply(g.end) + ")\n" + //+ "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + ""; + + res += + ((((GoJob) api.job).noCopy) + ? + "decoded = *bs[0].(*" + a.payload.elems.get(0) + ")\n" + : + "" + //+ "data[0] = decoded\n" + //+ "}\n" + ); + + //+ "*arg0 = reduceFn0(data)\n" // FIXME: arg0 + // + "*arg0 = data[0]\n" + + //+ "*arg0 = (<-s.data).(" + ((DataType) a.payload.elems.get(0)).getSimpleName() + ")\n"; + + res += + "if err := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "].Recv(&arg0); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "\n" + + "\tch := make(chan *" + apigen.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" + + "\tch <- " + apigen.getSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; + + // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + + } + + return res + + "return ch"; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java new file mode 100644 index 000000000..f157e1166 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java @@ -0,0 +1,186 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.scribble.codegen.statetype.STBranchStateBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.endpoint.actions.EReceive; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +public class ParamCoreSTBranchStateBuilder extends STBranchStateBuilder +{ + public ParamCoreSTBranchStateBuilder(ParamCoreSTBranchActionBuilder bb) + { + super(bb); + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + + //return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); + ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; + Role r = apigen.actual.getName(); + GProtocolName simpname = apigen.apigen.proto.getSimpleName(); + String tname = apigen.getStateChanName(s); + //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); + String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, apigen.actual); + String res = + apigen.apigen.generateRootPackageDecl() + "\n" + + "\n" + + apigen.apigen.generateScribbleRuntimeImports() + "\n" + + "import \"log\"\n" + + //+ (((GoJob) api.job).noCopy ? "" : Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + + + "\n" + + "type " + tname + " struct{\n" + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan string\n") // chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") + .collect(Collectors.joining("")) + /*+ (((GoJob) apigen.job).noCopy ? "data chan []interface{}" : + //"data chan [][]byte\n" + "data chan interface{}\n" + )*/ + + "}\n"; + + res += "\n" + + "func (ep *" + epType + ") New" + + ((s.id != api.graph.init.id) ? tname + : ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(((ParamCoreSTStateChanApiBuilder) api).actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + + "() *" + tname + " {\n" // FIXME: factor out + + "s := &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan "//chan *" + apigen.getStateChanName(s.getSuccessor(a)) + + "string" + + ", 1)") + .collect(Collectors.joining(", ")) + ", " + + /*+ "data: make(chan " + (((GoJob) api.job).noCopy ? "[]interface{}" : + //"[][]byte" + " interface{}" + ) + ", 1)"*/ + + + "}\n" + + "go s.foo()\n" + + "return s\n" + + "}\n"; + + res += "\n" + + "func (s *" + tname + ") foo() {\n" + + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + "var op string\n"; + + ParamRole peer = (ParamRole) s.getActions().iterator().next().peer; + ParamRange g = peer.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + + if (((GoJob) apigen.job).noCopy) + { + res += + "label := " + sEpRecv + "Raw(" + sEpProto + "." + peer.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + + "op := *label[0].(*string)\n"; // FIXME: cast for safety? + } + else + { + res += + "if err := " + sEpRecv + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + + foo.apply(g.start) + "].Recv(&op); err != nil {\n" // g.end = g.start + + "log.Fatal(err)\n" + + "}\n"; + } + + /*List as = s.getActions(); + boolean allEmpty = as.stream().allMatch(a -> a.payload.elems.isEmpty()); + if (!allEmpty) // FIXME: + { + res += + "var b string\n" // HACK? + //"var b int\n" + + "if err := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&b); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "s.data <- b\n"; + // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + }*/ + + res+= "if " + + s.getActions().stream().map(a -> + { + //String sEp = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + return + "op == \"" + a.mid + "\" {\n" + /*+ "\tch := make(chan *" + apigen.getStateChanName(s.getSuccessor(a)) + ", 1)\n" + + "\tch <- " + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" + + "\ts._" + a.mid + "_Chan <- ch\n"*/ + + "\ts._" + a.mid + "_Chan <- \"" + a.mid +"\"\n" + + "\t" + s.getActions().stream() + .filter(otheract -> otheract.mid != a.mid) + .map(otheract -> { return "close(s._" + otheract.mid + "_Chan)"; }) + .collect(Collectors.joining("\n\t")) + "\n" + + "}"; + }).collect(Collectors.joining(" else if ")) + "\n" + + "}\n"; + + return res; + } + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + String out = getPreamble(api, s); + + for (EAction a : s.getActions()) + { + out += "\n\n"; + if (a instanceof EReceive) // FIXME: factor out action kind + { + out += this.bb.build(api, s, a); // Getting 1 checks non-unary + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + + return out; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java new file mode 100644 index 000000000..aa692507f --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java @@ -0,0 +1,41 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import org.scribble.codegen.java.endpointapi.ApiGen; +import org.scribble.codegen.statetype.STEndStateBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; + +public class ParamCoreSTEndStateBuilder extends STEndStateBuilder +{ + public ParamCoreSTEndStateBuilder() + { + + } + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + return getPreamble(api, s); + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + ParamCoreSTStateChanApiBuilder schangen = (ParamCoreSTStateChanApiBuilder) api; + //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); + String tname = api.getStateChanName(s); + String res = + schangen.apigen.generateRootPackageDecl() + "\n" + + "\n" + ////+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + ////+ schangen.apigen.generateScribbleRuntimeImports() + "\n" + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + + "\n" + + "type " + tname + " struct{\n" + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" // FIXME: factor out + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(api.gpn.getSimpleName(), api.role) + "\n" // FIXME: factor out + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out + + "}"; + return res; // No LinearResource + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java new file mode 100644 index 000000000..3e122adda --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java @@ -0,0 +1,129 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.main.Job; +import org.scribble.main.ScribbleException; +import org.scribble.model.endpoint.EGraph; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +// Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTEndpointApiGenerator +public class ParamCoreSTEndpointApiGenerator +{ + public final Job job; + public final GProtocolName proto; + public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral + //public final Map actuals; + public final Map> actuals; + //public final EGraph graph; + + //public final Map> all; + + public ParamCoreSTEndpointApiGenerator(Job job, GProtocolName fullname, Role self, //Map actuals) + Map> actuals) + { + this.job = job; + this.proto = fullname; + this.self = self; + this.actuals = Collections.unmodifiableMap(actuals); + //this.graph = graph; + //this.all = Collections.unmodifiableMap(all); + } + + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later + public Map build() throws ScribbleException + { + Map res = new HashMap<>(); // filepath -> source + res.putAll(buildSessionApi()); + for (Entry actual : this.actuals.get(this.self).entrySet()) + { + res.putAll(buildStateChannelApi(actual.getKey(), actual.getValue())); + } + return res; + } + + //@Override + public Map buildSessionApi() // FIXME: factor out + { + this.job.debugPrintln("\n[param-core] Running " + ParamCoreSTSessionApiBuilder.class + " for " + this.proto + "@" + this.self); + //throw new RuntimeException("[param-core] TODO:"); + return new ParamCoreSTSessionApiBuilder(this).build(); + } + + public Map buildStateChannelApi(ParamActualRole actual, EGraph graph) // FIXME: factor out + { + this.job.debugPrintln("\n[param-core] Running " + ParamCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + this.self); + return new ParamCoreSTStateChanApiBuilder(this, actual, graph).build(); + } + + /*public String getGeneratedEndpointType() + { + /*return "Endpoint_" + this.proto.getSimpleName() + "_" + //+ getGeneratedActualRoleName(); // No: endpoint covers all actual roles of this role name + + this.self;* / + return getGeneratedEndpointType(this.proto.getSimpleName(), this.self); + }*/ + + //public static String getGeneratedEndpointType(GProtocolName simpname, Role r) + public static String getGeneratedEndpointType(GProtocolName simpname, ParamActualRole r) + { + //return "Endpoint_" + simpname + "_" + r; + return simpname + "_" + getGeneratedActualRoleName(r); + } + + // Doesn't use coranges -- same as getGeneratedParamRoleName? // Old + public static String getGeneratedActualRoleName(ParamActualRole actual) + { + /*return actual.getName() + + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ + /*if (actual.ranges.size() > 1 || actual.coranges.size() > 0) + { + throw new RuntimeException("[param-core] TODO: " + actual); + } + ParamRange g = actual.ranges.iterator().next(); + return actual.getName() + "_" + g.start + "To" + g.end;*/ + return actual.getName() + "_" + + actual.ranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")) + + (actual.coranges.isEmpty() ? "" : "_not_") + + actual.coranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")); + } + + //@Override + public String getRootPackage() // Derives only from proto name + { + //throw new RuntimeException("[param-core] TODO:"); + return this.proto.getSimpleName().toString(); + } + + public String generateRootPackageDecl() + { + //throw new RuntimeException("[param-core] TODO: "); + return "package " + getRootPackage(); + } + + //@Override + public List getScribbleRuntimeImports() // FIXME: factor up + { + return Stream.of( + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + ////ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE + //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + + //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, + //ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE + ).collect(Collectors.toList()); + } + + public String generateScribbleRuntimeImports() + { + return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java new file mode 100644 index 000000000..1aee81e18 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java @@ -0,0 +1,66 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import org.scribble.codegen.statetype.STOutputStateBuilder; +import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.endpoint.actions.EDisconnect; +import org.scribble.model.endpoint.actions.ERequest; +import org.scribble.model.endpoint.actions.ESend; +import org.scribble.type.name.DataType; + +public class ParamCoreSTOutputStateBuilder extends STOutputStateBuilder +{ + public final ParamCoreSTSendActionBuilder nb; + + // sb is ParamCoreSTSplitActionBuilder + public ParamCoreSTOutputStateBuilder(STSendActionBuilder sb, ParamCoreSTSendActionBuilder nb) + { + super(sb); + this.nb = nb; + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); + } + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + String out = getPreamble(api, s); + + for (EAction a : s.getActions()) + { + out += "\n\n"; + if (a instanceof ESend) // FIXME: factor out action kind + { + out += this.sb.build(api, s, a); + + // FIXME: delegation + if (!a.payload.elems.stream() + .anyMatch(pet -> ((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet))) + { + out += "\n\n"; + out += this.nb.build(api, s, a); + } + } + else if (a instanceof ERequest) + { + throw new RuntimeException("TODO: " + a); + } + else if (a instanceof EDisconnect) + { + throw new RuntimeException("TODO: " + a); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + + return out; + } +} \ No newline at end of file diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java new file mode 100644 index 000000000..c75dc1902 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java @@ -0,0 +1,201 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STReceiveActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class ParamCoreSTReceiveActionBuilder extends STReceiveActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(STStateChanApiBuilder apigen, EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + + i + " *[]" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + ).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, EState succ) + { + if(a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + /*sEpRecv + + "(" + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "\"" + a.mid + "\")\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + "\tvar decoded "+a.payload.elems.get(0)+"\n" + + "\tif err := gob.NewDecoder(bytes.NewReader(b[i-"+foo.apply(g.start)+"])).Decode(&decoded); err != nil {\n\t\t" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Self.Name())\n" + + "\t}\n" + + "\tdata[i-"+foo.apply(g.start)+"] = decoded\n" + + "}\n" + + "*arg0 = reduceFn(data)" + /*+ "if " + sEpErr + " != nil {\n" + + "return nil\n" + + "}\n"*/ + + /*String res = + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n"; // Discard op*/ + String res = ""; + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + + String extName = ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + + res += + (((GoJob) apigen.job).noCopy + ? + "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + + "for i := 0; i < len(b); i++ {\n" + + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n" + : + //"data := make([]" + "data := make(map[int]" + + extName//a.payload.elems.get(0) + + ", " + foo.apply(g.end) + ")\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + + + (a.mid.toString().equals("") ? "" : // HACK + "var lab string\n" + + "if err := " + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "&lab" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n") + + + "var tmp " + extName + "\n" + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + + + "if err := " + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + //+ "&data[i-1]" + + "&tmp" + + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "data[i-1] = tmp\n" + + "}\n" + //+ "*arg0 = data\n"); // FIXME: arg0 + + //+ "*arg0 = " + hackGetValues(extName) + "(data)\n"; // FIXME: arg0 + + //+ ((!Stream.of("int", "string", "[]byte").collect(Collectors.toSet()).contains(extName) + // ? + + "f := func(m map[int] " + extName + ") []" + extName + " {\n" + + "xs := make([]" + extName + ", len(m))\n" + + "keys := make([]int, 0)\n" + + "for k, _ := range m {\n" + + "keys = append(keys, k)\n" + + "}\n" + + "sort.Ints(keys)\n" + + "for i, k := range keys {\n" + + "xs[i] = m[k]\n" + + "}\n" + + "return xs\n" + + "}\n" + + "*arg0 = f(data)\n"); + // : "") + } + + return res + + buildReturn(apigen, curr, succ); + } + + protected static String hackGetValues(String t) + { + if (t.equals("int")) + { + return "util.GetValuesInt"; + } + else if (t.equals("string")) + { + return "util.GetValuesString"; + } + else if (t.equals("[]byte")) + { + return "util.GetValuesBates"; + } + else + { + throw new RuntimeException("[TODO] " + t); + //return t; + } + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java new file mode 100644 index 000000000..ccf1510d3 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java @@ -0,0 +1,55 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.List; + +import org.scribble.codegen.statetype.STReceiveActionBuilder; +import org.scribble.codegen.statetype.STReceiveStateBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; + +public class ParamCoreSTReceiveStateBuilder extends STReceiveStateBuilder +{ + public final ParamCoreSTReceiveActionBuilder vb; + + // sb is ParamCoreSTReduceActionBuilder + public ParamCoreSTReceiveStateBuilder(STReceiveActionBuilder sb, ParamCoreSTReceiveActionBuilder vb) + { + super(sb); + this.vb = vb; + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); + } + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + String out = getPreamble(api, s); + + List as = s.getActions(); + if (as.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + as); + } + EAction a = as.get(0); + + out += "\n\n"; + out += this.rb.build(api, s, a); + + // FIXME: delegation + if (!a.payload.elems.stream() + .anyMatch(pet -> ((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet))) + { + out += "\n\n"; + out += this.vb.build(api, s, a); + } + + return out; + } +} + diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReduceActionBuilder.java new file mode 100644 index 000000000..d24c0feff --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReduceActionBuilder.java @@ -0,0 +1,243 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STReceiveActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; + +public class ParamCoreSTReduceActionBuilder extends STReceiveActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + //return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + return ParamCoreSTApiGenConstants.GO_CROSS_REDUCE_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(STStateChanApiBuilder apigen, EAction a) + { + DataType[] pet = new DataType[1]; + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + + i + " *" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0] = (DataType) a.payload.elems.get(i)) //a.payload.elems.get(i) + + // HACK + + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "" : + ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + //+ " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) + + " []" + + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + + ") " + + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + ) + + ).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, EState succ) + { + if(a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + + String sEpRecv = + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + /*sEpRecv + + "(" + sEpProto + + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "\"" + a.mid + "\")\n" + + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "arg" + i + ")") + .collect(Collectors.joining("\n")) + "\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + "\tvar decoded "+a.payload.elems.get(0)+"\n" + + "\tif err := gob.NewDecoder(bytes.NewReader(b[i-"+foo.apply(g.start)+"])).Decode(&decoded); err != nil {\n\t\t" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Self.Name())\n" + + "\t}\n" + + "\tdata[i-"+foo.apply(g.start)+"] = decoded\n" + + "}\n" + + "*arg0 = reduceFn(data)" + /*+ "if " + sEpErr + " != nil {\n" + + "return nil\n" + + "}\n"*/ + + // FIXME: single arg // Currently never true because of ParamCoreSTOutputStateBuilder + boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> + //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem + ((ParamCoreSTStateChanApiBuilder) apigen).isDelegType((DataType) pet)); + + /*String res = + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n"; // Discard op*/ + String res = ""; + + if (isDeleg) + { + /*var ept *session.Endpoint + err := conn.Recv(&ept) + if err != nil { + log.Fatalf("Wrong value received..") + } + sesss[i] = &Game_a_Init{ept: ept} // Delegated session initialisation + + st.ept.ConnMu.RUnlock() + return sesss, &ClientA_p_End{}*/ + + String extName = ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + + res = + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + + + (a.mid.toString().equals("") ? "" : // HACK + "var lab string\n" + + "if err := " + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "&lab" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n") + + + "var tmp *" + + extName + "\n" + //extName.substring(0, extName.indexOf('_', extName.indexOf('_', extName.indexOf('_')+1)+1)) + "\n" // FIXME HACK + + + "if err := " + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + //+ "&data[i-1]" + + "&tmp" + + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "arg0 = &" + extName + "{" + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": tmp." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " }\n" + + "}\n"; + + } + else if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + + String extName = ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + + res += + (((GoJob) apigen.job).noCopy + ? + "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + + "for i := 0; i < len(b); i++ {\n" + + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n" + : + /*"data := make([]" + ParamCoreSTStateChanApiBuilder.batesHack(a.payload.elems.get(0)) //a.payload.elems.get(0) + + ", " + foo.apply(g.end) + ")\n"*/ + "data := make(map[int]" + extName + ")\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + + + (a.mid.toString().equals("") ? "" : // HACK + "var lab string\n" + + "if err := " + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "&lab" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n") + + + "var tmp " + extName + "\n" + + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + + + "if err := " + sEpRecv + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" //+ sEpProto + "." + r.getName() + ", " + //+ "&data[i-1]" + + "&tmp" + + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "data[i] = tmp\n" + + "}\n" + //+ "*arg0 = reduceFn0(" + // + ParamCoreSTReceiveActionBuilder.hackGetValues(((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0))) + "(data))\n"); // FIXME: arg0 + + + "f := func(m map[int] " + extName + ") []" + extName + " {\n" + + + "xs := make([]" + extName + ", len(m))\n" + + "keys := make([]int, 0)\n" + + "for k, _ := range m {\n" + + "keys = append(keys, k)\n" + + "}\n" + + "sort.Ints(keys)\n" // Needed? + + "for i, k := range keys {\n" + + "xs[i] = m[k]\n" + + "}\n" + + "return xs\n" + + "}\n" + + "*arg0 = reduceFn0(f(data))\n"); + } + + return res + + buildReturn(apigen, curr, succ); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java new file mode 100644 index 000000000..b95c3e557 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java @@ -0,0 +1,191 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; + +public class ParamCoreSTSendActionBuilder extends STSendActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(STStateChanApiBuilder apigen, EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + + i + " []" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + ).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, EState succ) + { + if(a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + + List as = curr.getActions(); + if (as.size() > 1 && as.stream().anyMatch(b -> b.mid.toString().equals(""))) // HACK + { + throw new //ParamCoreException + RuntimeException("[param-core] Empty labels not allowed in non-unary choices: " + curr.getActions()); + } + + String sEpWrite = + //s.ep.Write + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; + + ".Conn"; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + + /*String res = + (((GoJob) api.job).noCopy + ? + "labels := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "tmp := \"" + a.mid + "\"\n" + + "\tlabels[i-" + foo.apply(g.start) + "] = &tmp\n" + + "}\n" + : + "labels := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "\tlabels[i-" + foo.apply(g.start) + "] = []byte(\"" + a.mid + "\")\n" + + "}\n") + + + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "labels)\n"; + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + res += + (((GoJob) api.job).noCopy + ? + "b := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end)+"; i++ {\n" + + "tmp := splitFn0(arg0, i)\n" + + "\tb[i-"+foo.apply(g.start)+"] = &tmp\n" + + "}\n" + : + "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + "\tvar buf bytes.Buffer\n" + + "\tif err := gob.NewEncoder(&buf).Encode(splitFn0(arg0, i)); err != nil {\n\t\t" // only arg0 + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Errors <- session.SerialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Self.Name())\n" + + "\t}\n" + + "\tb[i-"+foo.apply(g.start)+"] = buf.Bytes()\n" + + "}\n") + + + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + + "." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + //+ "\"" + a.mid + "\"" + + "b" + + ")\n"; + }*/ + + // FIXME: single arg // Currently never true because of ParamCoreSTOutputStateBuilder + boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> + //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem + ((ParamCoreSTStateChanApiBuilder) apigen).isDelegType((DataType) pet)); + + String res = + //st1.Use() + "j := 0\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + (a.mid.toString().equals("") ? "" : // HACK + "if err := " + sEpWrite + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "\"" + a.mid + "\"" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n") + + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + ((isDeleg) //... FIXME: delegation: take pointer? send underlying ept? -- don't do (multi)"send"? + ? + "log.Fatal(\"TODO\")\n" + : + "if err := " + sEpWrite + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "arg0[j]" //+ "splitFn0(arg0, i)" // FIXME: hardcoded arg0 + + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "j = j+1\n" + + "}\n"); + + /*for i, v := range pl { + st1.ept.Conn[Worker][i].Send(a.mid) + st1.ept.Conn[Worker][i].Send(v) + }*/ + + return + res + + buildReturn(apigen, curr, succ); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java new file mode 100644 index 000000000..bf490546a --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java @@ -0,0 +1,265 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.ast.Module; +import org.scribble.ast.ProtocolDecl; +import org.scribble.ext.go.ast.ParamRoleDecl; +import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EStateKind; +import org.scribble.type.kind.Global; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +// Cf. STStateChanApiBuilder +public class ParamCoreSTSessionApiBuilder // FIXME: make base STSessionApiBuilder +{ + private ParamCoreSTEndpointApiGenerator apigen; + + //private final Map> actuals; + + public ParamCoreSTSessionApiBuilder(ParamCoreSTEndpointApiGenerator apigen)//, Map> actuals) + { + this.apigen = apigen; + //this.actuals = Collections.unmodifiableMap(actuals); + } + + //@Override + public Map build() // FIXME: factor out + { + Module mod = this.apigen.job.getContext().getModule(this.apigen.proto.getPrefix()); + GProtocolName simpname = this.apigen.proto.getSimpleName(); + ProtocolDecl gpd = mod.getProtocolDecl(simpname); + List roles = gpd.header.roledecls.getRoles(); + + /*Set instates = new HashSet<>(); + Predicate f = s -> s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT; + if (f.test(this.apigen.graph.init)) + { + instates.add(this.apigen.graph.init); + } + instates.addAll(MState.getReachableStates(this.apigen.graph.init).stream().filter(f).collect(Collectors.toSet()));*/ + + // roles + String sessPack = + //"package " + this.apigen.getRootPackage() + "\n" // FIXME: factor out + this.apigen.generateRootPackageDecl() + "\n" + + "\n" + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + + this.apigen.generateScribbleRuntimeImports() + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; + + sessPack += "\n" + + "type " + simpname + " struct {\n" + + roles.stream().map(r -> r + " " + ParamCoreSTApiGenConstants.GO_ROLE_TYPE + "\n").collect(Collectors.joining("")) + // Just need role name constants for now -- params not fixed until endpoint creation + + "}\n" + + "\n" + + "func New" + simpname + "() *" + simpname + " {\n" + + "return &" + simpname + "{ " + roles.stream().map(r -> ParamCoreSTApiGenConstants.GO_ROLE_CONSTRUCTOR + + "(\"" + r + "\")").collect(Collectors.joining(", ")) + " }\n" + // Singleton types? + + "}\n"; + + + /*sessPack += + roles.stream().map(r -> + "type _" + r + " struct { }\n" + + "\n" + + "func (*_" + r +") GetRoleName() string {\n" + + "return \"" + r + "\"\n" + + "}\n" + + "\n" + + "var __" + r + " *_" + r + "\n" + + "\n" + + "func new" + r + "() *_" + r + " {\n" // FIXME: not concurrent + + "if __" + r + " == nil {\n" + + "__"+ r + " = &_" + r + "{}\n" + + "}\n" + + "return __" + r + "\n" + + "}" + ).collect(Collectors.joining("\n\n")) + "\n" + + "\n";*/ + + // Protocol and role specific endpoints + //Function epTypeName = r -> "_Endpoint" + simpname + "_" + r; + sessPack += + roles.stream().map(rfoo -> + { + Set actuals = this.apigen.actuals.get(rfoo).keySet(); + return + actuals.stream().map(actual -> + { + String epTypeName = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, actual); + List decls = + gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(actual.getName())) + .map(rd -> (ParamRoleDecl) rd).collect(Collectors.toList()); + if (decls.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + actual); + } + List vars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); + //.flatMap(rd -> ((ParamRoleDecl) rd).params.stream()).collect(Collectors.toList()); + + /*if (actual.ranges.size() > 1) + { + throw new RuntimeException("TODO: " + actual); + }*/ + //ParamRange g = actual.ranges.iterator().next(); + + return + + "\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, actual) + ") Ept() *session.Endpoint {\n" + + "return p.ept\n" + + "}\n" + + + "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out + + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " *" + simpname + "\n" + /*+ this.apigen.actuals.get(r).keySet().stream() + .map(a -> + { + String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); + return actualName + "s map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; + }).collect(Collectors.joining(""))*/ + + "*session.LinearResource\n" + + "ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + "Params map[string]int\n" + + "}\n" + + "\n" + + + /*+ "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, addr, port string) error {\n" + + "ini.ept.Conn[rolename.Name()][id-1] = tcp.NewConnection(addr, port).Accept().(*tcp.Conn)\n" + + "return nil\n" + + "}\n" + + "\n" + + "func (ini *" + epTypeName + ") Connect(rolename session.Role, id int, addr, port string) error {\n" + + "ini.ept.Conn[rolename.Name()][id-1] = tcp.NewConnection(addr, port).Connect()\n" + + "return nil\n" + + "}\n" + + "\n"*/ + + "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, acceptor transport.Transport) error {\n" + + "ini.ept.Conn[rolename.Name()][id] = acceptor.Accept()\n" + + "return nil\n" // FIXME: runtime currently does log.Fatal on error + + "}\n" + + "\n" + + "func (ini *" + epTypeName + ") Request(rolename session.Role, id int, requestor transport.Transport) error {\n" + + "ini.ept.Conn[rolename.Name()][id] = requestor.Connect()\n" + + "return nil\n" // FIXME: runtime currently does log.Fatal on error + + "}\n" + + "\n" + + + + + "func (p *" + simpname + ") New" + epTypeName + + "(" + + vars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + + "self int" + + ")" + + "(*" + epTypeName + ") {\n" + + /*+ "ep := &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p,\n" + + + this.apigen.actuals.get(r).keySet().stream() + .map(a -> + { + String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); + return actualName + "s: make(map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName + + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ")"; + }).collect(Collectors.joining(", ")) + ",\n" + + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ": " + + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" + + + this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(r)) + .map(e -> + { + Map tmp = e.getValue(); + if (tmp.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + tmp); + } + ParamActualRole peer = tmp.keySet().iterator().next(); + ParamRange g = peer.ranges.iterator().next(); + Function foo = ee -> + { + if (ee instanceof ParamIndexInt) + { + return ee.toString(); + } + else if (ee instanceof ParamIndexVar) + { + return "ep.Params[\"" + ee + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + ee); + } + }; + return + "ep.Params = map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining(", ")) + "}\n" + + "ep.Peers[p." + peer.getName() + "] = struct{Start int; End int}{" + foo.apply(g.start) + ", " + foo.apply(g.end) + "}\n" + + "for i := ep." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Peers[p." + peer.getName() + "].Start; i <= ep.Peers[p." + peer.getName() + "].End; i++ {\n" + + "\tp." + peer.getName() + ".(session.ParamRole).Register(i)\n" + + "}\n"; + }).collect(Collectors.joining("")) + + + "return ep\n"*/ + //+ "conns := make(map[string][]transport.Channel)\n" + + "conns := make(map[string]map[int]transport.Channel)\n" + + + //+ this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(actual.getName())) + + this.apigen.actuals.entrySet().stream() + .map(e -> "conns[p." + e.getKey() + ".Name()] = " + /*+ "make([]transport.Channel, " + + e.getValue().keySet().iterator().next().ranges.iterator().next().end + "-" // FIXME: e.getValues().size() > 1 + + e.getValue().keySet().iterator().next().ranges.iterator().next().start + "+1)\n")*/ + + "make(map[int]transport.Channel)\n") + .collect(Collectors.joining("")) + + + + "params := make(map[string]int)\n" + + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) + + "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, " //-1, + + "conns), params}\n" // FIXME: numRoles + + "}\n" + + /*+ this.apigen.actuals.get(r).keySet().stream() + .map(a -> + { + String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); + return + "\nfunc (ep *" + epTypeName + ") " + + "Register_" + actualName + + "(i int, impl func(*" + simpname + "_" + actualName + "_1) *" // FIXME: factor out with above + + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ") {\n" + + "ep." + actualName + "s[i] = impl\n" + + "ep.Proto."+ r +".(session.ParamRole).Register(i)\n" + + "}\n"; + }).collect(Collectors.joining(""));*/ + + + + "\nfunc (ini *" + epTypeName + ") Init() (*" + epTypeName + "_1) {\n" + + "ini.Use()\n" + + "ini.ept.CheckConnection()\n" + + + ((this.apigen.actuals.get(rfoo).get(actual).init.getStateKind() == EStateKind.POLY_INPUT) + ? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" + : "return &" + epTypeName + "_1{&session.LinearResource{}, ini}\n") + + "}"; + }).collect(Collectors.joining("")); + }).collect(Collectors.joining("\n")); + + String dir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; + Map res = new HashMap<>(); + res.put(dir + simpname + ".go", sessPack); + return res; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSplitActionBuilder.java new file mode 100644 index 000000000..4c8d33525 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSplitActionBuilder.java @@ -0,0 +1,199 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STSendActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.ParamIndexInt; +import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; + +public class ParamCoreSTSplitActionBuilder extends STSendActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return ParamCoreSTApiGenConstants.GO_CROSS_SPLIT_FUN_PREFIX + "_" + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + "_" + a.mid; + } + + @Override + public String buildArgs(STStateChanApiBuilder apigen, EAction a) + { + DataType[] pet = new DataType[1]; + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + + i + " " + + // HACK + + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0] = ((DataType) a.payload.elems.get(i)))) ? "*" : "") + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) //a.payload.elems.get(i) + + + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + + // HACK + + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + + ", i" + i + " int) " + + + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") + + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + ).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + if(a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + a); + } + + List as = curr.getActions(); + if (as.size() > 1 && as.stream().anyMatch(b -> b.mid.toString().equals(""))) // HACK + { + throw new //ParamCoreException + RuntimeException("[param-core] Empty labels not allowed in non-unary choices: " + curr.getActions()); + } + + String sEpWrite = + //s.ep.Write + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; + + ".Conn"; + String sEpProto = + //"s.ep.Proto" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + /*String sEpErr = + //"s.ep.Err" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamRole r = (ParamRole) a.peer; + ParamRange g = r.ranges.iterator().next(); + Function foo = e -> + { + if (e instanceof ParamIndexInt) + { + return e.toString(); + } + else if (e instanceof ParamIndexVar) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + }; + + /*String res = + (((GoJob) api.job).noCopy + ? + "labels := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "tmp := \"" + a.mid + "\"\n" + + "\tlabels[i-" + foo.apply(g.start) + "] = &tmp\n" + + "}\n" + : + "labels := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" + + "\tlabels[i-" + foo.apply(g.start) + "] = []byte(\"" + a.mid + "\")\n" + + "}\n") + + + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + "." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + + "labels)\n"; + + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + res += + (((GoJob) api.job).noCopy + ? + "b := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end)+"; i++ {\n" + + "tmp := splitFn0(arg0, i)\n" + + "\tb[i-"+foo.apply(g.start)+"] = &tmp\n" + + "}\n" + : + "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" + + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + "\tvar buf bytes.Buffer\n" + + "\tif err := gob.NewEncoder(&buf).Encode(splitFn0(arg0, i)); err != nil {\n\t\t" // only arg0 + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Errors <- session.SerialiseFailed(err, \"" + getActionName(api, a) +"\", " + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Self.Name())\n" + + "\t}\n" + + "\tb[i-"+foo.apply(g.start)+"] = buf.Bytes()\n" + + "}\n") + + + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") + + "(" + sEpProto + + "." + r.getName() + ", " + + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " + //+ "\"" + a.mid + "\"" + + "b" + + ")\n"; + }*/ + + String res = + //st1.Use() + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + (a.mid.toString().equals("") ? "" : // HACK + "if err := " + sEpWrite + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + "\"" + a.mid + "\"" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n") + + + ((((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) a.payload.elems.get(0))) ? "arg0.Res.Use()\n" : "") + + //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "if err := " + sEpWrite + + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "(" //+ sEpProto + "." + r.getName() + ", " + + + "splitFn0(arg0, i)" + "); err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "}\n"; + + /*for i, v := range pl { + st1.ept.Conn[Worker][i].Send(a.mid) + st1.ept.Conn[Worker][i].Send(v) + }*/ + + return + res + + buildReturn(api, curr, succ); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java new file mode 100644 index 000000000..858b363af --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java @@ -0,0 +1,404 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.ast.DataTypeDecl; +import org.scribble.codegen.statetype.STActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.ast.ParamCoreDelegDecl; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; +import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; +import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.EStateKind; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.PayloadElemType; + +// Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder +public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder +{ + protected final ParamCoreSTEndpointApiGenerator apigen; + public final ParamActualRole actual; // this.apigen.self.equals(this.actual.getName()) + //public final EGraph graph; + + public final ParamCoreSTReceiveActionBuilder vb; + + private int counter = 1; + + private final Set datats; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams + + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later + // actual.getName().equals(this.role) + public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, ParamActualRole actual, EGraph graph) + { + super(apigen.job, apigen.proto, apigen.self, graph, + new ParamCoreSTOutputStateBuilder(new ParamCoreSTSplitActionBuilder(), new ParamCoreSTSendActionBuilder()), + new ParamCoreSTReceiveStateBuilder(new ParamCoreSTReduceActionBuilder(), new ParamCoreSTReceiveActionBuilder()), + new ParamCoreSTBranchStateBuilder(new ParamCoreSTBranchActionBuilder()), + null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), + new ParamCoreSTEndStateBuilder()); + + //throw new RuntimeException("[param-core] TODO:"); + this.apigen = apigen; + this.actual = actual; + + this.vb = ((ParamCoreSTReceiveStateBuilder) this.rb).vb; + + this.datats = this.apigen.job.getContext().getMainModule().getNonProtocolDecls().stream() + .filter(d -> (d instanceof DataTypeDecl)).map(d -> ((DataTypeDecl) d)).collect(Collectors.toSet()); + } + + protected ParamActualRole getSelf() + { + return (ParamActualRole) this.getSelf(); + } + + // Not actual roles; param roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName + public static String getGeneratedParamRoleName(ParamRole r) + { + //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); + if (r.ranges.size() > 1) + { + throw new RuntimeException("[param-core] TODO: " + r); + } + ParamRange g = r.ranges.iterator().next(); + return r.getName() + "_" + g.start + "To" + g.end; + } + + + /*@Override + public String getPackage() + { + //throw new RuntimeException("[param-core] TODO:"); + return this.gpn.getSimpleName().toString(); + }*/ + + @Override + protected String makeSTStateName(EState s) + { + //throw new RuntimeException("[param-core] TODO:"); + if (s.isTerminal()) + { + ////return "_EndState"; + //return ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; + return makeEndStateName(this.apigen.proto.getSimpleName(), this.actual); + } + return this.apigen.proto.getSimpleName() + "_" + + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + + "_" + this.counter++; + } + + public static String makeEndStateName(GProtocolName simpname, ParamActualRole r) + { + return simpname + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(r) + "_" + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; + } + + @Override + public String getFilePath(String filename) + { + //throw new RuntimeException("[param-core] TODO:"); + if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go + { + filename = "$" + filename.substring(1); + } + return this.gpn.toString().replaceAll("\\.", "/") + "/" + filename + ".go"; + } + + public String getActualRoleName() + { + return this.apigen.self.toString(); + } + + public boolean isDelegType(DataType t) + { + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof ParamCoreDelegDecl; // FIXME: make a map + } + + protected String getExtName(DataType t) + { + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; // FIXME: make a map + } + + protected String getExtSource(DataType t) + { + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extSource; // FIXME: make a map + } + + private String makeImportExtName(DataType t) + { + String extName = getExtName(t); + switch (extName) + { + case "int": // FIXME: factor out with batesHack + case "[]int": + case "[][]int": + case "string": + case "[]string": + case "[][]string": + case "byte": + case "[]byte": + case "[][]byte": + { + return ""; + } + default: + { + return "import \"" + getExtSource(t) + "\"\n"; + } + } + } + + protected String getStateChanPremable(EState s) + { + //Role r = this.actual.getName(); + + GProtocolName simpname = this.apigen.proto.getSimpleName(); + String tname = this.getStateChanName(s); + //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); + String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, this.actual); + + String res = + this.apigen.generateRootPackageDecl() + "\n" + + "\n" + + this.apigen.generateScribbleRuntimeImports() + "\n" + + "import \"log\"\n" + + /*+ (s.isTerminal() || ((GoJob) apigen.job).noCopy ? "" : + Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) + .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + + "\n"*/ + + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) // FIXME: refactor into state builders + //? "import \"github.com/rhu1/scribble-go-runtime/test/util\"\n" : "") + ? "import \"sort\"\n" : "") + + + ((s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + ? s.getActions().stream().flatMap(a -> a.payload.elems.stream()).collect(Collectors.toSet()).stream() + .map(p -> makeImportExtName((DataType) p)) + .collect(Collectors.joining("")) + : "") + + + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + ? "\nvar _ = sort.Sort\n" : "") + + + "\n" + + "type " + tname + " struct{\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + + "}\n"; + + if (s.id == this.graph.init.id) + { + res += "\n" + + "func (ep *" + epType + ") New" + + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1" // cf. makeSTStateName + + "() *" + tname + " {\n" // FIXME: factor out + + "return &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")}\n" + + "}"; + } + + return res; + } + + @Override + public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here because action builder hierarchy not suitable (extended by action kind, not by target language) + { + EState succ = curr.getSuccessor(a); + if (getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1) + { + return + "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(this, a) + + ") <-chan *" + ab.getReturnType(this, curr, succ) + " {\n" + + ab.buildBody(this, curr, a, succ) + "\n" + + "}"; + } + else + { + //throw new RuntimeException("[param-core] TODO: "); + return + "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(this, a) + + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + ab.buildBody(this, curr, a, succ) + "\n" + + "}"; + } + } + + @Override + public String getChannelName(STStateChanApiBuilder api, EAction a) + { + //throw new RuntimeException("[param-core] TODO: "); + return + //"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; + "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; + } + + @Override + public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) // FIXME: refactor action builders as interfaces and use generic parameter for kind + { + //throw new RuntimeException("[param-core] TODO: "); + String sEp = + //"s.ep" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + String res = ""; + + /*if (succ.isTerminal()) // FIXME + { + res += sEp + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINISHPROTOCOL + "()\n"; + }*/ + + res += "return " + getSuccStateChan(ab, curr, succ, sEp); + return res; + } + + public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) + { + if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) + { + return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + + "New" + //+ getStateChanName(succ) + + ((succ.id != this.graph.init.id) ? getStateChanName(succ) + : ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + + "()"; + } + else + { + String res = "&" + ab.getReturnType(this, curr, succ) + "{ " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; + if (!succ.isTerminal()) + { + res += ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case + } + res += " }"; + return res; + } + } + + @Override + public Map build() // filepath -> source + { + Map api = new HashMap<>(); + Set states = new LinkedHashSet<>(); + states.add(this.graph.init); + states.addAll(MState.getReachableStates(this.graph.init)); + for (EState s : states) + { + switch (getStateKind(s)) + { + case CROSS_SEND: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; + case CROSS_RECEIVE: + { + if (s.getActions().size() > 1) + { + api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + //api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out + } + else + { + api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); + } + break; + } + case DOT_SEND: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case DOT_RECEIVE: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case MULTICHOICES_RECEIVE: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket + default: throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + } + } + return api; + } + + protected String batesHack(PayloadElemType t) + { + /*String tmp = t.toString(); + return (tmp.equals("bates")) ? "[]byte" : tmp;*/ + DataType dt = (DataType) t; + String extName = getExtName(dt); + + switch (extName) + { + case "int": + case "[]int": // FIXME: generalise arbitrary dimension array + case "[][]int": + case "string": + case "[]string": + case "[][]string": + case "byte": + case "[]byte": + case "[][]byte": + { + return extName; + } + default: + { + return extName; // FIXME + } + } + } + + // FIXME: make ParamCoreEState + enum ParamCoreEStateKind { CROSS_SEND, CROSS_RECEIVE, DOT_SEND, DOT_RECEIVE, MULTICHOICES_RECEIVE, TERMINAL } + + protected static ParamCoreEStateKind getStateKind(EState s) + { + List as = s.getActions(); + if (as.isEmpty()) + { + return ParamCoreEStateKind.TERMINAL; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossSend)) + { + return ParamCoreEStateKind.CROSS_SEND; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossReceive)) + { + return ParamCoreEStateKind.CROSS_RECEIVE; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotSend)) + { + return ParamCoreEStateKind.DOT_SEND; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotReceive)) + { + return ParamCoreEStateKind.DOT_RECEIVE; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEMultiChoicesReceive)) + { + return ParamCoreEStateKind.MULTICHOICES_RECEIVE; + } + else + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + } + } +} From 128f0b53df95f250b60f6277bc72a096df1706e8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 21 Apr 2018 21:05:24 +0100 Subject: [PATCH 200/433] Revising param-core API gen. --- .../ext/go/core/cli/ParamCoreCLArgParser.java | 16 +- .../ext/go/core/cli/ParamCoreCommandLine.java | 5 +- .../ParamCoreSTBranchStateBuilder.java | 2 +- .../ParamCoreSTEndStateBuilder.java | 16 +- .../ParamCoreSTEndpointApiGenerator.java | 56 +-- .../ParamCoreSTOutputStateBuilder.java | 2 +- .../ParamCoreSTSendActionBuilder.java | 21 +- .../ParamCoreSTSessionApiBuilder.java | 96 ++++- .../ParamCoreSTStateChanApiBuilder.java | 360 +++++++++--------- 9 files changed, 334 insertions(+), 240 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java index c745c1af6..f98e6f668 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java @@ -76,7 +76,7 @@ protected int parseFlag(int i) throws CommandLineException // Non-unique flags case ParamCoreCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); case ParamCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); - case ParamCoreCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParseRoleArg(flag, i); + case ParamCoreCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParseRoleAndPathArgs(flag, i); // Base CL @@ -140,6 +140,20 @@ protected int paramParseRoleAndFileArgs(String f, int i) throws CommandLineExcep return i; } + // path is absolute import path + protected int paramParseRoleAndPathArgs(String f, int i) throws CommandLineException + { + ParamCoreCLArgFlag flag = ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + if ((i + 2) >= this.args.length) + { + throw new CommandLineException("Missing role/path arguments"); + } + String role = this.args[++i]; + String path = this.args[++i]; + goConcatArgs(flag, role, path); + return i; + } + /*// FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java index 73b0b3ac2..cdf119b4a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java @@ -134,11 +134,12 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co { JobContext jcontext = job.getContext(); String[] args = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_API_GEN); - for (int i = 0; i < args.length; i += 1) + for (int i = 0; i < args.length; i += 2) { String simpname = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_PARAM)[0]; GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); Role role = checkRoleArg(jcontext, fullname, args[i]); + String impath = args[i+1]; /*for (ParamActualRole ranges : this.P0.get(role).keySet()) { EGraph efsm = this.E0.get(role).get(ranges); @@ -150,7 +151,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co Map goClasses = new ParamCoreSTSessionApiBuilder((GoJob) job, fullname, this.E0).build();*/ //Map actuals = this.E0.get(role); - Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, role, this.E0).build(); + Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, role, this.E0, impath).build(); outputClasses(goClasses); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java index f157e1166..6d2921d63 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java @@ -43,7 +43,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) GProtocolName simpname = apigen.apigen.proto.getSimpleName(); String tname = apigen.getStateChanName(s); //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, apigen.actual); + String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, apigen.actual); String res = apigen.apigen.generateRootPackageDecl() + "\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java index aa692507f..69d092070 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java @@ -1,6 +1,5 @@ package org.scribble.ext.go.core.codegen.statetype3; -import org.scribble.codegen.java.endpointapi.ApiGen; import org.scribble.codegen.statetype.STEndStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.model.endpoint.EState; @@ -25,16 +24,15 @@ public String getPreamble(STStateChanApiBuilder api, EState s) //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); String tname = api.getStateChanName(s); String res = - schangen.apigen.generateRootPackageDecl() + "\n" + //schangen.apigen.generateRootPackageDecl() + "\n" + "package " + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(((ParamCoreSTStateChanApiBuilder) api).actual) + "\n" + "\n" - ////+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" - ////+ schangen.apigen.generateScribbleRuntimeImports() + "\n" - //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "\n" - + "type " + tname + " struct{\n" - //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" // FIXME: factor out - //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(api.gpn.getSimpleName(), api.role) + "\n" // FIXME: factor out - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out + + "type " + tname + " struct {\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + //+ " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out + + " session.ParamEndpoint" + "\n" // FIXME: factor out + "}"; return res; // No LinearResource } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java index 3e122adda..960611f9d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java @@ -25,10 +25,12 @@ public class ParamCoreSTEndpointApiGenerator public final Map> actuals; //public final EGraph graph; + public final String impath; + //public final Map> all; public ParamCoreSTEndpointApiGenerator(Job job, GProtocolName fullname, Role self, //Map actuals) - Map> actuals) + Map> actuals, String impath) { this.job = job; this.proto = fullname; @@ -36,6 +38,7 @@ public ParamCoreSTEndpointApiGenerator(Job job, GProtocolName fullname, Role sel this.actuals = Collections.unmodifiableMap(actuals); //this.graph = graph; //this.all = Collections.unmodifiableMap(all); + this.impath = impath; } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later @@ -72,30 +75,6 @@ public Map buildStateChannelApi(ParamActualRole actual, EGraph g return getGeneratedEndpointType(this.proto.getSimpleName(), this.self); }*/ - //public static String getGeneratedEndpointType(GProtocolName simpname, Role r) - public static String getGeneratedEndpointType(GProtocolName simpname, ParamActualRole r) - { - //return "Endpoint_" + simpname + "_" + r; - return simpname + "_" + getGeneratedActualRoleName(r); - } - - // Doesn't use coranges -- same as getGeneratedParamRoleName? // Old - public static String getGeneratedActualRoleName(ParamActualRole actual) - { - /*return actual.getName() - + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ - /*if (actual.ranges.size() > 1 || actual.coranges.size() > 0) - { - throw new RuntimeException("[param-core] TODO: " + actual); - } - ParamRange g = actual.ranges.iterator().next(); - return actual.getName() + "_" + g.start + "To" + g.end;*/ - return actual.getName() + "_" - + actual.ranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")) - + (actual.coranges.isEmpty() ? "" : "_not_") - + actual.coranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")); - } - //@Override public String getRootPackage() // Derives only from proto name { @@ -126,4 +105,31 @@ public String generateScribbleRuntimeImports() { return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); } + + + + + //public static String getGeneratedEndpointType(GProtocolName simpname, Role r) + public static String getGeneratedEndpointTypeName(GProtocolName simpname, ParamActualRole r) + { + //return "Endpoint_" + simpname + "_" + r; + return simpname + "_" + getGeneratedActualRoleName(r); + } + + // Doesn't use coranges -- same as getGeneratedParamRoleName? // Old + public static String getGeneratedActualRoleName(ParamActualRole actual) + { + /*return actual.getName() + + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ + /*if (actual.ranges.size() > 1 || actual.coranges.size() > 0) + { + throw new RuntimeException("[param-core] TODO: " + actual); + } + ParamRange g = actual.ranges.iterator().next(); + return actual.getName() + "_" + g.start + "To" + g.end;*/ + return actual.getName() + "_" + + actual.ranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")) + + (actual.coranges.isEmpty() ? "" : "_not_") + + actual.coranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")); + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java index 1aee81e18..e6795f6e4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java @@ -37,7 +37,7 @@ public String build(STStateChanApiBuilder api, EState s) out += "\n\n"; if (a instanceof ESend) // FIXME: factor out action kind { - out += this.sb.build(api, s, a); + //out += this.sb.build(api, s, a); // FIXME: delegation if (!a.payload.elems.stream() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java index b95c3e557..3fb1fb42c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java @@ -54,18 +54,15 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES String sEpWrite = //s.ep.Write - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Ept()" //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; + ".Conn"; - String sEpProto = + /*String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; - /*String sEpErr = - //"s.ep.Err" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ ParamRole r = (ParamRole) a.peer; ParamRange g = r.ranges.iterator().next(); @@ -78,7 +75,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES else if (e instanceof ParamIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params()[\"" + e + "\"]"; } else { @@ -156,7 +153,8 @@ else if (e instanceof ParamIndexVar) //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + (a.mid.toString().equals("") ? "" : // HACK "if err := " + sEpWrite - + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + //+ "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "[\"" + r.getName() + "\"][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "\"" + a.mid + "\"" + "); err != nil {\n" @@ -169,7 +167,8 @@ else if (e instanceof ParamIndexVar) "log.Fatal(\"TODO\")\n" : "if err := " + sEpWrite - + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + //+ "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "[\"" + r.getName() + "\"][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "arg0[j]" //+ "splitFn0(arg0, i)" // FIXME: hardcoded arg0 diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java index bf490546a..09d506aaa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java @@ -45,6 +45,26 @@ public Map build() // FIXME: factor out } instates.addAll(MState.getReachableStates(this.apigen.graph.init).stream().filter(f).collect(Collectors.toSet()));*/ + String epPack = + //this.apigen.generateRootPackageDecl() + "\n" + "\n" + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + + this.apigen.generateScribbleRuntimeImports() + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; + + /*+ (roles.stream().map(rfoo -> + { + Set actuals = this.apigen.actuals.get(rfoo).keySet(); + return + actuals.stream().map(actual -> + { + return "import _" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + " \"" + this.apigen.impath + "/" + this.apigen.getRootPackage() + + "/" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "\"\n"; + }).collect(Collectors.joining("")); + }).collect(Collectors.joining("")) + );*/ + // roles String sessPack = //"package " + this.apigen.getRootPackage() + "\n" // FIXME: factor out @@ -52,8 +72,20 @@ public Map build() // FIXME: factor out + "\n" //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" + this.apigen.generateScribbleRuntimeImports() - + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; + + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n" //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; + + + (roles.stream().map(rfoo -> + { + Set actuals = this.apigen.actuals.get(rfoo).keySet(); + return + actuals.stream().map(actual -> + { + return "import _" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + " \"" + this.apigen.impath + "/" + this.apigen.getRootPackage() + + "/" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "\"\n"; + }).collect(Collectors.joining("")); + }).collect(Collectors.joining("")) + ); sessPack += "\n" + "type " + simpname + " struct {\n" @@ -65,6 +97,10 @@ public Map build() // FIXME: factor out + "return &" + simpname + "{ " + roles.stream().map(r -> ParamCoreSTApiGenConstants.GO_ROLE_CONSTRUCTOR + "(\"" + r + "\")").collect(Collectors.joining(", ")) + " }\n" // Singleton types? + + "}\n" + + "\n" + + "func (*" + simpname +") IsProtocol() {\n" + + "\n" + "}\n"; @@ -86,6 +122,9 @@ public Map build() // FIXME: factor out + "}" ).collect(Collectors.joining("\n\n")) + "\n" + "\n";*/ + + String dir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; + Map res = new HashMap<>(); // Protocol and role specific endpoints //Function epTypeName = r -> "_Endpoint" + simpname + "_" + r; @@ -96,7 +135,7 @@ public Map build() // FIXME: factor out return actuals.stream().map(actual -> { - String epTypeName = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, actual); + String epTypeName = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, actual); List decls = gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(actual.getName())) .map(rd -> (ParamRoleDecl) rd).collect(Collectors.toList()); @@ -113,14 +152,20 @@ public Map build() // FIXME: factor out }*/ //ParamRange g = actual.ranges.iterator().next(); - return + //return + String epPack1 = - "\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, actual) + ") Ept() *session.Endpoint {\n" + "\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, actual) + ") Ept() *session.Endpoint {\n" + "return p.ept\n" + "}\n" + + "\n" + + "\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, actual) + ") Params() map[string]int {\n" + + "return p.params\n" + + "}\n" + "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out - + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " *" + simpname + "\n" + //+ ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " *" + simpname + "\n" + + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " *session.Protocol\n" /*+ this.apigen.actuals.get(r).keySet().stream() .map(a -> { @@ -130,7 +175,7 @@ public Map build() // FIXME: factor out }).collect(Collectors.joining(""))*/ + "*session.LinearResource\n" + "ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" - + "Params map[string]int\n" + + "params map[string]int\n" + "}\n" + "\n" @@ -154,16 +199,15 @@ public Map build() // FIXME: factor out + "ini.ept.Conn[rolename.Name()][id] = requestor.Connect()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n" - + "\n" - - + + "\n"; - + "func (p *" + simpname + ") New" + epTypeName + String sessPack1 = + "func (p *" + simpname + ") New" + epTypeName + "(" + vars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" - + "(*" + epTypeName + ") {\n" + + "(*_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "." + epTypeName + ") {\n" /*+ "ep := &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p,\n" @@ -229,7 +273,7 @@ else if (ee instanceof ParamIndexVar) + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) + "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, " //-1, + "conns), params}\n" // FIXME: numRoles - + "}\n" + + "}\n"; /*+ this.apigen.actuals.get(r).keySet().stream() .map(a -> @@ -245,20 +289,38 @@ else if (ee instanceof ParamIndexVar) + "}\n"; }).collect(Collectors.joining(""));*/ - - + "\nfunc (ini *" + epTypeName + ") Init() (*" + epTypeName + "_1) {\n" + epPack1 += + /*+ "\nfunc (ini *" + epTypeName + ") Init() (*" + epTypeName + "_1) {\n" + + "ini.Use()\n" + + "ini.ept.CheckConnection()\n" + + + ((this.apigen.actuals.get(rfoo).get(actual).init.getStateKind() == EStateKind.POLY_INPUT) + ? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" + : "return &" + epTypeName + "_1{&session.LinearResource{}, ini}\n")*/ + "\nfunc (ini *" + epTypeName + ") Run(f func(*"//_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".Init)" + + "Init)" + //+ " _" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".End" + ") " + + "End" + ") " + //+ "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".End {\n" + + "End {\n" + "ini.Use()\n" + "ini.ept.CheckConnection()\n" + ((this.apigen.actuals.get(rfoo).get(actual).init.getStateKind() == EStateKind.POLY_INPUT) ? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" - : "return &" + epTypeName + "_1{&session.LinearResource{}, ini}\n") + //: "return &_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".Init{&session.LinearResource{}, ini}\n") + : "return f(" //+ ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".New(ini))\n") + + "New(ini))\n") + + + "}"; + + res.put(dir + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "/" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".go", + "package " + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "\n" + epPack + "\n" + epPack1); + return sessPack1; }).collect(Collectors.joining("")); }).collect(Collectors.joining("\n")); - String dir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; - Map res = new HashMap<>(); res.put(dir + simpname + ".go", sessPack); return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java index 858b363af..02388e7be 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java @@ -40,6 +40,45 @@ public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder private int counter = 1; private final Set datats; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams + + // FIXME: make ParamCoreEState + enum ParamCoreEStateKind { CROSS_SEND, CROSS_RECEIVE, DOT_SEND, DOT_RECEIVE, MULTICHOICES_RECEIVE, TERMINAL } + + protected static ParamCoreEStateKind getStateKind(EState s) + { + List as = s.getActions(); + if (as.isEmpty()) + { + return ParamCoreEStateKind.TERMINAL; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossSend)) + { + return ParamCoreEStateKind.CROSS_SEND; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossReceive)) + { + return ParamCoreEStateKind.CROSS_RECEIVE; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotSend)) + { + return ParamCoreEStateKind.DOT_SEND; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotReceive)) + { + return ParamCoreEStateKind.DOT_RECEIVE; + } + else if (as.stream().allMatch(a -> a instanceof ParamCoreEMultiChoicesReceive)) + { + return ParamCoreEStateKind.MULTICHOICES_RECEIVE; + } + else + { + throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + } + } + + + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later // actual.getName().equals(this.role) @@ -62,49 +101,48 @@ public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, Pa .filter(d -> (d instanceof DataTypeDecl)).map(d -> ((DataTypeDecl) d)).collect(Collectors.toSet()); } - protected ParamActualRole getSelf() - { - return (ParamActualRole) this.getSelf(); - } - - // Not actual roles; param roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName - public static String getGeneratedParamRoleName(ParamRole r) - { - //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); - if (r.ranges.size() > 1) - { - throw new RuntimeException("[param-core] TODO: " + r); - } - ParamRange g = r.ranges.iterator().next(); - return r.getName() + "_" + g.start + "To" + g.end; - } - - - /*@Override - public String getPackage() - { - //throw new RuntimeException("[param-core] TODO:"); - return this.gpn.getSimpleName().toString(); - }*/ - @Override - protected String makeSTStateName(EState s) + public Map build() // filepath -> source { - //throw new RuntimeException("[param-core] TODO:"); - if (s.isTerminal()) + Map api = new HashMap<>(); + Set states = new LinkedHashSet<>(); + states.add(this.graph.init); + states.addAll(MState.getReachableStates(this.graph.init)); + for (EState s : states) { - ////return "_EndState"; - //return ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; - return makeEndStateName(this.apigen.proto.getSimpleName(), this.actual); + switch (getStateKind(s)) + { + case CROSS_SEND: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; + case CROSS_RECEIVE: + { + if (s.getActions().size() > 1) + { + api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + //api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out + } + else + { + api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); + } + break; + } + case DOT_SEND: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case DOT_RECEIVE: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case MULTICHOICES_RECEIVE: + { + throw new RuntimeException("[param-core] TODO: " + s); + } + case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket + default: throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + } } - return this.apigen.proto.getSimpleName() + "_" - + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) - + "_" + this.counter++; - } - - public static String makeEndStateName(GProtocolName simpname, ParamActualRole r) - { - return simpname + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(r) + "_" + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; + return api; } @Override @@ -115,51 +153,9 @@ public String getFilePath(String filename) { filename = "$" + filename.substring(1); } - return this.gpn.toString().replaceAll("\\.", "/") + "/" + filename + ".go"; - } - - public String getActualRoleName() - { - return this.apigen.self.toString(); - } - - public boolean isDelegType(DataType t) - { - return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof ParamCoreDelegDecl; // FIXME: make a map - } - - protected String getExtName(DataType t) - { - return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; // FIXME: make a map - } - - protected String getExtSource(DataType t) - { - return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extSource; // FIXME: make a map - } - - private String makeImportExtName(DataType t) - { - String extName = getExtName(t); - switch (extName) - { - case "int": // FIXME: factor out with batesHack - case "[]int": - case "[][]int": - case "string": - case "[]string": - case "[][]string": - case "byte": - case "[]byte": - case "[][]byte": - { - return ""; - } - default: - { - return "import \"" + getExtSource(t) + "\"\n"; - } - } + return this.gpn.toString().replaceAll("\\.", "/") + + "/" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + + "/" + filename + ".go"; } protected String getStateChanPremable(EState s) @@ -168,11 +164,12 @@ protected String getStateChanPremable(EState s) GProtocolName simpname = this.apigen.proto.getSimpleName(); String tname = this.getStateChanName(s); - //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, this.actual); + ////String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); + //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, this.actual); String res = - this.apigen.generateRootPackageDecl() + "\n" + //this.apigen.generateRootPackageDecl() + "\n" + "package " + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "\n" + "\n" + this.apigen.generateScribbleRuntimeImports() + "\n" + "import \"log\"\n" @@ -195,17 +192,19 @@ protected String getStateChanPremable(EState s) ? "\nvar _ = sort.Sort\n" : "") + "\n" - + "type " + tname + " struct{\n" + + "type " + tname + " struct {\n" + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " session.ParamEndpoint" + "\n" // FIXME: factor out + "}\n"; if (s.id == this.graph.init.id) { res += "\n" - + "func (ep *" + epType + ") New" - + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1" // cf. makeSTStateName - + "() *" + tname + " {\n" // FIXME: factor out + /*+ "func (ep *" + epType + ") New" + + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1" // cf. makeSTStateName*/ + + "func New" + + "(ep session.ParamEndpoint) *" + tname + " {\n" // FIXME: factor out + "return &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")}\n" + "}"; @@ -242,15 +241,6 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b + "}"; } } - - @Override - public String getChannelName(STStateChanApiBuilder api, EAction a) - { - //throw new RuntimeException("[param-core] TODO: "); - return - //"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; - "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; - } @Override public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) // FIXME: refactor action builders as interfaces and use generic parameter for kind @@ -295,49 +285,108 @@ public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, Str } @Override - public Map build() // filepath -> source + public String getChannelName(STStateChanApiBuilder api, EAction a) // Not used? { - Map api = new HashMap<>(); - Set states = new LinkedHashSet<>(); - states.add(this.graph.init); - states.addAll(MState.getReachableStates(this.graph.init)); - for (EState s : states) + //throw new RuntimeException("[param-core] TODO: "); + return + //"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; + "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; + } + + protected ParamActualRole getSelf() + { + return (ParamActualRole) this.getSelf(); + } + + /*public String getActualRoleName() + { + return this.apigen.self.toString(); + }*/ + + + + + + /*@Override + public String getPackage() + { + //throw new RuntimeException("[param-core] TODO:"); + return this.gpn.getSimpleName().toString(); + }*/ + + @Override + protected String makeSTStateName(EState s) + { + return (s.isTerminal()) + ? makeEndStateName(this.apigen.proto.getSimpleName(), this.actual) + : (s.id == this.graph.init.id) + ? "Init" // FIXME: factor out + : //this.apigen.proto.getSimpleName() + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_" + this.counter++; + "State" + this.counter++; + } + + public static String makeEndStateName(GProtocolName simpname, ParamActualRole r) + { + return //simpname + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(r) + "_" + + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; + } + + // Not actual roles; param roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName + public static String getGeneratedParamRoleName(ParamRole r) + { + //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); + if (r.ranges.size() > 1) { - switch (getStateKind(s)) + throw new RuntimeException("[param-core] TODO: " + r); + } + ParamRange g = r.ranges.iterator().next(); + return r.getName() + "_" + g.start + "To" + g.end; + } + + + + + public boolean isDelegType(DataType t) + { + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof ParamCoreDelegDecl; // FIXME: make a map + } + + protected String getExtName(DataType t) + { + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; // FIXME: make a map + } + + protected String getExtSource(DataType t) + { + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extSource; // FIXME: make a map + } + + private String makeImportExtName(DataType t) + { + String extName = getExtName(t); + switch (extName) + { + case "int": // FIXME: factor out with batesHack + case "[]int": + case "[][]int": + case "string": + case "[]string": + case "[][]string": + case "byte": + case "[]byte": + case "[][]byte": { - case CROSS_SEND: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; - case CROSS_RECEIVE: - { - if (s.getActions().size() > 1) - { - api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); - //api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out - } - else - { - api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); - } - break; - } - case DOT_SEND: - { - throw new RuntimeException("[param-core] TODO: " + s); - } - case DOT_RECEIVE: - { - throw new RuntimeException("[param-core] TODO: " + s); - } - case MULTICHOICES_RECEIVE: - { - throw new RuntimeException("[param-core] TODO: " + s); - } - case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket - default: throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + return ""; + } + default: + { + return "import \"" + getExtSource(t) + "\"\n"; } } - return api; } + + protected String batesHack(PayloadElemType t) { /*String tmp = t.toString(); @@ -365,40 +414,5 @@ protected String batesHack(PayloadElemType t) } } } - - // FIXME: make ParamCoreEState - enum ParamCoreEStateKind { CROSS_SEND, CROSS_RECEIVE, DOT_SEND, DOT_RECEIVE, MULTICHOICES_RECEIVE, TERMINAL } - - protected static ParamCoreEStateKind getStateKind(EState s) - { - List as = s.getActions(); - if (as.isEmpty()) - { - return ParamCoreEStateKind.TERMINAL; - } - else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossSend)) - { - return ParamCoreEStateKind.CROSS_SEND; - } - else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossReceive)) - { - return ParamCoreEStateKind.CROSS_RECEIVE; - } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotSend)) - { - return ParamCoreEStateKind.DOT_SEND; - } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotReceive)) - { - return ParamCoreEStateKind.DOT_RECEIVE; - } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEMultiChoicesReceive)) - { - return ParamCoreEStateKind.MULTICHOICES_RECEIVE; - } - else - { - throw new RuntimeException("[param-core] Shouldn't get in here: " + s); - } - } } + From abf9360828470823da4b0b91a8592b39aa60a552 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 10:13:28 +0100 Subject: [PATCH 201/433] Continued revising param-core API gen. --- .../ParamCoreSTReceiveActionBuilder.java | 43 ++--- .../ParamCoreSTReceiveStateBuilder.java | 4 +- .../ParamCoreSTSessionApiBuilder.java | 167 ++---------------- .../ParamCoreSTStateChanApiBuilder.java | 8 +- 4 files changed, 39 insertions(+), 183 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java index c75dc1902..501260a14 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java @@ -32,7 +32,7 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " *[]" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + + i + " []" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } @@ -47,16 +47,14 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES String sEpRecv = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + ".Ept()" + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; - String sEpProto = + + /*String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; - /*String sEpErr = - //"s.ep.Err" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ ParamRole r = (ParamRole) a.peer; ParamRange g = r.ranges.iterator().next(); @@ -69,7 +67,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES else if (e instanceof ParamIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params()[\"" + e + "\"]"; } else { @@ -122,16 +120,15 @@ else if (e instanceof ParamIndexVar) + "}\n" + "*arg0 = reduceFn0(data)\n" : - //"data := make([]" - "data := make(map[int]" + /*"data := make(map[int]" + extName//a.payload.elems.get(0) - + ", " + foo.apply(g.end) + ")\n" - + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + + ", " + foo.apply(g.end) + ")\n"*/ + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args + (a.mid.toString().equals("") ? "" : // HACK "var lab string\n" + "if err := " + sEpRecv - + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "[\"" + r.getName() + "\"][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + "); err != nil {\n" @@ -142,23 +139,18 @@ else if (e instanceof ParamIndexVar) + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + "if err := " + sEpRecv - + "[" + sEpProto + "." + r.getName() + ".Name()][i]" + + "[\"" + r.getName() + "\"][i]" + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL - + "(" //+ sEpProto + "." + r.getName() + ", " - //+ "&data[i-1]" + + "(" + "&tmp" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "data[i-1] = tmp\n" + + "arg0[i-1] = tmp\n" + "}\n" - //+ "*arg0 = data\n"); // FIXME: arg0 - - //+ "*arg0 = " + hackGetValues(extName) + "(data)\n"; // FIXME: arg0 - //+ ((!Stream.of("int", "string", "[]byte").collect(Collectors.toSet()).contains(extName) - // ? - + "f := func(m map[int] " + extName + ") []" + extName + " {\n" + + /*+ "f := func(m map[int] " + extName + ") []" + extName + " {\n" + "xs := make([]" + extName + ", len(m))\n" + "keys := make([]int, 0)\n" + "for k, _ := range m {\n" @@ -170,7 +162,8 @@ else if (e instanceof ParamIndexVar) + "}\n" + "return xs\n" + "}\n" - + "*arg0 = f(data)\n"); + + "*arg0 = f(data)\n"*/ + ); // : "") } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java index ccf1510d3..3b1e909bc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java @@ -38,8 +38,8 @@ public String build(STStateChanApiBuilder api, EState s) } EAction a = as.get(0); - out += "\n\n"; - out += this.rb.build(api, s, a); + /*out += "\n\n"; + out += this.rb.build(api, s, a);*/ // FIXME: delegation if (!a.payload.elems.stream() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java index 09d506aaa..a71965138 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java @@ -53,27 +53,12 @@ public Map build() // FIXME: factor out + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; - /*+ (roles.stream().map(rfoo -> - { - Set actuals = this.apigen.actuals.get(rfoo).keySet(); - return - actuals.stream().map(actual -> - { - return "import _" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + " \"" + this.apigen.impath + "/" + this.apigen.getRootPackage() - + "/" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "\"\n"; - }).collect(Collectors.joining("")); - }).collect(Collectors.joining("")) - );*/ - // roles String sessPack = - //"package " + this.apigen.getRootPackage() + "\n" // FIXME: factor out this.apigen.generateRootPackageDecl() + "\n" + "\n" - //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" - + this.apigen.generateScribbleRuntimeImports() - + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n" - //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; + + this.apigen.generateScribbleRuntimeImports() + "\n" + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n" + (roles.stream().map(rfoo -> { @@ -104,25 +89,6 @@ public Map build() // FIXME: factor out + "}\n"; - /*sessPack += - roles.stream().map(r -> - "type _" + r + " struct { }\n" - + "\n" - + "func (*_" + r +") GetRoleName() string {\n" - + "return \"" + r + "\"\n" - + "}\n" - + "\n" - + "var __" + r + " *_" + r + "\n" - + "\n" - + "func new" + r + "() *_" + r + " {\n" // FIXME: not concurrent - + "if __" + r + " == nil {\n" - + "__"+ r + " = &_" + r + "{}\n" - + "}\n" - + "return __" + r + "\n" - + "}" - ).collect(Collectors.joining("\n\n")) + "\n" - + "\n";*/ - String dir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; Map res = new HashMap<>(); @@ -144,15 +110,8 @@ public Map build() // FIXME: factor out throw new RuntimeException("Shouldn't get in here: " + actual); } List vars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); - //.flatMap(rd -> ((ParamRoleDecl) rd).params.stream()).collect(Collectors.toList()); - /*if (actual.ranges.size() > 1) - { - throw new RuntimeException("TODO: " + actual); - }*/ - //ParamRange g = actual.ranges.iterator().next(); - //return String epPack1 = "\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, actual) + ") Ept() *session.Endpoint {\n" @@ -164,32 +123,24 @@ public Map build() // FIXME: factor out + "}\n" + "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out - //+ ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " *" + simpname + "\n" - + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " *session.Protocol\n" - /*+ this.apigen.actuals.get(r).keySet().stream() - .map(a -> - { - String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); - return actualName + "s map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName - + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + "\n"; - }).collect(Collectors.joining(""))*/ + + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " session.Protocol\n" + "*session.LinearResource\n" + "ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "params map[string]int\n" + "}\n" + "\n" - - - /*+ "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, addr, port string) error {\n" - + "ini.ept.Conn[rolename.Name()][id-1] = tcp.NewConnection(addr, port).Accept().(*tcp.Conn)\n" - + "return nil\n" + + + "func New(p session.Protocol, params map[string]int, self int) *" + epTypeName + "{\n" + + "conns := make(map[string]map[int]transport.Channel)\n" + + this.apigen.actuals.entrySet().stream() + .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + + "make(map[int]transport.Channel)\n") + .collect(Collectors.joining("")) + + "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, conns), params}\n" + "}\n" + "\n" - + "func (ini *" + epTypeName + ") Connect(rolename session.Role, id int, addr, port string) error {\n" - + "ini.ept.Conn[rolename.Name()][id-1] = tcp.NewConnection(addr, port).Connect()\n" - + "return nil\n" - + "}\n" - + "\n"*/ + + + "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, acceptor transport.Transport) error {\n" + "ini.ept.Conn[rolename.Name()][id] = acceptor.Accept()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error @@ -209,110 +160,24 @@ public Map build() // FIXME: factor out ")" + "(*_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "." + epTypeName + ") {\n" - /*+ "ep := &" + epTypeName + "{ " + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + ": p,\n" - - + this.apigen.actuals.get(r).keySet().stream() - .map(a -> - { - String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); - return actualName + "s: make(map[int] func(*" + simpname + "_" + actualName + "_1) *" // FIXME: init statechan, factor out with makeSTStateName - + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ")"; - }).collect(Collectors.joining(", ")) + ",\n" - + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ": " - + ParamCoreSTApiGenConstants.GO_ENDPOINT_CONSTRUCTOR + "(p, p." + r + ")}\n" - - + this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(r)) - .map(e -> - { - Map tmp = e.getValue(); - if (tmp.size() > 1) - { - throw new RuntimeException("[param-core] TODO: " + tmp); - } - ParamActualRole peer = tmp.keySet().iterator().next(); - ParamRange g = peer.ranges.iterator().next(); - Function foo = ee -> - { - if (ee instanceof ParamIndexInt) - { - return ee.toString(); - } - else if (ee instanceof ParamIndexVar) - { - return "ep.Params[\"" + ee + "\"]"; - } - else - { - throw new RuntimeException("[param-core] TODO: " + ee); - } - }; - return - "ep.Params = map[string]int {" + vars.stream().map(v -> "\"" + v + "\": " + v).collect(Collectors.joining(", ")) + "}\n" - + "ep.Peers[p." + peer.getName() + "] = struct{Start int; End int}{" + foo.apply(g.start) + ", " + foo.apply(g.end) + "}\n" - + "for i := ep." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Peers[p." + peer.getName() + "].Start; i <= ep.Peers[p." + peer.getName() + "].End; i++ {\n" - + "\tp." + peer.getName() + ".(session.ParamRole).Register(i)\n" - + "}\n"; - }).collect(Collectors.joining("")) - - + "return ep\n"*/ - //+ "conns := make(map[string][]transport.Channel)\n" - + "conns := make(map[string]map[int]transport.Channel)\n" - - - //+ this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(actual.getName())) - + this.apigen.actuals.entrySet().stream() - .map(e -> "conns[p." + e.getKey() + ".Name()] = " - /*+ "make([]transport.Channel, " - + e.getValue().keySet().iterator().next().ranges.iterator().next().end + "-" // FIXME: e.getValues().size() > 1 - + e.getValue().keySet().iterator().next().ranges.iterator().next().start + "+1)\n")*/ - + "make(map[int]transport.Channel)\n") - .collect(Collectors.joining("")) - + "params := make(map[string]int)\n" + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) - + "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, " //-1, - + "conns), params}\n" // FIXME: numRoles + //+ "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, " + "conns), params}\n" // FIXME: numRoles + + "return _" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".New" + "(p, params, self)\n" // FIXME: numRoles + "}\n"; - /*+ this.apigen.actuals.get(r).keySet().stream() - .map(a -> - { - String actualName = ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(a); - return - "\nfunc (ep *" + epTypeName + ") " - + "Register_" + actualName - + "(i int, impl func(*" + simpname + "_" + actualName + "_1) *" // FIXME: factor out with above - + ParamCoreSTStateChanApiBuilder.makeEndStateName(simpname, a) + ") {\n" - + "ep." + actualName + "s[i] = impl\n" - + "ep.Proto."+ r +".(session.ParamRole).Register(i)\n" - + "}\n"; - }).collect(Collectors.joining(""));*/ - epPack1 += - /*+ "\nfunc (ini *" + epTypeName + ") Init() (*" + epTypeName + "_1) {\n" - + "ini.Use()\n" - + "ini.ept.CheckConnection()\n" - + - ((this.apigen.actuals.get(rfoo).get(actual).init.getStateKind() == EStateKind.POLY_INPUT) - ? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" - : "return &" + epTypeName + "_1{&session.LinearResource{}, ini}\n")*/ "\nfunc (ini *" + epTypeName + ") Run(f func(*"//_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".Init)" + "Init)" - //+ " _" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".End" + ") " + "End" + ") " - //+ "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".End {\n" + "End {\n" + "ini.Use()\n" + "ini.ept.CheckConnection()\n" + ((this.apigen.actuals.get(rfoo).get(actual).init.getStateKind() == EStateKind.POLY_INPUT) ? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" - //: "return &_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".Init{&session.LinearResource{}, ini}\n") - : "return f(" //+ ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".New(ini))\n") - + "New(ini))\n") - - + : "return f(&Init{ new(session.LinearResource), ini })") + "}"; res.put(dir + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "/" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".go", diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java index 02388e7be..335c99955 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java @@ -162,7 +162,7 @@ protected String getStateChanPremable(EState s) { //Role r = this.actual.getName(); - GProtocolName simpname = this.apigen.proto.getSimpleName(); + //GProtocolName simpname = this.apigen.proto.getSimpleName(); String tname = this.getStateChanName(s); ////String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, this.actual); @@ -198,17 +198,15 @@ protected String getStateChanPremable(EState s) + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " session.ParamEndpoint" + "\n" // FIXME: factor out + "}\n"; - if (s.id == this.graph.init.id) + /*if (s.id == this.graph.init.id) { res += "\n" - /*+ "func (ep *" + epType + ") New" - + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1" // cf. makeSTStateName*/ + "func New" + "(ep session.ParamEndpoint) *" + tname + " {\n" // FIXME: factor out + "return &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")}\n" + "}"; - } + }*/ return res; } From 92a62b9ff25319f7f5b679f0a4b03601d0600009 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 10:23:56 +0100 Subject: [PATCH 202/433] Minor. --- .../codegen/statetype3/ParamCoreSTEndpointApiGenerator.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java index 960611f9d..6a82932b6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java @@ -109,11 +109,10 @@ public String generateScribbleRuntimeImports() - //public static String getGeneratedEndpointType(GProtocolName simpname, Role r) public static String getGeneratedEndpointTypeName(GProtocolName simpname, ParamActualRole r) { - //return "Endpoint_" + simpname + "_" + r; - return simpname + "_" + getGeneratedActualRoleName(r); + //return simpname + "_" + getGeneratedActualRoleName(r); + return getGeneratedActualRoleName(r); } // Doesn't use coranges -- same as getGeneratedParamRoleName? // Old From 32705adf7811dfc08dfaddf3868a032c45855913 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 10:26:03 +0100 Subject: [PATCH 203/433] Minor. --- .../core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java index a71965138..0405895b8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java @@ -153,7 +153,7 @@ public Map build() // FIXME: factor out + "\n"; String sessPack1 = - "func (p *" + simpname + ") New" + epTypeName + "func (p *" + simpname + ") New" + "_" + epTypeName + "(" + vars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + From 4f1b71a7ef1846a7d0b56ffc19202c2c0c7a8d10 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 10:40:32 +0100 Subject: [PATCH 204/433] Minor. --- .../ParamCoreSTEndStateBuilder.java | 6 +-- .../ParamCoreSTReceiveActionBuilder.java | 4 +- .../ParamCoreSTSendActionBuilder.java | 4 +- .../ParamCoreSTSessionApiBuilder.java | 39 ++++++++++--------- .../ParamCoreSTStateChanApiBuilder.java | 8 ++-- 5 files changed, 31 insertions(+), 30 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java index 69d092070..7d95a4d43 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java @@ -27,12 +27,12 @@ public String getPreamble(STStateChanApiBuilder api, EState s) //schangen.apigen.generateRootPackageDecl() + "\n" "package " + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(((ParamCoreSTStateChanApiBuilder) api).actual) + "\n" + "\n" - + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "\n" + "type " + tname + " struct {\n" + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - //+ " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out - + " session.ParamEndpoint" + "\n" // FIXME: factor out + + " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out + //+ " session.ParamEndpoint" + "\n" // FIXME: factor out + "}"; return res; // No LinearResource } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java index 501260a14..6042a19b0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java @@ -48,7 +48,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Ept()" + + ".Ept" + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; /*String sEpProto = @@ -67,7 +67,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES else if (e instanceof ParamIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params()[\"" + e + "\"]"; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java index 3fb1fb42c..95635a6e9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java @@ -56,7 +56,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES //s.ep.Write ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Ept()" + + ".Ept" //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; + ".Conn"; /*String sEpProto = @@ -75,7 +75,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES else if (e instanceof ParamIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params()[\"" + e + "\"]"; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java index 0405895b8..a65aec29c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java @@ -57,7 +57,7 @@ public Map build() // FIXME: factor out String sessPack = this.apigen.generateRootPackageDecl() + "\n" + "\n" - + this.apigen.generateScribbleRuntimeImports() + "\n" + //+ this.apigen.generateScribbleRuntimeImports() + "\n" //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n" + (roles.stream().map(rfoo -> @@ -74,14 +74,14 @@ public Map build() // FIXME: factor out sessPack += "\n" + "type " + simpname + " struct {\n" - + roles.stream().map(r -> r + " " + ParamCoreSTApiGenConstants.GO_ROLE_TYPE + "\n").collect(Collectors.joining("")) + //+ roles.stream().map(r -> r + " " + ParamCoreSTApiGenConstants.GO_ROLE_TYPE + "\n").collect(Collectors.joining("")) // Just need role name constants for now -- params not fixed until endpoint creation + "}\n" + "\n" - + "func New" + simpname + "() *" + simpname + " {\n" - + "return &" + simpname + "{ " + roles.stream().map(r -> ParamCoreSTApiGenConstants.GO_ROLE_CONSTRUCTOR - + "(\"" + r + "\")").collect(Collectors.joining(", ")) + " }\n" + + "func New_" + simpname + "() *" + simpname + " {\n" + //+ "return &" + simpname + "{ " + roles.stream().map(r -> ParamCoreSTApiGenConstants.GO_ROLE_CONSTRUCTOR + "(\"" + r + "\")").collect(Collectors.joining(", ")) + " }\n" // Singleton types? + + "return &" + simpname + "{ }\n" + "}\n" + "\n" + "func (*" + simpname +") IsProtocol() {\n" @@ -114,21 +114,22 @@ public Map build() // FIXME: factor out String epPack1 = - "\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, actual) + ") Ept() *session.Endpoint {\n" + "\ntype " + epTypeName + " struct {\n" // FIXME: factor out + + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " session.Protocol\n" + + "*session.LinearResource\n" + + "Ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + "Params map[string]int\n" + + "}\n" + + "\n" + + /*+ "\n\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, actual) + ") Ept() *session.Endpoint {\n" + "return p.ept\n" + "}\n" + "\n" + "\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, actual) + ") Params() map[string]int {\n" + "return p.params\n" - + "}\n" + + "}\n"*/ - + "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out - + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " session.Protocol\n" - + "*session.LinearResource\n" - + "ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" - + "params map[string]int\n" - + "}\n" - + "\n" + "func New(p session.Protocol, params map[string]int, self int) *" + epTypeName + "{\n" + "conns := make(map[string]map[int]transport.Channel)\n" @@ -141,13 +142,13 @@ public Map build() // FIXME: factor out + "\n" - + "func (ini *" + epTypeName + ") Accept(rolename session.Role, id int, acceptor transport.Transport) error {\n" - + "ini.ept.Conn[rolename.Name()][id] = acceptor.Accept()\n" + + "func (ini *" + epTypeName + ") Accept(rolename string, id int, acceptor transport.Transport) error {\n" + + "ini.Ept.Conn[rolename][id] = acceptor.Accept()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n" - + "func (ini *" + epTypeName + ") Request(rolename session.Role, id int, requestor transport.Transport) error {\n" - + "ini.ept.Conn[rolename.Name()][id] = requestor.Connect()\n" + + "func (ini *" + epTypeName + ") Dial(rolename string, id int, requestor transport.Transport) error {\n" + + "ini.Ept.Conn[rolename][id] = requestor.Connect()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n"; @@ -173,7 +174,7 @@ public Map build() // FIXME: factor out + "End" + ") " + "End {\n" + "ini.Use()\n" - + "ini.ept.CheckConnection()\n" + + "ini.Ept.CheckConnection()\n" + ((this.apigen.actuals.get(rfoo).get(actual).init.getStateKind() == EStateKind.POLY_INPUT) ? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java index 335c99955..4da55bdc7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java @@ -162,10 +162,10 @@ protected String getStateChanPremable(EState s) { //Role r = this.actual.getName(); - //GProtocolName simpname = this.apigen.proto.getSimpleName(); + GProtocolName simpname = this.apigen.proto.getSimpleName(); String tname = this.getStateChanName(s); ////String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, this.actual); + String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, this.actual); String res = //this.apigen.generateRootPackageDecl() + "\n" @@ -194,8 +194,8 @@ protected String getStateChanPremable(EState s) + "\n" + "type " + tname + " struct {\n" + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" - //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " session.ParamEndpoint" + "\n" // FIXME: factor out + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " session.ParamEndpoint" + "\n" // FIXME: factor out + "}\n"; /*if (s.id == this.graph.init.id) From a680d2beb44039ff1a124b4e19f35c49979b26e2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 10:49:57 +0100 Subject: [PATCH 205/433] Continued revising param-core API gen. --- .../codegen/statetype3/ParamCoreSTSessionApiBuilder.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java index a65aec29c..bdf70bd05 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java @@ -78,7 +78,7 @@ public Map build() // FIXME: factor out // Just need role name constants for now -- params not fixed until endpoint creation + "}\n" + "\n" - + "func New_" + simpname + "() *" + simpname + " {\n" + + "func New() *" + simpname + " {\n" //+ "return &" + simpname + "{ " + roles.stream().map(r -> ParamCoreSTApiGenConstants.GO_ROLE_CONSTRUCTOR + "(\"" + r + "\")").collect(Collectors.joining(", ")) + " }\n" // Singleton types? + "return &" + simpname + "{ }\n" @@ -116,6 +116,7 @@ public Map build() // FIXME: factor out "\ntype " + epTypeName + " struct {\n" // FIXME: factor out + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " session.Protocol\n" + + "Self int\n" + "*session.LinearResource\n" + "Ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "Params map[string]int\n" @@ -137,7 +138,7 @@ public Map build() // FIXME: factor out .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + "make(map[int]transport.Channel)\n") .collect(Collectors.joining("")) - + "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, conns), params}\n" + + "return &" + epTypeName + "{p, self, &session.LinearResource{}, session.NewEndpoint(self, conns), params}\n" + "}\n" + "\n" From 0df6a694fa4af622959f5d325fbd18794108edb6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 10:57:17 +0100 Subject: [PATCH 206/433] Minor. --- .../ParamCoreSTReceiveActionBuilder.java | 3 +- .../ParamCoreSTSendActionBuilder.java | 60 +------------------ 2 files changed, 4 insertions(+), 59 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java index 6042a19b0..fb34f2e90 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java @@ -22,7 +22,8 @@ public class ParamCoreSTReceiveActionBuilder extends STReceiveActionBuilder @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + return //ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + "Gather_" // FIXME: make unary Receive special case + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + "_" + a.mid; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java index 95635a6e9..f420c80f6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java @@ -23,7 +23,8 @@ public class ParamCoreSTSendActionBuilder extends STSendActionBuilder @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" + return //ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" + "Scatter_" // FIXME: make unary Send special case + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -83,63 +84,6 @@ else if (e instanceof ParamIndexVar) } }; - /*String res = - (((GoJob) api.job).noCopy - ? - "labels := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" - + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" - + "tmp := \"" + a.mid + "\"\n" - + "\tlabels[i-" + foo.apply(g.start) + "] = &tmp\n" - + "}\n" - : - "labels := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" - + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" - + "\tlabels[i-" + foo.apply(g.start) + "] = []byte(\"" + a.mid + "\")\n" - + "}\n") - - + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") - + "(" + sEpProto + "." + r.getName() + ", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " - + "labels)\n"; - - if (!a.payload.elems.isEmpty()) - { - if (a.payload.elems.size() > 1) - { - throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); - } - res += - (((GoJob) api.job).noCopy - ? - "b := make([]interface{}, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" - + "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end)+"; i++ {\n" - + "tmp := splitFn0(arg0, i)\n" - + "\tb[i-"+foo.apply(g.start)+"] = &tmp\n" - + "}\n" - : - "b := make([][]byte, " + foo.apply(g.end) + "-" + foo.apply(g.start) + "+1)\n" - + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" - + "\tvar buf bytes.Buffer\n" - + "\tif err := gob.NewEncoder(&buf).Encode(splitFn0(arg0, i)); err != nil {\n\t\t" // only arg0 - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Errors <- session.SerialiseFailed(err, \"" + getActionName(api, a) +"\", " - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Self.Name())\n" - + "\t}\n" - + "\tb[i-"+foo.apply(g.start)+"] = buf.Bytes()\n" - + "}\n") - - + sEpWrite + (((GoJob) api.job).noCopy ? "Raw" : "") - + "(" + sEpProto - + "." + r.getName() + ", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " - //+ "\"" + a.mid + "\"" - + "b" - + ")\n"; - }*/ - // FIXME: single arg // Currently never true because of ParamCoreSTOutputStateBuilder boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem From cc18326786a86227c5adf8540ce837a92f56cacf Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 11:00:16 +0100 Subject: [PATCH 207/433] Minor. --- .../core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java | 2 +- .../go/core/codegen/statetype2/ParamCoreSTEndStateBuilder.java | 1 - .../core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index a78d265a3..57bc6e52a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -39,7 +39,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) //return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; - Role r = apigen.actual.getName(); + //Role r = apigen.actual.getName(); GProtocolName simpname = apigen.apigen.proto.getSimpleName(); String tname = apigen.getStateChanName(s); //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndStateBuilder.java index d6eed153f..25ee036cb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndStateBuilder.java @@ -1,6 +1,5 @@ package org.scribble.ext.go.core.codegen.statetype2; -import org.scribble.codegen.java.endpointapi.ApiGen; import org.scribble.codegen.statetype.STEndStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.model.endpoint.EState; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java index 6d2921d63..c3e778bd6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java @@ -39,7 +39,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) //return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; - Role r = apigen.actual.getName(); + //Role r = apigen.actual.getName(); GProtocolName simpname = apigen.apigen.proto.getSimpleName(); String tname = apigen.getStateChanName(s); //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); From 410d4396da40b4d47815bc13e06ab3db977e72c1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 11:00:39 +0100 Subject: [PATCH 208/433] Minor. --- .../core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java | 1 - .../core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java | 1 - 2 files changed, 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index 57bc6e52a..5b97ad98b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -15,7 +15,6 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.endpoint.actions.EReceive; import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; public class ParamCoreSTBranchStateBuilder extends STBranchStateBuilder { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java index c3e778bd6..1e84518ec 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java @@ -15,7 +15,6 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.endpoint.actions.EReceive; import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; public class ParamCoreSTBranchStateBuilder extends STBranchStateBuilder { From 20482777dd910a8f89d381c863959bf0ce0bca5a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 11:21:31 +0100 Subject: [PATCH 209/433] Minor. --- .../scribble/ext/go/core/cli/ParamCoreCLArgParser.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java index f98e6f668..ffdea258f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java @@ -76,7 +76,7 @@ protected int parseFlag(int i) throws CommandLineException // Non-unique flags case ParamCoreCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); case ParamCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); - case ParamCoreCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParseRoleAndPathArgs(flag, i); + case ParamCoreCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParsePackagePathAndRoleArgs(flag, i); // Base CL @@ -140,16 +140,16 @@ protected int paramParseRoleAndFileArgs(String f, int i) throws CommandLineExcep return i; } - // path is absolute import path - protected int paramParseRoleAndPathArgs(String f, int i) throws CommandLineException + // path is absolute package path prefix for API imports + protected int paramParsePackagePathAndRoleArgs(String f, int i) throws CommandLineException { ParamCoreCLArgFlag flag = ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); if ((i + 2) >= this.args.length) { throw new CommandLineException("Missing role/path arguments"); } - String role = this.args[++i]; String path = this.args[++i]; + String role = this.args[++i]; goConcatArgs(flag, role, path); return i; } From aaa216b457f80f61f075f9e4cf6028e878747e69 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 11:38:16 +0100 Subject: [PATCH 210/433] Continued revising param-core API gen. --- .../ParamCoreSTBranchActionBuilder.java | 55 ++----------------- .../ParamCoreSTBranchStateBuilder.java | 20 ++++--- .../ParamCoreSTSessionApiBuilder.java | 5 +- .../ParamCoreSTStateChanApiBuilder.java | 3 +- 4 files changed, 24 insertions(+), 59 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java index eb7dd003b..a7c2dfc40 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java @@ -59,36 +59,6 @@ public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { - /*String sEpRecv = - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; - String sEpProto = - //"s.ep.Proto" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; - /*String sEpErr = - //"s.ep.Err" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ - - /*ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> - { - if (e instanceof ParamIndexInt) - { - return e.toString(); - } - else if (e instanceof ParamIndexVar) - { - return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; - } - else - { - throw new RuntimeException("[param-core] TODO: " + e); - } - };*/ - if(a.payload.elems.size() > 1) { throw new RuntimeException("[param-core] TODO: " + a); @@ -103,21 +73,6 @@ else if (e instanceof ParamIndexVar) } String res = - /*sEpRecv - + "(" + sEpProto - + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " - + "\"" + a.mid + "\")\n" - + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " - + "arg" + i + ")") - .collect(Collectors.joining("\n")) + "\n" - /*+ "if " + sEpErr + " != nil {\n" - + "return nil\n" - + "}\n"*/ - //buildReturn(api, curr, succ); - //"ch, selected := <-s._" + a.mid + "_Chan\n" "_, selected := <-s._" + a.mid + "_Chan\n" + "if !selected {\n" + "\treturn nil // select ignores nilchan\n" @@ -144,12 +99,13 @@ else if (e instanceof ParamIndexVar) String sEpRecv = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + + ".Ept"; //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; - String sEpProto = + /*String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; String sEp = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; @@ -183,7 +139,8 @@ else if (e instanceof ParamIndexVar) res += "if err := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") - + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "].Recv(&arg0); err != nil {\n" + //+ ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "].Recv(&arg0); err != nil {\n" + + ".Conn[\"" + peer.getName() + "\"][" + foo.apply(g.start) + "].Recv(&arg0); err != nil {\n" + "log.Fatal(err)\n" + "}\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java index 1e84518ec..003bb84a9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java @@ -5,6 +5,7 @@ import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.type.ParamActualRole; import org.scribble.ext.go.core.type.ParamRange; import org.scribble.ext.go.core.type.ParamRole; import org.scribble.ext.go.main.GoJob; @@ -26,15 +27,18 @@ public ParamCoreSTBranchStateBuilder(ParamCoreSTBranchActionBuilder bb) @Override public String getPreamble(STStateChanApiBuilder api, EState s) { + ParamActualRole actual = ((ParamCoreSTStateChanApiBuilder) api).actual; + String sEpRecv = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + + ".Ept"; //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; - String sEpProto = + /*String sEpProto = //"s.ep.Proto" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ //return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; @@ -44,7 +48,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, apigen.actual); String res = - apigen.apigen.generateRootPackageDecl() + "\n" + //apigen.apigen.generateRootPackageDecl() + "\n" + "package " + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "\n" + "\n" + apigen.apigen.generateScribbleRuntimeImports() + "\n" + "import \"log\"\n" @@ -67,7 +72,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) res += "\n" + "func (ep *" + epType + ") New" + ((s.id != api.graph.init.id) ? tname - : ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(((ParamCoreSTStateChanApiBuilder) api).actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + //: ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + : "Init") + "() *" + tname + " {\n" // FIXME: factor out + "s := &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " @@ -113,14 +119,14 @@ else if (e instanceof ParamIndexVar) if (((GoJob) apigen.job).noCopy) { res += - "label := " + sEpRecv + "Raw(" + sEpProto + "." + peer.getName() + ", " + "label := " + sEpRecv + "Raw(\"" + peer.getName() + "\", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" + "op := *label[0].(*string)\n"; // FIXME: cast for safety? } else { res += - "if err := " + sEpRecv + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + "if err := " + sEpRecv + ".Conn[\"" + peer.getName() + "\"][" + foo.apply(g.start) + "].Recv(&op); err != nil {\n" // g.end = g.start + "log.Fatal(err)\n" + "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java index bdf70bd05..8cbaaf075 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java @@ -178,8 +178,9 @@ public Map build() // FIXME: factor out + "ini.Ept.CheckConnection()\n" + ((this.apigen.actuals.get(rfoo).get(actual).init.getStateKind() == EStateKind.POLY_INPUT) - ? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" - : "return f(&Init{ new(session.LinearResource), ini })") + //? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" + ? "return f(ini.NewInit())\n" + : "return f(&Init{ new(session.LinearResource), ini })\n") + "}"; res.put(dir + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "/" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".go", diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java index 4da55bdc7..1df7f517f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java @@ -266,7 +266,8 @@ public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, Str "New" //+ getStateChanName(succ) + ((succ.id != this.graph.init.id) ? getStateChanName(succ) - : ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + //: ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + : "Init") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + "()"; } else From a13e70cf32416487e3284bf934b3ad8dff6778da Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 11:40:18 +0100 Subject: [PATCH 211/433] Continued revising param-core API gen. --- ...ctionBuilder.java => ParamCoreSTSelectActionBuilder.java} | 3 ++- ...hStateBuilder.java => ParamCoreSTSelectStateBuilder.java} | 5 +++-- .../codegen/statetype3/ParamCoreSTStateChanApiBuilder.java | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTBranchActionBuilder.java => ParamCoreSTSelectActionBuilder.java} (97%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTBranchStateBuilder.java => ParamCoreSTSelectStateBuilder.java} (97%) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectActionBuilder.java similarity index 97% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectActionBuilder.java index a7c2dfc40..d1be03469 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectActionBuilder.java @@ -17,7 +17,8 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; -public class ParamCoreSTBranchActionBuilder extends STBranchActionBuilder +// N.B. Select means Go select statement for input-choice; not output-choice +public class ParamCoreSTSelectActionBuilder extends STBranchActionBuilder { /*@Override public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectStateBuilder.java similarity index 97% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectStateBuilder.java index 003bb84a9..509a3b999 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectStateBuilder.java @@ -17,9 +17,10 @@ import org.scribble.model.endpoint.actions.EReceive; import org.scribble.type.name.GProtocolName; -public class ParamCoreSTBranchStateBuilder extends STBranchStateBuilder +// N.B. Select means Go select statement for input-choice; not output-choice +public class ParamCoreSTSelectStateBuilder extends STBranchStateBuilder { - public ParamCoreSTBranchStateBuilder(ParamCoreSTBranchActionBuilder bb) + public ParamCoreSTSelectStateBuilder(ParamCoreSTSelectActionBuilder bb) { super(bb); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java index 1df7f517f..797aee805 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java @@ -87,7 +87,7 @@ public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, Pa super(apigen.job, apigen.proto, apigen.self, graph, new ParamCoreSTOutputStateBuilder(new ParamCoreSTSplitActionBuilder(), new ParamCoreSTSendActionBuilder()), new ParamCoreSTReceiveStateBuilder(new ParamCoreSTReduceActionBuilder(), new ParamCoreSTReceiveActionBuilder()), - new ParamCoreSTBranchStateBuilder(new ParamCoreSTBranchActionBuilder()), + new ParamCoreSTSelectStateBuilder(new ParamCoreSTSelectActionBuilder()), null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), new ParamCoreSTEndStateBuilder()); From 379a56b2b33089bfeb048b17a736e2f6d3050598 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 14:03:57 +0100 Subject: [PATCH 212/433] Renamed Param prefix to RP. --- .../scribble/ext/go/ast/ParamAstFactory.java | 42 ---- .../ext/go/ast/ParamAstFactoryImpl.java | 141 ------------- .../org/scribble/ext/go/ast/RPAstFactory.java | 42 ++++ .../scribble/ext/go/ast/RPAstFactoryImpl.java | 141 +++++++++++++ .../{ParamRoleDecl.java => RPRoleDecl.java} | 34 ++-- .../{ParamGChoice.java => RPGChoice.java} | 26 +-- ...sfer.java => RPGCrossMessageTransfer.java} | 26 +-- ...ansfer.java => RPGDotMessageTransfer.java} | 26 +-- ...eTransfer.java => RPGMessageTransfer.java} | 22 +-- ...MultiChoices.java => RPGMultiChoices.java} | 36 ++-- ...sfer.java => RPGMultiChoicesTransfer.java} | 36 ++-- .../ast/name/simple/ParamRoleParamNode.java | 65 ------ .../go/ast/name/simple/RPRoleParamNode.java | 65 ++++++ .../scribble/ext/go/cli/GoCommandLine.java | 8 +- .../ext/go/core/ast/ParamCoreAstFactory.java | 133 ------------- ...eActionKind.java => RPCoreActionKind.java} | 2 +- .../ext/go/core/ast/RPCoreAstFactory.java | 133 +++++++++++++ ...ParamCoreChoice.java => RPCoreChoice.java} | 20 +- ...oreDelegDecl.java => RPCoreDelegDecl.java} | 18 +- .../ast/{ParamCoreEnd.java => RPCoreEnd.java} | 6 +- ...ramCoreMessage.java => RPCoreMessage.java} | 8 +- .../ast/{ParamCoreRec.java => RPCoreRec.java} | 8 +- ...ParamCoreRecVar.java => RPCoreRecVar.java} | 8 +- ...eption.java => RPCoreSyntaxException.java} | 12 +- .../{ParamCoreType.java => RPCoreType.java} | 2 +- .../go/core/ast/global/ParamCoreGType.java | 26 --- ...ActionKind.java => RPCoreGActionKind.java} | 4 +- ...ramCoreGChoice.java => RPCoreGChoice.java} | 130 ++++++------ .../{ParamCoreGEnd.java => RPCoreGEnd.java} | 26 +-- ...iChoices.java => RPCoreGMultiChoices.java} | 74 +++---- ...ava => RPCoreGProtocolDeclTranslator.java} | 186 +++++++++--------- .../{ParamCoreGRec.java => RPCoreGRec.java} | 36 ++-- ...ramCoreGRecVar.java => RPCoreGRecVar.java} | 24 +-- .../ext/go/core/ast/global/RPCoreGType.java | 26 +++ .../ext/go/core/ast/local/ParamCoreLType.java | 10 - ...ActionKind.java => RPCoreLActionKind.java} | 4 +- ...ramCoreLChoice.java => RPCoreLChoice.java} | 18 +- ...ossChoice.java => RPCoreLCrossChoice.java} | 14 +- ...eLDotChoice.java => RPCoreLDotChoice.java} | 22 +-- .../{ParamCoreLEnd.java => RPCoreLEnd.java} | 12 +- ...iChoices.java => RPCoreLMultiChoices.java} | 26 +-- .../{ParamCoreLRec.java => RPCoreLRec.java} | 10 +- ...ramCoreLRecVar.java => RPCoreLRecVar.java} | 10 +- .../ext/go/core/ast/local/RPCoreLType.java | 10 + ...oreCLArgFlag.java => RPCoreCLArgFlag.java} | 2 +- ...LArgParser.java => RPCoreCLArgParser.java} | 54 ++--- ...ommandLine.java => RPCoreCommandLine.java} | 134 ++++++------- .../ParamCoreSTBranchActionBuilder.java | 4 +- .../ParamCoreSTBranchStateBuilder.java | 20 +- .../ParamCoreSTEndpointApiGenerator.java | 16 +- .../ParamCoreSTReceiveActionBuilder.java | 24 +-- .../ParamCoreSTSendActionBuilder.java | 24 +-- .../ParamCoreSTSessionApiBuilder.java | 28 +-- .../ParamCoreSTStateChanApiBuilder.java | 40 ++-- .../ParamCoreSTBranchActionBuilder.java | 24 +-- .../ParamCoreSTBranchStateBuilder.java | 20 +- .../ParamCoreSTEndpointApiGenerator.java | 14 +- .../ParamCoreSTReceiveActionBuilder.java | 24 +-- .../ParamCoreSTReduceActionBuilder.java | 24 +-- .../ParamCoreSTSendActionBuilder.java | 24 +-- .../ParamCoreSTSessionApiBuilder.java | 14 +- .../ParamCoreSTSplitActionBuilder.java | 24 +-- .../ParamCoreSTStateChanApiBuilder.java | 44 ++--- ...ants.java => RPCoreSTApiGenConstants.java} | 2 +- ...nerator.java => RPCoreSTApiGenerator.java} | 63 +++--- ...lder.java => RPCoreSTEndStateBuilder.java} | 12 +- ...r.java => RPCoreSTOutputStateBuilder.java} | 10 +- ...java => RPCoreSTReceiveActionBuilder.java} | 44 ++--- ....java => RPCoreSTReceiveStateBuilder.java} | 10 +- ....java => RPCoreSTReduceActionBuilder.java} | 70 +++---- ....java => RPCoreSTSelectActionBuilder.java} | 44 ++--- ...r.java => RPCoreSTSelectStateBuilder.java} | 55 +++--- ...er.java => RPCoreSTSendActionBuilder.java} | 42 ++-- ...er.java => RPCoreSTSessionApiBuilder.java} | 45 ++--- ...r.java => RPCoreSTSplitActionBuilder.java} | 62 +++--- ....java => RPCoreSTStateChanApiBuilder.java} | 93 ++++----- ...oreException.java => RPCoreException.java} | 14 +- ...ainContext.java => RPCoreMainContext.java} | 30 +-- .../endpoint/ParamCoreEModelFactory.java | 25 --- .../endpoint/ParamCoreEModelFactoryImpl.java | 64 ------ ...hBuilder.java => RPCoreEGraphBuilder.java} | 76 +++---- .../model/endpoint/RPCoreEModelFactory.java | 25 +++ .../endpoint/RPCoreEModelFactoryImpl.java | 64 ++++++ .../endpoint/action/ParamCoreEAction.java | 9 - .../model/endpoint/action/RPCoreEAction.java | 9 + ...sReceive.java => RPCoreECrossReceive.java} | 18 +- ...eECrossSend.java => RPCoreECrossSend.java} | 18 +- ...DotReceive.java => RPCoreEDotReceive.java} | 34 ++-- ...mCoreEDotSend.java => RPCoreEDotSend.java} | 34 ++-- ...e.java => RPCoreEMultiChoicesReceive.java} | 20 +- .../{ParamRole.java => RPIndexedRole.java} | 14 +- .../type/{ParamRange.java => RPInterval.java} | 18 +- ...aramActualRole.java => RPRoleVariant.java} | 12 +- ...ParamGChoiceDel.java => RPGChoiceDel.java} | 10 +- ...ferDel.java => RPGMessageTransferDel.java} | 4 +- ...hoicesDel.java => RPGMultiChoicesDel.java} | 10 +- ...bParser.java => RPAntlrToScribParser.java} | 40 ++-- ...apper.java => RPScribbleAntlrWrapper.java} | 2 +- ...mAntlrGChoice.java => RPAntlrGChoice.java} | 14 +- ...Choices.java => RPAntlrGMultiChoices.java} | 18 +- ...ntlrRoleDecl.java => RPAntlrRoleDecl.java} | 14 +- ...legDecl.java => RPCoreAntlrDelegDecl.java} | 10 +- ...ntlrModule.java => RPCoreAntlrModule.java} | 2 +- ...java => RPAntlrGCrossMessageTransfer.java} | 22 +-- ...r.java => RPAntlrGDotMessageTransfer.java} | 22 +-- ...java => RPAntlrGMultiChoicesTransfer.java} | 22 +-- .../ast/index/ParamAntlrIndexExpr.java | 47 ----- .../scribble/ast/index/RPAntlrIndexExpr.java | 47 +++++ .../ast/name/ParamAntlrSimpleName.java | 8 +- .../ext/go/type/index/ParamIndexFactory.java | 21 -- ...mBinIndexExpr.java => RPBinIndexExpr.java} | 18 +- .../{ParamIndexExpr.java => RPIndexExpr.java} | 8 +- .../ext/go/type/index/RPIndexFactory.java | 21 ++ .../{ParamIndexInt.java => RPIndexInt.java} | 12 +- .../{ParamIndexVar.java => RPIndexVar.java} | 20 +- ...oleParamKind.java => RPRoleParamKind.java} | 12 +- .../{ParamRoleParam.java => RPRoleParam.java} | 16 +- 117 files changed, 1863 insertions(+), 1879 deletions(-) delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java rename scribble-go/src/main/java/org/scribble/ext/go/ast/{ParamRoleDecl.java => RPRoleDecl.java} (61%) rename scribble-go/src/main/java/org/scribble/ext/go/ast/global/{ParamGChoice.java => RPGChoice.java} (68%) rename scribble-go/src/main/java/org/scribble/ext/go/ast/global/{ParamGCrossMessageTransfer.java => RPGCrossMessageTransfer.java} (59%) rename scribble-go/src/main/java/org/scribble/ext/go/ast/global/{ParamGDotMessageTransfer.java => RPGDotMessageTransfer.java} (59%) rename scribble-go/src/main/java/org/scribble/ext/go/ast/global/{ParamGMessageTransfer.java => RPGMessageTransfer.java} (69%) rename scribble-go/src/main/java/org/scribble/ext/go/ast/global/{ParamGMultiChoices.java => RPGMultiChoices.java} (62%) rename scribble-go/src/main/java/org/scribble/ext/go/ast/global/{ParamGMultiChoicesTransfer.java => RPGMultiChoicesTransfer.java} (63%) delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPRoleParamNode.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/{ParamCoreActionKind.java => RPCoreActionKind.java} (59%) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/{ParamCoreChoice.java => RPCoreChoice.java} (63%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/{ParamCoreDelegDecl.java => RPCoreDelegDecl.java} (55%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/{ParamCoreEnd.java => RPCoreEnd.java} (65%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/{ParamCoreMessage.java => RPCoreMessage.java} (80%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/{ParamCoreRec.java => RPCoreRec.java} (78%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/{ParamCoreRecVar.java => RPCoreRecVar.java} (72%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/{ParamCoreSyntaxException.java => RPCoreSyntaxException.java} (67%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/{ParamCoreType.java => RPCoreType.java} (81%) delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/{ParamCoreGActionKind.java => RPCoreGActionKind.java} (73%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/{ParamCoreGChoice.java => RPCoreGChoice.java} (63%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/{ParamCoreGEnd.java => RPCoreGEnd.java} (51%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/{ParamCoreGMultiChoices.java => RPCoreGMultiChoices.java} (73%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/{ParamCoreGProtocolDeclTranslator.java => RPCoreGProtocolDeclTranslator.java} (69%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/{ParamCoreGRec.java => RPCoreGRec.java} (50%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/{ParamCoreGRecVar.java => RPCoreGRecVar.java} (56%) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/{ParamCoreLActionKind.java => RPCoreLActionKind.java} (83%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/{ParamCoreLChoice.java => RPCoreLChoice.java} (62%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/{ParamCoreLCrossChoice.java => RPCoreLCrossChoice.java} (53%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/{ParamCoreLDotChoice.java => RPCoreLDotChoice.java} (53%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/{ParamCoreLEnd.java => RPCoreLEnd.java} (53%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/{ParamCoreLMultiChoices.java => RPCoreLMultiChoices.java} (52%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/{ParamCoreLRec.java => RPCoreLRec.java} (65%) rename scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/{ParamCoreLRecVar.java => RPCoreLRecVar.java} (62%) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java rename scribble-go/src/main/java/org/scribble/ext/go/core/cli/{ParamCoreCLArgFlag.java => RPCoreCLArgFlag.java} (85%) rename scribble-go/src/main/java/org/scribble/ext/go/core/cli/{ParamCoreCLArgParser.java => RPCoreCLArgParser.java} (60%) rename scribble-go/src/main/java/org/scribble/ext/go/core/cli/{ParamCoreCommandLine.java => RPCoreCommandLine.java} (75%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTApiGenConstants.java => RPCoreSTApiGenConstants.java} (98%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTEndpointApiGenerator.java => RPCoreSTApiGenerator.java} (58%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTEndStateBuilder.java => RPCoreSTEndStateBuilder.java} (62%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTOutputStateBuilder.java => RPCoreSTOutputStateBuilder.java} (78%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTReceiveActionBuilder.java => RPCoreSTReceiveActionBuilder.java} (79%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTReceiveStateBuilder.java => RPCoreSTReceiveStateBuilder.java} (72%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTReduceActionBuilder.java => RPCoreSTReduceActionBuilder.java} (73%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTSelectActionBuilder.java => RPCoreSTSelectActionBuilder.java} (75%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTSelectStateBuilder.java => RPCoreSTSelectStateBuilder.java} (74%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTSendActionBuilder.java => RPCoreSTSendActionBuilder.java} (72%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTSessionApiBuilder.java => RPCoreSTSessionApiBuilder.java} (76%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTSplitActionBuilder.java => RPCoreSTSplitActionBuilder.java} (70%) rename scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/{ParamCoreSTStateChanApiBuilder.java => RPCoreSTStateChanApiBuilder.java} (76%) rename scribble-go/src/main/java/org/scribble/ext/go/core/main/{ParamCoreException.java => RPCoreException.java} (65%) rename scribble-go/src/main/java/org/scribble/ext/go/core/main/{ParamCoreMainContext.java => RPCoreMainContext.java} (60%) delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java rename scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/{ParamCoreEGraphBuilder.java => RPCoreEGraphBuilder.java} (59%) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEAction.java rename scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/{ParamCoreECrossReceive.java => RPCoreECrossReceive.java} (65%) rename scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/{ParamCoreECrossSend.java => RPCoreECrossSend.java} (65%) rename scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/{ParamCoreEDotReceive.java => RPCoreEDotReceive.java} (63%) rename scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/{ParamCoreEDotSend.java => RPCoreEDotSend.java} (65%) rename scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/{ParamCoreEMultiChoicesReceive.java => RPCoreEMultiChoicesReceive.java} (78%) rename scribble-go/src/main/java/org/scribble/ext/go/core/type/{ParamRole.java => RPIndexedRole.java} (81%) rename scribble-go/src/main/java/org/scribble/ext/go/core/type/{ParamRange.java => RPInterval.java} (74%) rename scribble-go/src/main/java/org/scribble/ext/go/core/type/{ParamActualRole.java => RPRoleVariant.java} (77%) rename scribble-go/src/main/java/org/scribble/ext/go/del/global/{ParamGChoiceDel.java => RPGChoiceDel.java} (77%) rename scribble-go/src/main/java/org/scribble/ext/go/del/global/{ParamGMessageTransferDel.java => RPGMessageTransferDel.java} (89%) rename scribble-go/src/main/java/org/scribble/ext/go/del/global/{ParamGMultiChoicesDel.java => RPGMultiChoicesDel.java} (76%) rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/{ParamAntlrToScribParser.java => RPAntlrToScribParser.java} (56%) rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/{ParamScribbleAntlrWrapper.java => RPScribbleAntlrWrapper.java} (91%) rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/{ParamAntlrGChoice.java => RPAntlrGChoice.java} (73%) rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/{ParamAntlrGMultiChoices.java => RPAntlrGMultiChoices.java} (74%) rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/{ParamAntlrRoleDecl.java => RPAntlrRoleDecl.java} (79%) rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/{ParamCoreAntlrDelegDecl.java => RPCoreAntlrDelegDecl.java} (76%) rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/{ParamCoreAntlrModule.java => RPCoreAntlrModule.java} (99%) rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/{ParamAntlrGCrossMessageTransfer.java => RPAntlrGCrossMessageTransfer.java} (76%) rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/{ParamAntlrGDotMessageTransfer.java => RPAntlrGDotMessageTransfer.java} (76%) rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/{ParamAntlrGMultiChoicesTransfer.java => RPAntlrGMultiChoicesTransfer.java} (71%) delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexFactory.java rename scribble-go/src/main/java/org/scribble/ext/go/type/index/{ParamBinIndexExpr.java => RPBinIndexExpr.java} (81%) rename scribble-go/src/main/java/org/scribble/ext/go/type/index/{ParamIndexExpr.java => RPIndexExpr.java} (77%) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java rename scribble-go/src/main/java/org/scribble/ext/go/type/index/{ParamIndexInt.java => RPIndexInt.java} (78%) rename scribble-go/src/main/java/org/scribble/ext/go/type/index/{ParamIndexVar.java => RPIndexVar.java} (70%) rename scribble-go/src/main/java/org/scribble/ext/go/type/kind/{ParamRoleParamKind.java => RPRoleParamKind.java} (56%) rename scribble-go/src/main/java/org/scribble/ext/go/type/name/{ParamRoleParam.java => RPRoleParam.java} (68%) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java deleted file mode 100644 index 438b4e8ef..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.scribble.ext.go.ast; - -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.MessageNode; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ext.go.ast.global.ParamGChoice; -import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; -import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; -import org.scribble.ext.go.ast.global.ParamGMultiChoices; -import org.scribble.ext.go.ast.global.ParamGMultiChoicesTransfer; -import org.scribble.ext.go.core.ast.ParamCoreDelegDecl; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexVar; - - -public interface ParamAstFactory extends AstFactory -{ - //ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); - ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); - - ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); - ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd); - ParamGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); - ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd); - ParamGChoice ParamGChoice(CommonTree source, RoleNode subj, ParamIndexExpr expr, List blocks); - ParamGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, ParamIndexVar var, - ParamIndexExpr start, ParamIndexExpr end, List blocks); - ParamGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - ParamIndexVar var, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd); - - - // param-core - - ParamCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name); -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java deleted file mode 100644 index 0a51a886e..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamAstFactoryImpl.java +++ /dev/null @@ -1,141 +0,0 @@ -package org.scribble.ext.go.ast; - -import java.util.List; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactoryImpl; -import org.scribble.ast.MessageNode; -import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.RoleDeclDel; -import org.scribble.ext.go.ast.global.ParamGChoice; -import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; -import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; -import org.scribble.ext.go.ast.global.ParamGMultiChoices; -import org.scribble.ext.go.ast.global.ParamGMultiChoicesTransfer; -import org.scribble.ext.go.core.ast.ParamCoreDelegDecl; -import org.scribble.ext.go.del.global.ParamGChoiceDel; -import org.scribble.ext.go.del.global.ParamGMessageTransferDel; -import org.scribble.ext.go.del.global.ParamGMultiChoicesDel; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexVar; - - -public class ParamAstFactoryImpl extends AstFactoryImpl implements ParamAstFactory -{ - - - // Instantiating existing node classes with new dels - - /*@Override - public GProtocolDecl GProtocolDecl(CommonTree source, List mods, GProtocolHeader header, GProtocolDef def) - { - GProtocolDecl gpd = new GProtocolDecl(source, mods, header, def); - gpd = del(gpd, new AssrtGProtocolDeclDel()); - return gpd; - }*/ - - - // Returning new node classes in place of existing -- FIXME: do for GMessageTransfer and GChoice - - @Override - public ParamRoleDecl RoleDecl(CommonTree source, RoleNode namenode) - { - ParamRoleDecl rd = new ParamRoleDecl(source, namenode); - rd = del(rd, new RoleDeclDel()); - return rd; - } - - - // Explicitly creating new Assrt nodes - - @Override - //public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params) - public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params) - { - ParamRoleDecl rd = new ParamRoleDecl(source, namenode, params); - rd = del(rd, new RoleDeclDel()); - return rd; - } - - @Override - public ParamGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) - ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) - { - ParamGCrossMessageTransfer mt = new ParamGCrossMessageTransfer(source, src, msg, dest, - srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); - mt = del(mt, new ParamGMessageTransferDel()); // FIXME: parameterised self connection check - return mt; - } - - @Override - public ParamGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) - ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) - { - ParamGDotMessageTransfer mt = new ParamGDotMessageTransfer(source, src, msg, dest, - srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); - mt = del(mt, new ParamGMessageTransferDel()); // FIXME: parameterised self connection check - return mt; - } - - @Override - public ParamGChoice ParamGChoice(CommonTree source, RoleNode subj, ParamIndexExpr expr, List blocks) - { - ParamGChoice gc = new ParamGChoice(source, subj, expr, blocks); - gc = del(gc, new ParamGChoiceDel()); - return gc; - } - - @Override - public ParamGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, ParamIndexVar var, - ParamIndexExpr start, ParamIndexExpr end, List blocks) - { - ParamGMultiChoices gc = new ParamGMultiChoices(source, subj, var, start, end, blocks); - gc = del(gc, new ParamGMultiChoicesDel()); - return gc; - } - - @Override - public ParamGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - ParamIndexVar var, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) - { - ParamGMultiChoicesTransfer mt = new ParamGMultiChoicesTransfer(source, src, msg, dest, - var, destRangeStart, destRangeEnd); - mt = del(mt, new ParamGMessageTransferDel()); // FIXME: not a ParamGMessageTransfer - return mt; - } - - /*@Override - public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) - { - NameNode snn = null; - - // Default del's - if (kind.equals(ParamRoleParamKind.KIND)) - { - snn = new ParamRoleParamNode(source, identifier); - return castNameNode(kind, del(snn, createDefaultDelegate())); - } - else - { - return super.SimpleNameNode(source, kind, identifier); - } - }*/ - - - - // param-core - - // Explicitly creating new Assrt nodes - - public ParamCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) - { - ParamCoreDelegDecl dtd = new ParamCoreDelegDecl(source, schema, extName, extSource, name); - dtd = del(dtd, createDefaultDelegate()); - return dtd; - } - -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java new file mode 100644 index 000000000..1536aabf6 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java @@ -0,0 +1,42 @@ +package org.scribble.ext.go.ast; + +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.MessageNode; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.global.RPGChoice; +import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; +import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; +import org.scribble.ext.go.ast.global.RPGMultiChoices; +import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; +import org.scribble.ext.go.core.ast.RPCoreDelegDecl; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; + + +public interface RPAstFactory extends AstFactory +{ + //ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); + RPRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); + + RPGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); + RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd); + RPGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); + RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd); + RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr, List blocks); + RPGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, RPIndexVar var, + RPIndexExpr start, RPIndexExpr end, List blocks); + RPGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + RPIndexVar var, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd); + + + // param-core + + RPCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name); +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java new file mode 100644 index 000000000..66a0ee627 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -0,0 +1,141 @@ +package org.scribble.ext.go.ast; + +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactoryImpl; +import org.scribble.ast.MessageNode; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.RoleDeclDel; +import org.scribble.ext.go.ast.global.RPGChoice; +import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; +import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; +import org.scribble.ext.go.ast.global.RPGMultiChoices; +import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; +import org.scribble.ext.go.core.ast.RPCoreDelegDecl; +import org.scribble.ext.go.del.global.RPGChoiceDel; +import org.scribble.ext.go.del.global.RPGMessageTransferDel; +import org.scribble.ext.go.del.global.RPGMultiChoicesDel; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; + + +public class RPAstFactoryImpl extends AstFactoryImpl implements RPAstFactory +{ + + + // Instantiating existing node classes with new dels + + /*@Override + public GProtocolDecl GProtocolDecl(CommonTree source, List mods, GProtocolHeader header, GProtocolDef def) + { + GProtocolDecl gpd = new GProtocolDecl(source, mods, header, def); + gpd = del(gpd, new AssrtGProtocolDeclDel()); + return gpd; + }*/ + + + // Returning new node classes in place of existing -- FIXME: do for GMessageTransfer and GChoice + + @Override + public RPRoleDecl RoleDecl(CommonTree source, RoleNode namenode) + { + RPRoleDecl rd = new RPRoleDecl(source, namenode); + rd = del(rd, new RoleDeclDel()); + return rd; + } + + + // Explicitly creating new Assrt nodes + + @Override + //public ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params) + public RPRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params) + { + RPRoleDecl rd = new RPRoleDecl(source, namenode, params); + rd = del(rd, new RoleDeclDel()); + return rd; + } + + @Override + public RPGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) + { + RPGCrossMessageTransfer mt = new RPGCrossMessageTransfer(source, src, msg, dest, + srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); + mt = del(mt, new RPGMessageTransferDel()); // FIXME: parameterised self connection check + return mt; + } + + @Override + public RPGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) + RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) + { + RPGDotMessageTransfer mt = new RPGDotMessageTransfer(source, src, msg, dest, + srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); + mt = del(mt, new RPGMessageTransferDel()); // FIXME: parameterised self connection check + return mt; + } + + @Override + public RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr, List blocks) + { + RPGChoice gc = new RPGChoice(source, subj, expr, blocks); + gc = del(gc, new RPGChoiceDel()); + return gc; + } + + @Override + public RPGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, RPIndexVar var, + RPIndexExpr start, RPIndexExpr end, List blocks) + { + RPGMultiChoices gc = new RPGMultiChoices(source, subj, var, start, end, blocks); + gc = del(gc, new RPGMultiChoicesDel()); + return gc; + } + + @Override + public RPGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + RPIndexVar var, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) + { + RPGMultiChoicesTransfer mt = new RPGMultiChoicesTransfer(source, src, msg, dest, + var, destRangeStart, destRangeEnd); + mt = del(mt, new RPGMessageTransferDel()); // FIXME: not a ParamGMessageTransfer + return mt; + } + + /*@Override + public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) + { + NameNode snn = null; + + // Default del's + if (kind.equals(ParamRoleParamKind.KIND)) + { + snn = new ParamRoleParamNode(source, identifier); + return castNameNode(kind, del(snn, createDefaultDelegate())); + } + else + { + return super.SimpleNameNode(source, kind, identifier); + } + }*/ + + + + // param-core + + // Explicitly creating new Assrt nodes + + public RPCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) + { + RPCoreDelegDecl dtd = new RPCoreDelegDecl(source, schema, extName, extSource, name); + dtd = del(dtd, createDefaultDelegate()); + return dtd; + } + +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPRoleDecl.java similarity index 61% rename from scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java rename to scribble-go/src/main/java/org/scribble/ext/go/ast/RPRoleDecl.java index 6904856fb..679e94015 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/ParamRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPRoleDecl.java @@ -9,46 +9,46 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.ast.name.simple.SimpleNameNode; import org.scribble.del.ScribDel; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.main.ScribbleException; import org.scribble.type.kind.RoleKind; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; -public class ParamRoleDecl extends RoleDecl +public class RPRoleDecl extends RoleDecl { //public final List params; - public final List params; + public final List params; - public ParamRoleDecl(CommonTree source, RoleNode name) + public RPRoleDecl(CommonTree source, RoleNode name) { this(source, name, Collections.emptyList()); } //public ParamRoleDecl(CommonTree source, RoleNode name, List params) - public ParamRoleDecl(CommonTree source, RoleNode name, List params) // Separating params from base RoleNode better for subprotos? + public RPRoleDecl(CommonTree source, RoleNode name, List params) // Separating params from base RoleNode better for subprotos? { super(source, name); this.params = Collections.unmodifiableList(params); } @Override - protected ParamRoleDecl copy() + protected RPRoleDecl copy() { - return new ParamRoleDecl(this.source, (RoleNode) this.name, this.params); + return new RPRoleDecl(this.source, (RoleNode) this.name, this.params); } @Override - public ParamRoleDecl clone(AstFactory af) + public RPRoleDecl clone(AstFactory af) { RoleNode role = (RoleNode) this.name.clone(af); //List params = ScribUtil.cloneList(af, this.params); - List params = this.params; - return ((ParamAstFactory) af).ParamRoleDecl(this.source, role, params); + List params = this.params; + return ((RPAstFactory) af).ParamRoleDecl(this.source, role, params); } @Override - public ParamRoleDecl project(AstFactory af, Role self) + public RPRoleDecl project(AstFactory af, Role self) { /*RoleDecl proj = super.project(af, self); return reconstruct((SimpleNameNode) proj.name, this.params); // FIXME: */ @@ -56,26 +56,26 @@ public ParamRoleDecl project(AstFactory af, Role self) } @Override - public ParamRoleDecl reconstruct(SimpleNameNode name) + public RPRoleDecl reconstruct(SimpleNameNode name) { throw new RuntimeException("[param] Shouldn't get in here: " + this); } //public ParamRoleDecl reconstruct(SimpleNameNode name, List params) - public ParamRoleDecl reconstruct(SimpleNameNode name, List params) + public RPRoleDecl reconstruct(SimpleNameNode name, List params) { ScribDel del = del(); - ParamRoleDecl rd = new ParamRoleDecl(this.source, (RoleNode) name, params); - rd = (ParamRoleDecl) rd.del(del); + RPRoleDecl rd = new RPRoleDecl(this.source, (RoleNode) name, params); + rd = (RPRoleDecl) rd.del(del); return rd; } @Override - public ParamRoleDecl visitChildren(AstVisitor nv) throws ScribbleException + public RPRoleDecl visitChildren(AstVisitor nv) throws ScribbleException { RoleNode name = visitChildWithClassEqualityCheck(this, (RoleNode) this.name, nv); //List params = visitChildListWithClassEqualityCheck(this, this.params, nv); - List params = this.params; + List params = this.params; return reconstruct(name, params); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGChoice.java similarity index 68% rename from scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java rename to scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGChoice.java index 9ebe10fe8..c93d0e741 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGChoice.java @@ -14,19 +14,19 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; import org.scribble.util.ScribUtil; import org.scribble.visit.AstVisitor; -public class ParamGChoice extends GChoice +public class RPGChoice extends GChoice { - public final ParamIndexExpr expr; + public final RPIndexExpr expr; - public ParamGChoice(CommonTree source, RoleNode subj, ParamIndexExpr expr, List blocks) + public RPGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr, List blocks) { super(source, subj, blocks); this.expr = expr; @@ -42,33 +42,33 @@ public LChoice project(AstFactory af, Role self, List blocks) @Override protected ScribNodeBase copy() { - return new ParamGChoice(this.source, this.subj, this.expr, getBlocks()); + return new RPGChoice(this.source, this.subj, this.expr, getBlocks()); } @Override - public ParamGChoice clone(AstFactory af) + public RPGChoice clone(AstFactory af) { RoleNode subj = this.subj.clone(af); List blocks = ScribUtil.cloneList(af, getBlocks()); - return ((ParamAstFactory) af).ParamGChoice(this.source, subj, this.expr, blocks); + return ((RPAstFactory) af).ParamGChoice(this.source, subj, this.expr, blocks); } @Override - public ParamGChoice reconstruct(RoleNode subj, List> blocks) + public RPGChoice reconstruct(RoleNode subj, List> blocks) { throw new RuntimeException("[param] Shouldn't get in here: " + this); } - public ParamGChoice reconstruct(RoleNode subj, ParamIndexExpr expr, List> blocks) + public RPGChoice reconstruct(RoleNode subj, RPIndexExpr expr, List> blocks) { ScribDel del = del(); - ParamGChoice gc = new ParamGChoice(this.source, subj, expr, castBlocks(blocks)); - gc = (ParamGChoice) gc.del(del); + RPGChoice gc = new RPGChoice(this.source, subj, expr, castBlocks(blocks)); + gc = (RPGChoice) gc.del(del); return gc; } @Override - public ParamGChoice visitChildren(AstVisitor nv) throws ScribbleException + public RPGChoice visitChildren(AstVisitor nv) throws ScribbleException { RoleNode subj = (RoleNode) visitChild(this.subj, nv); List blocks = visitChildListWithClassEqualityCheck(this, getBlocks(), nv); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java similarity index 59% rename from scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java rename to scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java index 5f6e853eb..ba13fc165 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java @@ -7,16 +7,16 @@ import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.type.name.Role; // Subsumes scatter/gather, src/dest range length one -public class ParamGCrossMessageTransfer extends ParamGMessageTransfer +public class RPGCrossMessageTransfer extends RPGMessageTransfer { - public ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + public RPGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) - ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) + RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) { super(source, src, msg, dest, srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); } @@ -29,31 +29,31 @@ public LNode project(AstFactory af, Role self) } @Override - protected ParamGCrossMessageTransfer copy() + protected RPGCrossMessageTransfer copy() { - return new ParamGCrossMessageTransfer(this.source, this.src, this.msg, getDestinations().get(0), + return new RPGCrossMessageTransfer(this.source, this.src, this.msg, getDestinations().get(0), this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); } @Override - public ParamGCrossMessageTransfer clone(AstFactory af) + public RPGCrossMessageTransfer clone(AstFactory af) { RoleNode src = this.src.clone(af); MessageNode msg = this.msg.clone(af); RoleNode dest = getDestinations().get(0).clone(af); - return ((ParamAstFactory) af).ParamGCrossMessageTransfer(this.source, src, msg, dest, + return ((RPAstFactory) af).ParamGCrossMessageTransfer(this.source, src, msg, dest, this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); } @Override - public ParamGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, + public RPGCrossMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) - ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) + RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) { ScribDel del = del(); - ParamGCrossMessageTransfer gmt = new ParamGCrossMessageTransfer(this.source, src, msg, dest, + RPGCrossMessageTransfer gmt = new RPGCrossMessageTransfer(this.source, src, msg, dest, srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); - gmt = (ParamGCrossMessageTransfer) gmt.del(del); + gmt = (RPGCrossMessageTransfer) gmt.del(del); return gmt; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDotMessageTransfer.java similarity index 59% rename from scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java rename to scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDotMessageTransfer.java index 5dea915b9..0478e74f2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGDotMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDotMessageTransfer.java @@ -7,15 +7,15 @@ import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.type.name.Role; -public class ParamGDotMessageTransfer extends ParamGMessageTransfer +public class RPGDotMessageTransfer extends RPGMessageTransfer { - public ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + public RPGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) - ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) + RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) { super(source, src, msg, dest, srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); } @@ -28,31 +28,31 @@ public LNode project(AstFactory af, Role self) } @Override - protected ParamGDotMessageTransfer copy() + protected RPGDotMessageTransfer copy() { - return new ParamGDotMessageTransfer(this.source, this.src, this.msg, getDestinations().get(0), + return new RPGDotMessageTransfer(this.source, this.src, this.msg, getDestinations().get(0), this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); } @Override - public ParamGDotMessageTransfer clone(AstFactory af) + public RPGDotMessageTransfer clone(AstFactory af) { RoleNode src = this.src.clone(af); MessageNode msg = this.msg.clone(af); RoleNode dest = getDestinations().get(0).clone(af); - return ((ParamAstFactory) af).ParamGDotMessageTransfer(this.source, src, msg, dest, + return ((RPAstFactory) af).ParamGDotMessageTransfer(this.source, src, msg, dest, this.srcRangeStart, this.srcRangeEnd, this.destRangeStart, this.destRangeEnd); } @Override - public ParamGDotMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, + public RPGDotMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) - ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) + RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) { ScribDel del = del(); - ParamGDotMessageTransfer gmt = new ParamGDotMessageTransfer(this.source, src, msg, dest, + RPGDotMessageTransfer gmt = new RPGDotMessageTransfer(this.source, src, msg, dest, srcRangeStart, srcRangeEnd, destRangeStart, destRangeEnd); - gmt = (ParamGDotMessageTransfer) gmt.del(del); + gmt = (RPGDotMessageTransfer) gmt.del(del); return gmt; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMessageTransfer.java similarity index 69% rename from scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java rename to scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMessageTransfer.java index 11dbd0d57..69d253084 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMessageTransfer.java @@ -9,12 +9,12 @@ import org.scribble.ast.MessageTransfer; import org.scribble.ast.global.GMessageTransfer; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.visit.AstVisitor; -public abstract class ParamGMessageTransfer extends GMessageTransfer //implements ParamActionAssertNode +public abstract class RPGMessageTransfer extends GMessageTransfer //implements ParamActionAssertNode { // ParamRoleNode? -- cf. ParamRoleDecl // All >= 0; end >= start @@ -22,14 +22,14 @@ public abstract class ParamGMessageTransfer extends GMessageTransfer //implemen public final ParamRoleParamNode srcRangeEnd; // Inclusive public final ParamRoleParamNode destRangeStart; public final ParamRoleParamNode destRangeEnd; // Inclusive*/ - public final ParamIndexExpr srcRangeStart; - public final ParamIndexExpr srcRangeEnd; // Inclusive - public final ParamIndexExpr destRangeStart; - public final ParamIndexExpr destRangeEnd; // Inclusive + public final RPIndexExpr srcRangeStart; + public final RPIndexExpr srcRangeEnd; // Inclusive + public final RPIndexExpr destRangeStart; + public final RPIndexExpr destRangeEnd; // Inclusive - public ParamGMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + public RPGMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) - ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) + RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) { super(source, src, msg, Arrays.asList(dest)); this.srcRangeStart = srcRangeStart; @@ -39,14 +39,14 @@ public ParamGMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, R } @Override - public ParamGMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) + public RPGMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) { throw new RuntimeException("[param] Shouldn't get in here: " + this); } - public abstract ParamGMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, + public abstract RPGMessageTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); - ParamIndexExpr srcRangeStart, ParamIndexExpr srcRangeEnd, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd); + RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd); @Override public MessageTransfer visitChildren(AstVisitor nv) throws ScribbleException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoices.java similarity index 62% rename from scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoices.java rename to scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoices.java index a0d9c6a82..58f515edd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoices.java @@ -14,23 +14,23 @@ import org.scribble.ast.local.LProtocolBlock; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; import org.scribble.util.ScribUtil; import org.scribble.visit.AstVisitor; -public class ParamGMultiChoices extends GChoice +public class RPGMultiChoices extends GChoice { - public final ParamIndexVar var; - public final ParamIndexExpr start; - public final ParamIndexExpr end; + public final RPIndexVar var; + public final RPIndexExpr start; + public final RPIndexExpr end; - public ParamGMultiChoices(CommonTree source, RoleNode subj, ParamIndexVar var, - ParamIndexExpr start, ParamIndexExpr end, List blocks) + public RPGMultiChoices(CommonTree source, RoleNode subj, RPIndexVar var, + RPIndexExpr start, RPIndexExpr end, List blocks) { super(source, subj, blocks); this.var = var; @@ -48,34 +48,34 @@ public LChoice project(AstFactory af, Role self, List blocks) @Override protected ScribNodeBase copy() { - return new ParamGMultiChoices(this.source, this.subj, this.var, this.start, this.end, getBlocks()); + return new RPGMultiChoices(this.source, this.subj, this.var, this.start, this.end, getBlocks()); } @Override - public ParamGMultiChoices clone(AstFactory af) + public RPGMultiChoices clone(AstFactory af) { RoleNode subj = this.subj.clone(af); List blocks = ScribUtil.cloneList(af, getBlocks()); - return ((ParamAstFactory) af).ParamGMultiChoices(this.source, subj, this.var, this.start, this.end, blocks); + return ((RPAstFactory) af).ParamGMultiChoices(this.source, subj, this.var, this.start, this.end, blocks); } @Override - public ParamGMultiChoices reconstruct(RoleNode subj, List> blocks) + public RPGMultiChoices reconstruct(RoleNode subj, List> blocks) { throw new RuntimeException("[param] Shouldn't get in here: " + this); } - public ParamGMultiChoices reconstruct(RoleNode subj, ParamIndexVar var, - ParamIndexExpr start, ParamIndexExpr end, List> blocks) + public RPGMultiChoices reconstruct(RoleNode subj, RPIndexVar var, + RPIndexExpr start, RPIndexExpr end, List> blocks) { ScribDel del = del(); - ParamGMultiChoices gc = new ParamGMultiChoices(this.source, subj, var, start, end, castBlocks(blocks)); - gc = (ParamGMultiChoices) gc.del(del); + RPGMultiChoices gc = new RPGMultiChoices(this.source, subj, var, start, end, castBlocks(blocks)); + gc = (RPGMultiChoices) gc.del(del); return gc; } @Override - public ParamGMultiChoices visitChildren(AstVisitor nv) throws ScribbleException + public RPGMultiChoices visitChildren(AstVisitor nv) throws ScribbleException { RoleNode subj = (RoleNode) visitChild(this.subj, nv); List blocks = visitChildListWithClassEqualityCheck(this, getBlocks(), nv); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoicesTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoicesTransfer.java similarity index 63% rename from scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoicesTransfer.java rename to scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoicesTransfer.java index 9ec00a3cb..52ab8e4a1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/ParamGMultiChoicesTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoicesTransfer.java @@ -12,23 +12,23 @@ import org.scribble.ast.local.LNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; // Subsumes scatter/gather, src/dest range length one -public class ParamGMultiChoicesTransfer extends GMessageTransfer +public class RPGMultiChoicesTransfer extends GMessageTransfer { - public final ParamIndexVar var; - public final ParamIndexExpr destRangeStart; - public final ParamIndexExpr destRangeEnd; // Inclusive + public final RPIndexVar var; + public final RPIndexExpr destRangeStart; + public final RPIndexExpr destRangeEnd; // Inclusive - public ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, - ParamIndexVar var, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) + public RPGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, + RPIndexVar var, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) { super(source, src, msg, Arrays.asList(dest)); this.var = var; @@ -44,35 +44,35 @@ public LNode project(AstFactory af, Role self) } @Override - protected ParamGMultiChoicesTransfer copy() + protected RPGMultiChoicesTransfer copy() { - return new ParamGMultiChoicesTransfer(this.source, this.src, this.msg, getDestinations().get(0), + return new RPGMultiChoicesTransfer(this.source, this.src, this.msg, getDestinations().get(0), this.var, this.destRangeStart, this.destRangeEnd); } @Override - public ParamGMultiChoicesTransfer clone(AstFactory af) + public RPGMultiChoicesTransfer clone(AstFactory af) { RoleNode src = this.src.clone(af); MessageNode msg = this.msg.clone(af); RoleNode dest = getDestinations().get(0).clone(af); - return ((ParamAstFactory) af).ParamGMultiChoicesTransfer(this.source, src, msg, dest, + return ((RPAstFactory) af).ParamGMultiChoicesTransfer(this.source, src, msg, dest, this.var, this.destRangeStart, this.destRangeEnd); } @Override - public ParamGMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) + public RPGMessageTransfer reconstruct(RoleNode src, MessageNode msg, List dests) { throw new RuntimeException("[param] Shouldn't get in here: " + this); } - public ParamGMultiChoicesTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, - ParamIndexVar var, ParamIndexExpr destRangeStart, ParamIndexExpr destRangeEnd) + public RPGMultiChoicesTransfer reconstruct(RoleNode src, MessageNode msg, RoleNode dest, + RPIndexVar var, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) { ScribDel del = del(); - ParamGMultiChoicesTransfer gmt = new ParamGMultiChoicesTransfer(this.source, src, msg, dest, + RPGMultiChoicesTransfer gmt = new RPGMultiChoicesTransfer(this.source, src, msg, dest, var, destRangeStart, destRangeEnd); - gmt = (ParamGMultiChoicesTransfer) gmt.del(del); + gmt = (RPGMultiChoicesTransfer) gmt.del(del); return gmt; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java deleted file mode 100644 index 024fb0a9f..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/ParamRoleParamNode.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.scribble.ext.go.ast.name.simple; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.name.simple.SimpleNameNode; -import org.scribble.ext.go.type.kind.ParamRoleParamKind; -import org.scribble.ext.go.type.name.ParamRoleParam; - - -// Currently used for both "actual params" and int literals -@Deprecated -public class ParamRoleParamNode extends SimpleNameNode -{ - public ParamRoleParamNode(CommonTree source, String identifier) - { - super(source, identifier); - } - - @Override - protected ParamRoleParamNode copy() - { - return new ParamRoleParamNode(this.source, getIdentifier()); - } - - @Override - public ParamRoleParamNode clone(AstFactory af) - { - return (ParamRoleParamNode) af.SimpleNameNode(this.source, ParamRoleParamKind.KIND, getIdentifier()); - } - - @Override - public ParamRoleParam toName() - { - String id = getIdentifier(); - return new ParamRoleParam(id); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof ParamRoleParamNode)) - { - return false; - } - return ((ParamRoleParamNode) o).canEqual(this) && super.equals(o); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof ParamRoleParamNode; - } - - @Override - public int hashCode() - { - int hash = 7159; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPRoleParamNode.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPRoleParamNode.java new file mode 100644 index 000000000..f66135b07 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPRoleParamNode.java @@ -0,0 +1,65 @@ +package org.scribble.ext.go.ast.name.simple; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.name.simple.SimpleNameNode; +import org.scribble.ext.go.type.kind.RPRoleParamKind; +import org.scribble.ext.go.type.name.RPRoleParam; + + +// Currently used for both "actual params" and int literals +@Deprecated +public class RPRoleParamNode extends SimpleNameNode +{ + public RPRoleParamNode(CommonTree source, String identifier) + { + super(source, identifier); + } + + @Override + protected RPRoleParamNode copy() + { + return new RPRoleParamNode(this.source, getIdentifier()); + } + + @Override + public RPRoleParamNode clone(AstFactory af) + { + return (RPRoleParamNode) af.SimpleNameNode(this.source, RPRoleParamKind.KIND, getIdentifier()); + } + + @Override + public RPRoleParam toName() + { + String id = getIdentifier(); + return new RPRoleParam(id); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPRoleParamNode)) + { + return false; + } + return ((RPRoleParamNode) o).canEqual(this) && super.equals(o); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof RPRoleParamNode; + } + + @Override + public int hashCode() + { + int hash = 7159; + hash = 31 * super.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java index c6b2f3010..83fe7fce9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/cli/GoCommandLine.java @@ -10,8 +10,8 @@ import org.scribble.cli.CommandLine; import org.scribble.cli.CommandLineException; import org.scribble.ext.go.codegen.statetype.go.GoEndpointApiGenerator; -import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoMainContext; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; @@ -31,8 +31,8 @@ public class GoCommandLine extends CommandLine // HACK: store in (Core) Job/JobContext? protected GProtocolDecl gpd; - protected Map> P0; - protected Map> E0; + protected Map> P0; + protected Map> E0; //protected ParamCoreSModel model; public GoCommandLine(String... args) throws CommandLineException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java deleted file mode 100644 index 5dffd7dbc..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreAstFactory.java +++ /dev/null @@ -1,133 +0,0 @@ -package org.scribble.ext.go.core.ast; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.scribble.ext.go.core.ast.global.ParamCoreGActionKind; -import org.scribble.ext.go.core.ast.global.ParamCoreGChoice; -import org.scribble.ext.go.core.ast.global.ParamCoreGEnd; -import org.scribble.ext.go.core.ast.global.ParamCoreGMultiChoices; -import org.scribble.ext.go.core.ast.global.ParamCoreGRec; -import org.scribble.ext.go.core.ast.global.ParamCoreGRecVar; -import org.scribble.ext.go.core.ast.global.ParamCoreGType; -import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; -import org.scribble.ext.go.core.ast.local.ParamCoreLCrossChoice; -import org.scribble.ext.go.core.ast.local.ParamCoreLDotChoice; -import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; -import org.scribble.ext.go.core.ast.local.ParamCoreLMultiChoices; -import org.scribble.ext.go.core.ast.local.ParamCoreLRec; -import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; -import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexVar; -import org.scribble.type.Payload; -import org.scribble.type.name.Op; -import org.scribble.type.name.RecVar; - - -public class ParamCoreAstFactory -{ - public ParamCoreAstFactory() - { - - } - - public ParamRole ParamRole(String name, ParamRange range) // ParamRange not "ast", so not made by af - { - return new ParamRole(name, Stream.of(range).collect(Collectors.toSet())); - } - - // Pre: not null - public ParamCoreMessage ParamCoreAction(Op op, Payload pay) - { - return new ParamCoreMessage(op, pay); - } - - public ParamCoreGChoice ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest, LinkedHashMap cases) - { - return new ParamCoreGChoice(src, kind, dest, cases); - } - - public ParamCoreGMultiChoices ParamCoreGMultiChoices(ParamRole src, ParamIndexVar var, - ParamRole dest, List cases, ParamCoreGType cont) - { - return new ParamCoreGMultiChoices(src, var, dest, cases, cont); - } - - public ParamCoreGRec ParamCoreGRec(RecVar recvar, ParamCoreGType body) - { - return new ParamCoreGRec(recvar, body); - } - - public ParamCoreGRecVar ParamCoreGRecVar(RecVar recvar) - { - return new ParamCoreGRecVar(recvar); - } - - public ParamCoreGEnd ParamCoreGEnd() - { - return ParamCoreGEnd.END; - } - - public ParamCoreLCrossChoice ParamCoreLCrossChoice(ParamRole role, ParamCoreLActionKind kind, - LinkedHashMap cases) - { - return new ParamCoreLCrossChoice(role, kind, cases); - } - - public ParamCoreLDotChoice ParamCoreLDotChoice(ParamRole role, ParamIndexExpr offset, ParamCoreLActionKind kind, - LinkedHashMap cases) - { - return new ParamCoreLDotChoice(role, offset, kind, cases); - } - - public ParamCoreLMultiChoices ParamCoreLMultiChoices(ParamRole role, ParamIndexVar var, - List cases, ParamCoreLType cont) - { - return new ParamCoreLMultiChoices(role, var, cases, cont); - } - - /*public ParamCoreLSend LSend(Role self, Role peer, Op op, Payload pay) - { - return new ParamCoreLSend(self, peer, op, pay); - } - - public ParamCoreLReceive LReceive(Role self, Role peer, Op op, Payload pay) - { - return new ParamCoreLReceive(self, peer, op, pay); - } - - public ParamCoreLConnect LConnect(Role self, Role peer, Op op, Payload pay) - { - return new ParamCoreLConnect(self, peer, op, pay); - } - - public ParamCoreLAccept LAccept(Role self, Role peer, Op op, Payload pay) - { - return new ParamCoreLAccept(self, peer, op, pay); - }*/ - - /*public ParamCoreLDisconnect LDisconnect(Role self, Role peer) - { - return new ParamCoreLDisconnect(self, peer); - }*/ - - public ParamCoreLRec ParamCoreLRec(RecVar recvar, ParamCoreLType body) - { - return new ParamCoreLRec(recvar, body); - } - - public ParamCoreLRecVar ParamCoreLRecVar(RecVar recvar) - { - return new ParamCoreLRecVar(recvar); - } - - public ParamCoreLEnd ParamCoreLEnd() - { - return ParamCoreLEnd.END; - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreActionKind.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreActionKind.java similarity index 59% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreActionKind.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreActionKind.java index 80d6ffe57..43460eea3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreActionKind.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreActionKind.java @@ -2,7 +2,7 @@ import org.scribble.type.kind.ProtocolKind; -public interface ParamCoreActionKind +public interface RPCoreActionKind { } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java new file mode 100644 index 000000000..835e7973d --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java @@ -0,0 +1,133 @@ +package org.scribble.ext.go.core.ast; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.ext.go.core.ast.global.RPCoreGActionKind; +import org.scribble.ext.go.core.ast.global.RPCoreGChoice; +import org.scribble.ext.go.core.ast.global.RPCoreGEnd; +import org.scribble.ext.go.core.ast.global.RPCoreGMultiChoices; +import org.scribble.ext.go.core.ast.global.RPCoreGRec; +import org.scribble.ext.go.core.ast.global.RPCoreGRecVar; +import org.scribble.ext.go.core.ast.global.RPCoreGType; +import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; +import org.scribble.ext.go.core.ast.local.RPCoreLCrossChoice; +import org.scribble.ext.go.core.ast.local.RPCoreLDotChoice; +import org.scribble.ext.go.core.ast.local.RPCoreLEnd; +import org.scribble.ext.go.core.ast.local.RPCoreLMultiChoices; +import org.scribble.ext.go.core.ast.local.RPCoreLRec; +import org.scribble.ext.go.core.ast.local.RPCoreLRecVar; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.Payload; +import org.scribble.type.name.Op; +import org.scribble.type.name.RecVar; + + +public class RPCoreAstFactory +{ + public RPCoreAstFactory() + { + + } + + public RPIndexedRole ParamRole(String name, RPInterval range) // ParamRange not "ast", so not made by af + { + return new RPIndexedRole(name, Stream.of(range).collect(Collectors.toSet())); + } + + // Pre: not null + public RPCoreMessage ParamCoreAction(Op op, Payload pay) + { + return new RPCoreMessage(op, pay); + } + + public RPCoreGChoice ParamCoreGChoice(RPIndexedRole src, RPCoreGActionKind kind, RPIndexedRole dest, LinkedHashMap cases) + { + return new RPCoreGChoice(src, kind, dest, cases); + } + + public RPCoreGMultiChoices ParamCoreGMultiChoices(RPIndexedRole src, RPIndexVar var, + RPIndexedRole dest, List cases, RPCoreGType cont) + { + return new RPCoreGMultiChoices(src, var, dest, cases, cont); + } + + public RPCoreGRec ParamCoreGRec(RecVar recvar, RPCoreGType body) + { + return new RPCoreGRec(recvar, body); + } + + public RPCoreGRecVar ParamCoreGRecVar(RecVar recvar) + { + return new RPCoreGRecVar(recvar); + } + + public RPCoreGEnd ParamCoreGEnd() + { + return RPCoreGEnd.END; + } + + public RPCoreLCrossChoice ParamCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, + LinkedHashMap cases) + { + return new RPCoreLCrossChoice(role, kind, cases); + } + + public RPCoreLDotChoice ParamCoreLDotChoice(RPIndexedRole role, RPIndexExpr offset, RPCoreLActionKind kind, + LinkedHashMap cases) + { + return new RPCoreLDotChoice(role, offset, kind, cases); + } + + public RPCoreLMultiChoices ParamCoreLMultiChoices(RPIndexedRole role, RPIndexVar var, + List cases, RPCoreLType cont) + { + return new RPCoreLMultiChoices(role, var, cases, cont); + } + + /*public ParamCoreLSend LSend(Role self, Role peer, Op op, Payload pay) + { + return new ParamCoreLSend(self, peer, op, pay); + } + + public ParamCoreLReceive LReceive(Role self, Role peer, Op op, Payload pay) + { + return new ParamCoreLReceive(self, peer, op, pay); + } + + public ParamCoreLConnect LConnect(Role self, Role peer, Op op, Payload pay) + { + return new ParamCoreLConnect(self, peer, op, pay); + } + + public ParamCoreLAccept LAccept(Role self, Role peer, Op op, Payload pay) + { + return new ParamCoreLAccept(self, peer, op, pay); + }*/ + + /*public ParamCoreLDisconnect LDisconnect(Role self, Role peer) + { + return new ParamCoreLDisconnect(self, peer); + }*/ + + public RPCoreLRec ParamCoreLRec(RecVar recvar, RPCoreLType body) + { + return new RPCoreLRec(recvar, body); + } + + public RPCoreLRecVar ParamCoreLRecVar(RecVar recvar) + { + return new RPCoreLRecVar(recvar); + } + + public RPCoreLEnd ParamCoreLEnd() + { + return RPCoreLEnd.END; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreChoice.java similarity index 63% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreChoice.java index 62282301c..de39667fc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreChoice.java @@ -3,24 +3,24 @@ import java.util.LinkedHashMap; import java.util.stream.Collectors; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.type.kind.ProtocolKind; -public abstract class ParamCoreChoice, K extends ProtocolKind> implements ParamCoreType +public abstract class RPCoreChoice, K extends ProtocolKind> implements RPCoreType { - public final ParamRole role; - public final ParamCoreActionKind kind; - public final LinkedHashMap cases; + public final RPIndexedRole role; + public final RPCoreActionKind kind; + public final LinkedHashMap cases; // Pre: cases.size() > 1 - public ParamCoreChoice(ParamRole role, ParamCoreActionKind kind, LinkedHashMap cases) + public RPCoreChoice(RPIndexedRole role, RPCoreActionKind kind, LinkedHashMap cases) { this.role = role; this.kind = kind; this.cases = new LinkedHashMap<>(cases); } - public abstract ParamCoreActionKind getKind(); + public abstract RPCoreActionKind getKind(); @Override public int hashCode() @@ -39,11 +39,11 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreChoice)) + if (!(obj instanceof RPCoreChoice)) { return false; } - ParamCoreChoice them = (ParamCoreChoice) obj; + RPCoreChoice them = (RPCoreChoice) obj; return them.canEquals(this) && this.role.equals(them.role) && this.kind.equals(kind) && this.cases.equals(them.cases); } @@ -51,7 +51,7 @@ public boolean equals(Object obj) @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreChoice; + return o instanceof RPCoreChoice; } protected String casesToString() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreDelegDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreDelegDecl.java similarity index 55% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreDelegDecl.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreDelegDecl.java index 4bd993a80..f19aa1d91 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreDelegDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreDelegDecl.java @@ -8,13 +8,13 @@ import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.MemberNameNode; import org.scribble.del.ScribDel; -import org.scribble.ext.go.ast.ParamAstFactory; +import org.scribble.ext.go.ast.RPAstFactory; import org.scribble.type.kind.DataTypeKind; // HACK -- extending P@r[e] syntax is not clear yet -public class ParamCoreDelegDecl extends DataTypeDecl +public class RPCoreDelegDecl extends DataTypeDecl { - public ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) + public RPCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) { super(source, schema, extName, extSource, name); } @@ -22,22 +22,22 @@ public ParamCoreDelegDecl(CommonTree source, String schema, String extName, Stri @Override protected ScribNodeBase copy() { - return new ParamCoreDelegDecl(this.source, this.schema, this.extName, this.extSource, getNameNode()); + return new RPCoreDelegDecl(this.source, this.schema, this.extName, this.extSource, getNameNode()); } @Override - public ParamCoreDelegDecl clone(AstFactory af) + public RPCoreDelegDecl clone(AstFactory af) { DataTypeNode name = (DataTypeNode) this.name.clone(af); - return ((ParamAstFactory) af).ParamCoreDelegDecl(this.source, this.schema, this.extName, this.extSource, name); + return ((RPAstFactory) af).ParamCoreDelegDecl(this.source, this.schema, this.extName, this.extSource, name); } @Override - public ParamCoreDelegDecl reconstruct(String schema, String extName, String extSource, MemberNameNode name) + public RPCoreDelegDecl reconstruct(String schema, String extName, String extSource, MemberNameNode name) { ScribDel del = del(); - ParamCoreDelegDecl dtd = new ParamCoreDelegDecl(this.source, schema, extName, extSource, (DataTypeNode) name); - dtd = (ParamCoreDelegDecl) dtd.del(del); + RPCoreDelegDecl dtd = new RPCoreDelegDecl(this.source, schema, extName, extSource, (DataTypeNode) name); + dtd = (RPCoreDelegDecl) dtd.del(del); return dtd; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreEnd.java similarity index 65% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreEnd.java index 0b1afde54..ab2e836f3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreEnd.java @@ -2,7 +2,7 @@ import org.scribble.type.kind.ProtocolKind; -public abstract class ParamCoreEnd implements ParamCoreType +public abstract class RPCoreEnd implements RPCoreType { @Override public String toString() @@ -13,11 +13,11 @@ public String toString() @Override public boolean equals(Object obj) { - if (!(obj instanceof ParamCoreEnd)) + if (!(obj instanceof RPCoreEnd)) { return false; } - return ((ParamCoreEnd) obj).canEquals(this); + return ((RPCoreEnd) obj).canEquals(this); } public abstract boolean canEquals(Object o); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreMessage.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessage.java similarity index 80% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreMessage.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessage.java index b26d6599a..f77406ad9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreMessage.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessage.java @@ -4,12 +4,12 @@ import org.scribble.type.name.Op; -public class ParamCoreMessage +public class RPCoreMessage { public final Op op; public final Payload pay; - public ParamCoreMessage(Op op, Payload pay) + public RPCoreMessage(Op op, Payload pay) { this.op = op; this.pay = pay; @@ -37,11 +37,11 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreMessage)) + if (!(obj instanceof RPCoreMessage)) { return false; } - ParamCoreMessage them = (ParamCoreMessage) obj; + RPCoreMessage them = (RPCoreMessage) obj; return //them.canEquals(this) && this.op.equals(them.op) && this.pay.equals(them.pay); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreRec.java similarity index 78% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreRec.java index 6a024641f..5a1560c0f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreRec.java @@ -3,12 +3,12 @@ import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.RecVar; -public abstract class ParamCoreRec, K extends ProtocolKind> implements ParamCoreType +public abstract class RPCoreRec, K extends ProtocolKind> implements RPCoreType { public final RecVar recvar; // FIXME: RecVarNode? (Cf. AssrtCoreAction.op/pay) public final B body; - public ParamCoreRec(RecVar recvar, B body) + public RPCoreRec(RecVar recvar, B body) { this.recvar = recvar; this.body = body; @@ -27,11 +27,11 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreRec)) + if (!(obj instanceof RPCoreRec)) { return false; } - ParamCoreRec them = (ParamCoreRec) obj; + RPCoreRec them = (RPCoreRec) obj; return them.canEquals(this) && this.recvar.equals(them.recvar) && this.body.equals(them.body); // FIXME: check B kind is equal? } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreRecVar.java similarity index 72% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreRecVar.java index 5dafbc2c0..bf96e7df4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreRecVar.java @@ -4,11 +4,11 @@ import org.scribble.type.name.RecVar; -public abstract class ParamCoreRecVar implements ParamCoreType +public abstract class RPCoreRecVar implements RPCoreType { public final RecVar recvar; - public ParamCoreRecVar(RecVar var) + public RPCoreRecVar(RecVar var) { this.recvar = var; } @@ -22,11 +22,11 @@ public String toString() @Override public boolean equals(Object obj) { - if (!(obj instanceof ParamCoreRecVar)) + if (!(obj instanceof RPCoreRecVar)) { return false; } - ParamCoreRecVar them = (ParamCoreRecVar) obj; + RPCoreRecVar them = (RPCoreRecVar) obj; return them.canEquals(this) && this.recvar.equals(them.recvar); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreSyntaxException.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreSyntaxException.java similarity index 67% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreSyntaxException.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreSyntaxException.java index b8ac26293..cc8e26945 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreSyntaxException.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreSyntaxException.java @@ -6,7 +6,7 @@ // For parsing errors due to core syntax restrictions (vs. "full" Scribble) -- distinction used for JUnit testing (i.e., to indicate non core syntax that are otherwise valid protocols) // i.e., should only be thrown by AssrtCoreGProtocolDeclTranslator // N.B. so should not be used for actual "semantic" WF errors -public class ParamCoreSyntaxException extends AntlrSourceException // N.B. not Scribble/AssrttException -- cf. AssrtCoreTestBase::tests +public class RPCoreSyntaxException extends AntlrSourceException // N.B. not Scribble/AssrttException -- cf. AssrtCoreTestBase::tests { /** @@ -15,32 +15,32 @@ public class ParamCoreSyntaxException extends AntlrSourceException // N.B. not private static final long serialVersionUID = 1L; - public ParamCoreSyntaxException(String arg0) + public RPCoreSyntaxException(String arg0) { super(arg0); // TODO Auto-generated constructor stub } - public ParamCoreSyntaxException(Throwable arg0) + public RPCoreSyntaxException(Throwable arg0) { super(arg0); // TODO Auto-generated constructor stub } - public ParamCoreSyntaxException(String arg0, Throwable arg1) + public RPCoreSyntaxException(String arg0, Throwable arg1) { super(arg0, arg1); // TODO Auto-generated constructor stub } - public ParamCoreSyntaxException(String message, Throwable cause, boolean enableSuppression, + public RPCoreSyntaxException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); // TODO Auto-generated constructor stub } - public ParamCoreSyntaxException(CommonTree blame, String arg0) + public RPCoreSyntaxException(CommonTree blame, String arg0) { super(blame, arg0); // TODO Auto-generated constructor stub diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreType.java similarity index 81% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreType.java index 1f1376b92..8f9c198c2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/ParamCoreType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreType.java @@ -3,7 +3,7 @@ import org.scribble.type.kind.ProtocolKind; // ast here means "core syntax" of session types -- it does not link the actual Scribble source (cf. base ast classes) -public interface ParamCoreType +public interface RPCoreType { boolean canEquals(Object o); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java deleted file mode 100644 index b1e508b6f..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGType.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.scribble.ext.go.core.ast.global; - -import java.util.Set; - -import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ext.go.core.ast.ParamCoreAstFactory; -import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.ParamCoreType; -import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.main.GoJob; -import org.scribble.type.kind.Global; - - -public interface ParamCoreGType extends ParamCoreType -{ - - boolean isWellFormed(GoJob job, GProtocolDecl gpd); - - // FIXME: clarify, Role subj is used as "role name" - //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; - ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException; - - Set getParamRoles(); -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGActionKind.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGActionKind.java similarity index 73% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGActionKind.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGActionKind.java index af54eadfc..c69757e2d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGActionKind.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGActionKind.java @@ -1,9 +1,9 @@ package org.scribble.ext.go.core.ast.global; -import org.scribble.ext.go.core.ast.ParamCoreActionKind; +import org.scribble.ext.go.core.ast.RPCoreActionKind; import org.scribble.type.kind.Global; -public enum ParamCoreGActionKind implements ParamCoreActionKind +public enum RPCoreGActionKind implements RPCoreActionKind { CROSS_TRANSFER, DOT_TRANSFER; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java similarity index 63% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 3175dd65b..4eb0a9021 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -11,33 +11,33 @@ import java.util.stream.Stream; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ext.go.core.ast.ParamCoreAstFactory; -import org.scribble.ext.go.core.ast.ParamCoreChoice; -import org.scribble.ext.go.core.ast.ParamCoreMessage; -import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; -import org.scribble.ext.go.core.ast.local.ParamCoreLDotChoice; -import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreChoice; +import org.scribble.ext.go.core.ast.RPCoreMessage; +import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; +import org.scribble.ext.go.core.ast.local.RPCoreLDotChoice; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamBinIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexFactory; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPBinIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexFactory; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.type.kind.Global; import org.scribble.type.name.GDelegationType; import org.scribble.type.name.PayloadElemType; import org.scribble.type.name.Role; -public class ParamCoreGChoice extends ParamCoreChoice implements ParamCoreGType +public class RPCoreGChoice extends RPCoreChoice implements RPCoreGType { - public final ParamRole src; // "Singleton" -- checked by isWellFormed - public final ParamRole dest; // this.dest == super.role -- arbitrary? + public final RPIndexedRole src; // "Singleton" -- checked by isWellFormed + public final RPIndexedRole dest; // this.dest == super.role -- arbitrary? - public ParamCoreGChoice(ParamRole src, ParamCoreGActionKind kind, ParamRole dest, LinkedHashMap cases) + public RPCoreGChoice(RPIndexedRole src, RPCoreGActionKind kind, RPIndexedRole dest, LinkedHashMap cases) { super(dest, kind, cases); this.src = src; @@ -50,9 +50,9 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) // src (i.e., choice subj) range size=1 for non-unary choices enforced by ParamScribble.g syntax // Directed choice check by ParamCoreGProtocolDeclTranslator ensures all dests (including ranges) are (syntactically) the same - ParamRange srcRange = this.src.getParsedRange(); - ParamRange destRange = this.dest.getParsedRange(); - Set vars = Stream.of(srcRange, destRange).flatMap(r -> r.getVars().stream()).collect(Collectors.toSet()); + RPInterval srcRange = this.src.getParsedRange(); + RPInterval destRange = this.dest.getParsedRange(); + Set vars = Stream.of(srcRange, destRange).flatMap(r -> r.getVars().stream()).collect(Collectors.toSet()); /*// CHECKME: is range size>0 already ensured by syntax? Function foo1 = r -> @@ -69,7 +69,7 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) return Z3Wrapper.checkSat(job, gpd, foo); };*/ - Function foo1 = r -> // FIXME: factor out with above + Function foo1 = r -> // FIXME: factor out with above "(assert " + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and (and") + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant @@ -77,7 +77,7 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) + " (> " + r.start.toSmt2Formula() + " " + r.end.toSmt2Formula() + ")" + (vars.isEmpty() ? "" : "))") + ")"; - Predicate foo2 = r -> + Predicate foo2 = r -> { String foo = foo1.apply(r); @@ -91,7 +91,7 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } - if (this.kind == ParamCoreGActionKind.CROSS_TRANSFER) + if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) { if (this.cases.size() > 1) { @@ -114,7 +114,7 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) if (this.src.getName().equals(this.dest.getName())) { - if (this.kind == ParamCoreGActionKind.CROSS_TRANSFER) + if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) { String smt2 = "(assert (exists ((foobartmp Int)"; // FIXME: factor out smt2 += vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")); @@ -135,7 +135,7 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } } - if (this.kind == ParamCoreGActionKind.DOT_TRANSFER) + if (this.kind == RPCoreGActionKind.DOT_TRANSFER) { String smt2 = "(assert" + (vars.isEmpty() ? "" : " (forall (" + vars.stream().map(v -> "(" + v + " Int)").collect(Collectors.joining(" "))) + ") " @@ -159,27 +159,27 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } @Override - public ParamCoreGActionKind getKind() + public RPCoreGActionKind getKind() { - return (ParamCoreGActionKind) this.kind; + return (RPCoreGActionKind) this.kind; } @Override - public Set getParamRoles() + public Set getParamRoles() { - Set res = Stream.of(this.src, this.dest).collect(Collectors.toSet()); + Set res = Stream.of(this.src, this.dest).collect(Collectors.toSet()); this.cases.values().forEach(c -> res.addAll(c.getParamRoles())); return res; } @Override //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException - public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { - LinkedHashMap projs = new LinkedHashMap<>(); - for (Entry e : this.cases.entrySet()) + LinkedHashMap projs = new LinkedHashMap<>(); + for (Entry e : this.cases.entrySet()) { - ParamCoreMessage a = e.getKey(); + RPCoreMessage a = e.getKey(); //projs.put(a, e.getValue().project(af, r, ranges)); projs.put(a, e.getValue().project(af, subj)); // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) @@ -203,61 +203,61 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro Role srcName = this.src.getName(); Role destName = this.dest.getName(); Role subjName = subj.getName(); - ParamRange srcRange = this.src.getParsedRange(); - ParamRange destRange = this.dest.getParsedRange(); - if (this.kind == ParamCoreGActionKind.CROSS_TRANSFER) + RPInterval srcRange = this.src.getParsedRange(); + RPInterval destRange = this.dest.getParsedRange(); + if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) { //if (this.src.getName().equals(r)) if (srcName.equals(subjName) && subj.ranges.contains(srcRange)) // FIXME: factor out? { - return af.ParamCoreLCrossChoice(this.dest, ParamCoreLActionKind.CROSS_SEND, projs); + return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); } else if (destName.equals(subjName) && subj.ranges.contains(destRange)) { - return af.ParamCoreLCrossChoice(this.src, ParamCoreLActionKind.CROSS_RECEIVE, projs); + return af.ParamCoreLCrossChoice(this.src, RPCoreLActionKind.CROSS_RECEIVE, projs); } } - else if (this.kind == ParamCoreGActionKind.DOT_TRANSFER) + else if (this.kind == RPCoreGActionKind.DOT_TRANSFER) { if (srcName.equals(subjName) && subj.ranges.contains(srcRange)) // FIXME: factor out? { if (destName.equals(subjName) && subj.ranges.contains(destRange)) // Possible for dot-transfer (src.start != dest.start) -- cf. cross-transfer { - ParamIndexExpr offset = ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Add, - ParamIndexFactory.ParamIntVar("_id"), - ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Subt, destRange.start, srcRange.start)); + RPIndexExpr offset = RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Add, + RPIndexFactory.ParamIntVar("_id"), + RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Subt, destRange.start, srcRange.start)); /*Map tmp = projs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, p -> new ParamCoreLDotChoice(this.dest, offset, ParamCoreLActionKind.DOT_SEND, Stream.of(p.getKey()).collect(Collectors.toMap(k -> k, k -> p.getValue()))) ));*/ - Function, LinkedHashMap> foo = e -> + Function, LinkedHashMap> foo = e -> { - LinkedHashMap res = new LinkedHashMap<>(); + LinkedHashMap res = new LinkedHashMap<>(); res.put(e.getKey(), e.getValue()); return res; }; - LinkedHashMap tmp = new LinkedHashMap<>(); + LinkedHashMap tmp = new LinkedHashMap<>(); projs.entrySet().forEach(e -> tmp.put(e.getKey(), - new ParamCoreLDotChoice(this.dest, offset, ParamCoreLActionKind.DOT_SEND, foo.apply(e)))); - ParamIndexExpr offset2 = ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Add, - ParamIndexFactory.ParamIntVar("_id"), - ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Subt, srcRange.start, destRange.start)); - return af.ParamCoreLDotChoice(this.src, offset2, ParamCoreLActionKind.DOT_RECEIVE, tmp); + new RPCoreLDotChoice(this.dest, offset, RPCoreLActionKind.DOT_SEND, foo.apply(e)))); + RPIndexExpr offset2 = RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Add, + RPIndexFactory.ParamIntVar("_id"), + RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Subt, srcRange.start, destRange.start)); + return af.ParamCoreLDotChoice(this.src, offset2, RPCoreLActionKind.DOT_RECEIVE, tmp); } else { - ParamIndexExpr offset = ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Add, - ParamIndexFactory.ParamIntVar("_id"), - ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Subt, destRange.start, srcRange.start)); - return af.ParamCoreLDotChoice(this.dest, offset, ParamCoreLActionKind.DOT_SEND, projs); + RPIndexExpr offset = RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Add, + RPIndexFactory.ParamIntVar("_id"), + RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Subt, destRange.start, srcRange.start)); + return af.ParamCoreLDotChoice(this.dest, offset, RPCoreLActionKind.DOT_SEND, projs); } } else if (destName.equals(subjName) && subj.ranges.contains(destRange)) { - ParamIndexExpr offset = ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Add, - ParamIndexFactory.ParamIntVar("_id"), - ParamIndexFactory.ParamBinIndexExpr(ParamBinIndexExpr.Op.Subt, srcRange.start, destRange.start)); - return af.ParamCoreLDotChoice(this.src, offset, ParamCoreLActionKind.DOT_RECEIVE, projs); + RPIndexExpr offset = RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Add, + RPIndexFactory.ParamIntVar("_id"), + RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Subt, srcRange.start, destRange.start)); + return af.ParamCoreLDotChoice(this.src, offset, RPCoreLActionKind.DOT_RECEIVE, projs); } } else @@ -271,13 +271,13 @@ else if (destName.equals(subjName) && subj.ranges.contains(destRange)) } //private ParamCoreLType merge(ParamCoreAstFactory af, Role r, Set ranges, Map projs) throws ParamCoreSyntaxException - private ParamCoreLType merge(ParamCoreAstFactory af, ParamActualRole r, Map projs) throws ParamCoreSyntaxException + private RPCoreLType merge(RPCoreAstFactory af, RPRoleVariant r, Map projs) throws RPCoreSyntaxException { // "Merge" - Set values = new HashSet<>(projs.values()); + Set values = new HashSet<>(projs.values()); if (values.size() > 1) { - throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + throw new RPCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r //+ " for " + ranges + ": cannot merge for: " + projs.keySet()); } @@ -301,17 +301,17 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreGChoice)) + if (!(obj instanceof RPCoreGChoice)) { return false; } - return super.equals(obj) && this.src.equals(((ParamCoreGChoice) obj).src); // Does canEquals + return super.equals(obj) && this.src.equals(((RPCoreGChoice) obj).src); // Does canEquals } @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreGChoice; + return o instanceof RPCoreGChoice; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java similarity index 51% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java index ca8eb0a27..280d76943 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java @@ -4,21 +4,21 @@ import java.util.Set; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ext.go.core.ast.ParamCoreAstFactory; -import org.scribble.ext.go.core.ast.ParamCoreEnd; -import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreEnd; +import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; -public class ParamCoreGEnd extends ParamCoreEnd implements ParamCoreGType +public class RPCoreGEnd extends RPCoreEnd implements RPCoreGType { - public static final ParamCoreGEnd END = new ParamCoreGEnd(); + public static final RPCoreGEnd END = new RPCoreGEnd(); - private ParamCoreGEnd() + private RPCoreGEnd() { } @@ -30,14 +30,14 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } @Override - public Set getParamRoles() + public Set getParamRoles() { return Collections.emptySet(); } @Override //public ParamCoreLEnd project(ParamCoreAstFactory af, Role r, Set ranges) - public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { return af.ParamCoreLEnd(); } @@ -45,7 +45,7 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro @Override public boolean equals(Object obj) { - if (!(obj instanceof ParamCoreGEnd)) + if (!(obj instanceof RPCoreGEnd)) { return false; } @@ -55,7 +55,7 @@ public boolean equals(Object obj) @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreGEnd; + return o instanceof RPCoreGEnd; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java similarity index 73% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java index 5c736a54f..da362825c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java @@ -10,38 +10,38 @@ import java.util.stream.Stream; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ext.go.core.ast.ParamCoreAstFactory; -import org.scribble.ext.go.core.ast.ParamCoreChoice; -import org.scribble.ext.go.core.ast.ParamCoreMessage; -import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; -import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreChoice; +import org.scribble.ext.go.core.ast.RPCoreMessage; +import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Global; -public class ParamCoreGMultiChoices extends ParamCoreChoice implements ParamCoreGType +public class RPCoreGMultiChoices extends RPCoreChoice implements RPCoreGType { - public final ParamRole src; // Gives the Scribble choices-subj range // Cf. ParamCoreGChoice singleton src - public final ParamIndexVar var; + public final RPIndexedRole src; // Gives the Scribble choices-subj range // Cf. ParamCoreGChoice singleton src + public final RPIndexVar var; - public final ParamRole dest; // this.dest == super.role -- arbitrary? + public final RPIndexedRole dest; // this.dest == super.role -- arbitrary? - public ParamCoreGMultiChoices(ParamRole src, ParamIndexVar var, ParamRole dest, List cases, ParamCoreGType cont) + public RPCoreGMultiChoices(RPIndexedRole src, RPIndexVar var, RPIndexedRole dest, List cases, RPCoreGType cont) { //super(dest, ParamCoreGActionKind.CROSS_TRANSFER, cases.stream().collect(Collectors.toMap(c -> c, c -> cont))); // FIXME - super(dest, ParamCoreGActionKind.CROSS_TRANSFER, foo(cases, cont)); // FIXME + super(dest, RPCoreGActionKind.CROSS_TRANSFER, foo(cases, cont)); // FIXME this.src = src; this.dest = dest; this.var = var; } - private static LinkedHashMap foo(List cases, ParamCoreGType cont) + private static LinkedHashMap foo(List cases, RPCoreGType cont) { - LinkedHashMap tmp = new LinkedHashMap<>(); + LinkedHashMap tmp = new LinkedHashMap<>(); cases.stream().forEach(c -> tmp.put(c, cont)); return tmp; } @@ -140,32 +140,32 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } @Override - public ParamCoreGActionKind getKind() + public RPCoreGActionKind getKind() { - return (ParamCoreGActionKind) this.kind; + return (RPCoreGActionKind) this.kind; } @Override - public Set getParamRoles() + public Set getParamRoles() { - Set res = Stream.of(this.src, this.dest).collect(Collectors.toSet()); + Set res = Stream.of(this.src, this.dest).collect(Collectors.toSet()); res.addAll(this.cases.values().iterator().next().getParamRoles()); return res; } @Override //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException - public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { - if (this.kind != ParamCoreGActionKind.CROSS_TRANSFER) + if (this.kind != RPCoreGActionKind.CROSS_TRANSFER) { throw new RuntimeException("[param-core] TODO: " + this); } - LinkedHashMap projs = new LinkedHashMap<>(); - for (Entry e : this.cases.entrySet()) + LinkedHashMap projs = new LinkedHashMap<>(); + for (Entry e : this.cases.entrySet()) { - ParamCoreMessage a = e.getKey(); + RPCoreMessage a = e.getKey(); //projs.put(a, e.getValue().project(af, r, ranges)); projs.put(a, e.getValue().project(af, subj)); // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) @@ -173,10 +173,10 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro } // FIXME: same condition as merge (factor out) // FIXME: no, already syntactic singleton continuation already checked by ParamCoreGProtocolDeclTranslator? - Set values = new HashSet<>(projs.values()); + Set values = new HashSet<>(projs.values()); if (values.size() > 1) { - throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + subj + throw new RPCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + subj //+ " for " + ranges + ": cannot merge for: " + projs.keySet()); } @@ -184,7 +184,7 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro // "Simple" cases -- same projection as ParamCoreGChoice, i.e., same local types? -- index var redundant, apart from "syntactic consistency" for subsequent message actions? (i.e., only for Scribble syntax?) if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? { - return af.ParamCoreLCrossChoice(this.dest, ParamCoreLActionKind.CROSS_SEND, projs); + return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); } else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) { @@ -198,13 +198,13 @@ else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this } //private ParamCoreLType merge(ParamCoreAstFactory af, Role r, Set ranges, Map projs) throws ParamCoreSyntaxException - private ParamCoreLType merge(ParamCoreAstFactory af, ParamActualRole r, Map projs) throws ParamCoreSyntaxException + private RPCoreLType merge(RPCoreAstFactory af, RPRoleVariant r, Map projs) throws RPCoreSyntaxException { // "Merge" - Set values = new HashSet<>(projs.values()); + Set values = new HashSet<>(projs.values()); if (values.size() > 1) { - throw new ParamCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + throw new RPCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r //+ " for " + ranges + ": cannot merge for: " + projs.keySet()); } @@ -215,7 +215,7 @@ private ParamCoreLType merge(ParamCoreAstFactory af, ParamActualRole r, Map(), false, false); } // List because subList is useful for parsing the continuation - private ParamCoreGType parseSeq(List is, Map rvs, - boolean checkChoiceGuard, boolean checkRecGuard) throws ParamCoreSyntaxException + private RPCoreGType parseSeq(List is, Map rvs, + boolean checkChoiceGuard, boolean checkRecGuard) throws RPCoreSyntaxException { if (is.isEmpty()) { @@ -92,18 +92,18 @@ private ParamCoreGType parseSeq(List is, Map r { if (checkChoiceGuard) // No "flattening" of nested choices not allowed? { - throw new ParamCoreSyntaxException(first.getSource(), "[param-core] Unguarded in choice case: " + first); + throw new RPCoreSyntaxException(first.getSource(), "[param-core] Unguarded in choice case: " + first); } if (is.size() > 1) { - throw new ParamCoreSyntaxException(is.get(1).getSource(), "[param-core] Bad sequential composition after: " + first); + throw new RPCoreSyntaxException(is.get(1).getSource(), "[param-core] Bad sequential composition after: " + first); } if (first instanceof GChoice) { - if (first instanceof ParamGMultiChoices) + if (first instanceof RPGMultiChoices) { - return parseParamGMultiChoices(rvs, checkRecGuard, (ParamGMultiChoices) first); + return parseParamGMultiChoices(rvs, checkRecGuard, (RPGMultiChoices) first); } else // GChoice or ParamGChoice { @@ -125,27 +125,27 @@ else if (first instanceof GContinue) } } - private ParamCoreGType parseGChoice(Map rvs, - boolean checkRecGuard, GChoice gc) throws ParamCoreSyntaxException + private RPCoreGType parseGChoice(Map rvs, + boolean checkRecGuard, GChoice gc) throws RPCoreSyntaxException { - List children = new LinkedList<>(); + List children = new LinkedList<>(); for (GProtocolBlock b : gc.getBlocks()) { children.add(parseSeq(b.getInteractionSeq().getInteractions(), rvs, true, checkRecGuard)); // Check cases are guarded } - ParamCoreGActionKind kind = null; - ParamRole src = null; - ParamRole dest = null; - LinkedHashMap cases = new LinkedHashMap<>(); - for (ParamCoreGType c : children) + RPCoreGActionKind kind = null; + RPIndexedRole src = null; + RPIndexedRole dest = null; + LinkedHashMap cases = new LinkedHashMap<>(); + for (RPCoreGType c : children) { // Because all cases should be action guards (unary choices) - if (!(c instanceof ParamCoreGChoice)) + if (!(c instanceof RPCoreGChoice)) { throw new RuntimeException("[param-core] Shouldn't get in here: " + c); } - ParamCoreGChoice tmp = (ParamCoreGChoice) c; + RPCoreGChoice tmp = (RPCoreGChoice) c; if (tmp.cases.size() > 1) { throw new RuntimeException("[param-core] Shouldn't get in here: " + c); @@ -163,17 +163,17 @@ else if (!kind.equals(tmp.kind)) } else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) { - throw new ParamCoreSyntaxException(gc.getSource(), + throw new RPCoreSyntaxException(gc.getSource(), "[param-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); } // "Flatten" nested choices (already checked they are guarded) -- Scribble choice subjects ignored - for (Entry e : tmp.cases.entrySet()) + for (Entry e : tmp.cases.entrySet()) { - ParamCoreMessage k = e.getKey(); + RPCoreMessage k = e.getKey(); if (cases.keySet().stream().anyMatch(x -> x.op.equals(k.op))) { - throw new ParamCoreSyntaxException(gc.getSource(), + throw new RPCoreSyntaxException(gc.getSource(), "[param-core] Non-deterministic actions not supported: " + k.op); } cases.put(k, e.getValue()); @@ -183,43 +183,43 @@ else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) return this.af.ParamCoreGChoice(src, kind, dest, cases); } - private ParamCoreGMultiChoices parseGMultiChoicesTransfer(List is, Map rvs) throws ParamCoreSyntaxException + private RPCoreGMultiChoices parseGMultiChoicesTransfer(List is, Map rvs) throws RPCoreSyntaxException { GInteractionNode in = is.get(0); - if (!(in instanceof ParamGMultiChoicesTransfer)) + if (!(in instanceof RPGMultiChoicesTransfer)) { - throw new ParamCoreSyntaxException(in.getSource(), "[param-core] Expected GMultiChoicesTransfer: " + in.getClass()); + throw new RPCoreSyntaxException(in.getSource(), "[param-core] Expected GMultiChoicesTransfer: " + in.getClass()); } - ParamGMultiChoicesTransfer gmt = (ParamGMultiChoicesTransfer) in; - ParamCoreMessage a = this.af.ParamCoreAction(parseOp(gmt), parsePayload(gmt)); + RPGMultiChoicesTransfer gmt = (RPGMultiChoicesTransfer) in; + RPCoreMessage a = this.af.ParamCoreAction(parseOp(gmt), parsePayload(gmt)); String srcName = parseSourceRole(gmt); String destName = parseDestinationRole(gmt); - ParamRole src = af.ParamRole(srcName, new ParamRange(gmt.var, gmt.var)); // HACK var -- multichoices needs src range (e.g., projection), but multichoicestransfer doesn't - ParamRole dest = af.ParamRole(destName, new ParamRange(gmt.destRangeStart, gmt.destRangeEnd)); + RPIndexedRole src = af.ParamRole(srcName, new RPInterval(gmt.var, gmt.var)); // HACK var -- multichoices needs src range (e.g., projection), but multichoicestransfer doesn't + RPIndexedRole dest = af.ParamRole(destName, new RPInterval(gmt.destRangeStart, gmt.destRangeEnd)); - ParamCoreGType cont = parseSeq(is.subList(1, is.size()), rvs, false, false); // Subseqeuent choice/rec is guarded by (at least) this action + RPCoreGType cont = parseSeq(is.subList(1, is.size()), rvs, false, false); // Subseqeuent choice/rec is guarded by (at least) this action return this.af.ParamCoreGMultiChoices(src, gmt.var, dest, Stream.of(a).collect(Collectors.toList()), cont); } // FIXME: factor out with parseGChoice - private ParamCoreGType parseParamGMultiChoices(Map rvs, - boolean checkRecGuard, ParamGMultiChoices gc) throws ParamCoreSyntaxException + private RPCoreGType parseParamGMultiChoices(Map rvs, + boolean checkRecGuard, RPGMultiChoices gc) throws RPCoreSyntaxException { - List children = new LinkedList<>(); + List children = new LinkedList<>(); for (GProtocolBlock b : gc.getBlocks()) { children.add(parseGMultiChoicesTransfer(b.getInteractionSeq().getInteractions(), rvs)); // Check cases are guarded } - ParamCoreGActionKind kind = null; - ParamRole src = null; - ParamRole dest = null; - LinkedHashMap cases = new LinkedHashMap<>(); - for (ParamCoreGMultiChoices c : children) + RPCoreGActionKind kind = null; + RPIndexedRole src = null; + RPIndexedRole dest = null; + LinkedHashMap cases = new LinkedHashMap<>(); + for (RPCoreGMultiChoices c : children) { - ParamCoreGMultiChoices tmp = (ParamCoreGMultiChoices) c; + RPCoreGMultiChoices tmp = (RPCoreGMultiChoices) c; if (tmp.cases.size() > 1) { throw new RuntimeException("[param-core] Shouldn't get in here: " + c); @@ -237,17 +237,17 @@ else if (!kind.equals(tmp.kind)) } else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) { - throw new ParamCoreSyntaxException(gc.getSource(), + throw new RPCoreSyntaxException(gc.getSource(), "[param-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); } // "Flatten" nested choices (already checked they are guarded) -- Scribble choice subjects ignored - for (Entry e : tmp.cases.entrySet()) + for (Entry e : tmp.cases.entrySet()) { - ParamCoreMessage k = e.getKey(); + RPCoreMessage k = e.getKey(); if (cases.keySet().stream().anyMatch(x -> x.op.equals(k.op))) { - throw new ParamCoreSyntaxException(gc.getSource(), + throw new RPCoreSyntaxException(gc.getSource(), "[param-core] Non-deterministic actions not supported: " + k.op); } cases.put(k, e.getValue()); @@ -256,37 +256,37 @@ else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) if (new HashSet<>(cases.values()).size() > 1) { - throw new ParamCoreSyntaxException(gc.getSource(), + throw new RPCoreSyntaxException(gc.getSource(), "[param-core] Continuations not syntactically equal: " + cases.values()); } return this.af.ParamCoreGMultiChoices( //src, - new ParamRole(gc.subj.toString(), Stream.of(new ParamRange(gc.start, gc.end)).collect(Collectors.toSet())), + new RPIndexedRole(gc.subj.toString(), Stream.of(new RPInterval(gc.start, gc.end)).collect(Collectors.toSet())), gc.var, dest, cases.keySet().stream().collect(Collectors.toList()), cases.values().iterator().next()); } - private ParamCoreGType parseGRecursion(Map rvs, - boolean checkChoiceGuard, GRecursion gr) throws ParamCoreSyntaxException + private RPCoreGType parseGRecursion(Map rvs, + boolean checkChoiceGuard, GRecursion gr) throws RPCoreSyntaxException { RecVar recvar = gr.recvar.toName(); if (recvar.toString().contains("__")) // HACK: "inlined proto rec var" { - RecVarNode rvn = (RecVarNode) ((ParamAstFactory) this.job.af).SimpleNameNode(null, RecVarKind.KIND, makeFreshRecVarName()); + RecVarNode rvn = (RecVarNode) ((RPAstFactory) this.job.af).SimpleNameNode(null, RecVarKind.KIND, makeFreshRecVarName()); rvs.put(recvar, rvn.toName()); recvar = rvn.toName(); } - ParamCoreGType body = parseSeq(gr.getBlock().getInteractionSeq().getInteractions(), rvs, checkChoiceGuard, true); // Check rec body is guarded + RPCoreGType body = parseSeq(gr.getBlock().getInteractionSeq().getInteractions(), rvs, checkChoiceGuard, true); // Check rec body is guarded return this.af.ParamCoreGRec(recvar, body); } - private ParamCoreGType parseGContinue(Map rvs, boolean checkRecGuard, GContinue gc) - throws ParamCoreSyntaxException + private RPCoreGType parseGContinue(Map rvs, boolean checkRecGuard, GContinue gc) + throws RPCoreSyntaxException { if (checkRecGuard) { - throw new ParamCoreSyntaxException(gc.getSource(), "[param-core] Unguarded in recursion: " + gc); // FIXME: too conservative, e.g., rec X . A -> B . rec Y . X + throw new RPCoreSyntaxException(gc.getSource(), "[param-core] Unguarded in recursion: " + gc); // FIXME: too conservative, e.g., rec X . A -> B . rec Y . X } RecVar recvar = gc.recvar.toName(); if (rvs.containsKey(recvar)) @@ -297,84 +297,84 @@ private ParamCoreGType parseGContinue(Map rvs, boolean checkRecG } // Parses message interactions as unary choices - private ParamCoreGChoice parseGMessageTransfer(List is, Map rvs, GMessageTransfer gmt) throws ParamCoreSyntaxException + private RPCoreGChoice parseGMessageTransfer(List is, Map rvs, GMessageTransfer gmt) throws RPCoreSyntaxException { - ParamCoreMessage a = this.af.ParamCoreAction(parseOp(gmt), parsePayload(gmt)); + RPCoreMessage a = this.af.ParamCoreAction(parseOp(gmt), parsePayload(gmt)); String srcName = parseSourceRole(gmt); String destName = parseDestinationRole(gmt); - ParamCoreGActionKind kind; - ParamRole src; - ParamRole dest; - if (gmt instanceof ParamGCrossMessageTransfer) + RPCoreGActionKind kind; + RPIndexedRole src; + RPIndexedRole dest; + if (gmt instanceof RPGCrossMessageTransfer) { - ParamGCrossMessageTransfer cross = (ParamGCrossMessageTransfer) gmt; - kind = ParamCoreGActionKind.CROSS_TRANSFER; + RPGCrossMessageTransfer cross = (RPGCrossMessageTransfer) gmt; + kind = RPCoreGActionKind.CROSS_TRANSFER; /*src = af.ParamRole(srcName, new ParamRange(cross.srcRangeStart.toName(), cross.srcRangeEnd.toName())); dest = af.ParamRole(destName, new ParamRange(cross.destRangeStart.toName(), cross.destRangeEnd.toName()));*/ - src = af.ParamRole(srcName, new ParamRange(cross.srcRangeStart, cross.srcRangeEnd)); - dest = af.ParamRole(destName, new ParamRange(cross.destRangeStart, cross.destRangeEnd)); + src = af.ParamRole(srcName, new RPInterval(cross.srcRangeStart, cross.srcRangeEnd)); + dest = af.ParamRole(destName, new RPInterval(cross.destRangeStart, cross.destRangeEnd)); } - else if (gmt instanceof ParamGDotMessageTransfer) + else if (gmt instanceof RPGDotMessageTransfer) { - ParamGDotMessageTransfer dot = (ParamGDotMessageTransfer) gmt; - kind = ParamCoreGActionKind.DOT_TRANSFER; + RPGDotMessageTransfer dot = (RPGDotMessageTransfer) gmt; + kind = RPCoreGActionKind.DOT_TRANSFER; /*src = af.ParamRole(srcName, new ParamRange(dot.srcRangeStart.toName(), dot.srcRangeEnd.toName())); dest = af.ParamRole(destName, new ParamRange(dot.destRangeStart.toName(), dot.destRangeEnd.toName()));*/ - src = af.ParamRole(srcName, new ParamRange(dot.srcRangeStart, dot.srcRangeEnd)); - dest = af.ParamRole(destName, new ParamRange(dot.destRangeStart, dot.destRangeEnd)); + src = af.ParamRole(srcName, new RPInterval(dot.srcRangeStart, dot.srcRangeEnd)); + dest = af.ParamRole(destName, new RPInterval(dot.destRangeStart, dot.destRangeEnd)); } else { /*src = af.ParamRole(srcName, 1, 1); dest = af.ParamRole(destName, 1, 1);*/ - throw new ParamCoreSyntaxException(gmt.getSource(), "[param-core] Not supported: " + gmt.getClass() + "\n " + gmt); + throw new RPCoreSyntaxException(gmt.getSource(), "[param-core] Not supported: " + gmt.getClass() + "\n " + gmt); } return parseGSimpleInteractionNode(is, rvs, src, kind, a, dest); } // Duplicated from parseGMessageTransfer (MessageTransfer and ConnectionAction have no common - private ParamCoreGChoice parseGSimpleInteractionNode( + private RPCoreGChoice parseGSimpleInteractionNode( List is, Map rvs, - ParamRole src, ParamCoreGActionKind kind, ParamCoreMessage a, ParamRole dest) throws ParamCoreSyntaxException + RPIndexedRole src, RPCoreGActionKind kind, RPCoreMessage a, RPIndexedRole dest) throws RPCoreSyntaxException { if (src.equals(dest)) { throw new RuntimeException("[param-core] Shouldn't get in here (self-communication): " + src + ", " + dest); } - ParamCoreGType cont = parseSeq(is.subList(1, is.size()), rvs, false, false); // Subseqeuent choice/rec is guarded by (at least) this action - LinkedHashMap tmp = new LinkedHashMap<>(); + RPCoreGType cont = parseSeq(is.subList(1, is.size()), rvs, false, false); // Subseqeuent choice/rec is guarded by (at least) this action + LinkedHashMap tmp = new LinkedHashMap<>(); tmp.put(a, cont); return this.af.ParamCoreGChoice(src, kind, dest, tmp); //Stream.of(a).collect(Collectors.toMap(x -> x, x -> cont))); } - private Op parseOp(GMessageTransfer gmt) throws ParamCoreSyntaxException + private Op parseOp(GMessageTransfer gmt) throws RPCoreSyntaxException { return parseOp(gmt.msg); } - private Op parseOp(MessageNode mn) throws ParamCoreSyntaxException + private Op parseOp(MessageNode mn) throws RPCoreSyntaxException { if (!mn.isMessageSigNode()) { - throw new ParamCoreSyntaxException(mn.getSource(), " [param-core] Message sig names not supported: " + mn); // TODO: MessageSigName + throw new RPCoreSyntaxException(mn.getSource(), " [param-core] Message sig names not supported: " + mn); // TODO: MessageSigName } MessageSigNode msn = ((MessageSigNode) mn); return msn.op.toName(); } - private Payload parsePayload(GMessageTransfer gmt) throws ParamCoreSyntaxException + private Payload parsePayload(GMessageTransfer gmt) throws RPCoreSyntaxException { return parsePayload(gmt.msg); } - private Payload parsePayload(MessageNode mn) throws ParamCoreSyntaxException + private Payload parsePayload(MessageNode mn) throws RPCoreSyntaxException { if (!mn.isMessageSigNode()) { - throw new ParamCoreSyntaxException(mn.getSource(), " [param-core] Message sig names not supported: " + mn); // TODO: MessageSigName + throw new RPCoreSyntaxException(mn.getSource(), " [param-core] Message sig names not supported: " + mn); // TODO: MessageSigName } return ((MessageSigNode) mn).toMessage().payload; } @@ -389,16 +389,16 @@ private String parseSourceRole(RoleNode rn) return rn.toString(); } - private String parseDestinationRole(GMessageTransfer gmt) throws ParamCoreSyntaxException + private String parseDestinationRole(GMessageTransfer gmt) throws RPCoreSyntaxException { if (gmt.getDestinations().size() > 1) { - throw new ParamCoreSyntaxException(gmt.getSource(), " [TODO] Multicast not supported: " + gmt); + throw new RPCoreSyntaxException(gmt.getSource(), " [TODO] Multicast not supported: " + gmt); } return parseDestinationRole(gmt.getDestinations().get(0)); } - private String parseDestinationRole(RoleNode rn) throws ParamCoreSyntaxException + private String parseDestinationRole(RoleNode rn) throws RPCoreSyntaxException { return rn.toString(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java similarity index 50% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java index a6626e6e0..8bc19dc5e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java @@ -3,21 +3,21 @@ import java.util.Set; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ext.go.core.ast.ParamCoreAstFactory; -import org.scribble.ext.go.core.ast.ParamCoreRec; -import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; -import org.scribble.ext.go.core.ast.local.ParamCoreLRecVar; -import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreRec; +import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.RPCoreLEnd; +import org.scribble.ext.go.core.ast.local.RPCoreLRecVar; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; -public class ParamCoreGRec extends ParamCoreRec implements ParamCoreGType +public class RPCoreGRec extends RPCoreRec implements RPCoreGType { - public ParamCoreGRec(RecVar recvar, ParamCoreGType body) + public RPCoreGRec(RecVar recvar, RPCoreGType body) { super(recvar, body); } @@ -29,21 +29,21 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } @Override - public Set getParamRoles() + public Set getParamRoles() { return this.body.getParamRoles(); } @Override //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException - public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { //ParamCoreLType proj = this.body.project(af, r, ranges); - ParamCoreLType proj = this.body.project(af, subj); - if (proj instanceof ParamCoreLRecVar) + RPCoreLType proj = this.body.project(af, subj); + if (proj instanceof RPCoreLRecVar) { - ParamCoreLRecVar rv = (ParamCoreLRecVar) proj; - return rv.recvar.equals(this.recvar) ? ParamCoreLEnd.END : rv; + RPCoreLRecVar rv = (RPCoreLRecVar) proj; + return rv.recvar.equals(this.recvar) ? RPCoreLEnd.END : rv; } else { @@ -58,7 +58,7 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreGRec)) + if (!(obj instanceof RPCoreGRec)) { return false; } @@ -68,7 +68,7 @@ public boolean equals(Object obj) @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreGRec; + return o instanceof RPCoreGRec; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java similarity index 56% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java index 3621f7172..1bb44995c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/ParamCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java @@ -4,20 +4,20 @@ import java.util.Set; import org.scribble.ast.global.GProtocolDecl; -import org.scribble.ext.go.core.ast.ParamCoreAstFactory; -import org.scribble.ext.go.core.ast.ParamCoreRecVar; -import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreRecVar; +import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; -public class ParamCoreGRecVar extends ParamCoreRecVar implements ParamCoreGType +public class RPCoreGRecVar extends RPCoreRecVar implements RPCoreGType { - public ParamCoreGRecVar(RecVar var) + public RPCoreGRecVar(RecVar var) { super(var); } @@ -29,14 +29,14 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } @Override - public Set getParamRoles() + public Set getParamRoles() { return Collections.emptySet(); } @Override //public ParamCoreLRecVar project(ParamCoreAstFactory af, Role r, Set ranges) - public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) throws ParamCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { return af.ParamCoreLRecVar(this.recvar); } @@ -44,7 +44,7 @@ public ParamCoreLType project(ParamCoreAstFactory af, ParamActualRole subj) thro @Override public boolean equals(Object obj) { - if (!(obj instanceof ParamCoreGRecVar)) + if (!(obj instanceof RPCoreGRecVar)) { return false; } @@ -62,6 +62,6 @@ public int hashCode() @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreGRecVar; + return o instanceof RPCoreGRecVar; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java new file mode 100644 index 000000000..a7d08ce98 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java @@ -0,0 +1,26 @@ +package org.scribble.ext.go.core.ast.global; + +import java.util.Set; + +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.main.GoJob; +import org.scribble.type.kind.Global; + + +public interface RPCoreGType extends RPCoreType +{ + + boolean isWellFormed(GoJob job, GProtocolDecl gpd); + + // FIXME: clarify, Role subj is used as "role name" + //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; + RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException; + + Set getParamRoles(); +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java deleted file mode 100644 index a96cb5913..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLType.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.scribble.ext.go.core.ast.local; - -import org.scribble.ext.go.core.ast.ParamCoreType; -import org.scribble.type.kind.Local; - - -public interface ParamCoreLType extends ParamCoreType -{ - -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLActionKind.java similarity index 83% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLActionKind.java index 5c2959db2..39309abe5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLActionKind.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLActionKind.java @@ -1,9 +1,9 @@ package org.scribble.ext.go.core.ast.local; -import org.scribble.ext.go.core.ast.ParamCoreActionKind; +import org.scribble.ext.go.core.ast.RPCoreActionKind; import org.scribble.type.kind.Local; -public enum ParamCoreLActionKind implements ParamCoreActionKind +public enum RPCoreLActionKind implements RPCoreActionKind { CROSS_SEND, CROSS_RECEIVE, // Multi-receive, but unary choice // Cf. API gen, unary vs. non-unary choice diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java similarity index 62% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java index 7e45c654e..1f6a0d8cf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java @@ -3,22 +3,22 @@ import java.util.LinkedHashMap; import java.util.stream.Collectors; -import org.scribble.ext.go.core.ast.ParamCoreChoice; -import org.scribble.ext.go.core.ast.ParamCoreMessage; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.ast.RPCoreChoice; +import org.scribble.ext.go.core.ast.RPCoreMessage; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.type.kind.Local; -public abstract class ParamCoreLChoice extends ParamCoreChoice implements ParamCoreLType +public abstract class RPCoreLChoice extends RPCoreChoice implements RPCoreLType { - protected ParamCoreLChoice(ParamRole role, ParamCoreLActionKind kind, LinkedHashMap cases) + protected RPCoreLChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMap cases) { super(role, kind, cases); } @Override - public ParamCoreLActionKind getKind() + public RPCoreLActionKind getKind() { - return (ParamCoreLActionKind) this.kind; + return (RPCoreLActionKind) this.kind; } @Override @@ -53,7 +53,7 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreLChoice)) + if (!(obj instanceof RPCoreLChoice)) { return false; } @@ -63,6 +63,6 @@ public boolean equals(Object obj) @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreLChoice; + return o instanceof RPCoreLChoice; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java similarity index 53% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java index 22ad40301..2b35f5e13 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLCrossChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java @@ -2,15 +2,15 @@ import java.util.LinkedHashMap; -import org.scribble.ext.go.core.ast.ParamCoreMessage; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.ast.RPCoreMessage; +import org.scribble.ext.go.core.type.RPIndexedRole; -public class ParamCoreLCrossChoice extends ParamCoreLChoice +public class RPCoreLCrossChoice extends RPCoreLChoice { - public ParamCoreLCrossChoice(ParamRole role, ParamCoreLActionKind kind, LinkedHashMap cases) + public RPCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMap cases) { super(role, kind, cases); - if (kind != ParamCoreLActionKind.CROSS_SEND && kind != ParamCoreLActionKind.CROSS_RECEIVE) + if (kind != RPCoreLActionKind.CROSS_SEND && kind != RPCoreLActionKind.CROSS_RECEIVE) { throw new RuntimeException("[param-core] Shouldn't get in here: " + kind); } @@ -31,7 +31,7 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreLCrossChoice)) + if (!(obj instanceof RPCoreLCrossChoice)) { return false; } @@ -41,6 +41,6 @@ public boolean equals(Object obj) @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreLCrossChoice; + return o instanceof RPCoreLCrossChoice; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java similarity index 53% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java index 2f160b076..c3cb754c1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLDotChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java @@ -2,19 +2,19 @@ import java.util.LinkedHashMap; -import org.scribble.ext.go.core.ast.ParamCoreMessage; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.core.ast.RPCoreMessage; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexExpr; -public class ParamCoreLDotChoice extends ParamCoreLChoice +public class RPCoreLDotChoice extends RPCoreLChoice { - public final ParamIndexExpr offset; + public final RPIndexExpr offset; - public ParamCoreLDotChoice(ParamRole role, ParamIndexExpr offset, ParamCoreLActionKind kind, LinkedHashMap cases) + public RPCoreLDotChoice(RPIndexedRole role, RPIndexExpr offset, RPCoreLActionKind kind, LinkedHashMap cases) { super(role, kind, cases); - if (kind != ParamCoreLActionKind.DOT_SEND && kind != ParamCoreLActionKind.DOT_RECEIVE) + if (kind != RPCoreLActionKind.DOT_SEND && kind != RPCoreLActionKind.DOT_RECEIVE) { throw new RuntimeException("[param-core] Shouldn't get in here: " + kind); } @@ -24,7 +24,7 @@ public ParamCoreLDotChoice(ParamRole role, ParamIndexExpr offset, ParamCoreLActi @Override public String toString() { - ParamRange g = this.role.ranges.iterator().next(); + RPInterval g = this.role.ranges.iterator().next(); return this.role.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + this.kind + casesToString(); } @@ -45,7 +45,7 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreLDotChoice)) + if (!(obj instanceof RPCoreLDotChoice)) { return false; } @@ -55,6 +55,6 @@ public boolean equals(Object obj) @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreLDotChoice; + return o instanceof RPCoreLDotChoice; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java similarity index 53% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java index 7e94f540f..dc9b7482b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java @@ -1,14 +1,14 @@ package org.scribble.ext.go.core.ast.local; -import org.scribble.ext.go.core.ast.ParamCoreEnd; +import org.scribble.ext.go.core.ast.RPCoreEnd; import org.scribble.type.kind.Local; -public class ParamCoreLEnd extends ParamCoreEnd implements ParamCoreLType +public class RPCoreLEnd extends RPCoreEnd implements RPCoreLType { - public static final ParamCoreLEnd END = new ParamCoreLEnd(); + public static final RPCoreLEnd END = new RPCoreLEnd(); - private ParamCoreLEnd() + private RPCoreLEnd() { } @@ -16,7 +16,7 @@ private ParamCoreLEnd() @Override public boolean equals(Object obj) { - if (!(obj instanceof ParamCoreLEnd)) + if (!(obj instanceof RPCoreLEnd)) { return false; } @@ -26,7 +26,7 @@ public boolean equals(Object obj) @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreLEnd; + return o instanceof RPCoreLEnd; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java similarity index 52% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java index d4c3ec9df..e0583262f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java @@ -4,30 +4,30 @@ import java.util.LinkedHashMap; import java.util.List; -import org.scribble.ext.go.core.ast.ParamCoreMessage; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.core.ast.RPCoreMessage; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexVar; // FIXME: factor out better with ParamCore(L)Choice -- or deprecate and just use kind? -public class ParamCoreLMultiChoices extends ParamCoreLChoice +public class RPCoreLMultiChoices extends RPCoreLChoice { - public final ParamIndexVar var; // Redundant? + public final RPIndexVar var; // Redundant? // Pre: cases.size() > 1 - public ParamCoreLMultiChoices(ParamRole role, ParamIndexVar var, List cases, ParamCoreLType cont) + public RPCoreLMultiChoices(RPIndexedRole role, RPIndexVar var, List cases, RPCoreLType cont) { - super(role, ParamCoreLActionKind.MULTICHOICES_RECEIVE, foo(cases, cont)); + super(role, RPCoreLActionKind.MULTICHOICES_RECEIVE, foo(cases, cont)); this.var = var; } - private static LinkedHashMap foo(List cases, ParamCoreLType cont) + private static LinkedHashMap foo(List cases, RPCoreLType cont) { - LinkedHashMap tmp = new LinkedHashMap<>(); + LinkedHashMap tmp = new LinkedHashMap<>(); cases.stream().forEach(c -> tmp.put(c, cont)); return tmp; } - public ParamCoreLType getContinuation() + public RPCoreLType getContinuation() { if (new HashSet<>(this.cases.values()).size() > 1) { @@ -52,11 +52,11 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreLMultiChoices)) + if (!(obj instanceof RPCoreLMultiChoices)) { return false; } - ParamCoreLMultiChoices them = (ParamCoreLMultiChoices) obj; + RPCoreLMultiChoices them = (RPCoreLMultiChoices) obj; return super.equals(this) && this.var.equals(them.var); } @@ -64,6 +64,6 @@ public boolean equals(Object obj) @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreLMultiChoices; + return o instanceof RPCoreLMultiChoices; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java similarity index 65% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java index 195f6f7c1..178e360bf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java @@ -1,12 +1,12 @@ package org.scribble.ext.go.core.ast.local; -import org.scribble.ext.go.core.ast.ParamCoreRec; +import org.scribble.ext.go.core.ast.RPCoreRec; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; -public class ParamCoreLRec extends ParamCoreRec implements ParamCoreLType +public class RPCoreLRec extends RPCoreRec implements RPCoreLType { - public ParamCoreLRec(RecVar recvar, ParamCoreLType body) + public RPCoreLRec(RecVar recvar, RPCoreLType body) { //super(recvar, annot, init, body); super(recvar, body); @@ -19,7 +19,7 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamCoreLRec)) + if (!(obj instanceof RPCoreLRec)) { return false; } @@ -29,7 +29,7 @@ public boolean equals(Object obj) @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreLRec; + return o instanceof RPCoreLRec; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java similarity index 62% rename from scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java index d9014128b..48ecc3592 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/ParamCoreLRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java @@ -1,13 +1,13 @@ package org.scribble.ext.go.core.ast.local; -import org.scribble.ext.go.core.ast.ParamCoreRecVar; +import org.scribble.ext.go.core.ast.RPCoreRecVar; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; -public class ParamCoreLRecVar extends ParamCoreRecVar implements ParamCoreLType +public class RPCoreLRecVar extends RPCoreRecVar implements RPCoreLType { - public ParamCoreLRecVar(RecVar var) + public RPCoreLRecVar(RecVar var) { super(var); } @@ -15,7 +15,7 @@ public ParamCoreLRecVar(RecVar var) @Override public boolean equals(Object obj) { - if (!(obj instanceof ParamCoreLRecVar)) + if (!(obj instanceof RPCoreLRecVar)) { return false; } @@ -33,6 +33,6 @@ public int hashCode() @Override public boolean canEquals(Object o) { - return o instanceof ParamCoreLRecVar; + return o instanceof RPCoreLRecVar; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java new file mode 100644 index 000000000..81a66b3be --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java @@ -0,0 +1,10 @@ +package org.scribble.ext.go.core.ast.local; + +import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.type.kind.Local; + + +public interface RPCoreLType extends RPCoreType +{ + +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java similarity index 85% rename from scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java index dcf7f752f..081d56e85 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgFlag.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java @@ -1,6 +1,6 @@ package org.scribble.ext.go.core.cli; -public enum ParamCoreCLArgFlag +public enum RPCoreCLArgFlag { // Unique flags PARAM_CORE_PARAM, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java similarity index 60% rename from scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java index ffdea258f..fde4cb347 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java @@ -7,7 +7,7 @@ import org.scribble.cli.CLArgParser; import org.scribble.cli.CommandLineException; -public class ParamCoreCLArgParser extends CLArgParser +public class RPCoreCLArgParser extends CLArgParser { // Unique flags public static final String PARAM_CORE_PARAM_FLAG = "-param"; @@ -18,33 +18,33 @@ public class ParamCoreCLArgParser extends CLArgParser public static final String PARAM_CORE_EFSM_PNG_FLAG = "-param-fsmpng"; public static final String PARAM_CORE_API_GEN_FLAG = "-param-api"; - private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); + private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); { - ParamCoreCLArgParser.PARAM_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_CORE_PARAM_FLAG, ParamCoreCLArgFlag.PARAM_CORE_PARAM); - ParamCoreCLArgParser.PARAM_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG, ParamCoreCLArgFlag.PARAM_CORE_NO_COPY); + RPCoreCLArgParser.PARAM_UNIQUE_FLAGS.put(RPCoreCLArgParser.PARAM_CORE_PARAM_FLAG, RPCoreCLArgFlag.PARAM_CORE_PARAM); + RPCoreCLArgParser.PARAM_UNIQUE_FLAGS.put(RPCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG, RPCoreCLArgFlag.PARAM_CORE_NO_COPY); } - private static final Map PARAM_NON_UNIQUE_FLAGS = new HashMap<>(); + private static final Map PARAM_NON_UNIQUE_FLAGS = new HashMap<>(); { - ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_CORE_EFSM_FLAG, ParamCoreCLArgFlag.PARAM_CORE_EFSM); - ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG, ParamCoreCLArgFlag.PARAM_CORE_EFSM_PNG); - ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(ParamCoreCLArgParser.PARAM_CORE_API_GEN_FLAG, ParamCoreCLArgFlag.PARAM_CORE_API_GEN); + RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(RPCoreCLArgParser.PARAM_CORE_EFSM_FLAG, RPCoreCLArgFlag.PARAM_CORE_EFSM); + RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(RPCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG, RPCoreCLArgFlag.PARAM_CORE_EFSM_PNG); + RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(RPCoreCLArgParser.PARAM_CORE_API_GEN_FLAG, RPCoreCLArgFlag.PARAM_CORE_API_GEN); } - private static final Map PARAM_FLAGS = new HashMap<>(); + private static final Map PARAM_FLAGS = new HashMap<>(); { - ParamCoreCLArgParser.PARAM_FLAGS.putAll(ParamCoreCLArgParser.PARAM_UNIQUE_FLAGS); - ParamCoreCLArgParser.PARAM_FLAGS.putAll(ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS); + RPCoreCLArgParser.PARAM_FLAGS.putAll(RPCoreCLArgParser.PARAM_UNIQUE_FLAGS); + RPCoreCLArgParser.PARAM_FLAGS.putAll(RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS); } - private final Map paramParsed = new HashMap<>(); + private final Map paramParsed = new HashMap<>(); - public ParamCoreCLArgParser(String[] args) throws CommandLineException + public RPCoreCLArgParser(String[] args) throws CommandLineException { super(args); // Assigns this.args and calls parseArgs } - public Map getParamArgs() throws CommandLineException + public Map getParamArgs() throws CommandLineException { //super.parseArgs(); // Needed return this.paramParsed; @@ -53,7 +53,7 @@ public Map getParamArgs() throws CommandLineExcept @Override protected boolean isFlag(String arg) { - return ParamCoreCLArgParser.PARAM_FLAGS.containsKey(arg) || super.isFlag(arg); + return RPCoreCLArgParser.PARAM_FLAGS.containsKey(arg) || super.isFlag(arg); } // Pre: i is the index of the current flag to parse @@ -66,17 +66,17 @@ protected int parseFlag(int i) throws CommandLineException { // Unique flags - case ParamCoreCLArgParser.PARAM_CORE_PARAM_FLAG: + case RPCoreCLArgParser.PARAM_CORE_PARAM_FLAG: { return paramParseParam(i); } - case ParamCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG: return paramParseNoCopy(i); + case RPCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG: return paramParseNoCopy(i); // Non-unique flags - case ParamCoreCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); - case ParamCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); - case ParamCoreCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParsePackagePathAndRoleArgs(flag, i); + case RPCoreCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); + case RPCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); + case RPCoreCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParsePackagePathAndRoleArgs(flag, i); // Base CL @@ -95,19 +95,19 @@ private int paramParseParam(int i) throws CommandLineException throw new CommandLineException("Missing simple global protocol name argument."); } String proto = this.args[++i]; - paramCheckAndAddUniqueFlag(ParamCoreCLArgParser.PARAM_CORE_PARAM_FLAG, new String[] { proto }); + paramCheckAndAddUniqueFlag(RPCoreCLArgParser.PARAM_CORE_PARAM_FLAG, new String[] { proto }); return i; } private int paramParseNoCopy(int i) throws CommandLineException { - paramCheckAndAddUniqueFlag(ParamCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG, new String[] { }); + paramCheckAndAddUniqueFlag(RPCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG, new String[] { }); return i; } private void paramCheckAndAddUniqueFlag(String flag, String[] args) throws CommandLineException { - ParamCoreCLArgFlag argFlag = ParamCoreCLArgParser.PARAM_UNIQUE_FLAGS.get(flag); + RPCoreCLArgFlag argFlag = RPCoreCLArgParser.PARAM_UNIQUE_FLAGS.get(flag); if (this.paramParsed.containsKey(argFlag)) { throw new CommandLineException("Duplicate flag: " + flag); @@ -117,7 +117,7 @@ private void paramCheckAndAddUniqueFlag(String flag, String[] args) throws Comma private int paramParseRoleArg(String f, int i) throws CommandLineException { - ParamCoreCLArgFlag flag = ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + RPCoreCLArgFlag flag = RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); if ((i + 1) >= this.args.length) { throw new CommandLineException("Missing role argument"); @@ -129,7 +129,7 @@ private int paramParseRoleArg(String f, int i) throws CommandLineException protected int paramParseRoleAndFileArgs(String f, int i) throws CommandLineException { - ParamCoreCLArgFlag flag = ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + RPCoreCLArgFlag flag = RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); if ((i + 2) >= this.args.length) { throw new CommandLineException("Missing role/file arguments"); @@ -143,7 +143,7 @@ protected int paramParseRoleAndFileArgs(String f, int i) throws CommandLineExcep // path is absolute package path prefix for API imports protected int paramParsePackagePathAndRoleArgs(String f, int i) throws CommandLineException { - ParamCoreCLArgFlag flag = ParamCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + RPCoreCLArgFlag flag = RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); if ((i + 2) >= this.args.length) { throw new CommandLineException("Missing role/path arguments"); @@ -169,7 +169,7 @@ private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException }*/ // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag - private void goConcatArgs(ParamCoreCLArgFlag flag, String... toAdd) + private void goConcatArgs(RPCoreCLArgFlag flag, String... toAdd) { String[] args = this.paramParsed.get(flag); if (args == null) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java similarity index 75% rename from scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index cdf119b4a..0697e8e24 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/ParamCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -17,22 +17,22 @@ import org.scribble.cli.CLArgFlag; import org.scribble.cli.CommandLine; import org.scribble.cli.CommandLineException; -import org.scribble.ext.go.core.ast.ParamCoreAstFactory; -import org.scribble.ext.go.core.ast.ParamCoreSyntaxException; -import org.scribble.ext.go.core.ast.global.ParamCoreGProtocolDeclTranslator; -import org.scribble.ext.go.core.ast.global.ParamCoreGType; -import org.scribble.ext.go.core.ast.local.ParamCoreLType; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.global.RPCoreGProtocolDeclTranslator; +import org.scribble.ext.go.core.ast.global.RPCoreGType; +import org.scribble.ext.go.core.ast.local.RPCoreLType; //import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; //import org.scribble.ext.go.core.codegen.statetype2.ParamCoreSTEndpointApiGenerator; -import org.scribble.ext.go.core.codegen.statetype3.ParamCoreSTEndpointApiGenerator; -import org.scribble.ext.go.core.main.ParamCoreException; -import org.scribble.ext.go.core.main.ParamCoreMainContext; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEGraphBuilder; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.codegen.statetype3.RPCoreSTApiGenerator; +import org.scribble.ext.go.core.main.RPCoreException; +import org.scribble.ext.go.core.main.RPCoreMainContext; +import org.scribble.ext.go.core.model.endpoint.RPCoreEGraphBuilder; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; @@ -46,22 +46,22 @@ import org.scribble.util.ScribParserException; // N.B. this is the CL for both -goapi and param-core extensions -public class ParamCoreCommandLine extends CommandLine +public class RPCoreCommandLine extends CommandLine { - protected final Map paramArgs; // Maps each flag to list of associated argument values + protected final Map paramArgs; // Maps each flag to list of associated argument values // HACK: store in (Core) Job/JobContext? protected GProtocolDecl gpd; - protected Map> P0; - protected Map> E0; + protected Map> P0; + protected Map> E0; //protected ParamCoreSModel model; - public ParamCoreCommandLine(String... args) throws CommandLineException + public RPCoreCommandLine(String... args) throws CommandLineException { - this(new ParamCoreCLArgParser(args)); + this(new RPCoreCLArgParser(args)); } - private ParamCoreCommandLine(ParamCoreCLArgParser p) throws CommandLineException + private RPCoreCommandLine(RPCoreCLArgParser p) throws CommandLineException { super(p); // calls p.parse() if (this.args.containsKey(CLArgFlag.INLINE_MAIN_MOD)) @@ -78,7 +78,7 @@ private ParamCoreCommandLine(ParamCoreCLArgParser p) throws CommandLineException } @Override - protected ParamCoreMainContext newMainContext() throws ScribParserException, ScribbleException + protected RPCoreMainContext newMainContext() throws ScribParserException, ScribbleException { boolean debug = this.args.containsKey(CLArgFlag.VERBOSE); // TODO: factor out with CommandLine (cf. MainContext fields) boolean useOldWF = this.args.containsKey(CLArgFlag.OLD_WF); @@ -89,7 +89,7 @@ protected ParamCoreMainContext newMainContext() throws ScribParserException, Scr boolean noAcceptCorrelationCheck = this.args.containsKey(CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); boolean noValidation = this.args.containsKey(CLArgFlag.NO_VALIDATION); - boolean noCopy = this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM_CORE_NO_COPY); + boolean noCopy = this.paramArgs.containsKey(RPCoreCLArgFlag.PARAM_CORE_NO_COPY); List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) ? CommandLine.parseImportPaths(this.args.get(CLArgFlag.IMPORT_PATH)[0]) @@ -104,20 +104,20 @@ protected ParamCoreMainContext newMainContext() throws ScribParserException, Scr else { Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); - return new ParamCoreMainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, + return new RPCoreMainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, noCopy); } } public static void main(String[] args) throws CommandLineException, AntlrSourceException { - new ParamCoreCommandLine(args).run(); + new RPCoreCommandLine(args).run(); } @Override - protected void doValidationTasks(Job job) throws ParamCoreSyntaxException, AntlrSourceException, ScribParserException, CommandLineException + protected void doValidationTasks(Job job) throws RPCoreSyntaxException, AntlrSourceException, ScribParserException, CommandLineException { - if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM_CORE_PARAM)) + if (this.paramArgs.containsKey(RPCoreCLArgFlag.PARAM_CORE_PARAM)) { doParamCoreValidationTasks((GoJob) job); } @@ -130,13 +130,13 @@ protected void doValidationTasks(Job job) throws ParamCoreSyntaxException, Antlr @Override protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, CommandLineException { - if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM_CORE_API_GEN)) + if (this.paramArgs.containsKey(RPCoreCLArgFlag.PARAM_CORE_API_GEN)) { JobContext jcontext = job.getContext(); - String[] args = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_API_GEN); + String[] args = this.paramArgs.get(RPCoreCLArgFlag.PARAM_CORE_API_GEN); for (int i = 0; i < args.length; i += 2) { - String simpname = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_PARAM)[0]; + String simpname = this.paramArgs.get(RPCoreCLArgFlag.PARAM_CORE_PARAM)[0]; GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); Role role = checkRoleArg(jcontext, fullname, args[i]); String impath = args[i+1]; @@ -151,7 +151,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co Map goClasses = new ParamCoreSTSessionApiBuilder((GoJob) job, fullname, this.E0).build();*/ //Map actuals = this.E0.get(role); - Map goClasses = new ParamCoreSTEndpointApiGenerator(job, fullname, role, this.E0, impath).build(); + Map goClasses = new RPCoreSTApiGenerator(job, fullname, this.E0, impath, role).build(); outputClasses(goClasses); } } @@ -161,7 +161,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co } } - private void doParamCoreValidationTasks(GoJob j) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + private void doParamCoreValidationTasks(GoJob j) throws RPCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException { /*if (this.args.containsKey(CLArgFlag.PROJECT)) // HACK // modules/f17/src/test/scrib/demo/fase17/AppD.scr in [default] mode bug --- projection/EFSM not properly formed if this if is commented ???? @@ -171,7 +171,7 @@ private void doParamCoreValidationTasks(GoJob j) throws ParamCoreSyntaxException paramCorePreContextBuilding(j); - GProtocolName simpname = new GProtocolName(this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_PARAM)[0]); + GProtocolName simpname = new GProtocolName(this.paramArgs.get(RPCoreCLArgFlag.PARAM_CORE_PARAM)[0]); if (simpname.toString().equals("[ParamCoreAllTest]")) // HACK: ParamCoreAllTest { paramCoreParseAndCheckWF(j); // Includes base passes @@ -198,7 +198,7 @@ private void paramCorePreContextBuilding(GoJob job) throws ScribbleException } // Pre: assrtPreContextBuilding(job) - private void paramCoreParseAndCheckWF(GoJob job) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + private void paramCoreParseAndCheckWF(GoJob job) throws RPCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException { Module main = job.getContext().getMainModule(); for (GProtocolDecl gpd : main.getGlobalProtocolDecls()) @@ -211,27 +211,27 @@ private void paramCoreParseAndCheckWF(GoJob job) throws ParamCoreSyntaxException } // Pre: paramCorePreContextBuilding(job) - private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws ParamCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException + private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws RPCoreSyntaxException, ScribbleException, ScribParserException, CommandLineException { Module main = job.getContext().getMainModule(); if (!main.hasProtocolDecl(simpname)) { - throw new ParamCoreException("[param-core] Global protocol not found: " + simpname); + throw new RPCoreException("[param-core] Global protocol not found: " + simpname); } this.gpd = (GProtocolDecl) main.getProtocolDecl(simpname); - ParamCoreAstFactory af = new ParamCoreAstFactory(); - ParamCoreGType gt = new ParamCoreGProtocolDeclTranslator(job, af).translate(this.gpd); + RPCoreAstFactory af = new RPCoreAstFactory(); + RPCoreGType gt = new RPCoreGProtocolDeclTranslator(job, af).translate(this.gpd); job.debugPrintln("\n[param-core] Translated:\n " + gt); if (!gt.isWellFormed(job, gpd)) { - throw new ParamCoreException("[param-core] Global type not well-formed:\n " + gt); + throw new RPCoreException("[param-core] Global type not well-formed:\n " + gt); } //Map>> - Map> + Map> protoRoles = getProtoRoles(job, gt); job.debugPrintln("\n[param-core] Computed roles: " + protoRoles); @@ -240,12 +240,12 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? { //for (Set ranges : protoRoles.get(r)) - for (ParamActualRole ranges : protoRoles.get(r)) + for (RPRoleVariant ranges : protoRoles.get(r)) { //ParamCoreLType lt = gt.project(af, r, ranges); - ParamCoreLType lt = gt.project(af, ranges); + RPCoreLType lt = gt.project(af, ranges); //Map, ParamCoreLType> tmp = P0.get(r); - Map tmp = P0.get(r); + Map tmp = P0.get(r); if (tmp == null) { tmp = new HashMap<>(); @@ -257,16 +257,16 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws } } - ParamCoreEGraphBuilder builder = new ParamCoreEGraphBuilder(job); + RPCoreEGraphBuilder builder = new RPCoreEGraphBuilder(job); this.E0 = new HashMap<>(); for (Role r : P0.keySet()) { //for (Set ranges : this.P0.get(r).keySet()) - for (ParamActualRole ranges : this.P0.get(r).keySet()) + for (RPRoleVariant ranges : this.P0.get(r).keySet()) { EGraph g = builder.build(this.P0.get(r).get(ranges)); //Map, EGraph> tmp = this.E0.get(r); - Map tmp = this.E0.get(r); + Map tmp = this.E0.get(r); if (tmp == null) { tmp = new HashMap<>(); @@ -308,35 +308,35 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws //..HERE FIXME ActualParam -- ParamRange is now already a Set private //Map>> - Map> - getProtoRoles(GoJob job, ParamCoreGType gt) + Map> + getProtoRoles(GoJob job, RPCoreGType gt) { - Set prs = gt.getParamRoles(); + Set prs = gt.getParamRoles(); - Map> map + Map> map = prs.stream() .map(x -> x.getName()) .distinct() .collect(Collectors.toMap(x -> x, x -> prs.stream().filter(y -> y.getName().equals(x)).collect(Collectors.toSet()))); - Map>> powersets = map.keySet().stream().collect(Collectors.toMap(k -> k, k -> new HashSet<>())); + Map>> powersets = map.keySet().stream().collect(Collectors.toMap(k -> k, k -> new HashSet<>())); for (Role n : map.keySet()) { - Set> tmp = powersets.get(n); - Set todo = new HashSet<>(map.get(n)); + Set> tmp = powersets.get(n); + Set todo = new HashSet<>(map.get(n)); while (!todo.isEmpty()) { - Iterator i = todo.iterator(); - ParamRole next = i.next(); + Iterator i = todo.iterator(); + RPIndexedRole next = i.next(); i.remove(); - Set range = new HashSet<>(); + Set range = new HashSet<>(); //range.add(next.range); range.add(next.ranges.iterator().next()); if (!tmp.contains(next)) { tmp.addAll(tmp.stream().map(t -> { - Set ggg = new HashSet<>(); + Set ggg = new HashSet<>(); ggg.addAll(t); ggg.add(range.iterator().next()); return ggg; @@ -347,18 +347,18 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws } //Map>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); - Map> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); + Map> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); for (Role r : powersets.keySet()) { - Set> powset = powersets.get(r); + Set> powset = powersets.get(r); int i = 1; int size = powset.size(); job.debugPrintln("\n[param-core] Ranges powerset for " + r + ": " + powset); - for (Set cand : powset) + for (Set cand : powset) { - Set coset = powset.stream().filter(f -> f.stream().noneMatch(g -> cand.contains(g))).flatMap(Collection::stream).collect(Collectors.toSet()); + Set coset = powset.stream().filter(f -> f.stream().noneMatch(g -> cand.contains(g))).flatMap(Collection::stream).collect(Collectors.toSet()); String z3 = ""; @@ -387,7 +387,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws } //Set actuals - Set actuals + Set actuals = cand.stream().flatMap(c -> c.getVars().stream()).collect(Collectors.toSet()); actuals.addAll(coset.stream().flatMap(c -> c.getVars().stream()).collect(Collectors.toSet())); //if (!actuals.isEmpty()) @@ -407,7 +407,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws if (Z3Wrapper.checkSat(job, this.gpd, z3)) { //protoRoles.get(r).add(cand); - protoRoles.get(r).add(new ParamActualRole(r.toString(), cand, coset)); + protoRoles.get(r).add(new RPRoleVariant(r.toString(), cand, coset)); } } } @@ -418,9 +418,9 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws @Override protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleException { - if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM_CORE_EFSM)) + if (this.paramArgs.containsKey(RPCoreCLArgFlag.PARAM_CORE_EFSM)) { - String[] args = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_EFSM); + String[] args = this.paramArgs.get(RPCoreCLArgFlag.PARAM_CORE_EFSM); for (int i = 0; i < args.length; i += 1) { Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); @@ -431,15 +431,15 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce }); } } - if (this.paramArgs.containsKey(ParamCoreCLArgFlag.PARAM_CORE_EFSM_PNG)) + if (this.paramArgs.containsKey(RPCoreCLArgFlag.PARAM_CORE_EFSM_PNG)) { - String[] args = this.paramArgs.get(ParamCoreCLArgFlag.PARAM_CORE_EFSM_PNG); + String[] args = this.paramArgs.get(RPCoreCLArgFlag.PARAM_CORE_EFSM_PNG); for (int i = 0; i < args.length; i += 2) { Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); String png = args[i+1]; //for (Entry, EGraph> e : this.E0.get(role).entrySet()) - for (Entry e : this.E0.get(role).entrySet()) + for (Entry e : this.E0.get(role).entrySet()) { String out = e.getValue().init.toDot(); runDot(out, png); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java index be0599722..fdf5a7346 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchActionBuilder.java @@ -5,7 +5,7 @@ import org.scribble.codegen.statetype.STBranchActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; import org.scribble.ext.go.main.GoJob; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -29,7 +29,7 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME public String getActionName(STStateChanApiBuilder api, EAction a) { return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index cdc20b751..084aa4d0c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -7,12 +7,12 @@ import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.endpoint.actions.EReceive; @@ -85,15 +85,15 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "func (s *" + tname + ") foo() {\n" + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"; - ParamRole peer = (ParamRole) s.getActions().iterator().next().peer; - ParamRange g = peer.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole peer = (RPIndexedRole) s.getActions().iterator().next().peer; + RPInterval g = peer.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index 02639d342..cb5131b59 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -8,8 +8,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.main.Job; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; @@ -23,13 +23,13 @@ public class ParamCoreSTEndpointApiGenerator public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral //public final Map actuals; - public final Map> actuals; + public final Map> actuals; //public final EGraph graph; //public final Map> all; public ParamCoreSTEndpointApiGenerator(Job job, GProtocolName fullname, Role self, //Map actuals) - Map> actuals) + Map> actuals) { this.job = job; this.proto = fullname; @@ -44,7 +44,7 @@ public Map build() throws ScribbleException { Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); - for (Entry actual : this.actuals.get(this.self).entrySet()) + for (Entry actual : this.actuals.get(this.self).entrySet()) { res.putAll(buildStateChannelApi(actual.getKey(), actual.getValue())); } @@ -59,7 +59,7 @@ public Map buildSessionApi() // FIXME: factor out return new ParamCoreSTSessionApiBuilder(this).build(); } - public Map buildStateChannelApi(ParamActualRole actual, EGraph graph) // FIXME: factor out + public Map buildStateChannelApi(RPRoleVariant actual, EGraph graph) // FIXME: factor out { this.job.debugPrintln("\n[param-core] Running " + ParamCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + this.self); return new ParamCoreSTStateChanApiBuilder(this, actual, graph).build(); @@ -80,7 +80,7 @@ public static String getGeneratedEndpointType(GProtocolName simpname, Role r) } // Doesn't use coranges -- same as getGeneratedParamRoleName? - public static String getGeneratedActualRoleName(ParamActualRole actual) + public static String getGeneratedActualRoleName(RPRoleVariant actual) { /*return actual.getName() + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ @@ -88,7 +88,7 @@ public static String getGeneratedActualRoleName(ParamActualRole actual) { throw new RuntimeException("[param-core] TODO: " + actual); } - ParamRange g = actual.ranges.iterator().next(); + RPInterval g = actual.ranges.iterator().next(); return actual.getName() + "_" + g.start + "To" + g.end; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 701ef79dd..20576e8ae 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -6,13 +6,13 @@ import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -23,7 +23,7 @@ public class ParamCoreSTReceiveActionBuilder extends STReceiveActionBuilder public String getActionName(STStateChanApiBuilder api, EAction a) { return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -54,15 +54,15 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ - ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval g = r.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index c3c69c2d7..53a1f8721 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -6,13 +6,13 @@ import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -23,7 +23,7 @@ public class ParamCoreSTSendActionBuilder extends STSendActionBuilder public String getActionName(STStateChanApiBuilder api, EAction a) { return ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -54,15 +54,15 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ - ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval g = r.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 0f7051762..0686b54dd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -8,12 +8,12 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.ext.go.ast.ParamRoleDecl; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.ast.RPRoleDecl; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EGraph; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -93,9 +93,9 @@ public Map build() // FIXME: factor out roles.stream().map(r -> { String epTypeName = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - List vars = + List vars = gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(r)) - .flatMap(rd -> ((ParamRoleDecl) rd).params.stream()).collect(Collectors.toList()); + .flatMap(rd -> ((RPRoleDecl) rd).params.stream()).collect(Collectors.toList()); return "\n\ntype " + epTypeName + " struct {\n" // FIXME: factor out + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " *" + simpname + "\n" @@ -135,20 +135,20 @@ public Map build() // FIXME: factor out + this.apigen.actuals.entrySet().stream().filter(e -> !e.getKey().equals(r)) .map(e -> { - Map tmp = e.getValue(); + Map tmp = e.getValue(); if (tmp.size() > 1) { throw new RuntimeException("[param-core] TODO: " + tmp); } - ParamActualRole peer = tmp.keySet().iterator().next(); - ParamRange g = peer.ranges.iterator().next(); - Function foo = ee -> + RPRoleVariant peer = tmp.keySet().iterator().next(); + RPInterval g = peer.ranges.iterator().next(); + Function foo = ee -> { - if (ee instanceof ParamIndexInt) + if (ee instanceof RPIndexInt) { return ee.toString(); } - else if (ee instanceof ParamIndexVar) + else if (ee instanceof RPIndexVar) { return "ep.Params[\"" + ee + "\"]"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index fd09fc5f5..108cad27f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -10,14 +10,14 @@ import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotSend; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEMultiChoicesReceive; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; @@ -30,14 +30,14 @@ public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder { protected final ParamCoreSTEndpointApiGenerator apigen; - public final ParamActualRole actual; // this.apigen.self.equals(this.actual.getName()) + public final RPRoleVariant actual; // this.apigen.self.equals(this.actual.getName()) //public final EGraph graph; private int counter = 1; // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later // actual.getName().equals(this.role) - public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, ParamActualRole actual, EGraph graph) + public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, RPRoleVariant actual, EGraph graph) { super(apigen.job, apigen.proto, apigen.self, graph, new ParamCoreSTOutputStateBuilder(new ParamCoreSTSendActionBuilder()), @@ -51,20 +51,20 @@ public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, Pa this.actual = actual; } - protected ParamActualRole getSelf() + protected RPRoleVariant getSelf() { - return (ParamActualRole) this.getSelf(); + return (RPRoleVariant) this.getSelf(); } // Not actual roles; param roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName - public static String getGeneratedParamRoleName(ParamRole r) + public static String getGeneratedParamRoleName(RPIndexedRole r) { //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); if (r.ranges.size() > 1) { throw new RuntimeException("[param-core] TODO: " + r); } - ParamRange g = r.ranges.iterator().next(); + RPInterval g = r.ranges.iterator().next(); return r.getName() + "_" + g.start + "To" + g.end; } @@ -91,7 +91,7 @@ protected String makeSTStateName(EState s) + "_" + this.counter++; } - public static String makeEndStateName(GProtocolName simpname, ParamActualRole r) + public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) { return simpname + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(r) + "_" + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; } @@ -283,23 +283,23 @@ protected static ParamCoreEStateKind getStateKind(EState s) { return ParamCoreEStateKind.TERMINAL; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossSend)) + else if (as.stream().allMatch(a -> a instanceof RPCoreECrossSend)) { return ParamCoreEStateKind.CROSS_SEND; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossReceive)) + else if (as.stream().allMatch(a -> a instanceof RPCoreECrossReceive)) { return ParamCoreEStateKind.CROSS_RECEIVE; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotSend)) + else if (as.stream().allMatch(a -> a instanceof RPCoreEDotSend)) { return ParamCoreEStateKind.DOT_SEND; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotReceive)) + else if (as.stream().allMatch(a -> a instanceof RPCoreEDotReceive)) { return ParamCoreEStateKind.DOT_RECEIVE; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEMultiChoicesReceive)) + else if (as.stream().allMatch(a -> a instanceof RPCoreEMultiChoicesReceive)) { return ParamCoreEStateKind.MULTICHOICES_RECEIVE; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java index 91d7edb56..f7e3fc4fe 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java @@ -6,13 +6,13 @@ import org.scribble.codegen.statetype.STBranchActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; @@ -36,7 +36,7 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME public String getActionName(STStateChanApiBuilder api, EAction a) { return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -123,15 +123,15 @@ else if (e instanceof ParamIndexVar) + "\treturn nil // select ignores nilchan\n" + "}\n"; - ParamRole peer = (ParamRole) curr.getActions().iterator().next().peer; - ParamRange g = peer.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole peer = (RPIndexedRole) curr.getActions().iterator().next().peer; + RPInterval g = peer.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index 5b97ad98b..c7173a42a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -5,12 +5,12 @@ import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.endpoint.actions.EReceive; @@ -91,15 +91,15 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + "var op string\n"; - ParamRole peer = (ParamRole) s.getActions().iterator().next().peer; - ParamRange g = peer.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole peer = (RPIndexedRole) s.getActions().iterator().next().peer; + RPInterval g = peer.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java index 43430794b..6a73f4931 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java @@ -8,7 +8,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.main.Job; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; @@ -22,13 +22,13 @@ public class ParamCoreSTEndpointApiGenerator public final GProtocolName proto; public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral //public final Map actuals; - public final Map> actuals; + public final Map> actuals; //public final EGraph graph; //public final Map> all; public ParamCoreSTEndpointApiGenerator(Job job, GProtocolName fullname, Role self, //Map actuals) - Map> actuals) + Map> actuals) { this.job = job; this.proto = fullname; @@ -43,7 +43,7 @@ public Map build() throws ScribbleException { Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); - for (Entry actual : this.actuals.get(this.self).entrySet()) + for (Entry actual : this.actuals.get(this.self).entrySet()) { res.putAll(buildStateChannelApi(actual.getKey(), actual.getValue())); } @@ -58,7 +58,7 @@ public Map buildSessionApi() // FIXME: factor out return new ParamCoreSTSessionApiBuilder(this).build(); } - public Map buildStateChannelApi(ParamActualRole actual, EGraph graph) // FIXME: factor out + public Map buildStateChannelApi(RPRoleVariant actual, EGraph graph) // FIXME: factor out { this.job.debugPrintln("\n[param-core] Running " + ParamCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + this.self); return new ParamCoreSTStateChanApiBuilder(this, actual, graph).build(); @@ -73,14 +73,14 @@ public Map buildStateChannelApi(ParamActualRole actual, EGraph g }*/ //public static String getGeneratedEndpointType(GProtocolName simpname, Role r) - public static String getGeneratedEndpointType(GProtocolName simpname, ParamActualRole r) + public static String getGeneratedEndpointType(GProtocolName simpname, RPRoleVariant r) { //return "Endpoint_" + simpname + "_" + r; return simpname + "_" + getGeneratedActualRoleName(r); } // Doesn't use coranges -- same as getGeneratedParamRoleName? // Old - public static String getGeneratedActualRoleName(ParamActualRole actual) + public static String getGeneratedActualRoleName(RPRoleVariant actual) { /*return actual.getName() + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index 7369ff87b..46221d307 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -6,13 +6,13 @@ import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -23,7 +23,7 @@ public class ParamCoreSTReceiveActionBuilder extends STReceiveActionBuilder public String getActionName(STStateChanApiBuilder api, EAction a) { return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -58,15 +58,15 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ - ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval g = r.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index 1c5040a96..2c47da6e5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -6,13 +6,13 @@ import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; @@ -25,7 +25,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) { //return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" return ParamCoreSTApiGenConstants.GO_CROSS_REDUCE_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -75,15 +75,15 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ - ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval g = r.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index f3b945139..271fe79c2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -7,12 +7,12 @@ import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; @@ -24,7 +24,7 @@ public class ParamCoreSTSendActionBuilder extends STSendActionBuilder public String getActionName(STStateChanApiBuilder api, EAction a) { return ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -67,15 +67,15 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ - ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval g = r.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java index 690ba2c0c..c8ee84c53 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSessionApiBuilder.java @@ -8,9 +8,9 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.ext.go.ast.ParamRoleDecl; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.ast.RPRoleDecl; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -92,19 +92,19 @@ public Map build() // FIXME: factor out sessPack += roles.stream().map(rfoo -> { - Set actuals = this.apigen.actuals.get(rfoo).keySet(); + Set actuals = this.apigen.actuals.get(rfoo).keySet(); return actuals.stream().map(actual -> { String epTypeName = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, actual); - List decls = + List decls = gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(actual.getName())) - .map(rd -> (ParamRoleDecl) rd).collect(Collectors.toList()); + .map(rd -> (RPRoleDecl) rd).collect(Collectors.toList()); if (decls.size() > 1) { throw new RuntimeException("Shouldn't get in here: " + actual); } - List vars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); + List vars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); //.flatMap(rd -> ((ParamRoleDecl) rd).params.stream()).collect(Collectors.toList()); /*if (actual.ranges.size() > 1) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java index 56b396b12..c7903cf76 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java @@ -7,12 +7,12 @@ import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; @@ -24,7 +24,7 @@ public class ParamCoreSTSplitActionBuilder extends STSendActionBuilder public String getActionName(STStateChanApiBuilder api, EAction a) { return ParamCoreSTApiGenConstants.GO_CROSS_SPLIT_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -84,15 +84,15 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ - ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval g = r.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index 63ad91664..fc00b25c2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -10,15 +10,15 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.ast.ParamCoreDelegDecl; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.ast.RPCoreDelegDecl; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotSend; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEMultiChoicesReceive; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; @@ -32,7 +32,7 @@ public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder { protected final ParamCoreSTEndpointApiGenerator apigen; - public final ParamActualRole actual; // this.apigen.self.equals(this.actual.getName()) + public final RPRoleVariant actual; // this.apigen.self.equals(this.actual.getName()) //public final EGraph graph; public final ParamCoreSTReceiveActionBuilder vb; @@ -43,7 +43,7 @@ public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later // actual.getName().equals(this.role) - public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, ParamActualRole actual, EGraph graph) + public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, RPRoleVariant actual, EGraph graph) { super(apigen.job, apigen.proto, apigen.self, graph, new ParamCoreSTOutputStateBuilder(new ParamCoreSTSplitActionBuilder(), new ParamCoreSTSendActionBuilder()), @@ -62,20 +62,20 @@ public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, Pa .filter(d -> (d instanceof DataTypeDecl)).map(d -> ((DataTypeDecl) d)).collect(Collectors.toSet()); } - protected ParamActualRole getSelf() + protected RPRoleVariant getSelf() { - return (ParamActualRole) this.getSelf(); + return (RPRoleVariant) this.getSelf(); } // Not actual roles; param roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName - public static String getGeneratedParamRoleName(ParamRole r) + public static String getGeneratedParamRoleName(RPIndexedRole r) { //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); if (r.ranges.size() > 1) { throw new RuntimeException("[param-core] TODO: " + r); } - ParamRange g = r.ranges.iterator().next(); + RPInterval g = r.ranges.iterator().next(); return r.getName() + "_" + g.start + "To" + g.end; } @@ -102,7 +102,7 @@ protected String makeSTStateName(EState s) + "_" + this.counter++; } - public static String makeEndStateName(GProtocolName simpname, ParamActualRole r) + public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) { return simpname + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(r) + "_" + ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; } @@ -125,7 +125,7 @@ public String getActualRoleName() public boolean isDelegType(DataType t) { - return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof ParamCoreDelegDecl; // FIXME: make a map + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof RPCoreDelegDecl; // FIXME: make a map } protected String getExtName(DataType t) @@ -376,23 +376,23 @@ protected static ParamCoreEStateKind getStateKind(EState s) { return ParamCoreEStateKind.TERMINAL; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossSend)) + else if (as.stream().allMatch(a -> a instanceof RPCoreECrossSend)) { return ParamCoreEStateKind.CROSS_SEND; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossReceive)) + else if (as.stream().allMatch(a -> a instanceof RPCoreECrossReceive)) { return ParamCoreEStateKind.CROSS_RECEIVE; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotSend)) + else if (as.stream().allMatch(a -> a instanceof RPCoreEDotSend)) { return ParamCoreEStateKind.DOT_SEND; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotReceive)) + else if (as.stream().allMatch(a -> a instanceof RPCoreEDotReceive)) { return ParamCoreEStateKind.DOT_RECEIVE; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEMultiChoicesReceive)) + else if (as.stream().allMatch(a -> a instanceof RPCoreEMultiChoicesReceive)) { return ParamCoreEStateKind.MULTICHOICES_RECEIVE; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java similarity index 98% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTApiGenConstants.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index 86ee292e6..6418ef835 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -1,6 +1,6 @@ package org.scribble.ext.go.core.codegen.statetype3; -public class ParamCoreSTApiGenConstants +public class RPCoreSTApiGenConstants { //public static final String GO_SCRIBBLERUNTIME_PACKAGE = "org/scribble/runtime/net"; public static final String GO_SCRIBBLERUNTIME_SESSION_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/session"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java similarity index 58% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 6a82932b6..3abf1dd95 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -2,13 +2,11 @@ import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.scribble.ext.go.core.type.ParamActualRole; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.main.Job; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; @@ -16,29 +14,24 @@ import org.scribble.type.name.Role; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTEndpointApiGenerator -public class ParamCoreSTEndpointApiGenerator +public class RPCoreSTApiGenerator { public final Job job; public final GProtocolName proto; - public final Role self; // FIXME: base endpoint API gen is role-oriented, while session API generator should be neutral - //public final Map actuals; - public final Map> actuals; - //public final EGraph graph; + public final Map> actuals; - public final String impath; + public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module + public final Role self; + // FIXME: just a role name -- cf. CL arg + // FIXME: any way to separate Session API (Protocol) from Endpoint/StateChan APIs? - //public final Map> all; - - public ParamCoreSTEndpointApiGenerator(Job job, GProtocolName fullname, Role self, //Map actuals) - Map> actuals, String impath) + public RPCoreSTApiGenerator(Job job, GProtocolName fullname, Map> actuals, String packpath, Role self) { this.job = job; this.proto = fullname; - this.self = self; this.actuals = Collections.unmodifiableMap(actuals); - //this.graph = graph; - //this.all = Collections.unmodifiableMap(all); - this.impath = impath; + this.packpath = packpath; + this.self = self; } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later @@ -46,7 +39,7 @@ public Map build() throws ScribbleException { Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); - for (Entry actual : this.actuals.get(this.self).entrySet()) + for (Entry actual : this.actuals.get(this.self).entrySet()) { res.putAll(buildStateChannelApi(actual.getKey(), actual.getValue())); } @@ -56,39 +49,28 @@ public Map build() throws ScribbleException //@Override public Map buildSessionApi() // FIXME: factor out { - this.job.debugPrintln("\n[param-core] Running " + ParamCoreSTSessionApiBuilder.class + " for " + this.proto + "@" + this.self); - //throw new RuntimeException("[param-core] TODO:"); - return new ParamCoreSTSessionApiBuilder(this).build(); + this.job.debugPrintln("\n[param-core] Running " + RPCoreSTSessionApiBuilder.class + " for " + this.proto + "@" + this.self); + return new RPCoreSTSessionApiBuilder(this).build(); } - public Map buildStateChannelApi(ParamActualRole actual, EGraph graph) // FIXME: factor out + public Map buildStateChannelApi(RPRoleVariant actual, EGraph graph) // FIXME: factor out { - this.job.debugPrintln("\n[param-core] Running " + ParamCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + this.self); - return new ParamCoreSTStateChanApiBuilder(this, actual, graph).build(); + this.job.debugPrintln("\n[param-core] Running " + RPCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + this.self); + return new RPCoreSTStateChanApiBuilder(this, actual, graph).build(); } - /*public String getGeneratedEndpointType() - { - /*return "Endpoint_" + this.proto.getSimpleName() + "_" - //+ getGeneratedActualRoleName(); // No: endpoint covers all actual roles of this role name - + this.self;* / - return getGeneratedEndpointType(this.proto.getSimpleName(), this.self); - }*/ - //@Override public String getRootPackage() // Derives only from proto name { - //throw new RuntimeException("[param-core] TODO:"); return this.proto.getSimpleName().toString(); } public String generateRootPackageDecl() { - //throw new RuntimeException("[param-core] TODO: "); return "package " + getRootPackage(); } - //@Override + /*//@Override public List getScribbleRuntimeImports() // FIXME: factor up { return Stream.of( @@ -104,19 +86,18 @@ public List getScribbleRuntimeImports() // FIXME: factor up public String generateScribbleRuntimeImports() { return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); - } - - + }*/ - public static String getGeneratedEndpointTypeName(GProtocolName simpname, ParamActualRole r) + // Endpoint kind -- use actual-role name, e.g., S_1To1, W_1Ton + public static String getGeneratedEndpointTypeName(GProtocolName simpname, RPRoleVariant r) { //return simpname + "_" + getGeneratedActualRoleName(r); return getGeneratedActualRoleName(r); } - // Doesn't use coranges -- same as getGeneratedParamRoleName? // Old - public static String getGeneratedActualRoleName(ParamActualRole actual) + // Endpoint, e.g., S_1To1, W_1Ton + public static String getGeneratedActualRoleName(RPRoleVariant actual) { /*return actual.getName() + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java similarity index 62% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java index 7d95a4d43..d5b9ea725 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java @@ -4,9 +4,9 @@ import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.model.endpoint.EState; -public class ParamCoreSTEndStateBuilder extends STEndStateBuilder +public class RPCoreSTEndStateBuilder extends STEndStateBuilder { - public ParamCoreSTEndStateBuilder() + public RPCoreSTEndStateBuilder() { } @@ -20,18 +20,18 @@ public String build(STStateChanApiBuilder api, EState s) @Override public String getPreamble(STStateChanApiBuilder api, EState s) { - ParamCoreSTStateChanApiBuilder schangen = (ParamCoreSTStateChanApiBuilder) api; + RPCoreSTStateChanApiBuilder schangen = (RPCoreSTStateChanApiBuilder) api; //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); String tname = api.getStateChanName(s); String res = //schangen.apigen.generateRootPackageDecl() + "\n" - "package " + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(((ParamCoreSTStateChanApiBuilder) api).actual) + "\n" + "package " + RPCoreSTApiGenerator.getGeneratedActualRoleName(((RPCoreSTStateChanApiBuilder) api).actual) + "\n" + "\n" //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "\n" + "type " + tname + " struct {\n" - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + " *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + " *" + RPCoreSTApiGenerator.getGeneratedEndpointTypeName(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out //+ " session.ParamEndpoint" + "\n" // FIXME: factor out + "}"; return res; // No LinearResource diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTOutputStateBuilder.java similarity index 78% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTOutputStateBuilder.java index e6795f6e4..bcce5f893 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTOutputStateBuilder.java @@ -10,12 +10,12 @@ import org.scribble.model.endpoint.actions.ESend; import org.scribble.type.name.DataType; -public class ParamCoreSTOutputStateBuilder extends STOutputStateBuilder +public class RPCoreSTOutputStateBuilder extends STOutputStateBuilder { - public final ParamCoreSTSendActionBuilder nb; + public final RPCoreSTSendActionBuilder nb; // sb is ParamCoreSTSplitActionBuilder - public ParamCoreSTOutputStateBuilder(STSendActionBuilder sb, ParamCoreSTSendActionBuilder nb) + public RPCoreSTOutputStateBuilder(STSendActionBuilder sb, RPCoreSTSendActionBuilder nb) { super(sb); this.nb = nb; @@ -24,7 +24,7 @@ public ParamCoreSTOutputStateBuilder(STSendActionBuilder sb, ParamCoreSTSendActi @Override public String getPreamble(STStateChanApiBuilder api, EState s) { - return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); + return ((RPCoreSTStateChanApiBuilder) api).getStateChanPremable(s); } @Override @@ -41,7 +41,7 @@ public String build(STStateChanApiBuilder api, EState s) // FIXME: delegation if (!a.payload.elems.stream() - .anyMatch(pet -> ((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet))) + .anyMatch(pet -> ((RPCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet))) { out += "\n\n"; out += this.nb.build(api, s, a); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java similarity index 79% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index fb34f2e90..04886fa87 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -6,17 +6,17 @@ import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -public class ParamCoreSTReceiveActionBuilder extends STReceiveActionBuilder +public class RPCoreSTReceiveActionBuilder extends STReceiveActionBuilder { @Override @@ -24,7 +24,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) { return //ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" "Gather_" // FIXME: make unary Receive special case - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + RPCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -32,8 +32,8 @@ public String getActionName(STStateChanApiBuilder api, EAction a) public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " []" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + + i + " []" + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } @@ -46,8 +46,8 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES } String sEpRecv = - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Ept" + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; @@ -57,18 +57,18 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ - ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval g = r.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { - return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { @@ -110,7 +110,7 @@ else if (e instanceof ParamIndexVar) throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); } - String extName = ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + String extName = ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); res += (((GoJob) apigen.job).noCopy @@ -130,7 +130,7 @@ else if (e instanceof ParamIndexVar) "var lab string\n" + "if err := " + sEpRecv + "[\"" + r.getName() + "\"][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" @@ -141,7 +141,7 @@ else if (e instanceof ParamIndexVar) + "if err := " + sEpRecv + "[\"" + r.getName() + "\"][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&tmp" + "); err != nil {\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveStateBuilder.java similarity index 72% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveStateBuilder.java index 3b1e909bc..d7131766d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReceiveStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveStateBuilder.java @@ -9,12 +9,12 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; -public class ParamCoreSTReceiveStateBuilder extends STReceiveStateBuilder +public class RPCoreSTReceiveStateBuilder extends STReceiveStateBuilder { - public final ParamCoreSTReceiveActionBuilder vb; + public final RPCoreSTReceiveActionBuilder vb; // sb is ParamCoreSTReduceActionBuilder - public ParamCoreSTReceiveStateBuilder(STReceiveActionBuilder sb, ParamCoreSTReceiveActionBuilder vb) + public RPCoreSTReceiveStateBuilder(STReceiveActionBuilder sb, RPCoreSTReceiveActionBuilder vb) { super(sb); this.vb = vb; @@ -23,7 +23,7 @@ public ParamCoreSTReceiveStateBuilder(STReceiveActionBuilder sb, ParamCoreSTRece @Override public String getPreamble(STStateChanApiBuilder api, EState s) { - return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); + return ((RPCoreSTStateChanApiBuilder) api).getStateChanPremable(s); } @Override @@ -43,7 +43,7 @@ public String build(STStateChanApiBuilder api, EState s) // FIXME: delegation if (!a.payload.elems.stream() - .anyMatch(pet -> ((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet))) + .anyMatch(pet -> ((RPCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet))) { out += "\n\n"; out += this.vb.build(api, s, a); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java similarity index 73% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReduceActionBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java index d24c0feff..b7b3b5c99 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java @@ -6,26 +6,26 @@ import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; -public class ParamCoreSTReduceActionBuilder extends STReceiveActionBuilder +public class RPCoreSTReduceActionBuilder extends STReceiveActionBuilder { @Override public String getActionName(STStateChanApiBuilder api, EAction a) { //return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" - return ParamCoreSTApiGenConstants.GO_CROSS_REDUCE_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + return RPCoreSTApiGenConstants.GO_CROSS_REDUCE_FUN_PREFIX + "_" + + RPCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -34,20 +34,20 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) { DataType[] pet = new DataType[1]; return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " *" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0] = (DataType) a.payload.elems.get(i)) //a.payload.elems.get(i) + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + + i + " *" + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0] = (DataType) a.payload.elems.get(i)) //a.payload.elems.get(i) // HACK - + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "" : - ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "" : + ", reduceFn" + i + " func(" + RPCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i //+ " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) + " []" - + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + ") " - + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) ) ).collect(Collectors.joining(", ")); @@ -62,31 +62,31 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES } String sEpRecv = - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; String sEpProto = //"s.ep.Proto" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO; /*String sEpErr = //"s.ep.Err" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ - ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval g = r.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { - return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { @@ -119,7 +119,7 @@ else if (e instanceof ParamIndexVar) // FIXME: single arg // Currently never true because of ParamCoreSTOutputStateBuilder boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem - ((ParamCoreSTStateChanApiBuilder) apigen).isDelegType((DataType) pet)); + ((RPCoreSTStateChanApiBuilder) apigen).isDelegType((DataType) pet)); /*String res = sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") @@ -138,7 +138,7 @@ else if (e instanceof ParamIndexVar) st.ept.ConnMu.RUnlock() return sesss, &ClientA_p_End{}*/ - String extName = ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + String extName = ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); res = "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args @@ -147,7 +147,7 @@ else if (e instanceof ParamIndexVar) "var lab string\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" @@ -159,14 +159,14 @@ else if (e instanceof ParamIndexVar) + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " //+ "&data[i-1]" + "&tmp" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "arg0 = &" + extName + "{" + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": tmp." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " }\n" + + "arg0 = &" + extName + "{" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": tmp." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " }\n" + "}\n"; } @@ -177,7 +177,7 @@ else if (!a.payload.elems.isEmpty()) throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); } - String extName = ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + String extName = ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); res += (((GoJob) apigen.job).noCopy @@ -197,7 +197,7 @@ else if (!a.payload.elems.isEmpty()) "var lab string\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" @@ -209,7 +209,7 @@ else if (!a.payload.elems.isEmpty()) + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" //+ sEpProto + "." + r.getName() + ", " //+ "&data[i-1]" + "&tmp" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java similarity index 75% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectActionBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index d1be03469..323118e58 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -6,19 +6,19 @@ import org.scribble.codegen.statetype.STBranchActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; // N.B. Select means Go select statement for input-choice; not output-choice -public class ParamCoreSTSelectActionBuilder extends STBranchActionBuilder +public class RPCoreSTSelectActionBuilder extends STBranchActionBuilder { /*@Override public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out @@ -36,8 +36,8 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + return RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + + RPCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -45,7 +45,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + i + " *" + a.payload.elems.get(i) //+ ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" // No: singleton choice subj (not multichoices) ).collect(Collectors.joining(", ")); @@ -67,7 +67,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem - ((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet)); + ((RPCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet)); if (isDeleg) { throw new RuntimeException("[param-core] TODO: " + a); @@ -79,18 +79,18 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "\treturn nil // select ignores nilchan\n" + "}\n"; - ParamRole peer = (ParamRole) curr.getActions().iterator().next().peer; - ParamRange g = peer.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole peer = (RPIndexedRole) curr.getActions().iterator().next().peer; + RPInterval g = peer.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { - return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { @@ -98,8 +98,8 @@ else if (e instanceof ParamIndexVar) } }; String sEpRecv = - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + ".Ept"; //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; @@ -108,8 +108,8 @@ else if (e instanceof ParamIndexVar) ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ - ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; - String sEp = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + RPCoreSTStateChanApiBuilder apigen = (RPCoreSTStateChanApiBuilder) api; + String sEp = RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; if (!a.payload.elems.isEmpty()) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java similarity index 74% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectStateBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index 509a3b999..efff990c5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -5,22 +5,22 @@ import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.endpoint.actions.EReceive; import org.scribble.type.name.GProtocolName; // N.B. Select means Go select statement for input-choice; not output-choice -public class ParamCoreSTSelectStateBuilder extends STBranchStateBuilder +public class RPCoreSTSelectStateBuilder extends STBranchStateBuilder { - public ParamCoreSTSelectStateBuilder(ParamCoreSTSelectActionBuilder bb) + public RPCoreSTSelectStateBuilder(RPCoreSTSelectActionBuilder bb) { super(bb); } @@ -28,11 +28,11 @@ public ParamCoreSTSelectStateBuilder(ParamCoreSTSelectActionBuilder bb) @Override public String getPreamble(STStateChanApiBuilder api, EState s) { - ParamActualRole actual = ((ParamCoreSTStateChanApiBuilder) api).actual; + RPRoleVariant actual = ((RPCoreSTStateChanApiBuilder) api).actual; String sEpRecv = - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + ".Ept"; //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; @@ -42,17 +42,18 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ //return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); - ParamCoreSTStateChanApiBuilder apigen = (ParamCoreSTStateChanApiBuilder) api; + RPCoreSTStateChanApiBuilder apigen = (RPCoreSTStateChanApiBuilder) api; //Role r = apigen.actual.getName(); GProtocolName simpname = apigen.apigen.proto.getSimpleName(); String tname = apigen.getStateChanName(s); //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, apigen.actual); + String epType = RPCoreSTApiGenerator.getGeneratedEndpointTypeName(simpname, apigen.actual); String res = //apigen.apigen.generateRootPackageDecl() + "\n" - "package " + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "\n" + "package " + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + "\n" + "\n" - + apigen.apigen.generateScribbleRuntimeImports() + "\n" + //+ apigen.apigen.generateScribbleRuntimeImports() + "\n" + + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "import \"log\"\n" //+ (((GoJob) api.job).noCopy ? "" : Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) @@ -60,8 +61,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "\n" + "type " + tname + " struct{\n" //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" - + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan string\n") // chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") .collect(Collectors.joining("")) /*+ (((GoJob) apigen.job).noCopy ? "data chan []interface{}" : @@ -76,8 +77,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) //: ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case : "Init") + "() *" + tname + " {\n" // FIXME: factor out - + "s := &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" - + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + + "s := &" + tname + " { " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + + ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan "//chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "string" + ", 1)") @@ -95,21 +96,21 @@ public String getPreamble(STStateChanApiBuilder api, EState s) res += "\n" + "func (s *" + tname + ") foo() {\n" - + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + "s." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + "var op string\n"; - ParamRole peer = (ParamRole) s.getActions().iterator().next().peer; - ParamRange g = peer.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole peer = (RPIndexedRole) s.getActions().iterator().next().peer; + RPInterval g = peer.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { - return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java similarity index 72% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index f420c80f6..c9e88acf0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -7,17 +7,17 @@ import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; -public class ParamCoreSTSendActionBuilder extends STSendActionBuilder +public class RPCoreSTSendActionBuilder extends STSendActionBuilder { @Override @@ -25,7 +25,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) { return //ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" "Scatter_" // FIXME: make unary Send special case - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + + RPCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -33,8 +33,8 @@ public String getActionName(STStateChanApiBuilder api, EAction a) public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG - + i + " []" + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + + i + " []" + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) ).collect(Collectors.joining(", ")); } @@ -55,7 +55,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES String sEpWrite = //s.ep.Write - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Ept" //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; @@ -65,18 +65,18 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ - ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval g = r.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { - return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { @@ -87,7 +87,7 @@ else if (e instanceof ParamIndexVar) // FIXME: single arg // Currently never true because of ParamCoreSTOutputStateBuilder boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem - ((ParamCoreSTStateChanApiBuilder) apigen).isDelegType((DataType) pet)); + ((RPCoreSTStateChanApiBuilder) apigen).isDelegType((DataType) pet)); String res = //st1.Use() @@ -99,7 +99,7 @@ else if (e instanceof ParamIndexVar) "if err := " + sEpWrite //+ "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "[\"" + r.getName() + "\"][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "\"" + a.mid + "\"" + "); err != nil {\n" + "log.Fatal(err)\n" @@ -113,7 +113,7 @@ else if (e instanceof ParamIndexVar) "if err := " + sEpWrite //+ "[" + sEpProto + "." + r.getName() + ".Name()][i]" + "[\"" + r.getName() + "\"][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "arg0[j]" //+ "splitFn0(arg0, i)" // FIXME: hardcoded arg0 + "); err != nil {\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java similarity index 76% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 8cbaaf075..87019481f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -8,22 +8,22 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.ext.go.ast.ParamRoleDecl; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.ast.RPRoleDecl; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; // Cf. STStateChanApiBuilder -public class ParamCoreSTSessionApiBuilder // FIXME: make base STSessionApiBuilder +public class RPCoreSTSessionApiBuilder { - private ParamCoreSTEndpointApiGenerator apigen; + private RPCoreSTApiGenerator apigen; //private final Map> actuals; - public ParamCoreSTSessionApiBuilder(ParamCoreSTEndpointApiGenerator apigen)//, Map> actuals) + public RPCoreSTSessionApiBuilder(RPCoreSTApiGenerator apigen)//, Map> actuals) { this.apigen = apigen; //this.actuals = Collections.unmodifiableMap(actuals); @@ -49,8 +49,9 @@ public Map build() // FIXME: factor out //this.apigen.generateRootPackageDecl() + "\n" "\n" //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" - + this.apigen.generateScribbleRuntimeImports() - + "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; + //+ this.apigen.generateScribbleRuntimeImports() + + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; // roles @@ -62,12 +63,12 @@ public Map build() // FIXME: factor out + (roles.stream().map(rfoo -> { - Set actuals = this.apigen.actuals.get(rfoo).keySet(); + Set actuals = this.apigen.actuals.get(rfoo).keySet(); return actuals.stream().map(actual -> { - return "import _" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + " \"" + this.apigen.impath + "/" + this.apigen.getRootPackage() - + "/" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "\"\n"; + return "import _" + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + " \"" + this.apigen.packpath + "/" + this.apigen.getRootPackage() + + "/" + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + "\"\n"; }).collect(Collectors.joining("")); }).collect(Collectors.joining("")) ); @@ -97,28 +98,28 @@ public Map build() // FIXME: factor out sessPack += roles.stream().map(rfoo -> { - Set actuals = this.apigen.actuals.get(rfoo).keySet(); + Set actuals = this.apigen.actuals.get(rfoo).keySet(); return actuals.stream().map(actual -> { - String epTypeName = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, actual); - List decls = + String epTypeName = RPCoreSTApiGenerator.getGeneratedEndpointTypeName(simpname, actual); + List decls = gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(actual.getName())) - .map(rd -> (ParamRoleDecl) rd).collect(Collectors.toList()); + .map(rd -> (RPRoleDecl) rd).collect(Collectors.toList()); if (decls.size() > 1) { throw new RuntimeException("Shouldn't get in here: " + actual); } - List vars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); + List vars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); String epPack1 = "\ntype " + epTypeName + " struct {\n" // FIXME: factor out - + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " session.Protocol\n" + + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " session.Protocol\n" + "Self int\n" + "*session.LinearResource\n" - + "Ept *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + "Ept *" + RPCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "Params map[string]int\n" + "}\n" + "\n" @@ -160,13 +161,13 @@ public Map build() // FIXME: factor out vars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" - + "(*_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "." + epTypeName + ") {\n" + + "(*_" + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + "." + epTypeName + ") {\n" + "params := make(map[string]int)\n" + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) //+ "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, " + "conns), params}\n" // FIXME: numRoles - + "return _" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".New" + "(p, params, self)\n" // FIXME: numRoles + + "return _" + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + ".New" + "(p, params, self)\n" // FIXME: numRoles + "}\n"; epPack1 += @@ -183,8 +184,8 @@ public Map build() // FIXME: factor out : "return f(&Init{ new(session.LinearResource), ini })\n") + "}"; - res.put(dir + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "/" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".go", - "package " + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "\n" + epPack + "\n" + epPack1); + res.put(dir + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + "/" + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + ".go", + "package " + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + "\n" + epPack + "\n" + epPack1); return sessPack1; }).collect(Collectors.joining("")); }).collect(Collectors.joining("\n")); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java similarity index 70% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSplitActionBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java index 4c8d33525..ffc5a3d25 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java @@ -7,24 +7,24 @@ import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEAction; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexInt; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; -public class ParamCoreSTSplitActionBuilder extends STSendActionBuilder +public class RPCoreSTSplitActionBuilder extends STSendActionBuilder { @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return ParamCoreSTApiGenConstants.GO_CROSS_SPLIT_FUN_PREFIX + "_" - + ParamCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((ParamCoreEAction) a).getPeer()) + return RPCoreSTApiGenConstants.GO_CROSS_SPLIT_FUN_PREFIX + "_" + + RPCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -33,23 +33,23 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) { DataType[] pet = new DataType[1]; return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " // HACK - + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0] = ((DataType) a.payload.elems.get(i)))) ? "*" : "") - + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) //a.payload.elems.get(i) + + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0] = ((DataType) a.payload.elems.get(i)))) ? "*" : "") + + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) //a.payload.elems.get(i) - + ", splitFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + + ", splitFn" + i + " func(" + RPCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " // HACK - + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") - + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") + + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + ", i" + i + " int) " - + ((((ParamCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") - + ((ParamCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") + + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) ).collect(Collectors.joining(", ")); } @@ -71,31 +71,31 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat String sEpWrite = //s.ep.Write - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; + ".Conn"; String sEpProto = //"s.ep.Proto" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO; /*String sEpErr = //"s.ep.Err" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ - ParamRole r = (ParamRole) a.peer; - ParamRange g = r.ranges.iterator().next(); - Function foo = e -> + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval g = r.ranges.iterator().next(); + Function foo = e -> { - if (e instanceof ParamIndexInt) + if (e instanceof RPIndexInt) { return e.toString(); } - else if (e instanceof ParamIndexVar) + else if (e instanceof RPIndexVar) { - return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; + return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else { @@ -168,18 +168,18 @@ else if (e instanceof ParamIndexVar) + (a.mid.toString().equals("") ? "" : // HACK "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "\"" + a.mid + "\"" + "); err != nil {\n" + "log.Fatal(err)\n" + "}\n") - + ((((ParamCoreSTStateChanApiBuilder) api).isDelegType((DataType) a.payload.elems.get(0))) ? "arg0.Res.Use()\n" : "") + + ((((RPCoreSTStateChanApiBuilder) api).isDelegType((DataType) a.payload.elems.get(0))) ? "arg0.Res.Use()\n" : "") //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "splitFn0(arg0, i)" + "); err != nil {\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java similarity index 76% rename from scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 797aee805..c8226211b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -10,15 +10,15 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.ast.ParamCoreDelegDecl; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; -import org.scribble.ext.go.core.type.ParamActualRole; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.ast.RPCoreDelegDecl; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotSend; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEMultiChoicesReceive; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; @@ -29,13 +29,13 @@ import org.scribble.type.name.PayloadElemType; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder -public class ParamCoreSTStateChanApiBuilder extends STStateChanApiBuilder +public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder { - protected final ParamCoreSTEndpointApiGenerator apigen; - public final ParamActualRole actual; // this.apigen.self.equals(this.actual.getName()) + protected final RPCoreSTApiGenerator apigen; + public final RPRoleVariant actual; // this.apigen.self.equals(this.actual.getName()) //public final EGraph graph; - public final ParamCoreSTReceiveActionBuilder vb; + public final RPCoreSTReceiveActionBuilder vb; private int counter = 1; @@ -51,23 +51,23 @@ protected static ParamCoreEStateKind getStateKind(EState s) { return ParamCoreEStateKind.TERMINAL; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossSend)) + else if (as.stream().allMatch(a -> a instanceof RPCoreECrossSend)) { return ParamCoreEStateKind.CROSS_SEND; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreECrossReceive)) + else if (as.stream().allMatch(a -> a instanceof RPCoreECrossReceive)) { return ParamCoreEStateKind.CROSS_RECEIVE; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotSend)) + else if (as.stream().allMatch(a -> a instanceof RPCoreEDotSend)) { return ParamCoreEStateKind.DOT_SEND; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEDotReceive)) + else if (as.stream().allMatch(a -> a instanceof RPCoreEDotReceive)) { return ParamCoreEStateKind.DOT_RECEIVE; } - else if (as.stream().allMatch(a -> a instanceof ParamCoreEMultiChoicesReceive)) + else if (as.stream().allMatch(a -> a instanceof RPCoreEMultiChoicesReceive)) { return ParamCoreEStateKind.MULTICHOICES_RECEIVE; } @@ -82,20 +82,20 @@ else if (as.stream().allMatch(a -> a instanceof ParamCoreEMultiChoicesReceive)) // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later // actual.getName().equals(this.role) - public ParamCoreSTStateChanApiBuilder(ParamCoreSTEndpointApiGenerator apigen, ParamActualRole actual, EGraph graph) + public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant actual, EGraph graph) { super(apigen.job, apigen.proto, apigen.self, graph, - new ParamCoreSTOutputStateBuilder(new ParamCoreSTSplitActionBuilder(), new ParamCoreSTSendActionBuilder()), - new ParamCoreSTReceiveStateBuilder(new ParamCoreSTReduceActionBuilder(), new ParamCoreSTReceiveActionBuilder()), - new ParamCoreSTSelectStateBuilder(new ParamCoreSTSelectActionBuilder()), + new RPCoreSTOutputStateBuilder(new RPCoreSTSplitActionBuilder(), new RPCoreSTSendActionBuilder()), + new RPCoreSTReceiveStateBuilder(new RPCoreSTReduceActionBuilder(), new RPCoreSTReceiveActionBuilder()), + new RPCoreSTSelectStateBuilder(new RPCoreSTSelectActionBuilder()), null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), - new ParamCoreSTEndStateBuilder()); + new RPCoreSTEndStateBuilder()); //throw new RuntimeException("[param-core] TODO:"); this.apigen = apigen; this.actual = actual; - this.vb = ((ParamCoreSTReceiveStateBuilder) this.rb).vb; + this.vb = ((RPCoreSTReceiveStateBuilder) this.rb).vb; this.datats = this.apigen.job.getContext().getMainModule().getNonProtocolDecls().stream() .filter(d -> (d instanceof DataTypeDecl)).map(d -> ((DataTypeDecl) d)).collect(Collectors.toSet()); @@ -154,7 +154,7 @@ public String getFilePath(String filename) filename = "$" + filename.substring(1); } return this.gpn.toString().replaceAll("\\.", "/") - + "/" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + + "/" + RPCoreSTApiGenerator.getGeneratedActualRoleName(this.actual) + "/" + filename + ".go"; } @@ -165,13 +165,14 @@ protected String getStateChanPremable(EState s) GProtocolName simpname = this.apigen.proto.getSimpleName(); String tname = this.getStateChanName(s); ////String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, this.actual); + String epType = RPCoreSTApiGenerator.getGeneratedEndpointTypeName(simpname, this.actual); String res = //this.apigen.generateRootPackageDecl() + "\n" - "package " + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "\n" + "package " + RPCoreSTApiGenerator.getGeneratedActualRoleName(this.actual) + "\n" + "\n" - + this.apigen.generateScribbleRuntimeImports() + "\n" + + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + //+ this.apigen.generateScribbleRuntimeImports() + "\n" + "import \"log\"\n" /*+ (s.isTerminal() || ((GoJob) apigen.job).noCopy ? "" : @@ -193,8 +194,8 @@ protected String getStateChanPremable(EState s) + "\n" + "type " + tname + " struct {\n" - + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " session.ParamEndpoint" + "\n" // FIXME: factor out + "}\n"; @@ -218,7 +219,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b if (getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1) { return - "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "func (" + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(this, a) + ") <-chan *" + ab.getReturnType(this, curr, succ) + " {\n" @@ -229,12 +230,12 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b { //throw new RuntimeException("[param-core] TODO: "); return - "func (" + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "func (" + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(this, a) + ") *" + ab.getReturnType(this, curr, succ) + " {\n" - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE - + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + ab.buildBody(this, curr, a, succ) + "\n" + "}"; } @@ -246,7 +247,7 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) / //throw new RuntimeException("[param-core] TODO: "); String sEp = //"s.ep" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; String res = ""; /*if (succ.isTerminal()) // FIXME @@ -262,7 +263,7 @@ public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, Str { if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { - return ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + + return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "New" //+ getStateChanName(succ) + ((succ.id != this.graph.init.id) ? getStateChanName(succ) @@ -272,11 +273,11 @@ public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, Str } else { - String res = "&" + ab.getReturnType(this, curr, succ) + "{ " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; + String res = "&" + ab.getReturnType(this, curr, succ) + "{ " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; if (!succ.isTerminal()) { - res += ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE - + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case + res += ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case } res += " }"; return res; @@ -292,9 +293,9 @@ public String getChannelName(STStateChanApiBuilder api, EAction a) // Not used? "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; } - protected ParamActualRole getSelf() + protected RPRoleVariant getSelf() { - return (ParamActualRole) this.getSelf(); + return (RPRoleVariant) this.getSelf(); } /*public String getActualRoleName() @@ -324,21 +325,21 @@ protected String makeSTStateName(EState s) "State" + this.counter++; } - public static String makeEndStateName(GProtocolName simpname, ParamActualRole r) + public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) { return //simpname + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(r) + "_" + - ParamCoreSTApiGenConstants.GO_SCHAN_END_TYPE; + RPCoreSTApiGenConstants.GO_SCHAN_END_TYPE; } // Not actual roles; param roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName - public static String getGeneratedParamRoleName(ParamRole r) + public static String getGeneratedParamRoleName(RPIndexedRole r) { //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); if (r.ranges.size() > 1) { throw new RuntimeException("[param-core] TODO: " + r); } - ParamRange g = r.ranges.iterator().next(); + RPInterval g = r.ranges.iterator().next(); return r.getName() + "_" + g.start + "To" + g.end; } @@ -347,7 +348,7 @@ public static String getGeneratedParamRoleName(ParamRole r) public boolean isDelegType(DataType t) { - return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof ParamCoreDelegDecl; // FIXME: make a map + return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof RPCoreDelegDecl; // FIXME: make a map } protected String getExtName(DataType t) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreException.java b/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreException.java similarity index 65% rename from scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreException.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreException.java index 1421ef4e9..f84fd9fda 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreException.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreException.java @@ -4,7 +4,7 @@ import org.scribble.main.ScribbleException; //public class AssrtException extends Exception -public class ParamCoreException extends ScribbleException +public class RPCoreException extends ScribbleException { /** @@ -12,37 +12,37 @@ public class ParamCoreException extends ScribbleException */ private static final long serialVersionUID = 1L; - public ParamCoreException() + public RPCoreException() { // TODO Auto-generated constructor stub } - public ParamCoreException(String arg0) + public RPCoreException(String arg0) { super(arg0); // TODO Auto-generated constructor stub } - public ParamCoreException(Throwable arg0) + public RPCoreException(Throwable arg0) { super(arg0); // TODO Auto-generated constructor stub } - public ParamCoreException(String arg0, Throwable arg1) + public RPCoreException(String arg0, Throwable arg1) { super(arg0, arg1); // TODO Auto-generated constructor stub } - public ParamCoreException(String message, Throwable cause, boolean enableSuppression, + public RPCoreException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); // TODO Auto-generated constructor stub } - public ParamCoreException(CommonTree blame, String arg0) + public RPCoreException(CommonTree blame, String arg0) { super(blame, arg0); // TODO Auto-generated constructor stub diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java similarity index 60% rename from scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java index a40cc942e..d5f66a044 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/main/ParamCoreMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java @@ -2,25 +2,25 @@ import java.nio.file.Path; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.ParamAstFactoryImpl; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactoryImpl; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.RPAstFactoryImpl; +import org.scribble.ext.go.core.model.endpoint.RPCoreEModelFactory; +import org.scribble.ext.go.core.model.endpoint.RPCoreEModelFactoryImpl; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.parser.scribble.ParamAntlrToScribParser; -import org.scribble.ext.go.parser.scribble.ParamScribbleAntlrWrapper; +import org.scribble.ext.go.parser.scribble.RPAntlrToScribParser; +import org.scribble.ext.go.parser.scribble.RPScribbleAntlrWrapper; import org.scribble.main.MainContext; import org.scribble.main.ScribbleException; import org.scribble.main.resource.ResourceLocator; import org.scribble.parser.scribble.ScribbleAntlrWrapper; import org.scribble.util.ScribParserException; -public class ParamCoreMainContext extends MainContext +public class RPCoreMainContext extends MainContext { protected final boolean noCopy; // Load main module from file system - public ParamCoreMainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, + public RPCoreMainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean noCopy) throws ScribParserException, ScribbleException { @@ -39,25 +39,25 @@ public GoJob newJob() @Override protected ScribbleAntlrWrapper newAntlrParser() { - return new ParamScribbleAntlrWrapper(); + return new RPScribbleAntlrWrapper(); } @Override - protected ParamAntlrToScribParser newScribParser() + protected RPAntlrToScribParser newScribParser() { - return new ParamAntlrToScribParser(); + return new RPAntlrToScribParser(); } @Override - protected ParamAstFactory newAstFactory() + protected RPAstFactory newAstFactory() { - return new ParamAstFactoryImpl(); + return new RPAstFactoryImpl(); } @Override - protected ParamCoreEModelFactory newEModelFactory() + protected RPCoreEModelFactory newEModelFactory() { - return new ParamCoreEModelFactoryImpl(); // HACK FIXME + return new RPCoreEModelFactoryImpl(); // HACK FIXME } /*@Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java deleted file mode 100644 index 3d8eb84ce..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.scribble.ext.go.core.model.endpoint; - -import java.util.List; - -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.model.endpoint.EModelFactory; -import org.scribble.type.Payload; -import org.scribble.type.name.MessageId; - -public interface ParamCoreEModelFactory extends EModelFactory -{ - - ParamCoreECrossSend newParamCoreECrossSend(ParamRole peer, MessageId mid, Payload payload); - ParamCoreECrossReceive newParamCoreECrossReceive(ParamRole peer, MessageId mid, Payload payload); - ParamCoreEDotSend newParamCoreEDotSend(ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload); - ParamCoreEDotReceive newParamCoreEDotReceive(ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload); - ParamCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(ParamRole peer,//MessageId mid, Payload payload) - List> mids, List pays); -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java deleted file mode 100644 index 0598c1f42..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEModelFactoryImpl.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.scribble.ext.go.core.model.endpoint; - -import java.util.List; - -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreECrossSend; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotReceive; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEDotSend; -import org.scribble.ext.go.core.model.endpoint.action.ParamCoreEMultiChoicesReceive; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.model.endpoint.EModelFactoryImpl; -import org.scribble.model.endpoint.actions.EReceive; -import org.scribble.model.endpoint.actions.ESend; -import org.scribble.type.Payload; -import org.scribble.type.name.MessageId; -import org.scribble.type.name.Role; - -public class ParamCoreEModelFactoryImpl extends EModelFactoryImpl implements ParamCoreEModelFactory -{ - - @Override - public ESend newESend(Role peer, MessageId mid, Payload payload) - { - throw new RuntimeException("[param-core] Shouldn't get in here: "); - } - - @Override - public EReceive newEReceive(Role peer, MessageId mid, Payload payload) - { - throw new RuntimeException("[param-core] Shouldn't get in here: "); - } - - @Override - public ParamCoreECrossSend newParamCoreECrossSend(ParamRole peer, MessageId mid, Payload payload) - { - return new ParamCoreECrossSend(this, peer, mid, payload); - } - - @Override - public ParamCoreECrossReceive newParamCoreECrossReceive(ParamRole peer, MessageId mid, Payload payload) - { - return new ParamCoreECrossReceive(this, peer, mid, payload); - } - - @Override - public ParamCoreEDotSend newParamCoreEDotSend(ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload) - { - return new ParamCoreEDotSend(this, peer, offset, mid, payload); - } - - @Override - public ParamCoreEDotReceive newParamCoreEDotReceive(ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload) - { - return new ParamCoreEDotReceive(this, peer, offset, mid, payload); - } - - @Override - public ParamCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(ParamRole peer,//MessageId mid, Payload payload) - List> mids, List pays) - { - return new ParamCoreEMultiChoicesReceive(this, peer, mids, pays); - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java similarity index 59% rename from scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java index b244ecf22..343b111af 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/ParamCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java @@ -6,18 +6,18 @@ import java.util.Map; import java.util.stream.Collectors; -import org.scribble.ext.go.core.ast.ParamCoreMessage; -import org.scribble.ext.go.core.ast.ParamCoreRecVar; -import org.scribble.ext.go.core.ast.local.ParamCoreLActionKind; -import org.scribble.ext.go.core.ast.local.ParamCoreLChoice; -import org.scribble.ext.go.core.ast.local.ParamCoreLDotChoice; -import org.scribble.ext.go.core.ast.local.ParamCoreLEnd; -import org.scribble.ext.go.core.ast.local.ParamCoreLMultiChoices; -import org.scribble.ext.go.core.ast.local.ParamCoreLRec; -import org.scribble.ext.go.core.ast.local.ParamCoreLType; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.ast.RPCoreMessage; +import org.scribble.ext.go.core.ast.RPCoreRecVar; +import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; +import org.scribble.ext.go.core.ast.local.RPCoreLChoice; +import org.scribble.ext.go.core.ast.local.RPCoreLDotChoice; +import org.scribble.ext.go.core.ast.local.RPCoreLEnd; +import org.scribble.ext.go.core.ast.local.RPCoreLMultiChoices; +import org.scribble.ext.go.core.ast.local.RPCoreLRec; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.endpoint.EState; @@ -26,32 +26,32 @@ import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; -public class ParamCoreEGraphBuilder +public class RPCoreEGraphBuilder { private final GoJob job; private final EGraphBuilderUtil util; // Not using any features for unguarded choice/recursion/continue (recursion manually tracked here) - public ParamCoreEGraphBuilder(GoJob job) + public RPCoreEGraphBuilder(GoJob job) { this.job = job; this.util = new EGraphBuilderUtil(job.ef); } - public EGraph build(ParamCoreLType lt) + public EGraph build(RPCoreLType lt) { this.util.init(this.job.ef.newEState(Collections.emptySet())); build(lt, this.util.getEntry(), this.util.getExit(), new HashMap<>()); return this.util.finalise(); } - private void build(ParamCoreLType lt, EState s1, EState s2, Map recs) + private void build(RPCoreLType lt, EState s1, EState s2, Map recs) { - if (lt instanceof ParamCoreLChoice) + if (lt instanceof RPCoreLChoice) { - if (lt instanceof ParamCoreLMultiChoices) + if (lt instanceof RPCoreLMultiChoices) { - ParamCoreLMultiChoices lc = (ParamCoreLMultiChoices) lt; + RPCoreLMultiChoices lc = (RPCoreLMultiChoices) lt; List> mids = lc.cases.keySet().stream().map(x -> x.op).collect(Collectors.toList()); List pays = lc.cases.keySet().stream().map(x -> x.pay).collect(Collectors.toList()); buildMultiChoicesEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), mids, pays, lc.getContinuation()); @@ -60,18 +60,18 @@ private void build(ParamCoreLType lt, EState s1, EState s2, Map } else { - ParamCoreLChoice lc = (ParamCoreLChoice) lt; - ParamIndexExpr offset = (lc instanceof ParamCoreLDotChoice) - ? ((ParamCoreLDotChoice) lc).offset + RPCoreLChoice lc = (RPCoreLChoice) lt; + RPIndexExpr offset = (lc instanceof RPCoreLDotChoice) + ? ((RPCoreLDotChoice) lc).offset : null; lc.cases.entrySet().stream().forEach(e -> buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue(), offset) ); } } - else if (lt instanceof ParamCoreLRec) + else if (lt instanceof RPCoreLRec) { - ParamCoreLRec lr = (ParamCoreLRec) lt; + RPCoreLRec lr = (RPCoreLRec) lt; Map tmp = new HashMap<>(recs); tmp.put(lr.recvar, s1); build(lr.body, s1, s2, tmp); @@ -83,16 +83,16 @@ else if (lt instanceof ParamCoreLRec) } private void buildEdgeAndContinuation(EState s1, EState s2, Map recs, - ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a, ParamCoreLType cont, ParamIndexExpr offset) + RPIndexedRole r, RPCoreLActionKind k, RPCoreMessage a, RPCoreLType cont, RPIndexExpr offset) { EAction ea = toEAction(r, k, a, offset); - if (cont instanceof ParamCoreLEnd) + if (cont instanceof RPCoreLEnd) { this.util.addEdge(s1, ea, s2); } - else if (cont instanceof ParamCoreRecVar) + else if (cont instanceof RPCoreRecVar) { - EState s = recs.get(((ParamCoreRecVar) cont).recvar); + EState s = recs.get(((RPCoreRecVar) cont).recvar); this.util.addEdge(s1, ea, s); } else @@ -105,16 +105,16 @@ else if (cont instanceof ParamCoreRecVar) // FIXME: factor out with above private void buildMultiChoicesEdgeAndContinuation(EState s1, EState s2, Map recs, - ParamRole r, ParamCoreLActionKind k, List> mids, List pays, ParamCoreLType cont) + RPIndexedRole r, RPCoreLActionKind k, List> mids, List pays, RPCoreLType cont) { - EAction ea = ((ParamCoreEModelFactory) this.util.ef).newParamCoreEMultiChoicesReceive(r, mids, pays); - if (cont instanceof ParamCoreLEnd) + EAction ea = ((RPCoreEModelFactory) this.util.ef).newParamCoreEMultiChoicesReceive(r, mids, pays); + if (cont instanceof RPCoreLEnd) { this.util.addEdge(s1, ea, s2); } - else if (cont instanceof ParamCoreRecVar) + else if (cont instanceof RPCoreRecVar) { - EState s = recs.get(((ParamCoreRecVar) cont).recvar); + EState s = recs.get(((RPCoreRecVar) cont).recvar); this.util.addEdge(s1, ea, s); } else @@ -125,23 +125,23 @@ else if (cont instanceof ParamCoreRecVar) } } - private EAction toEAction(ParamRole r, ParamCoreLActionKind k, ParamCoreMessage a, ParamIndexExpr offset) + private EAction toEAction(RPIndexedRole r, RPCoreLActionKind k, RPCoreMessage a, RPIndexExpr offset) { - ParamCoreEModelFactory ef = (ParamCoreEModelFactory) this.util.ef; // FIXME: factor out - if (k.equals(ParamCoreLActionKind.CROSS_SEND)) + RPCoreEModelFactory ef = (RPCoreEModelFactory) this.util.ef; // FIXME: factor out + if (k.equals(RPCoreLActionKind.CROSS_SEND)) { return ef.newParamCoreECrossSend(r, a.op, a.pay); } - else if (k.equals(ParamCoreLActionKind.CROSS_RECEIVE)) + else if (k.equals(RPCoreLActionKind.CROSS_RECEIVE)) { return ef.newParamCoreECrossReceive(r, a.op, a.pay); } - else if (k.equals(ParamCoreLActionKind.DOT_SEND)) + else if (k.equals(RPCoreLActionKind.DOT_SEND)) { return ef.newParamCoreEDotSend(r, offset, a.op, a.pay); } - else if (k.equals(ParamCoreLActionKind.DOT_RECEIVE)) + else if (k.equals(RPCoreLActionKind.DOT_RECEIVE)) { return ef.newParamCoreEDotReceive(r, offset, a.op, a.pay); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java new file mode 100644 index 000000000..88026dc8f --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java @@ -0,0 +1,25 @@ +package org.scribble.ext.go.core.model.endpoint; + +import java.util.List; + +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotSend; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEMultiChoicesReceive; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.model.endpoint.EModelFactory; +import org.scribble.type.Payload; +import org.scribble.type.name.MessageId; + +public interface RPCoreEModelFactory extends EModelFactory +{ + + RPCoreECrossSend newParamCoreECrossSend(RPIndexedRole peer, MessageId mid, Payload payload); + RPCoreECrossReceive newParamCoreECrossReceive(RPIndexedRole peer, MessageId mid, Payload payload); + RPCoreEDotSend newParamCoreEDotSend(RPIndexedRole peer, RPIndexExpr offset, MessageId mid, Payload payload); + RPCoreEDotReceive newParamCoreEDotReceive(RPIndexedRole peer, RPIndexExpr offset, MessageId mid, Payload payload); + RPCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(RPIndexedRole peer,//MessageId mid, Payload payload) + List> mids, List pays); +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java new file mode 100644 index 000000000..c861e83c2 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java @@ -0,0 +1,64 @@ +package org.scribble.ext.go.core.model.endpoint; + +import java.util.List; + +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotSend; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEMultiChoicesReceive; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.model.endpoint.EModelFactoryImpl; +import org.scribble.model.endpoint.actions.EReceive; +import org.scribble.model.endpoint.actions.ESend; +import org.scribble.type.Payload; +import org.scribble.type.name.MessageId; +import org.scribble.type.name.Role; + +public class RPCoreEModelFactoryImpl extends EModelFactoryImpl implements RPCoreEModelFactory +{ + + @Override + public ESend newESend(Role peer, MessageId mid, Payload payload) + { + throw new RuntimeException("[param-core] Shouldn't get in here: "); + } + + @Override + public EReceive newEReceive(Role peer, MessageId mid, Payload payload) + { + throw new RuntimeException("[param-core] Shouldn't get in here: "); + } + + @Override + public RPCoreECrossSend newParamCoreECrossSend(RPIndexedRole peer, MessageId mid, Payload payload) + { + return new RPCoreECrossSend(this, peer, mid, payload); + } + + @Override + public RPCoreECrossReceive newParamCoreECrossReceive(RPIndexedRole peer, MessageId mid, Payload payload) + { + return new RPCoreECrossReceive(this, peer, mid, payload); + } + + @Override + public RPCoreEDotSend newParamCoreEDotSend(RPIndexedRole peer, RPIndexExpr offset, MessageId mid, Payload payload) + { + return new RPCoreEDotSend(this, peer, offset, mid, payload); + } + + @Override + public RPCoreEDotReceive newParamCoreEDotReceive(RPIndexedRole peer, RPIndexExpr offset, MessageId mid, Payload payload) + { + return new RPCoreEDotReceive(this, peer, offset, mid, payload); + } + + @Override + public RPCoreEMultiChoicesReceive newParamCoreEMultiChoicesReceive(RPIndexedRole peer,//MessageId mid, Payload payload) + List> mids, List pays) + { + return new RPCoreEMultiChoicesReceive(this, peer, mids, pays); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java deleted file mode 100644 index 1cdfbf8f2..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEAction.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.scribble.ext.go.core.model.endpoint.action; - -import org.scribble.ext.go.core.type.ParamRole; - -public interface ParamCoreEAction -{ - - ParamRole getPeer(); // N.B. *not* ParamActualRole -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEAction.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEAction.java new file mode 100644 index 000000000..e8f692765 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEAction.java @@ -0,0 +1,9 @@ +package org.scribble.ext.go.core.model.endpoint.action; + +import org.scribble.ext.go.core.type.RPIndexedRole; + +public interface RPCoreEAction +{ + + RPIndexedRole getPeer(); // N.B. *not* ParamActualRole +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossReceive.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreECrossReceive.java similarity index 65% rename from scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossReceive.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreECrossReceive.java index ff7588add..c35aa7f7b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossReceive.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreECrossReceive.java @@ -1,7 +1,7 @@ package org.scribble.ext.go.core.model.endpoint.action; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.RPCoreEModelFactory; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.model.endpoint.actions.EReceive; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SReceive; @@ -9,22 +9,22 @@ import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; -public class ParamCoreECrossReceive extends EReceive implements ParamCoreEAction +public class RPCoreECrossReceive extends EReceive implements RPCoreEAction { - public ParamCoreECrossReceive(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + public RPCoreECrossReceive(RPCoreEModelFactory ef, RPIndexedRole peer, MessageId mid, Payload payload) { super(ef, peer, mid, payload); } @Override - public ParamRole getPeer() + public RPIndexedRole getPeer() { - return (ParamRole) this.peer; + return (RPIndexedRole) this.peer; } @Override - public ParamCoreECrossSend toDual(Role self) + public RPCoreECrossSend toDual(Role self) { throw new RuntimeException("[param-core] Shouldn't get in here: " + this); } @@ -50,7 +50,7 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamCoreECrossReceive)) + if (!(o instanceof RPCoreECrossReceive)) { return false; } @@ -60,6 +60,6 @@ public boolean equals(Object o) @Override public boolean canEqual(Object o) { - return o instanceof ParamCoreECrossReceive; + return o instanceof RPCoreECrossReceive; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossSend.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreECrossSend.java similarity index 65% rename from scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossSend.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreECrossSend.java index 421a251df..db205c659 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreECrossSend.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreECrossSend.java @@ -1,7 +1,7 @@ package org.scribble.ext.go.core.model.endpoint.action; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.RPCoreEModelFactory; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.model.endpoint.actions.ESend; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SSend; @@ -9,22 +9,22 @@ import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; -public class ParamCoreECrossSend extends ESend implements ParamCoreEAction +public class RPCoreECrossSend extends ESend implements RPCoreEAction { - public ParamCoreECrossSend(ParamCoreEModelFactory ef, ParamRole peer, MessageId mid, Payload payload) + public RPCoreECrossSend(RPCoreEModelFactory ef, RPIndexedRole peer, MessageId mid, Payload payload) { super(ef, peer, mid, payload); } @Override - public ParamRole getPeer() + public RPIndexedRole getPeer() { - return (ParamRole) this.peer; + return (RPIndexedRole) this.peer; } @Override - public ParamCoreECrossReceive toDual(Role self) + public RPCoreECrossReceive toDual(Role self) { throw new RuntimeException("[param-core] Shouldn't get in here: " + this); } @@ -50,7 +50,7 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamCoreECrossSend)) + if (!(o instanceof RPCoreECrossSend)) { return false; } @@ -60,6 +60,6 @@ public boolean equals(Object o) @Override public boolean canEqual(Object o) { - return o instanceof ParamCoreECrossSend; + return o instanceof RPCoreECrossSend; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotReceive.java similarity index 63% rename from scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotReceive.java index 2196a5ebc..d345df043 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotReceive.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotReceive.java @@ -1,9 +1,9 @@ package org.scribble.ext.go.core.model.endpoint.action; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.core.model.endpoint.RPCoreEModelFactory; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.model.endpoint.actions.EReceive; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SReceive; @@ -11,24 +11,24 @@ import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; -public class ParamCoreEDotReceive extends EReceive implements ParamCoreEAction +public class RPCoreEDotReceive extends EReceive implements RPCoreEAction { - public final ParamIndexExpr offset; + public final RPIndexExpr offset; - public ParamCoreEDotReceive(ParamCoreEModelFactory ef, ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload) + public RPCoreEDotReceive(RPCoreEModelFactory ef, RPIndexedRole peer, RPIndexExpr offset, MessageId mid, Payload payload) { super(ef, peer, mid, payload); this.offset = offset; } @Override - public ParamRole getPeer() + public RPIndexedRole getPeer() { - return (ParamRole) this.peer; + return (RPIndexedRole) this.peer; } @Override - public ParamCoreEDotSend toDual(Role self) + public RPCoreEDotSend toDual(Role self) { throw new RuntimeException("[param-core] Shouldn't get in here: " + this); } @@ -42,8 +42,8 @@ public SReceive toGlobal(SModelFactory sf, Role self) @Override public String toString() { - ParamRole peer = getPeer(); - ParamRange g = peer.ranges.iterator().next(); + RPIndexedRole peer = getPeer(); + RPInterval g = peer.ranges.iterator().next(); return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + getCommSymbol() + this.mid + this.payload; } @@ -52,8 +52,8 @@ public String toString() public String toStringWithMessageIdHack() { String m = this.mid.isMessageSigName() ? "^" + this.mid : this.mid.toString(); // HACK - ParamRole peer = getPeer(); - ParamRange g = peer.ranges.iterator().next(); + RPIndexedRole peer = getPeer(); + RPInterval g = peer.ranges.iterator().next(); return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + getCommSymbol() + m + this.payload; } @@ -80,17 +80,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamCoreEDotReceive)) + if (!(o instanceof RPCoreEDotReceive)) { return false; } return super.equals(o) // Does canEquals - && this.offset.equals(((ParamCoreEDotSend) o).offset); + && this.offset.equals(((RPCoreEDotSend) o).offset); } @Override public boolean canEqual(Object o) { - return o instanceof ParamCoreEDotReceive; + return o instanceof RPCoreEDotReceive; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotSend.java similarity index 65% rename from scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotSend.java index 65ed6bf9c..d1584713c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEDotSend.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotSend.java @@ -1,9 +1,9 @@ package org.scribble.ext.go.core.model.endpoint.action; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; -import org.scribble.ext.go.core.type.ParamRange; -import org.scribble.ext.go.core.type.ParamRole; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.core.model.endpoint.RPCoreEModelFactory; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.model.endpoint.actions.ESend; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SSend; @@ -11,25 +11,25 @@ import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; -public class ParamCoreEDotSend extends ESend implements ParamCoreEAction +public class RPCoreEDotSend extends ESend implements RPCoreEAction { - public final ParamIndexExpr offset; + public final RPIndexExpr offset; // ParamRole range is original peer absolute range -- local id plus offset will be inside this range - public ParamCoreEDotSend(ParamCoreEModelFactory ef, ParamRole peer, ParamIndexExpr offset, MessageId mid, Payload payload) + public RPCoreEDotSend(RPCoreEModelFactory ef, RPIndexedRole peer, RPIndexExpr offset, MessageId mid, Payload payload) { super(ef, peer, mid, payload); this.offset = offset; } @Override - public ParamRole getPeer() + public RPIndexedRole getPeer() { - return (ParamRole) this.peer; + return (RPIndexedRole) this.peer; } @Override - public ParamCoreEDotReceive toDual(Role self) + public RPCoreEDotReceive toDual(Role self) { throw new RuntimeException("[param-core] Shouldn't get in here: " + this); } @@ -43,8 +43,8 @@ public SSend toGlobal(SModelFactory sf, Role self) @Override public String toString() { - ParamRole peer = getPeer(); - ParamRange g = peer.ranges.iterator().next(); + RPIndexedRole peer = getPeer(); + RPInterval g = peer.ranges.iterator().next(); return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + getCommSymbol() + this.mid + this.payload; } @@ -53,8 +53,8 @@ public String toString() public String toStringWithMessageIdHack() { String m = this.mid.isMessageSigName() ? "^" + this.mid : this.mid.toString(); // HACK - ParamRole peer = getPeer(); - ParamRange g = peer.ranges.iterator().next(); + RPIndexedRole peer = getPeer(); + RPInterval g = peer.ranges.iterator().next(); return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + getCommSymbol() + m + this.payload; } @@ -81,17 +81,17 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamCoreEDotSend)) + if (!(o instanceof RPCoreEDotSend)) { return false; } return super.equals(o) // Does canEquals - && this.offset.equals(((ParamCoreEDotSend) o).offset); + && this.offset.equals(((RPCoreEDotSend) o).offset); } @Override public boolean canEqual(Object o) { - return o instanceof ParamCoreEDotSend; + return o instanceof RPCoreEDotSend; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEMultiChoicesReceive.java similarity index 78% rename from scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEMultiChoicesReceive.java index e1def9e31..32a9dea9c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/ParamCoreEMultiChoicesReceive.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEMultiChoicesReceive.java @@ -5,8 +5,8 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.ext.go.core.model.endpoint.ParamCoreEModelFactory; -import org.scribble.ext.go.core.type.ParamRole; +import org.scribble.ext.go.core.model.endpoint.RPCoreEModelFactory; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.model.endpoint.actions.EReceive; import org.scribble.model.global.SModelFactory; import org.scribble.model.global.actions.SReceive; @@ -14,12 +14,12 @@ import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; -public class ParamCoreEMultiChoicesReceive extends EReceive implements ParamCoreEAction +public class RPCoreEMultiChoicesReceive extends EReceive implements RPCoreEAction { public final List> mids; public final List pays; // mids.size() == pays.size() - public ParamCoreEMultiChoicesReceive(ParamCoreEModelFactory ef, ParamRole peer, List> mids, List pays) + public RPCoreEMultiChoicesReceive(RPCoreEModelFactory ef, RPIndexedRole peer, List> mids, List pays) { super(ef, peer, null, null); // null OK? this.mids = Collections.unmodifiableList(mids); @@ -27,13 +27,13 @@ public ParamCoreEMultiChoicesReceive(ParamCoreEModelFactory ef, ParamRole peer, } @Override - public ParamRole getPeer() + public RPIndexedRole getPeer() { - return (ParamRole) this.peer; + return (RPIndexedRole) this.peer; } @Override - public ParamCoreECrossSend toDual(Role self) + public RPCoreECrossSend toDual(Role self) { throw new RuntimeException("[param-core] Shouldn't get in here: " + this); } @@ -84,11 +84,11 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamCoreEMultiChoicesReceive)) + if (!(o instanceof RPCoreEMultiChoicesReceive)) { return false; } - ParamCoreEMultiChoicesReceive them = (ParamCoreEMultiChoicesReceive) o; + RPCoreEMultiChoicesReceive them = (RPCoreEMultiChoicesReceive) o; return them.canEqual(this) && // N.B. don't call super: this.mid, this.pay == null this.obj.equals(them.obj) && this.mids.equals(them.mids) && this.pays.equals(them.pays); } @@ -96,6 +96,6 @@ public boolean equals(Object o) @Override public boolean canEqual(Object o) { - return o instanceof ParamCoreEMultiChoicesReceive; + return o instanceof RPCoreEMultiChoicesReceive; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java similarity index 81% rename from scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java index cf89a98fb..442b1f8bb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java @@ -7,7 +7,7 @@ import org.scribble.type.name.Role; // FIXME: make distinct kind? i.e., don't extend Role? -- yes: ParamRole is not a Role (Role should actually be a ParamRole in that sense) -public class ParamRole extends Role +public class RPIndexedRole extends Role { /** * @@ -15,15 +15,15 @@ public class ParamRole extends Role private static final long serialVersionUID = 1L; //public final ParamRange range; - public final Set ranges; // size >= 1 -- size == 1 for parsed syntax + public final Set ranges; // size >= 1 -- size == 1 for parsed syntax - public ParamRole(String name, Set ranges) + public RPIndexedRole(String name, Set ranges) { super(name); this.ranges = Collections.unmodifiableSet(ranges); } - public ParamRange getParsedRange() + public RPInterval getParsedRange() { if (this.ranges.size() > 1) { @@ -65,11 +65,11 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamRole)) + if (!(obj instanceof RPIndexedRole)) { return false; } - ParamRole them = (ParamRole) obj; + RPIndexedRole them = (RPIndexedRole) obj; return super.equals(them) // Does canEqual && this.ranges.equals(them.ranges); } @@ -77,6 +77,6 @@ public boolean equals(Object obj) @Override public boolean canEqual(Object o) { - return o instanceof ParamRole; + return o instanceof RPIndexedRole; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java similarity index 74% rename from scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java index 83b097be8..27008e875 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamRange.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java @@ -4,26 +4,26 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; -public class ParamRange +public class RPInterval { /*public final ParamRoleParam start; public final ParamRoleParam end; // Inclusive*/ - public final ParamIndexExpr start; - public final ParamIndexExpr end; + public final RPIndexExpr start; + public final RPIndexExpr end; //public ParamRange(ParamRoleParam start, ParamRoleParam end) - public ParamRange(ParamIndexExpr start, ParamIndexExpr end) + public RPInterval(RPIndexExpr start, RPIndexExpr end) { this.start = start; this.end = end; } //public Set getActualParams() // Hack - public Set getVars() + public Set getVars() { //return Stream.of(this.start, this.end).filter(p -> !p.isConstant()).collect(Collectors.toSet()); return Stream.of(this.start, this.end).flatMap(p -> p.getVars().stream()).collect(Collectors.toSet()); @@ -51,11 +51,11 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamRange)) + if (!(obj instanceof RPInterval)) { return false; } - ParamRange them = (ParamRange) obj; + RPInterval them = (RPInterval) obj; return this.start.equals(them.start) && this.end.equals(them.end); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java similarity index 77% rename from scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java rename to scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java index 057416721..9f8fd0eb4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/ParamActualRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java @@ -4,16 +4,16 @@ import java.util.Set; import java.util.stream.Collectors; -public class ParamActualRole extends ParamRole +public class RPRoleVariant extends RPIndexedRole { /** * */ private static final long serialVersionUID = 1L; - public final Set coranges; + public final Set coranges; - public ParamActualRole(String name, Set ranges, Set coranges) + public RPRoleVariant(String name, Set ranges, Set coranges) { super(name, ranges); this.coranges = Collections.unmodifiableSet(coranges); @@ -44,11 +44,11 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof ParamActualRole)) + if (!(obj instanceof RPRoleVariant)) { return false; } - ParamActualRole them = (ParamActualRole) obj; + RPRoleVariant them = (RPRoleVariant) obj; return super.equals(them) // Does canEqual && this.coranges.equals(them.coranges); } @@ -56,6 +56,6 @@ public boolean equals(Object obj) @Override public boolean canEqual(Object o) { - return o instanceof ParamActualRole; + return o instanceof RPRoleVariant; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGChoiceDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java similarity index 77% rename from scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGChoiceDel.java rename to scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java index bc37cf9cb..df8972625 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGChoiceDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java @@ -8,23 +8,23 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDelBase; import org.scribble.del.global.GChoiceDel; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.global.ParamGChoice; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.global.RPGChoice; import org.scribble.main.ScribbleException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.InlineProtocolEnv; -public class ParamGChoiceDel extends GChoiceDel +public class RPGChoiceDel extends GChoiceDel { @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { - ParamGChoice gc = (ParamGChoice) visited; + RPGChoice gc = (RPGChoice) visited; List blocks = gc.getBlocks().stream() .map(b -> (GProtocolBlock) ((InlineProtocolEnv) b.del().env()).getTranslation()).collect(Collectors.toList()); RoleNode subj = gc.subj.clone(inl.job.af); - ParamGChoice inlined = ((ParamAstFactory) inl.job.af).ParamGChoice(gc.getSource(), subj, gc.expr, blocks); + RPGChoice inlined = ((RPAstFactory) inl.job.af).ParamGChoice(gc.getSource(), subj, gc.expr, blocks); inl.pushEnv(inl.popEnv().setTranslation(inlined)); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMessageTransferDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java similarity index 89% rename from scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMessageTransferDel.java rename to scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java index fd9cf686e..d8338c43a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMessageTransferDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java @@ -9,9 +9,9 @@ import org.scribble.type.name.Role; import org.scribble.visit.wf.NameDisambiguator; -public class ParamGMessageTransferDel extends GMessageTransferDel +public class RPGMessageTransferDel extends GMessageTransferDel { - public ParamGMessageTransferDel() + public RPGMessageTransferDel() { } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMultiChoicesDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMultiChoicesDel.java similarity index 76% rename from scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMultiChoicesDel.java rename to scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMultiChoicesDel.java index 20044a73a..aa1fe682a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/ParamGMultiChoicesDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMultiChoicesDel.java @@ -8,23 +8,23 @@ import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDelBase; import org.scribble.del.global.GChoiceDel; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.global.ParamGMultiChoices; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.global.RPGMultiChoices; import org.scribble.main.ScribbleException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.InlineProtocolEnv; -public class ParamGMultiChoicesDel extends GChoiceDel +public class RPGMultiChoicesDel extends GChoiceDel { @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { - ParamGMultiChoices gc = (ParamGMultiChoices) visited; + RPGMultiChoices gc = (RPGMultiChoices) visited; List blocks = gc.getBlocks().stream() .map(b -> (GProtocolBlock) ((InlineProtocolEnv) b.del().env()).getTranslation()).collect(Collectors.toList()); RoleNode subj = gc.subj.clone(inl.job.af); - ParamGMultiChoices inlined = ((ParamAstFactory) inl.job.af).ParamGMultiChoices(gc.getSource(), subj, + RPGMultiChoices inlined = ((RPAstFactory) inl.job.af).ParamGMultiChoices(gc.getSource(), subj, gc.var, gc.start, gc.end, blocks); inl.pushEnv(inl.popEnv().setTranslation(inlined)); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java similarity index 56% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java index 32570500d..4b7ebce5e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java @@ -3,20 +3,20 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.ScribNode; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.parser.scribble.ast.ParamAntlrGChoice; -import org.scribble.ext.go.parser.scribble.ast.ParamAntlrGMultiChoices; -import org.scribble.ext.go.parser.scribble.ast.ParamAntlrRoleDecl; -import org.scribble.ext.go.parser.scribble.ast.ParamCoreAntlrDelegDecl; -import org.scribble.ext.go.parser.scribble.ast.ParamCoreAntlrModule; -import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGCrossMessageTransfer; -import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGDotMessageTransfer; -import org.scribble.ext.go.parser.scribble.ast.global.ParamAntlrGMultiChoicesTransfer; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.parser.scribble.ast.RPAntlrGChoice; +import org.scribble.ext.go.parser.scribble.ast.RPAntlrGMultiChoices; +import org.scribble.ext.go.parser.scribble.ast.RPAntlrRoleDecl; +import org.scribble.ext.go.parser.scribble.ast.RPCoreAntlrDelegDecl; +import org.scribble.ext.go.parser.scribble.ast.RPCoreAntlrModule; +import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGCrossMessageTransfer; +import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGDotMessageTransfer; +import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGMultiChoicesTransfer; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ScribbleAntlrConstants; import org.scribble.util.ScribParserException; -public class ParamAntlrToScribParser extends AntlrToScribParser +public class RPAntlrToScribParser extends AntlrToScribParser { // FIXME: refactor constants following ScribbleAntlrConstants/AntlrToScribParserUtil? -- cannot extend existing node type enum though public static final String PARAM_ROLEDECL_NODE_TYPE = "PARAM_ROLEDECL"; @@ -27,7 +27,7 @@ public class ParamAntlrToScribParser extends AntlrToScribParser public static final String PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE = "PARAM_GLOBALMULTICHOICESTRANSFER"; public static final String PARAM_DELEGDECL_NODE_TYPE = "PARAM_DELEGDECL"; - public ParamAntlrToScribParser() + public RPAntlrToScribParser() { } @@ -37,27 +37,27 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException { AntlrToScribParser.checkForAntlrErrors(ct); - ParamAstFactory aaf = (ParamAstFactory) af; + RPAstFactory aaf = (RPAstFactory) af; String type = ct.getToken().getText(); // Duplicated from ScribParserUtil.getAntlrNodeType // FIXME: factor out with ParamAntlrPayloadElemList.parsePayloadElem switch (type) { case ScribbleAntlrConstants.MODULE_NODE_TYPE: - return ParamCoreAntlrModule.parseModule(this, ct, af); + return RPCoreAntlrModule.parseModule(this, ct, af); - case PARAM_ROLEDECL_NODE_TYPE: return ParamAntlrRoleDecl.parseParamRoleDecl(this, ct, aaf); + case PARAM_ROLEDECL_NODE_TYPE: return RPAntlrRoleDecl.parseParamRoleDecl(this, ct, aaf); case PARAM_GLOBALCROSSMESSAGETRANSFER_NODE_TYPE: - return ParamAntlrGCrossMessageTransfer.parseParamGCrossMessageTransfer(this, ct, aaf); + return RPAntlrGCrossMessageTransfer.parseParamGCrossMessageTransfer(this, ct, aaf); case PARAM_GLOBALDOTMESSAGETRANSFER_NODE_TYPE: - return ParamAntlrGDotMessageTransfer.parseParamGDotMessageTransfer(this, ct, aaf); + return RPAntlrGDotMessageTransfer.parseParamGDotMessageTransfer(this, ct, aaf); case PARAM_GLOBALCHOICE_NODE_TYPE: - return ParamAntlrGChoice.parseParamGChoice(this, ct, aaf); + return RPAntlrGChoice.parseParamGChoice(this, ct, aaf); case PARAM_GLOBALMULTICHOICES_NODE_TYPE: - return ParamAntlrGMultiChoices.parseParamGMultiChoices(this, ct, aaf); + return RPAntlrGMultiChoices.parseParamGMultiChoices(this, ct, aaf); case PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE: - return ParamAntlrGMultiChoicesTransfer.parseParamGMultiChoicesTransfer(this, ct, aaf); + return RPAntlrGMultiChoicesTransfer.parseParamGMultiChoicesTransfer(this, ct, aaf); case PARAM_DELEGDECL_NODE_TYPE: - return ParamCoreAntlrDelegDecl.parseDelegDecl(this, ct, aaf); + return RPCoreAntlrDelegDecl.parseDelegDecl(this, ct, aaf); default: return super.parse(ct, af); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPScribbleAntlrWrapper.java similarity index 91% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPScribbleAntlrWrapper.java index 3ddcc7af1..d3689a35b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ParamScribbleAntlrWrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPScribbleAntlrWrapper.java @@ -9,7 +9,7 @@ import org.scribble.parser.antlr.ParamScribbleParser; import org.scribble.parser.scribble.ScribbleAntlrWrapper; -public class ParamScribbleAntlrWrapper extends ScribbleAntlrWrapper +public class RPScribbleAntlrWrapper extends ScribbleAntlrWrapper { @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGChoice.java similarity index 73% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGChoice.java index aa4c8bd99..3b1cd9530 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGChoice.java @@ -6,27 +6,27 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.global.ParamGChoice; -import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.global.RPGChoice; +import org.scribble.ext.go.parser.scribble.ast.index.RPAntlrIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.AntlrToScribParserUtil; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; import org.scribble.util.ScribParserException; -public class ParamAntlrGChoice +public class RPAntlrGChoice { public static final int SUBJECT_CHILD_INDEX = 0; public static final int BLOCK_CHILDREN_START_INDEX = 2; public static final int INDEX_EXPR_CHILD_INDEX = 1; - public static ParamGChoice parseParamGChoice(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException + public static RPGChoice parseParamGChoice(AntlrToScribParser parser, CommonTree root, RPAstFactory af) throws ScribParserException { RoleNode subj = AntlrSimpleName.toRoleNode(getSubjectChild(root), af); List blocks = new LinkedList<>(); - ParamIndexExpr expr = ParamAntlrIndexExpr.parseParamIndexExpr(getIndexExprChild(root), af); + RPIndexExpr expr = RPAntlrIndexExpr.parseParamIndexExpr(getIndexExprChild(root), af); for (CommonTree b : getBlockChildren(root)) { blocks.add((GProtocolBlock) parser.parse(b, af)); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGMultiChoices.java similarity index 74% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGMultiChoices.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGMultiChoices.java index 475d20fb8..f2966a0f4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGMultiChoices.java @@ -7,16 +7,16 @@ import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.parser.scribble.ast.index.RPAntlrIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.AntlrToScribParserUtil; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; import org.scribble.util.ScribParserException; -public class ParamAntlrGMultiChoices +public class RPAntlrGMultiChoices { public static final int SUBJECT_CHILD_INDEX = 0; @@ -26,13 +26,13 @@ public class ParamAntlrGMultiChoices public static final int START_INDEX_EXPR_CHILD_INDEX = 2; public static final int END_INDEX_EXPR_CHILD_INDEX = 3; - public static GChoice parseParamGMultiChoices(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException + public static GChoice parseParamGMultiChoices(AntlrToScribParser parser, CommonTree root, RPAstFactory af) throws ScribParserException { RoleNode subj = AntlrSimpleName.toRoleNode(getSubjectChild(root), af); List blocks = new LinkedList<>(); - ParamIndexVar var = (ParamIndexVar) ParamAntlrIndexExpr.parseParamIndexExpr(getIndexVarChild(root), af); - ParamIndexExpr start = ParamAntlrIndexExpr.parseParamIndexExpr(getStartIndexExprChild(root), af); - ParamIndexExpr end = ParamAntlrIndexExpr.parseParamIndexExpr(getEndIndexExprChild(root), af); + RPIndexVar var = (RPIndexVar) RPAntlrIndexExpr.parseParamIndexExpr(getIndexVarChild(root), af); + RPIndexExpr start = RPAntlrIndexExpr.parseParamIndexExpr(getStartIndexExprChild(root), af); + RPIndexExpr end = RPAntlrIndexExpr.parseParamIndexExpr(getEndIndexExprChild(root), af); for (CommonTree b : getBlockChildren(root)) { blocks.add((GProtocolBlock) parser.parse(b, af)); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java similarity index 79% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java index 576012a62..8976978a6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamAntlrRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java @@ -6,26 +6,26 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.RoleDecl; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.type.index.ParamIndexFactory; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.type.index.RPIndexFactory; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; -public class ParamAntlrRoleDecl +public class RPAntlrRoleDecl { // Same as original public static final int NAME_CHILD_INDEX = 0; public static final int PARAM_CHILDREN_START_INDEX = 1; - public static RoleDecl parseParamRoleDecl(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) + public static RoleDecl parseParamRoleDecl(AntlrToScribParser parser, CommonTree root, RPAstFactory af) { RoleNode name = AntlrSimpleName.toRoleNode(getNameChild(root), af); /*List params = getParamChildren(root) .stream().map(p -> ParamAntlrSimpleName.toParamRoleParamNode(p, af)).collect(Collectors.toList());*/ - List params = getParamChildren(root) - .stream().map(p -> ParamIndexFactory.ParamIntVar(p.getText())).collect(Collectors.toList()); + List params = getParamChildren(root) + .stream().map(p -> RPIndexFactory.ParamIntVar(p.getText())).collect(Collectors.toList()); return af.ParamRoleDecl(root, name, params); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrDelegDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPCoreAntlrDelegDecl.java similarity index 76% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrDelegDecl.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPCoreAntlrDelegDecl.java index c8880712e..a48e3e03b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrDelegDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPCoreAntlrDelegDecl.java @@ -3,22 +3,22 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.core.ast.ParamCoreDelegDecl; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.core.ast.RPCoreDelegDecl; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.AntlrDataTypeDecl; import org.scribble.parser.scribble.ast.AntlrExtIdentifier; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; // Duplicated from AntlrDataTypeDecl -public class ParamCoreAntlrDelegDecl +public class RPCoreAntlrDelegDecl { public static final int SCHEMA_CHILD_INDEX = 0; public static final int EXTNAME_CHILD_INDEX = 1; public static final int SOURCE_CHILD_INDEX = 2; public static final int ALIAS_CHILD_INDEX = 3; - public static ParamCoreDelegDecl parseDelegDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) + public static RPCoreDelegDecl parseDelegDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) { CommonTree tmp1 = AntlrDataTypeDecl.getSchemaChild(ct); String schema = AntlrSimpleName.getName(tmp1); @@ -27,6 +27,6 @@ public static ParamCoreDelegDecl parseDelegDecl(AntlrToScribParser parser, Commo CommonTree tmp3 = AntlrDataTypeDecl.getSourceChild(ct); String source = AntlrExtIdentifier.getName(tmp3); DataTypeNode alias = AntlrSimpleName.toDataTypeNameNode(AntlrDataTypeDecl.getAliasChild(ct), af); // FIXME: EMTPY_ALIAS? - return ((ParamAstFactory) af).ParamCoreDelegDecl(ct, schema, extName, source, alias); + return ((RPAstFactory) af).ParamCoreDelegDecl(ct, schema, extName, source, alias); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrModule.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPCoreAntlrModule.java similarity index 99% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrModule.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPCoreAntlrModule.java index ccf303b9b..3bae965ec 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/ParamCoreAntlrModule.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPCoreAntlrModule.java @@ -19,7 +19,7 @@ import org.scribble.parser.scribble.ast.AntlrModule; import org.scribble.util.ScribParserException; -public class ParamCoreAntlrModule +public class RPCoreAntlrModule { // Duplicated from AntlrModule public static Module parseModule(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java similarity index 76% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java index 7db9c3c6a..40c0f4705 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java @@ -3,16 +3,16 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.global.ParamGCrossMessageTransfer; -import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; +import org.scribble.ext.go.parser.scribble.ast.index.RPAntlrIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.global.AntlrGMessageTransfer; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; import org.scribble.util.ScribParserException; -public class ParamAntlrGCrossMessageTransfer +public class RPAntlrGCrossMessageTransfer { // Same as original public static final int MESSAGE_CHILD_INDEX = 0; @@ -25,8 +25,8 @@ public class ParamAntlrGCrossMessageTransfer public static final int DEST_START_CHILD_INDEX = 5; public static final int DEST_END_CHILD_INDEX = 6; - public static ParamGCrossMessageTransfer - parseParamGCrossMessageTransfer(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException + public static RPGCrossMessageTransfer + parseParamGCrossMessageTransfer(AntlrToScribParser parser, CommonTree root, RPAstFactory af) throws ScribParserException { RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(root), af); MessageNode msg = AntlrGMessageTransfer.parseMessage(parser, getMessageChild(root), af); @@ -35,10 +35,10 @@ public class ParamAntlrGCrossMessageTransfer ParamRoleParamNode sourceEnd = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeEndChild(root), af); ParamRoleParamNode destStart = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeStartChild(root), af); ParamRoleParamNode destEnd = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeEndChild(root), af);*/ - ParamIndexExpr sourceStart = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeStartChild(root), af); - ParamIndexExpr sourceEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); - ParamIndexExpr destStart = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); - ParamIndexExpr destEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); + RPIndexExpr sourceStart = RPAntlrIndexExpr.parseParamIndexExpr(getSourceRangeStartChild(root), af); + RPIndexExpr sourceEnd = RPAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); + RPIndexExpr destStart = RPAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); + RPIndexExpr destEnd = RPAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); return af.ParamGCrossMessageTransfer(root, src, msg, dest, sourceStart, sourceEnd, destStart, destEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGDotMessageTransfer.java similarity index 76% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGDotMessageTransfer.java index fcd2d9361..a19769ae4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGDotMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGDotMessageTransfer.java @@ -3,17 +3,17 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.global.ParamGDotMessageTransfer; -import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexExpr; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; +import org.scribble.ext.go.parser.scribble.ast.index.RPAntlrIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.global.AntlrGMessageTransfer; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; import org.scribble.util.ScribParserException; // Duplicated from ParamAntlrGCrossMessageTransfer -public class ParamAntlrGDotMessageTransfer +public class RPAntlrGDotMessageTransfer { // Same as original public static final int MESSAGE_CHILD_INDEX = 0; @@ -26,8 +26,8 @@ public class ParamAntlrGDotMessageTransfer public static final int DEST_START_CHILD_INDEX = 5; public static final int DEST_END_CHILD_INDEX = 6; - public static ParamGDotMessageTransfer - parseParamGDotMessageTransfer(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException + public static RPGDotMessageTransfer + parseParamGDotMessageTransfer(AntlrToScribParser parser, CommonTree root, RPAstFactory af) throws ScribParserException { RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(root), af); MessageNode msg = AntlrGMessageTransfer.parseMessage(parser, getMessageChild(root), af); @@ -36,10 +36,10 @@ public class ParamAntlrGDotMessageTransfer ParamRoleParamNode sourceEnd = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeEndChild(root), af); ParamRoleParamNode destStart = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeStartChild(root), af); ParamRoleParamNode destEnd = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeEndChild(root), af);*/ - ParamIndexExpr sourceStart = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeStartChild(root), af); - ParamIndexExpr sourceEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); - ParamIndexExpr destStart = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); - ParamIndexExpr destEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); + RPIndexExpr sourceStart = RPAntlrIndexExpr.parseParamIndexExpr(getSourceRangeStartChild(root), af); + RPIndexExpr sourceEnd = RPAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); + RPIndexExpr destStart = RPAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); + RPIndexExpr destEnd = RPAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); return af.ParamGDotMessageTransfer(root, src, msg, dest, sourceStart, sourceEnd, destStart, destEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGMultiChoicesTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGMultiChoicesTransfer.java similarity index 71% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGMultiChoicesTransfer.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGMultiChoicesTransfer.java index b713a4cfe..2ed90a4e7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/ParamAntlrGMultiChoicesTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGMultiChoicesTransfer.java @@ -3,17 +3,17 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.MessageNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.ext.go.ast.ParamAstFactory; -import org.scribble.ext.go.ast.global.ParamGMultiChoicesTransfer; -import org.scribble.ext.go.parser.scribble.ast.index.ParamAntlrIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexVar; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; +import org.scribble.ext.go.parser.scribble.ast.index.RPAntlrIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.global.AntlrGMessageTransfer; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; import org.scribble.util.ScribParserException; -public class ParamAntlrGMultiChoicesTransfer +public class RPAntlrGMultiChoicesTransfer { // Same as original public static final int MESSAGE_CHILD_INDEX = 0; @@ -25,15 +25,15 @@ public class ParamAntlrGMultiChoicesTransfer public static final int DEST_START_CHILD_INDEX = 4; public static final int DEST_END_CHILD_INDEX = 5; - public static ParamGMultiChoicesTransfer - parseParamGMultiChoicesTransfer(AntlrToScribParser parser, CommonTree root, ParamAstFactory af) throws ScribParserException + public static RPGMultiChoicesTransfer + parseParamGMultiChoicesTransfer(AntlrToScribParser parser, CommonTree root, RPAstFactory af) throws ScribParserException { RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(root), af); MessageNode msg = AntlrGMessageTransfer.parseMessage(parser, getMessageChild(root), af); RoleNode dest = AntlrSimpleName.toRoleNode(getDestChild(root), af); - ParamIndexVar var = (ParamIndexVar) ParamAntlrIndexExpr.parseParamIndexExpr(getIndexVarChild(root), af); - ParamIndexExpr destStart = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); - ParamIndexExpr destEnd = ParamAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); + RPIndexVar var = (RPIndexVar) RPAntlrIndexExpr.parseParamIndexExpr(getIndexVarChild(root), af); + RPIndexExpr destStart = RPAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); + RPIndexExpr destEnd = RPAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); return af.ParamGMultiChoicesTransfer(root, src, msg, dest, var, destStart, destEnd); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java deleted file mode 100644 index c58e2383f..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/ParamAntlrIndexExpr.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.scribble.ext.go.parser.scribble.ast.index; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ext.go.type.index.ParamBinIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexExpr; -import org.scribble.ext.go.type.index.ParamIndexFactory; - -public class ParamAntlrIndexExpr -{ - public static ParamIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) - { - String type = ct.getToken().getText(); // Duplicated from ScribParserUtil.getAntlrNodeType - switch (type) - { - case "PARAM_BININDEXEXPR": // FIXME: factor out - { - ParamIndexExpr left = parseParamIndexExpr((CommonTree) ct.getChild(0), af); - if (ct.getChildCount() < 2) - { - return left; - } - ParamIndexExpr right = parseParamIndexExpr((CommonTree) ct.getChild(2), af); - ParamBinIndexExpr.Op op; - switch (ct.getChild(1).getText()) - { - case "+": op = ParamBinIndexExpr.Op.Add; break; - case "-": op = ParamBinIndexExpr.Op.Subt; break; - case "*": op = ParamBinIndexExpr.Op.Mult; break; - default: throw new RuntimeException("[param] Shouldn't get in here: " + ct); - } - return ParamIndexFactory.ParamBinIndexExpr(op, left, right); - } - default: - { - try - { - return ParamIndexFactory.ParamIntVal(Integer.parseInt(type)); - } - catch (NumberFormatException e) - { - return ParamIndexFactory.ParamIntVar(type); - } - } - } - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java new file mode 100644 index 000000000..474034c9c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java @@ -0,0 +1,47 @@ +package org.scribble.ext.go.parser.scribble.ast.index; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ext.go.type.index.RPBinIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexFactory; + +public class RPAntlrIndexExpr +{ + public static RPIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) + { + String type = ct.getToken().getText(); // Duplicated from ScribParserUtil.getAntlrNodeType + switch (type) + { + case "PARAM_BININDEXEXPR": // FIXME: factor out + { + RPIndexExpr left = parseParamIndexExpr((CommonTree) ct.getChild(0), af); + if (ct.getChildCount() < 2) + { + return left; + } + RPIndexExpr right = parseParamIndexExpr((CommonTree) ct.getChild(2), af); + RPBinIndexExpr.Op op; + switch (ct.getChild(1).getText()) + { + case "+": op = RPBinIndexExpr.Op.Add; break; + case "-": op = RPBinIndexExpr.Op.Subt; break; + case "*": op = RPBinIndexExpr.Op.Mult; break; + default: throw new RuntimeException("[param] Shouldn't get in here: " + ct); + } + return RPIndexFactory.ParamBinIndexExpr(op, left, right); + } + default: + { + try + { + return RPIndexFactory.ParamIntVal(Integer.parseInt(type)); + } + catch (NumberFormatException e) + { + return RPIndexFactory.ParamIntVar(type); + } + } + } + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java index 8fa148593..6da0ed74b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java @@ -2,15 +2,15 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ext.go.ast.name.simple.ParamRoleParamNode; -import org.scribble.ext.go.type.kind.ParamRoleParamKind; +import org.scribble.ext.go.ast.name.simple.RPRoleParamNode; +import org.scribble.ext.go.type.kind.RPRoleParamKind; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; @Deprecated public class ParamAntlrSimpleName { - public static ParamRoleParamNode toParamRoleParamNode(CommonTree ct, AstFactory af) + public static RPRoleParamNode toParamRoleParamNode(CommonTree ct, AstFactory af) { - return (ParamRoleParamNode) af.SimpleNameNode(ct, ParamRoleParamKind.KIND, AntlrSimpleName.getName(ct)); + return (RPRoleParamNode) af.SimpleNameNode(ct, RPRoleParamKind.KIND, AntlrSimpleName.getName(ct)); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexFactory.java deleted file mode 100644 index 6f0442823..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.scribble.ext.go.type.index; - -// Would correspond to a "types factory" -- cf. AST factory -public class ParamIndexFactory -{ - - public static ParamBinIndexExpr ParamBinIndexExpr(ParamBinIndexExpr.Op op, ParamIndexExpr left, ParamIndexExpr right) - { - return new ParamBinIndexExpr(op, left, right); - } - - public static ParamIndexInt ParamIntVal(int i) - { - return new ParamIndexInt(i); - } - - public static ParamIndexVar ParamIntVar(String text) - { - return new ParamIndexVar(text); - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java similarity index 81% rename from scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java rename to scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java index 35d58d31f..d6ad9f073 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamBinIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java @@ -5,7 +5,7 @@ // Binary arithmetic -public class ParamBinIndexExpr extends ParamIndexExpr +public class RPBinIndexExpr extends RPIndexExpr { public enum Op { @@ -27,10 +27,10 @@ public String toString() } public final Op op; - public final ParamIndexExpr left; - public final ParamIndexExpr right; + public final RPIndexExpr left; + public final RPIndexExpr right; - protected ParamBinIndexExpr(Op op, ParamIndexExpr left, ParamIndexExpr right) + protected RPBinIndexExpr(Op op, RPIndexExpr left, RPIndexExpr right) { this.left = left; this.right = right; @@ -60,9 +60,9 @@ public String toSmt2Formula() } @Override - public Set getVars() + public Set getVars() { - Set vars = new HashSet<>(this.left.getVars()); + Set vars = new HashSet<>(this.left.getVars()); vars.addAll(this.right.getVars()); return vars; } @@ -80,11 +80,11 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamBinIndexExpr)) + if (!(o instanceof RPBinIndexExpr)) { return false; } - ParamBinIndexExpr f = (ParamBinIndexExpr) o; + RPBinIndexExpr f = (RPBinIndexExpr) o; return super.equals(this) // Does canEqual && this.op.equals(f.op) && this.left.equals(f.left) && this.right.equals(f.right); // Storing left/right as a Set could give commutativity in equals, but not associativity @@ -94,7 +94,7 @@ public boolean equals(Object o) @Override protected boolean canEqual(Object o) { - return o instanceof ParamBinIndexExpr; + return o instanceof RPBinIndexExpr; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java similarity index 77% rename from scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java rename to scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java index 122d0e31f..4c1b58dc5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java @@ -2,7 +2,7 @@ import java.util.Set; -public abstract class ParamIndexExpr +public abstract class RPIndexExpr { public boolean isConstant() { @@ -11,7 +11,7 @@ public boolean isConstant() public abstract String toGoString(); - public abstract Set getVars(); + public abstract Set getVars(); public abstract String toSmt2Formula(); // Cf. toString -- but can be useful to separate, for debugging (and printing) @@ -23,11 +23,11 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamIndexExpr)) + if (!(o instanceof RPIndexExpr)) { return false; } - return ((ParamIndexExpr) o).canEqual(this); + return ((RPIndexExpr) o).canEqual(this); } protected abstract boolean canEqual(Object o); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java new file mode 100644 index 000000000..b16c09b60 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java @@ -0,0 +1,21 @@ +package org.scribble.ext.go.type.index; + +// Would correspond to a "types factory" -- cf. AST factory +public class RPIndexFactory +{ + + public static RPBinIndexExpr ParamBinIndexExpr(RPBinIndexExpr.Op op, RPIndexExpr left, RPIndexExpr right) + { + return new RPBinIndexExpr(op, left, right); + } + + public static RPIndexInt ParamIntVal(int i) + { + return new RPIndexInt(i); + } + + public static RPIndexVar ParamIntVar(String text) + { + return new RPIndexVar(text); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java similarity index 78% rename from scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java rename to scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java index fc5c7c81b..6d64e5e25 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexInt.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java @@ -4,11 +4,11 @@ import java.util.Set; // Integer literal -public class ParamIndexInt extends ParamIndexExpr +public class RPIndexInt extends RPIndexExpr { public final int val; - protected ParamIndexInt(int i) + protected RPIndexInt(int i) { this.val = i; } @@ -32,7 +32,7 @@ public String toSmt2Formula() } @Override - public Set getVars() + public Set getVars() { return Collections.emptySet(); } @@ -50,18 +50,18 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamIndexInt)) + if (!(o instanceof RPIndexInt)) { return false; } return super.equals(this) // Does canEqual - && this.val == ((ParamIndexInt) o).val; + && this.val == ((RPIndexInt) o).val; } @Override protected boolean canEqual(Object o) { - return o instanceof ParamIndexInt; + return o instanceof RPIndexInt; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java similarity index 70% rename from scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java rename to scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java index 5e835ea13..4b2fae42c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/ParamIndexVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java @@ -3,21 +3,21 @@ import java.util.HashSet; import java.util.Set; -import org.scribble.ext.go.type.name.ParamRoleParam; +import org.scribble.ext.go.type.name.RPRoleParam; // Variable occurrence -public class ParamIndexVar extends ParamIndexExpr +public class RPIndexVar extends RPIndexExpr { public final String name; - protected ParamIndexVar(String name) + protected RPIndexVar(String name) { this.name = name; } - public ParamRoleParam toRoleParam() + public RPRoleParam toRoleParam() { - return new ParamRoleParam(this.name); + return new RPRoleParam(this.name); } @Override @@ -38,9 +38,9 @@ public String toSmt2Formula() } @Override - public Set getVars() + public Set getVars() { - Set vars = new HashSet<>(); + Set vars = new HashSet<>(); vars.add(this); // FIXME: currently may also be a role return vars; } @@ -58,18 +58,18 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamIndexVar)) + if (!(o instanceof RPIndexVar)) { return false; } return super.equals(this) // Does canEqual - && this.name.equals(((ParamIndexVar) o).name); + && this.name.equals(((RPIndexVar) o).name); } @Override protected boolean canEqual(Object o) { - return o instanceof ParamIndexVar; + return o instanceof RPIndexVar; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/kind/ParamRoleParamKind.java b/scribble-go/src/main/java/org/scribble/ext/go/type/kind/RPRoleParamKind.java similarity index 56% rename from scribble-go/src/main/java/org/scribble/ext/go/type/kind/ParamRoleParamKind.java rename to scribble-go/src/main/java/org/scribble/ext/go/type/kind/RPRoleParamKind.java index fa6760079..ce06c67cf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/kind/ParamRoleParamKind.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/kind/RPRoleParamKind.java @@ -4,13 +4,13 @@ import org.scribble.type.kind.AbstractKind; -public class ParamRoleParamKind extends AbstractKind implements Serializable +public class RPRoleParamKind extends AbstractKind implements Serializable { private static final long serialVersionUID = 1L; - public static final ParamRoleParamKind KIND = new ParamRoleParamKind(); + public static final RPRoleParamKind KIND = new RPRoleParamKind(); - protected ParamRoleParamKind() + protected RPRoleParamKind() { } @@ -28,16 +28,16 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamRoleParamKind)) + if (!(o instanceof RPRoleParamKind)) { return false; } - return ((ParamRoleParamKind) o).canEqual(this); + return ((RPRoleParamKind) o).canEqual(this); } @Override public boolean canEqual(Object o) { - return o instanceof ParamRoleParamKind; + return o instanceof RPRoleParamKind; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java b/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPRoleParam.java similarity index 68% rename from scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java rename to scribble-go/src/main/java/org/scribble/ext/go/type/name/RPRoleParam.java index 4ecc5c004..86ec8750a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/name/ParamRoleParam.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPRoleParam.java @@ -1,21 +1,21 @@ package org.scribble.ext.go.type.name; -import org.scribble.ext.go.type.kind.ParamRoleParamKind; +import org.scribble.ext.go.type.kind.RPRoleParamKind; import org.scribble.type.name.AbstractName; // Currently used for both "actual params" and int literals -- cf. ParamRoleParamRoleNode, and isConstant -public class ParamRoleParam extends AbstractName +public class RPRoleParam extends AbstractName { private static final long serialVersionUID = 1L; - protected ParamRoleParam() + protected RPRoleParam() { - super(ParamRoleParamKind.KIND); + super(RPRoleParamKind.KIND); } - public ParamRoleParam(String text) + public RPRoleParam(String text) { - super(ParamRoleParamKind.KIND, text); + super(RPRoleParamKind.KIND, text); } public boolean isConstant() @@ -38,7 +38,7 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ParamRoleParam)) + if (!(o instanceof RPRoleParam)) { return false; } @@ -47,7 +47,7 @@ public boolean equals(Object o) public boolean canEqual(Object o) { - return o instanceof ParamRoleParam; + return o instanceof RPRoleParam; } @Override From f20fe11f90d4d0b3babaedcec6f28063c977e26d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 15:00:59 +0100 Subject: [PATCH 213/433] Continued revising param-core API gen. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 10 +- .../core/ast/global/RPCoreGMultiChoices.java | 4 +- .../go/core/ast/local/RPCoreLDotChoice.java | 2 +- .../ext/go/core/cli/RPCoreCommandLine.java | 2 +- .../ParamCoreSTBranchStateBuilder.java | 2 +- .../ParamCoreSTEndpointApiGenerator.java | 4 +- .../ParamCoreSTReceiveActionBuilder.java | 2 +- .../ParamCoreSTSendActionBuilder.java | 2 +- .../ParamCoreSTSessionApiBuilder.java | 2 +- .../ParamCoreSTStateChanApiBuilder.java | 4 +- .../ParamCoreSTBranchActionBuilder.java | 2 +- .../ParamCoreSTBranchStateBuilder.java | 2 +- .../ParamCoreSTEndpointApiGenerator.java | 6 +- .../ParamCoreSTReceiveActionBuilder.java | 2 +- .../ParamCoreSTReduceActionBuilder.java | 2 +- .../ParamCoreSTSendActionBuilder.java | 2 +- .../ParamCoreSTSplitActionBuilder.java | 2 +- .../ParamCoreSTStateChanApiBuilder.java | 4 +- .../statetype3/RPCoreSTApiGenerator.java | 83 +++--- .../statetype3/RPCoreSTEndStateBuilder.java | 4 +- .../RPCoreSTReceiveActionBuilder.java | 2 +- .../RPCoreSTReduceActionBuilder.java | 2 +- .../RPCoreSTSelectActionBuilder.java | 2 +- .../RPCoreSTSelectStateBuilder.java | 6 +- .../statetype3/RPCoreSTSendActionBuilder.java | 2 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 266 +++++++++--------- .../RPCoreSTSplitActionBuilder.java | 2 +- .../RPCoreSTStateChanApiBuilder.java | 36 +-- .../endpoint/action/RPCoreEDotReceive.java | 4 +- .../model/endpoint/action/RPCoreEDotSend.java | 4 +- .../ext/go/core/type/RPIndexedRole.java | 18 +- .../ext/go/core/type/RPRoleVariant.java | 12 +- 32 files changed, 250 insertions(+), 249 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 4eb0a9021..8a1438da0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -208,20 +208,20 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) { //if (this.src.getName().equals(r)) - if (srcName.equals(subjName) && subj.ranges.contains(srcRange)) // FIXME: factor out? + if (srcName.equals(subjName) && subj.intervals.contains(srcRange)) // FIXME: factor out? { return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); } - else if (destName.equals(subjName) && subj.ranges.contains(destRange)) + else if (destName.equals(subjName) && subj.intervals.contains(destRange)) { return af.ParamCoreLCrossChoice(this.src, RPCoreLActionKind.CROSS_RECEIVE, projs); } } else if (this.kind == RPCoreGActionKind.DOT_TRANSFER) { - if (srcName.equals(subjName) && subj.ranges.contains(srcRange)) // FIXME: factor out? + if (srcName.equals(subjName) && subj.intervals.contains(srcRange)) // FIXME: factor out? { - if (destName.equals(subjName) && subj.ranges.contains(destRange)) // Possible for dot-transfer (src.start != dest.start) -- cf. cross-transfer + if (destName.equals(subjName) && subj.intervals.contains(destRange)) // Possible for dot-transfer (src.start != dest.start) -- cf. cross-transfer { RPIndexExpr offset = RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Add, RPIndexFactory.ParamIntVar("_id"), @@ -252,7 +252,7 @@ else if (this.kind == RPCoreGActionKind.DOT_TRANSFER) return af.ParamCoreLDotChoice(this.dest, offset, RPCoreLActionKind.DOT_SEND, projs); } } - else if (destName.equals(subjName) && subj.ranges.contains(destRange)) + else if (destName.equals(subjName) && subj.intervals.contains(destRange)) { RPIndexExpr offset = RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Add, RPIndexFactory.ParamIntVar("_id"), diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java index da362825c..25972fae1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java @@ -182,11 +182,11 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor } // "Simple" cases -- same projection as ParamCoreGChoice, i.e., same local types? -- index var redundant, apart from "syntactic consistency" for subsequent message actions? (i.e., only for Scribble syntax?) - if (this.src.getName().equals(subj.getName()) && subj.ranges.contains(this.src.getParsedRange())) // FIXME: factor out? + if (this.src.getName().equals(subj.getName()) && subj.intervals.contains(this.src.getParsedRange())) // FIXME: factor out? { return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); } - else if (this.dest.getName().equals(subj.getName()) && subj.ranges.contains(this.dest.getParsedRange())) + else if (this.dest.getName().equals(subj.getName()) && subj.intervals.contains(this.dest.getParsedRange())) { return af.ParamCoreLMultiChoices(this.src, this.var, projs.keySet().stream().collect(Collectors.toList()), values.iterator().next()); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java index c3cb754c1..2a93a437c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java @@ -24,7 +24,7 @@ public RPCoreLDotChoice(RPIndexedRole role, RPIndexExpr offset, RPCoreLActionKin @Override public String toString() { - RPInterval g = this.role.ranges.iterator().next(); + RPInterval g = this.role.intervals.iterator().next(); return this.role.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + this.kind + casesToString(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 0697e8e24..56dd9ea0b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -331,7 +331,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws i.remove(); Set range = new HashSet<>(); //range.add(next.range); - range.add(next.ranges.iterator().next()); + range.add(next.intervals.iterator().next()); if (!tmp.contains(next)) { tmp.addAll(tmp.stream().map(t -> diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java index 084aa4d0c..8a0791ebf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTBranchStateBuilder.java @@ -86,7 +86,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "s." + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"; RPIndexedRole peer = (RPIndexedRole) s.getActions().iterator().next().peer; - RPInterval g = peer.ranges.iterator().next(); + RPInterval g = peer.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java index cb5131b59..d4474a694 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTEndpointApiGenerator.java @@ -84,11 +84,11 @@ public static String getGeneratedActualRoleName(RPRoleVariant actual) { /*return actual.getName() + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ - if (actual.ranges.size() > 1) + if (actual.intervals.size() > 1) { throw new RuntimeException("[param-core] TODO: " + actual); } - RPInterval g = actual.ranges.iterator().next(); + RPInterval g = actual.intervals.iterator().next(); return actual.getName() + "_" + g.start + "To" + g.end; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java index 20576e8ae..2193257a6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTReceiveActionBuilder.java @@ -55,7 +55,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java index 53a1f8721..3e08a3686 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSendActionBuilder.java @@ -55,7 +55,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java index 0686b54dd..5766249bf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTSessionApiBuilder.java @@ -141,7 +141,7 @@ public Map build() // FIXME: factor out throw new RuntimeException("[param-core] TODO: " + tmp); } RPRoleVariant peer = tmp.keySet().iterator().next(); - RPInterval g = peer.ranges.iterator().next(); + RPInterval g = peer.intervals.iterator().next(); Function foo = ee -> { if (ee instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index 108cad27f..bc9d85d13 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -60,11 +60,11 @@ protected RPRoleVariant getSelf() public static String getGeneratedParamRoleName(RPIndexedRole r) { //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); - if (r.ranges.size() > 1) + if (r.intervals.size() > 1) { throw new RuntimeException("[param-core] TODO: " + r); } - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); return r.getName() + "_" + g.start + "To" + g.end; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java index f7e3fc4fe..2cc34065d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchActionBuilder.java @@ -124,7 +124,7 @@ else if (e instanceof ParamIndexVar) + "}\n"; RPIndexedRole peer = (RPIndexedRole) curr.getActions().iterator().next().peer; - RPInterval g = peer.ranges.iterator().next(); + RPInterval g = peer.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java index c7173a42a..5637d5d30 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTBranchStateBuilder.java @@ -92,7 +92,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "var op string\n"; RPIndexedRole peer = (RPIndexedRole) s.getActions().iterator().next().peer; - RPInterval g = peer.ranges.iterator().next(); + RPInterval g = peer.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java index 6a73f4931..baf413fdb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTEndpointApiGenerator.java @@ -91,9 +91,9 @@ public static String getGeneratedActualRoleName(RPRoleVariant actual) ParamRange g = actual.ranges.iterator().next(); return actual.getName() + "_" + g.start + "To" + g.end;*/ return actual.getName() + "_" - + actual.ranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")) - + (actual.coranges.isEmpty() ? "" : "_not_") - + actual.coranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")); + + actual.intervals.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")) + + (actual.cointervals.isEmpty() ? "" : "_not_") + + actual.cointervals.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")); } //@Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java index 46221d307..c474cf154 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReceiveActionBuilder.java @@ -59,7 +59,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java index 2c47da6e5..51227b15d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTReduceActionBuilder.java @@ -76,7 +76,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java index 271fe79c2..c81f7ae09 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSendActionBuilder.java @@ -68,7 +68,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java index c7903cf76..9068e8c41 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTSplitActionBuilder.java @@ -85,7 +85,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index fc00b25c2..7c736a41d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -71,11 +71,11 @@ protected RPRoleVariant getSelf() public static String getGeneratedParamRoleName(RPIndexedRole r) { //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); - if (r.ranges.size() > 1) + if (r.intervals.size() > 1) { throw new RuntimeException("[param-core] TODO: " + r); } - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); return r.getName() + "_" + g.start + "To" + g.end; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 3abf1dd95..99a3bbb6a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -17,19 +17,23 @@ public class RPCoreSTApiGenerator { public final Job job; - public final GProtocolName proto; - public final Map> actuals; + public final GProtocolName proto; // Full name + public final Map> variants; public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module public final Role self; // FIXME: just a role name -- cf. CL arg // FIXME: any way to separate Session API (Protocol) from Endpoint/StateChan APIs? - public RPCoreSTApiGenerator(Job job, GProtocolName fullname, Map> actuals, String packpath, Role self) + public RPCoreSTApiGenerator(Job job, GProtocolName fullname, Map> variants, String packpath, Role self) { this.job = job; this.proto = fullname; - this.actuals = Collections.unmodifiableMap(actuals); + this.variants = Collections.unmodifiableMap( + variants.entrySet().stream().collect(Collectors.toMap( + e -> e.getKey(), + e -> Collections.unmodifiableMap(e.getValue()) + ))); this.packpath = packpath; this.self = self; } @@ -39,9 +43,9 @@ public Map build() throws ScribbleException { Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); - for (Entry actual : this.actuals.get(this.self).entrySet()) + for (Entry variant : this.variants.get(this.self).entrySet()) { - res.putAll(buildStateChannelApi(actual.getKey(), actual.getValue())); + res.putAll(buildStateChannelApi(variant.getKey(), variant.getValue())); } return res; } @@ -49,27 +53,59 @@ public Map build() throws ScribbleException //@Override public Map buildSessionApi() // FIXME: factor out { - this.job.debugPrintln("\n[param-core] Running " + RPCoreSTSessionApiBuilder.class + " for " + this.proto + "@" + this.self); + this.job.debugPrintln("\n[rp-core] Running " + RPCoreSTSessionApiBuilder.class + " for " + this.proto + "@" + this.self); return new RPCoreSTSessionApiBuilder(this).build(); } public Map buildStateChannelApi(RPRoleVariant actual, EGraph graph) // FIXME: factor out { - this.job.debugPrintln("\n[param-core] Running " + RPCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + this.self); + this.job.debugPrintln("\n[rp-core] Running " + RPCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + this.self); return new RPCoreSTStateChanApiBuilder(this, actual, graph).build(); } //@Override - public String getRootPackage() // Derives only from proto name + public String getApiRootPackageName() // Derives only from proto name { return this.proto.getSimpleName().toString(); } - public String generateRootPackageDecl() + /*public String makeApiRootPackageDecl() { - return "package " + getRootPackage(); + return "package " + getApiRootPackageName(); + }*/ + + public static String getEndpointKindPackageName(RPRoleVariant r) + { + return getGeneratedRoleVariantName(r); + } + + // Role variant = Endpoint kind -- e.g., S_1To1, W_1Ton + public static String getEndpointKindTypeName(GProtocolName simpname, RPRoleVariant r) + { + //return simpname + "_" + getGeneratedActualRoleName(r); + return getGeneratedRoleVariantName(r); + } + + public static String getGeneratedRoleVariantName(RPRoleVariant variant) + { + /*return actual.getName() + + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ + /*if (actual.ranges.size() > 1 || actual.coranges.size() > 0) + { + throw new RuntimeException("[param-core] TODO: " + actual); + } + ParamRange g = actual.ranges.iterator().next(); + return actual.getName() + "_" + g.start + "To" + g.end;*/ + return variant.getName() + "_" + + variant.intervals.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")) + + (variant.cointervals.isEmpty() + ? "" + : "_not_" + variant.cointervals.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and"))); } + + + /*//@Override public List getScribbleRuntimeImports() // FIXME: factor up { @@ -87,29 +123,4 @@ public String generateScribbleRuntimeImports() { return getScribbleRuntimeImports().stream().map(x -> "import \"" + x + "\"\n").collect(Collectors.joining()); }*/ - - - // Endpoint kind -- use actual-role name, e.g., S_1To1, W_1Ton - public static String getGeneratedEndpointTypeName(GProtocolName simpname, RPRoleVariant r) - { - //return simpname + "_" + getGeneratedActualRoleName(r); - return getGeneratedActualRoleName(r); - } - - // Endpoint, e.g., S_1To1, W_1Ton - public static String getGeneratedActualRoleName(RPRoleVariant actual) - { - /*return actual.getName() - + actual.ranges.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_");*/ - /*if (actual.ranges.size() > 1 || actual.coranges.size() > 0) - { - throw new RuntimeException("[param-core] TODO: " + actual); - } - ParamRange g = actual.ranges.iterator().next(); - return actual.getName() + "_" + g.start + "To" + g.end;*/ - return actual.getName() + "_" - + actual.ranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")) - + (actual.coranges.isEmpty() ? "" : "_not_") - + actual.coranges.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")); - } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java index d5b9ea725..554323fb6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java @@ -25,13 +25,13 @@ public String getPreamble(STStateChanApiBuilder api, EState s) String tname = api.getStateChanName(s); String res = //schangen.apigen.generateRootPackageDecl() + "\n" - "package " + RPCoreSTApiGenerator.getGeneratedActualRoleName(((RPCoreSTStateChanApiBuilder) api).actual) + "\n" + "package " + RPCoreSTApiGenerator.getGeneratedRoleVariantName(((RPCoreSTStateChanApiBuilder) api).actual) + "\n" + "\n" //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "\n" + "type " + tname + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + " *" + RPCoreSTApiGenerator.getGeneratedEndpointTypeName(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out + + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out //+ " session.ParamEndpoint" + "\n" // FIXME: factor out + "}"; return res; // No LinearResource diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 04886fa87..cc2bedda1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -58,7 +58,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java index b7b3b5c99..799009129 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java @@ -76,7 +76,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index 323118e58..9e37b3f40 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -80,7 +80,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "}\n"; RPIndexedRole peer = (RPIndexedRole) curr.getActions().iterator().next().peer; - RPInterval g = peer.ranges.iterator().next(); + RPInterval g = peer.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index efff990c5..22240cfca 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -47,10 +47,10 @@ public String getPreamble(STStateChanApiBuilder api, EState s) GProtocolName simpname = apigen.apigen.proto.getSimpleName(); String tname = apigen.getStateChanName(s); //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - String epType = RPCoreSTApiGenerator.getGeneratedEndpointTypeName(simpname, apigen.actual); + String epType = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, apigen.actual); String res = //apigen.apigen.generateRootPackageDecl() + "\n" - "package " + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + "\n" + "package " + RPCoreSTApiGenerator.getGeneratedRoleVariantName(actual) + "\n" + "\n" //+ apigen.apigen.generateScribbleRuntimeImports() + "\n" + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" @@ -100,7 +100,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "var op string\n"; RPIndexedRole peer = (RPIndexedRole) s.getActions().iterator().next().peer; - RPInterval g = peer.ranges.iterator().next(); + RPInterval g = peer.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index c9e88acf0..c5a111843 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -66,7 +66,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 87019481f..f31705a31 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -16,181 +16,171 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; +// RP Session API = Protocol API + Endpoint Kind APIs // Cf. STStateChanApiBuilder public class RPCoreSTSessionApiBuilder { private RPCoreSTApiGenerator apigen; - //private final Map> actuals; - - public RPCoreSTSessionApiBuilder(RPCoreSTApiGenerator apigen)//, Map> actuals) + public RPCoreSTSessionApiBuilder(RPCoreSTApiGenerator apigen) { this.apigen = apigen; - //this.actuals = Collections.unmodifiableMap(actuals); } //@Override public Map build() // FIXME: factor out { Module mod = this.apigen.job.getContext().getModule(this.apigen.proto.getPrefix()); + ProtocolDecl gpd = mod.getProtocolDecl(this.apigen.proto.getSimpleName()); + String basedir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; // Full name + Map res = new HashMap<>(); + buildProtocolApi(gpd, basedir, res); + buildEndpointKindApi(gpd, basedir, res); + return res; + } + + private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map res) + { GProtocolName simpname = this.apigen.proto.getSimpleName(); - ProtocolDecl gpd = mod.getProtocolDecl(simpname); - List roles = gpd.header.roledecls.getRoles(); - - /*Set instates = new HashSet<>(); - Predicate f = s -> s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT; - if (f.test(this.apigen.graph.init)) - { - instates.add(this.apigen.graph.init); - } - instates.addAll(MState.getReachableStates(this.apigen.graph.init).stream().filter(f).collect(Collectors.toSet()));*/ - - String epPack = - //this.apigen.generateRootPackageDecl() + "\n" - "\n" - //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PACKAGE + "\"\n" - //+ this.apigen.generateScribbleRuntimeImports() - + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" - + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; - //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "/tcp\"\n"; + List rolenames = gpd.header.roledecls.getRoles(); // roles - String sessPack = - this.apigen.generateRootPackageDecl() + "\n" + String protoFile = + "package " + this.apigen.getApiRootPackageName() + "\n" + "\n" - //+ this.apigen.generateScribbleRuntimeImports() + "\n" - //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n" - - + (roles.stream().map(rfoo -> + + // Import Endpoint Kind APIs -- FIXME: CL args + + (rolenames.stream().map(rname -> { - Set actuals = this.apigen.actuals.get(rfoo).keySet(); + Set variants = this.apigen.variants.get(rname).keySet(); return - actuals.stream().map(actual -> + variants.stream().map(v -> { - return "import _" + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + " \"" + this.apigen.packpath + "/" + this.apigen.getRootPackage() - + "/" + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + "\"\n"; + String epkindPackName = RPCoreSTApiGenerator.getEndpointKindPackageName(v); + return "import _" + epkindPackName // FIXME: alias now redundant + + " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() + "/" + epkindPackName + "\"\n"; }).collect(Collectors.joining("")); }).collect(Collectors.joining("")) ); - sessPack += "\n" + protoFile += "\n" + // Protocol type + "type " + simpname + " struct {\n" - //+ roles.stream().map(r -> r + " " + ParamCoreSTApiGenConstants.GO_ROLE_TYPE + "\n").collect(Collectors.joining("")) - // Just need role name constants for now -- params not fixed until endpoint creation + "}\n" + + // session.Protocol interface + "\n" - + "func New() *" + simpname + " {\n" - //+ "return &" + simpname + "{ " + roles.stream().map(r -> ParamCoreSTApiGenConstants.GO_ROLE_CONSTRUCTOR + "(\"" + r + "\")").collect(Collectors.joining(", ")) + " }\n" - // Singleton types? - + "return &" + simpname + "{ }\n" - + "}\n" - + "\n" + "func (*" + simpname +") IsProtocol() {\n" + + "}\n" + + // Protocol type constructor + "\n" + + "func New() *" + simpname + " {\n" + + "return &" + simpname + "{ }\n" + "}\n"; - - String dir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; - Map res = new HashMap<>(); - - // Protocol and role specific endpoints - //Function epTypeName = r -> "_Endpoint" + simpname + "_" + r; - sessPack += - roles.stream().map(rfoo -> + protoFile += "\n" + + rolenames.stream().map(rname -> { - Set actuals = this.apigen.actuals.get(rfoo).keySet(); + Set variants = this.apigen.variants.get(rname).keySet(); return - actuals.stream().map(actual -> - { - String epTypeName = RPCoreSTApiGenerator.getGeneratedEndpointTypeName(simpname, actual); - List decls = - gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(actual.getName())) - .map(rd -> (RPRoleDecl) rd).collect(Collectors.toList()); - if (decls.size() > 1) + variants.stream().map(variant -> { - throw new RuntimeException("Shouldn't get in here: " + actual); - } - List vars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); - - - String epPack1 = - - "\ntype " + epTypeName + " struct {\n" // FIXME: factor out - + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " session.Protocol\n" - + "Self int\n" - + "*session.LinearResource\n" - + "Ept *" + RPCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" - + "Params map[string]int\n" - + "}\n" - + "\n" - - /*+ "\n\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, actual) + ") Ept() *session.Endpoint {\n" - + "return p.ept\n" - + "}\n" - + "\n" - + "\nfunc (p *" + ParamCoreSTEndpointApiGenerator.getGeneratedEndpointTypeName(simpname, actual) + ") Params() map[string]int {\n" - + "return p.params\n" - + "}\n"*/ + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); + List decls = + gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(variant.getName())) + .map(rd -> (RPRoleDecl) rd).collect(Collectors.toList()); + if (decls.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + variant); + } + List ivars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); + // FIXME: get index vars from protocol body -- index var decls in sig now deprecated + + // Endpoint Kind constructor -- makes index var value maps + return "func (p *" + simpname + ") New" + "_" + epkindTypeName + + "(" + ivars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" + + "(*_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) + "." + epkindTypeName + ") {\n" + + "params := make(map[string]int)\n" + + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) + + "return _" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + ".New" + "(p, params, self)\n" + + "}\n"; + }).collect(Collectors.joining("")); + }).collect(Collectors.joining("\n")); + res.put(basedir + simpname + ".go", protoFile); + } - + "func New(p session.Protocol, params map[string]int, self int) *" + epTypeName + "{\n" - + "conns := make(map[string]map[int]transport.Channel)\n" - + this.apigen.actuals.entrySet().stream() - .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " - + "make(map[int]transport.Channel)\n") - .collect(Collectors.joining("")) - + "return &" + epTypeName + "{p, self, &session.LinearResource{}, session.NewEndpoint(self, conns), params}\n" - + "}\n" - + "\n" - - - + "func (ini *" + epTypeName + ") Accept(rolename string, id int, acceptor transport.Transport) error {\n" - + "ini.Ept.Conn[rolename][id] = acceptor.Accept()\n" - + "return nil\n" // FIXME: runtime currently does log.Fatal on error - + "}\n" - + "\n" - + "func (ini *" + epTypeName + ") Dial(rolename string, id int, requestor transport.Transport) error {\n" - + "ini.Ept.Conn[rolename][id] = requestor.Connect()\n" - + "return nil\n" // FIXME: runtime currently does log.Fatal on error - + "}\n" - + "\n"; - - String sessPack1 = - "func (p *" + simpname + ") New" + "_" + epTypeName - + "(" + - vars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + - "self int" + - ")" - + "(*_" + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + "." + epTypeName + ") {\n" + private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map res) + { + GProtocolName simpname = this.apigen.proto.getSimpleName(); + List roles = gpd.header.roledecls.getRoles(); - - + "params := make(map[string]int)\n" - + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) - //+ "return &" + epTypeName + "{p, &session.LinearResource{}, session.NewEndpoint(self, " + "conns), params}\n" // FIXME: numRoles - + "return _" + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + ".New" + "(p, params, self)\n" // FIXME: numRoles - + "}\n"; - - epPack1 += - "\nfunc (ini *" + epTypeName + ") Run(f func(*"//_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + ".Init)" - + "Init)" - + "End" + ") " - + "End {\n" - + "ini.Use()\n" - + "ini.Ept.CheckConnection()\n" - + - ((this.apigen.actuals.get(rfoo).get(actual).init.getStateKind() == EStateKind.POLY_INPUT) - //? "return ini.New" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1()\n" - ? "return f(ini.NewInit())\n" - : "return f(&Init{ new(session.LinearResource), ini })\n") - + "}"; - - res.put(dir + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + "/" + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + ".go", - "package " + RPCoreSTApiGenerator.getGeneratedActualRoleName(actual) + "\n" + epPack + "\n" + epPack1); - return sessPack1; - }).collect(Collectors.joining("")); - }).collect(Collectors.joining("\n")); + String epkindFile = "\n" // Package decl done later (per variant) + + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; - res.put(dir + simpname + ".go", sessPack); - return res; + // Endpoint Kind API per role variant + for (Role rname : roles) + { + Set variants = this.apigen.variants.get(rname).keySet(); + for (RPRoleVariant variant : variants) + { + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); + List decls = + gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(variant.getName())) + .map(rd -> (RPRoleDecl) rd).collect(Collectors.toList()); + if (decls.size() > 1) + { + throw new RuntimeException("Shouldn't get in here: " + variant); + } + // FIXME: get index vars from protocol body -- index var decls in sig now deprecated + + epkindFile += "\n" + + // Endpoint Kind type + + "type " + epkindTypeName + " struct {\n" + + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " session.Protocol\n" + + "Self int\n" + + "*session.LinearResource\n" + + "Ept *" + RPCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + "Params map[string]int\n" + + "}\n" + + // Endpoint Kind type constructor -- makes connection maps + + "\n" + + "func New(p session.Protocol, params map[string]int, self int) *" + epkindTypeName + "{\n" + + "conns := make(map[string]map[int]transport.Channel)\n" + + this.apigen.variants.entrySet().stream() + .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + "make(map[int]transport.Channel)\n") + .collect(Collectors.joining("")) + + "return &" + epkindTypeName + "{p, self, &session.LinearResource{}, session.NewEndpoint(self, conns), params}\n" + + "}\n" + + // Dial/Accept methdos -- FIXME: internalise peers + + "\n" + + "func (ini *" + epkindTypeName + ") Accept(rolename string, id int, acceptor transport.Transport) error {\n" + + "ini.Ept.Conn[rolename][id] = acceptor.Accept()\n" + + "return nil\n" // FIXME: runtime currently does log.Fatal on error + + "}\n" + + "\n" + + "func (ini *" + epkindTypeName + ") Dial(rolename string, id int, requestor transport.Transport) error {\n" + + "ini.Ept.Conn[rolename][id] = requestor.Connect()\n" + + "return nil\n" // FIXME: runtime currently does log.Fatal on error + + "}\n"; + + epkindFile += "\n" + + "func (ini *" + epkindTypeName + ") Run(f func(*Init) End) *End {\n" // f specifies non-pointer End + + "ini.Use()\n" // FIXME: int-counter linearity + + "ini.Ept.CheckConnection()\n" + + ((this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) // FIXME: type-switch? + ? "return f(ini.NewInit())\n" + : "return f(&Init{ new(session.LinearResource), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + + "}"; + + res.put(basedir + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "/" + RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant) + ".go", + "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "\n" + epkindFile); + } + } } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java index ffc5a3d25..ef60f06b0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java @@ -85,7 +85,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ERR;*/ RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); Function foo = e -> { if (e instanceof RPIndexInt) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index c8226211b..34eda0309 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -73,14 +73,14 @@ else if (as.stream().allMatch(a -> a instanceof RPCoreEMultiChoicesReceive)) } else { - throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + s); } } - // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) rp-core class later // actual.getName().equals(this.role) public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant actual, EGraph graph) { @@ -91,7 +91,7 @@ public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant ac null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), new RPCoreSTEndStateBuilder()); - //throw new RuntimeException("[param-core] TODO:"); + //throw new RuntimeException("[rp-core] TODO:"); this.apigen = apigen; this.actual = actual; @@ -128,18 +128,18 @@ public Map build() // filepath -> source } case DOT_SEND: { - throw new RuntimeException("[param-core] TODO: " + s); + throw new RuntimeException("[rp-core] TODO: " + s); } case DOT_RECEIVE: { - throw new RuntimeException("[param-core] TODO: " + s); + throw new RuntimeException("[rp-core] TODO: " + s); } case MULTICHOICES_RECEIVE: { - throw new RuntimeException("[param-core] TODO: " + s); + throw new RuntimeException("[rp-core] TODO: " + s); } case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket - default: throw new RuntimeException("[param-core] Shouldn't get in here: " + s); + default: throw new RuntimeException("[rp-core] Shouldn't get in here: " + s); } } return api; @@ -148,13 +148,13 @@ public Map build() // filepath -> source @Override public String getFilePath(String filename) { - //throw new RuntimeException("[param-core] TODO:"); + //throw new RuntimeException("[rp-core] TODO:"); if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go { filename = "$" + filename.substring(1); } return this.gpn.toString().replaceAll("\\.", "/") - + "/" + RPCoreSTApiGenerator.getGeneratedActualRoleName(this.actual) + + "/" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(this.actual) + "/" + filename + ".go"; } @@ -165,11 +165,11 @@ protected String getStateChanPremable(EState s) GProtocolName simpname = this.apigen.proto.getSimpleName(); String tname = this.getStateChanName(s); ////String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - String epType = RPCoreSTApiGenerator.getGeneratedEndpointTypeName(simpname, this.actual); + String epType = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, this.actual); String res = //this.apigen.generateRootPackageDecl() + "\n" - "package " + RPCoreSTApiGenerator.getGeneratedActualRoleName(this.actual) + "\n" + "package " + RPCoreSTApiGenerator.getGeneratedRoleVariantName(this.actual) + "\n" + "\n" + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" //+ this.apigen.generateScribbleRuntimeImports() + "\n" @@ -228,7 +228,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b } else { - //throw new RuntimeException("[param-core] TODO: "); + //throw new RuntimeException("[rp-core] TODO: "); return "func (" + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" @@ -244,7 +244,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b @Override public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) // FIXME: refactor action builders as interfaces and use generic parameter for kind { - //throw new RuntimeException("[param-core] TODO: "); + //throw new RuntimeException("[rp-core] TODO: "); String sEp = //"s.ep" RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; @@ -287,7 +287,7 @@ public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, Str @Override public String getChannelName(STStateChanApiBuilder api, EAction a) // Not used? { - //throw new RuntimeException("[param-core] TODO: "); + //throw new RuntimeException("[rp-core] TODO: "); return //"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; @@ -310,7 +310,7 @@ protected RPRoleVariant getSelf() /*@Override public String getPackage() { - //throw new RuntimeException("[param-core] TODO:"); + //throw new RuntimeException("[rp-core] TODO:"); return this.gpn.getSimpleName().toString(); }*/ @@ -335,11 +335,11 @@ public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) public static String getGeneratedParamRoleName(RPIndexedRole r) { //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); - if (r.ranges.size() > 1) + if (r.intervals.size() > 1) { - throw new RuntimeException("[param-core] TODO: " + r); + throw new RuntimeException("[rp-core] TODO: " + r); } - RPInterval g = r.ranges.iterator().next(); + RPInterval g = r.intervals.iterator().next(); return r.getName() + "_" + g.start + "To" + g.end; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotReceive.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotReceive.java index d345df043..472bc4855 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotReceive.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotReceive.java @@ -43,7 +43,7 @@ public SReceive toGlobal(SModelFactory sf, Role self) public String toString() { RPIndexedRole peer = getPeer(); - RPInterval g = peer.ranges.iterator().next(); + RPInterval g = peer.intervals.iterator().next(); return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + getCommSymbol() + this.mid + this.payload; } @@ -53,7 +53,7 @@ public String toStringWithMessageIdHack() { String m = this.mid.isMessageSigName() ? "^" + this.mid : this.mid.toString(); // HACK RPIndexedRole peer = getPeer(); - RPInterval g = peer.ranges.iterator().next(); + RPInterval g = peer.intervals.iterator().next(); return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + getCommSymbol() + m + this.payload; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotSend.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotSend.java index d1584713c..92efdf23a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotSend.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/action/RPCoreEDotSend.java @@ -44,7 +44,7 @@ public SSend toGlobal(SModelFactory sf, Role self) public String toString() { RPIndexedRole peer = getPeer(); - RPInterval g = peer.ranges.iterator().next(); + RPInterval g = peer.intervals.iterator().next(); return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + getCommSymbol() + this.mid + this.payload; } @@ -54,7 +54,7 @@ public String toStringWithMessageIdHack() { String m = this.mid.isMessageSigName() ? "^" + this.mid : this.mid.toString(); // HACK RPIndexedRole peer = getPeer(); - RPInterval g = peer.ranges.iterator().next(); + RPInterval g = peer.intervals.iterator().next(); return peer.getName() + "[" + this.offset + ":" + g.start + ".." + g.end + "]" + getCommSymbol() + m + this.payload; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java index 442b1f8bb..e2cad585c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java @@ -15,21 +15,21 @@ public class RPIndexedRole extends Role private static final long serialVersionUID = 1L; //public final ParamRange range; - public final Set ranges; // size >= 1 -- size == 1 for parsed syntax + public final Set intervals; // size >= 1 -- size == 1 for parsed syntax public RPIndexedRole(String name, Set ranges) { super(name); - this.ranges = Collections.unmodifiableSet(ranges); + this.intervals = Collections.unmodifiableSet(ranges); } public RPInterval getParsedRange() { - if (this.ranges.size() > 1) + if (this.intervals.size() > 1) { - throw new RuntimeException("[param-core] Shouldn't get in here: " + this.ranges); + throw new RuntimeException("[param-core] Shouldn't get in here: " + this.intervals); } - return this.ranges.iterator().next(); + return this.intervals.iterator().next(); } // FIXME @@ -41,8 +41,8 @@ public Role getName() @Override public String toString() { - String rs = this.ranges.stream().map(Object::toString).collect(Collectors.joining(", ")); - if (this.ranges.size() > 1) + String rs = this.intervals.stream().map(Object::toString).collect(Collectors.joining(", ")); + if (this.intervals.size() > 1) { rs = "{" + rs + "}"; } @@ -54,7 +54,7 @@ public int hashCode() { int hash = 7121; hash = 31 * hash + super.hashCode(); - hash = 31 * hash + this.ranges.hashCode(); + hash = 31 * hash + this.intervals.hashCode(); return hash; } @@ -71,7 +71,7 @@ public boolean equals(Object obj) } RPIndexedRole them = (RPIndexedRole) obj; return super.equals(them) // Does canEqual - && this.ranges.equals(them.ranges); + && this.intervals.equals(them.intervals); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java index 9f8fd0eb4..c41e8c645 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java @@ -11,20 +11,20 @@ public class RPRoleVariant extends RPIndexedRole */ private static final long serialVersionUID = 1L; - public final Set coranges; + public final Set cointervals; public RPRoleVariant(String name, Set ranges, Set coranges) { super(name, ranges); - this.coranges = Collections.unmodifiableSet(coranges); + this.cointervals = Collections.unmodifiableSet(coranges); } @Override public String toString() { // Duplicated from super to make braces mandatory - String rs1 = "{" + this.ranges.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; - String rs2 = "{" + this.coranges.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; + String rs1 = "{" + this.intervals.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; + String rs2 = "{" + this.cointervals.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; return super.getLastElement() + rs1 + rs2; } @@ -33,7 +33,7 @@ public int hashCode() { int hash = 7193; hash = 31 * hash + super.hashCode(); - hash = 31 * hash + this.coranges.hashCode(); + hash = 31 * hash + this.cointervals.hashCode(); return hash; } @@ -50,7 +50,7 @@ public boolean equals(Object obj) } RPRoleVariant them = (RPRoleVariant) obj; return super.equals(them) // Does canEqual - && this.coranges.equals(them.coranges); + && this.cointervals.equals(them.cointervals); } @Override From 8a7724161cd06fc1e69aa134851be57fd426eed6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 15:55:08 +0100 Subject: [PATCH 214/433] Continued revising param-core API gen. --- .../statetype3/RPCoreSTApiGenConstants.java | 4 +- .../statetype3/RPCoreSTEndStateBuilder.java | 13 +- .../RPCoreSTReceiveActionBuilder.java | 2 +- .../RPCoreSTReduceActionBuilder.java | 2 +- .../RPCoreSTSelectActionBuilder.java | 2 +- .../RPCoreSTSelectStateBuilder.java | 4 +- .../statetype3/RPCoreSTSendActionBuilder.java | 2 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 23 +- .../RPCoreSTSplitActionBuilder.java | 2 +- .../RPCoreSTStateChanApiBuilder.java | 303 ++++++++---------- 10 files changed, 161 insertions(+), 196 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index 6418ef835..281cba09e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -20,7 +20,7 @@ public class RPCoreSTApiGenConstants public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; public static final String GO_ENDPOINT_FINALISE = "Finalise"; //public static final String GO_ENDPOINT_ENDPOINT = "Endpoint"; - public static final String GO_ENDPOINT_ENDPOINT = "ept"; + public static final String GO_ENDPOINT_ENDPOINT = "Ept"; public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; @@ -32,7 +32,7 @@ public class RPCoreSTApiGenConstants public static final String GO_LINEARRESOURCE_TYPE = "session.LinearResource"; // net.LinearResource public static final String GO_LINEARRESOURCE_USE = "Use"; // net.LinearResource - public static final String GO_SCHAN_ENDPOINT = "Ept"; // ep; + public static final String GO_SCHAN_ENDPOINT = "EpKind"; // ep; public static final String GO_SCHAN_LINEARRESOURCE = "Res"; // state public static final String GO_SCHAN_END_TYPE = "End"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java index 554323fb6..60a1fdb91 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java @@ -21,18 +21,15 @@ public String build(STStateChanApiBuilder api, EState s) public String getPreamble(STStateChanApiBuilder api, EState s) { RPCoreSTStateChanApiBuilder schangen = (RPCoreSTStateChanApiBuilder) api; - //return GSTStateChanAPIBuilder.getStateChanPremable(api, s); - String tname = api.getStateChanName(s); + String scTypeName = api.getStateChanName(s); String res = - //schangen.apigen.generateRootPackageDecl() + "\n" - "package " + RPCoreSTApiGenerator.getGeneratedRoleVariantName(((RPCoreSTStateChanApiBuilder) api).actual) + "\n" + "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(((RPCoreSTStateChanApiBuilder) api).variant) + "\n" + "\n" //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "\n" - + "type " + tname + " struct {\n" - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(api.gpn.getSimpleName(), schangen.actual) + "\n" // FIXME: factor out - //+ " session.ParamEndpoint" + "\n" // FIXME: factor out + + "type " + scTypeName + " struct {\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + + RPCoreSTApiGenerator.getEndpointKindTypeName(api.gpn.getSimpleName(), schangen.variant) + "\n" // FIXME: factor out + "}"; return res; // No LinearResource } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index cc2bedda1..f1bc7446d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -24,7 +24,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) { return //ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" "Gather_" // FIXME: make unary Receive special case - + RPCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + + RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java index 799009129..a52bcca0b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java @@ -25,7 +25,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) { //return ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" return RPCoreSTApiGenConstants.GO_CROSS_REDUCE_FUN_PREFIX + "_" - + RPCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + + RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index 9e37b3f40..a955ca255 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -37,7 +37,7 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME public String getActionName(STStateChanApiBuilder api, EAction a) { return RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" - + RPCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + + RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index 22240cfca..062273851 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -28,7 +28,7 @@ public RPCoreSTSelectStateBuilder(RPCoreSTSelectActionBuilder bb) @Override public String getPreamble(STStateChanApiBuilder api, EState s) { - RPRoleVariant actual = ((RPCoreSTStateChanApiBuilder) api).actual; + RPRoleVariant actual = ((RPCoreSTStateChanApiBuilder) api).variant; String sEpRecv = RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER @@ -47,7 +47,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) GProtocolName simpname = apigen.apigen.proto.getSimpleName(); String tname = apigen.getStateChanName(s); //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - String epType = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, apigen.actual); + String epType = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, apigen.variant); String res = //apigen.apigen.generateRootPackageDecl() + "\n" "package " + RPCoreSTApiGenerator.getGeneratedRoleVariantName(actual) + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index c5a111843..7be128bc0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -25,7 +25,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) { return //ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" "Scatter_" // FIXME: make unary Send special case - + RPCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + + RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index f31705a31..4edbf8cc8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -33,7 +33,7 @@ public Map build() // FIXME: factor out Module mod = this.apigen.job.getContext().getModule(this.apigen.proto.getPrefix()); ProtocolDecl gpd = mod.getProtocolDecl(this.apigen.proto.getSimpleName()); String basedir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; // Full name - Map res = new HashMap<>(); + Map res = new HashMap<>(); // filepath -> source buildProtocolApi(gpd, basedir, res); buildEndpointKindApi(gpd, basedir, res); return res; @@ -116,7 +116,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< GProtocolName simpname = this.apigen.proto.getSimpleName(); List roles = gpd.header.roledecls.getRoles(); - String epkindFile = "\n" // Package decl done later (per variant) + String epkindImports = "\n" // Package decl done later (per variant) + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; @@ -136,14 +136,14 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< } // FIXME: get index vars from protocol body -- index var decls in sig now deprecated - epkindFile += "\n" + String epkindFile = epkindImports + "\n" // Endpoint Kind type + "type " + epkindTypeName + " struct {\n" + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " session.Protocol\n" + "Self int\n" + "*session.LinearResource\n" - + "Ept *" + RPCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + " *" + RPCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + "Params map[string]int\n" + "}\n" @@ -159,23 +159,24 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< // Dial/Accept methdos -- FIXME: internalise peers + "\n" - + "func (ini *" + epkindTypeName + ") Accept(rolename string, id int, acceptor transport.Transport) error {\n" - + "ini.Ept.Conn[rolename][id] = acceptor.Accept()\n" + + "func (ini *" + epkindTypeName + ") Accept(rolename string, id int, acc transport.Transport) error {\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Conn[rolename][id] = acc.Accept()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n" - + "func (ini *" + epkindTypeName + ") Dial(rolename string, id int, requestor transport.Transport) error {\n" - + "ini.Ept.Conn[rolename][id] = requestor.Connect()\n" + + "func (ini *" + epkindTypeName + ") Dial(rolename string, id int, req transport.Transport) error {\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Conn[rolename][id] = req.Connect()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n"; epkindFile += "\n" + "func (ini *" + epkindTypeName + ") Run(f func(*Init) End) *End {\n" // f specifies non-pointer End + "ini.Use()\n" // FIXME: int-counter linearity - + "ini.Ept.CheckConnection()\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".CheckConnection()\n" + ((this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) // FIXME: type-switch? - ? "return f(ini.NewInit())\n" - : "return f(&Init{ new(session.LinearResource), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + ? "end := f(ini.NewInit())\n" + : "end := f(&Init{ new(session.LinearResource), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + + "return &end\n" + "}"; res.put(basedir + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "/" + RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant) + ".go", diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java index ef60f06b0..01ffd94b9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java @@ -24,7 +24,7 @@ public class RPCoreSTSplitActionBuilder extends STSendActionBuilder public String getActionName(STStateChanApiBuilder api, EAction a) { return RPCoreSTApiGenConstants.GO_CROSS_SPLIT_FUN_PREFIX + "_" - + RPCoreSTStateChanApiBuilder.getGeneratedParamRoleName(((RPCoreEAction) a).getPeer()) + + RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 34eda0309..75058cde2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -13,12 +13,9 @@ import org.scribble.ext.go.core.ast.RPCoreDelegDecl; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; -import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotReceive; -import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotSend; -import org.scribble.ext.go.core.model.endpoint.action.RPCoreEMultiChoicesReceive; -import org.scribble.ext.go.core.type.RPRoleVariant; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; @@ -32,57 +29,16 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder { protected final RPCoreSTApiGenerator apigen; - public final RPRoleVariant actual; // this.apigen.self.equals(this.actual.getName()) - //public final EGraph graph; + public final RPRoleVariant variant; - public final RPCoreSTReceiveActionBuilder vb; + //public final RPCoreSTReceiveActionBuilder vb; private int counter = 1; + private final Set dtds; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams - private final Set datats; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams - - // FIXME: make ParamCoreEState - enum ParamCoreEStateKind { CROSS_SEND, CROSS_RECEIVE, DOT_SEND, DOT_RECEIVE, MULTICHOICES_RECEIVE, TERMINAL } - - protected static ParamCoreEStateKind getStateKind(EState s) - { - List as = s.getActions(); - if (as.isEmpty()) - { - return ParamCoreEStateKind.TERMINAL; - } - else if (as.stream().allMatch(a -> a instanceof RPCoreECrossSend)) - { - return ParamCoreEStateKind.CROSS_SEND; - } - else if (as.stream().allMatch(a -> a instanceof RPCoreECrossReceive)) - { - return ParamCoreEStateKind.CROSS_RECEIVE; - } - else if (as.stream().allMatch(a -> a instanceof RPCoreEDotSend)) - { - return ParamCoreEStateKind.DOT_SEND; - } - else if (as.stream().allMatch(a -> a instanceof RPCoreEDotReceive)) - { - return ParamCoreEStateKind.DOT_RECEIVE; - } - else if (as.stream().allMatch(a -> a instanceof RPCoreEMultiChoicesReceive)) - { - return ParamCoreEStateKind.MULTICHOICES_RECEIVE; - } - else - { - throw new RuntimeException("[rp-core] Shouldn't get in here: " + s); - } - } - - - - // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) rp-core class later - // actual.getName().equals(this.role) - public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant actual, EGraph graph) + // Pre: variant.getName().equals(this.role) + public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph) { super(apigen.job, apigen.proto, apigen.self, graph, new RPCoreSTOutputStateBuilder(new RPCoreSTSplitActionBuilder(), new RPCoreSTSendActionBuilder()), @@ -91,42 +47,40 @@ public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant ac null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), new RPCoreSTEndStateBuilder()); - //throw new RuntimeException("[rp-core] TODO:"); this.apigen = apigen; - this.actual = actual; + this.variant = variant; - this.vb = ((RPCoreSTReceiveStateBuilder) this.rb).vb; + //this.vb = ((RPCoreSTReceiveStateBuilder) this.rb).vb; - this.datats = this.apigen.job.getContext().getMainModule().getNonProtocolDecls().stream() + this.dtds = this.apigen.job.getContext().getMainModule().getNonProtocolDecls().stream() .filter(d -> (d instanceof DataTypeDecl)).map(d -> ((DataTypeDecl) d)).collect(Collectors.toSet()); } @Override public Map build() // filepath -> source { - Map api = new HashMap<>(); + Map res = new HashMap<>(); Set states = new LinkedHashSet<>(); states.add(this.graph.init); states.addAll(MState.getReachableStates(this.graph.init)); for (EState s : states) { - switch (getStateKind(s)) + switch (RPCoreSTStateChanApiBuilder.getStateKind(s)) { - case CROSS_SEND: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; + case CROSS_SEND: res.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; case CROSS_RECEIVE: { if (s.getActions().size() > 1) { - api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); - //api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out + res.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); } else { - api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); + res.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); } break; } - case DOT_SEND: + /*case DOT_SEND: // FIXME: CFSMs should have only !^1, ! and ? { throw new RuntimeException("[rp-core] TODO: " + s); } @@ -137,89 +91,70 @@ public Map build() // filepath -> source case MULTICHOICES_RECEIVE: { throw new RuntimeException("[rp-core] TODO: " + s); - } - case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket - default: throw new RuntimeException("[rp-core] Shouldn't get in here: " + s); + }*/ + case TERMINAL: res.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; + default: throw new RuntimeException("[rp-core] Shouldn't get in here: " + s); } } - return api; + return res; } @Override public String getFilePath(String filename) { - //throw new RuntimeException("[rp-core] TODO:"); if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go { filename = "$" + filename.substring(1); } return this.gpn.toString().replaceAll("\\.", "/") - + "/" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(this.actual) + + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) // State chans located with Endpoint Kind API + "/" + filename + ".go"; } protected String getStateChanPremable(EState s) { - //Role r = this.actual.getName(); - GProtocolName simpname = this.apigen.proto.getSimpleName(); - String tname = this.getStateChanName(s); - ////String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - String epType = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, this.actual); + String scTypeName = this.getStateChanName(s); + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, this.variant); String res = - //this.apigen.generateRootPackageDecl() + "\n" - "package " + RPCoreSTApiGenerator.getGeneratedRoleVariantName(this.actual) + "\n" + "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) + "\n" + "\n" + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" - //+ this.apigen.generateScribbleRuntimeImports() + "\n" - + "import \"log\"\n" - /*+ (s.isTerminal() || ((GoJob) apigen.job).noCopy ? "" : - Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) - .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) - + "\n"*/ - + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) // FIXME: refactor into state builders - //? "import \"github.com/rhu1/scribble-go-runtime/test/util\"\n" : "") - ? "import \"sort\"\n" : "") + // FIXME: error handling via Err field -- fallback should be panic + + "import \"log\"\n" + // FIXME: refactor into state-specific builders + ((s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) ? s.getActions().stream().flatMap(a -> a.payload.elems.stream()).collect(Collectors.toSet()).stream() - .map(p -> makeImportExtName((DataType) p)) - .collect(Collectors.joining("")) + .map(p -> makeExtNameImport((DataType) p)).collect(Collectors.joining("")) : "") + // FIXME: refactor into state-specific builders + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) - ? "\nvar _ = sort.Sort\n" : "") + ? "import \"sort\"\n\nvar _ = sort.Sort\n" + : "") + // State channel type + "\n" - + "type " + tname + " struct {\n" + + "type " + scTypeName + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" - //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " session.ParamEndpoint" + "\n" // FIXME: factor out + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + "}\n"; - - /*if (s.id == this.graph.init.id) - { - res += "\n" - + "func New" - + "(ep session.ParamEndpoint) *" + tname + " {\n" // FIXME: factor out - + "return &" + tname + " { " + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" - + ", " + ParamCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + ParamCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")}\n" - + "}"; - }*/ return res; } + // Here because action builder hierarchy not suitable (extended by action kind, not by target language) @Override - public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here because action builder hierarchy not suitable (extended by action kind, not by target language) + public String buildAction(STActionBuilder ab, EState curr, EAction a) { EState succ = curr.getSuccessor(a); if (getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1) { return - "func (" + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "func (" + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(this, a) + ") <-chan *" + ab.getReturnType(this, curr, succ) + " {\n" @@ -228,9 +163,8 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b } else { - //throw new RuntimeException("[rp-core] TODO: "); return - "func (" + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "func (" + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(this, a) + ") *" + ab.getReturnType(this, curr, succ) + " {\n" @@ -241,35 +175,24 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here b } } + // FIXME: refactor action builders as interfaces and use generic parameter for kind @Override - public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) // FIXME: refactor action builders as interfaces and use generic parameter for kind + public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) { - //throw new RuntimeException("[rp-core] TODO: "); - String sEp = - //"s.ep" - RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + String sEp = RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; String res = ""; - - /*if (succ.isTerminal()) // FIXME - { - res += sEp + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_FINISHPROTOCOL + "()\n"; - }*/ - res += "return " + getSuccStateChan(ab, curr, succ, sEp); return res; } - public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) + protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) { if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { - return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + - "New" - //+ getStateChanName(succ) - + ((succ.id != this.graph.init.id) ? getStateChanName(succ) - //: ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case - : "Init") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case - + "()"; + return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + + "NewInit()"; // For branch states (hacky?) + /*+ ((succ.id != this.graph.init.id) ? getStateChanName(succ) : "Init") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + + "()";*/ } else { @@ -287,42 +210,20 @@ public String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, Str @Override public String getChannelName(STStateChanApiBuilder api, EAction a) // Not used? { - //throw new RuntimeException("[rp-core] TODO: "); - return - //"s.ep.Chans[s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + "]"; - "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; - } - - protected RPRoleVariant getSelf() - { - return (RPRoleVariant) this.getSelf(); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + a); + //return "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; } - - /*public String getActualRoleName() - { - return this.apigen.self.toString(); - }*/ - - - - - - /*@Override - public String getPackage() - { - //throw new RuntimeException("[rp-core] TODO:"); - return this.gpn.getSimpleName().toString(); - }*/ @Override protected String makeSTStateName(EState s) { return (s.isTerminal()) - ? makeEndStateName(this.apigen.proto.getSimpleName(), this.actual) + ? makeEndStateName(this.apigen.proto.getSimpleName(), this.variant) : (s.id == this.graph.init.id) - ? "Init" // FIXME: factor out - : //this.apigen.proto.getSimpleName() + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_" + this.counter++; - "State" + this.counter++; + ? "Init" // FIXME: factor out (makeInitStateName) + : //this.apigen.proto.getSimpleName() + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_" + "State" + + this.counter++; } public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) @@ -331,8 +232,8 @@ public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) RPCoreSTApiGenConstants.GO_SCHAN_END_TYPE; } - // Not actual roles; param roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName - public static String getGeneratedParamRoleName(RPIndexedRole r) + // Not actual variants -- rather, indexed roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedRoleVariantName + public static String getGeneratedIndexedRoleName(RPIndexedRole r) { //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); if (r.intervals.size() > 1) @@ -346,22 +247,12 @@ public static String getGeneratedParamRoleName(RPIndexedRole r) - public boolean isDelegType(DataType t) + protected boolean isDelegType(DataType t) { - return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof RPCoreDelegDecl; // FIXME: make a map - } - - protected String getExtName(DataType t) - { - return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; // FIXME: make a map - } - - protected String getExtSource(DataType t) - { - return this.datats.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extSource; // FIXME: make a map + return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof RPCoreDelegDecl; // FIXME: make a map } - private String makeImportExtName(DataType t) + protected String makeExtNameImport(DataType t) { String extName = getExtName(t); switch (extName) @@ -385,8 +276,16 @@ private String makeImportExtName(DataType t) } } + private String getExtName(DataType t) + { + return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; // FIXME: make a map + } - + private String getExtSource(DataType t) + { + return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extSource; // FIXME: make a map + } + protected String batesHack(PayloadElemType t) { /*String tmp = t.toString(); @@ -414,5 +313,73 @@ protected String batesHack(PayloadElemType t) } } } + + + + + + + // FIXME: make a ParamCoreEState + protected enum ParamCoreEStateKind { CROSS_SEND, CROSS_RECEIVE, DOT_SEND, DOT_RECEIVE, MULTICHOICES_RECEIVE, TERMINAL } + + protected static ParamCoreEStateKind getStateKind(EState s) + { + List as = s.getActions(); + if (as.isEmpty()) + { + return ParamCoreEStateKind.TERMINAL; + } + else if (as.stream().allMatch(a -> a instanceof RPCoreECrossSend)) + { + return ParamCoreEStateKind.CROSS_SEND; + } + else if (as.stream().allMatch(a -> a instanceof RPCoreECrossReceive)) + { + return ParamCoreEStateKind.CROSS_RECEIVE; + } + /*else if (as.stream().allMatch(a -> a instanceof RPCoreEDotSend)) // FIXME: CFSMs should have only !^1, ! and ? + { + return ParamCoreEStateKind.DOT_SEND; + } + else if (as.stream().allMatch(a -> a instanceof RPCoreEDotReceive)) + { + return ParamCoreEStateKind.DOT_RECEIVE; + } + else if (as.stream().allMatch(a -> a instanceof RPCoreEMultiChoicesReceive)) + { + return ParamCoreEStateKind.MULTICHOICES_RECEIVE; + }*/ + else + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + s); + } + } + + + + + + + + + + + + /*@Override + public String getPackage() + { + //throw new RuntimeException("[rp-core] TODO:"); + return this.gpn.getSimpleName().toString(); + }*/ + + /*public String getActualRoleName() + { + return this.apigen.self.toString(); + }*/ + + /*protected RPRoleVariant getSelf() + { + return (RPRoleVariant) this.getSelf(); + }*/ } From 4e62c494d80640bd59aab47d0bdc9be4c935436d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 16:55:47 +0100 Subject: [PATCH 215/433] Continued revising param-core API gen. --- .../codegen/statetype/STActionBuilder.java | 2 +- .../statetype3/RPCoreSTApiGenConstants.java | 13 +- .../RPCoreSTReceiveActionBuilder.java | 185 ++++++------------ .../RPCoreSTReduceActionBuilder.java | 10 +- .../RPCoreSTSelectActionBuilder.java | 8 +- .../RPCoreSTSelectStateBuilder.java | 10 +- .../statetype3/RPCoreSTSendActionBuilder.java | 122 ++++-------- .../statetype3/RPCoreSTSessionApiBuilder.java | 10 +- .../RPCoreSTSplitActionBuilder.java | 10 +- .../RPCoreSTStateChanApiBuilder.java | 33 +++- 10 files changed, 158 insertions(+), 245 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index 823638e04..5eb4cb359 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -19,7 +19,7 @@ public abstract class STActionBuilder { public abstract String getActionName(STStateChanApiBuilder api, EAction a); - public abstract String buildArgs(STStateChanApiBuilder apigen, EAction a); + public abstract String buildArgs(STStateChanApiBuilder api, EAction a); public abstract String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ); public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index 281cba09e..0cf5e14de 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -21,6 +21,9 @@ public class RPCoreSTApiGenConstants public static final String GO_ENDPOINT_FINALISE = "Finalise"; //public static final String GO_ENDPOINT_ENDPOINT = "Endpoint"; public static final String GO_ENDPOINT_ENDPOINT = "Ept"; + public static final String GO_ENDPOINT_PARAMS = "Params"; + + public static final String GO_CONNECTION_MAP = "Conn"; public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; @@ -32,18 +35,20 @@ public class RPCoreSTApiGenConstants public static final String GO_LINEARRESOURCE_TYPE = "session.LinearResource"; // net.LinearResource public static final String GO_LINEARRESOURCE_USE = "Use"; // net.LinearResource - public static final String GO_SCHAN_ENDPOINT = "EpKind"; // ep; + public static final String GO_SCHAN_ENDPOINT = "Ept"; // ep; public static final String GO_SCHAN_LINEARRESOURCE = "Res"; // state public static final String GO_SCHAN_END_TYPE = "End"; - public static final String GO_IO_FUN_RECEIVER = "s"; + public static final String GO_IO_METHOD_RECEIVER = "s"; public static final String GO_CROSS_SPLIT_FUN_PREFIX = "Split"; public static final String GO_CROSS_SEND_FUN_PREFIX = "Send"; - public static final String GO_CROSS_SEND_FUN_ARG = "arg"; + public static final String GO_CROSS_SEND_METHOD_ARG = "arg"; public static final String GO_CROSS_REDUCE_FUN_PREFIX = "Reduce"; public static final String GO_CROSS_RECEIVE_FUN_PREFIX = "Recv"; - public static final String GO_CROSS_RECEIVE_FUN_ARG = "arg"; + public static final String GO_CROSS_RECEIVE_METHOD_ARG = "arg"; + public static final String RP_SCATTER_METHOD_PREFIX = "Scatter"; + public static final String RP_GATHER_METHOD_PREFIX = "Gather"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index f1bc7446d..b865ea63a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -1,18 +1,14 @@ package org.scribble.ext.go.core.codegen.statetype3; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexInt; -import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; @@ -22,157 +18,88 @@ public class RPCoreSTReceiveActionBuilder extends STReceiveActionBuilder @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return //ParamCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" - "Gather_" // FIXME: make unary Receive special case + return RPCoreSTApiGenConstants.RP_GATHER_METHOD_PREFIX + "_" // FIXME: make unary Receive special case + RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @Override - public String buildArgs(STStateChanApiBuilder apigen, EAction a) + public String buildArgs(STStateChanApiBuilder api, EAction a) { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG - + i + " []" + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) - ).collect(Collectors.joining(", ")); + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG + + i + " []" + ((RPCoreSTStateChanApiBuilder) api).batesHack(a.payload.elems.get(i))) //a.payload.elems.get(i) + .collect(Collectors.joining(", ")); } @Override - public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, EState succ) + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { if(a.payload.elems.size() > 1) { throw new RuntimeException("[param-core] TODO: " + a); } - String sEpRecv = - RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER - + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Ept" - + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + RPIndexedRole r = (RPIndexedRole) a.peer; + RPInterval d = r.intervals.iterator().next(); - /*String sEpProto = - //"s.ep.Proto" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ + String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + "[\"" + r.getName() + "\"]"; - RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.intervals.iterator().next(); - Function foo = e -> + String res = ""; + if (a.payload.elems.size() > 1) { - if (e instanceof RPIndexInt) - { - return e.toString(); - } - else if (e instanceof RPIndexVar) - { - return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; - } - else - { - throw new RuntimeException("[param-core] TODO: " + e); - } - }; - /*sEpRecv - + "(" + sEpProto - + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " - + "\"" + a.mid + "\")\n" - + IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> sEpRecv + "(" + sEpProto + ".(*" + api.gpn.getSimpleName() +")." + r.getName() + ", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ", " - + "arg" + i + ")") - .collect(Collectors.joining("\n")) + "\n" - + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" - + "\tvar decoded "+a.payload.elems.get(0)+"\n" - + "\tif err := gob.NewDecoder(bytes.NewReader(b[i-"+foo.apply(g.start)+"])).Decode(&decoded); err != nil {\n\t\t" - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Errors <- session.DeserialiseFailed(err, \"" + getActionName(api, a) +"\", " - + ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Self.Name())\n" - + "\t}\n" - + "\tdata[i-"+foo.apply(g.start)+"] = decoded\n" - + "}\n" - + "*arg0 = reduceFn(data)" - /*+ "if " + sEpErr + " != nil {\n" - + "return nil\n" - + "}\n"*/ + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } + + String extName = rpapi.batesHack(a.payload.elems.get(0)); - /*String res = - sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") - + "(" + sEpProto + "." + r.getName() + ", " + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n"; // Discard op*/ - String res = ""; + if (((GoJob) rpapi.job).noCopy) + { + /*res += "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" + + "for i := 0; i < len(b); i++ {\n" + + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" + + "}\n" + + "*arg0 = reduceFn0(data)\n";*/ + throw new RuntimeException("[rp-core] TODO: -nocopy" + a); // FIXME: currently missing from sender side? + } + else + { + res += "for i := " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + ";" + + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.end) + "; i++ {\n"; + + if (!a.mid.toString().equals("")) // HACK FIXME? + { + res += "var lab string\n" + + "if err := " + sEpRecv + "[i]" + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" + "&lab" + ")" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n"; + } if (!a.payload.elems.isEmpty()) { - if (a.payload.elems.size() > 1) - { - throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); - } - - String extName = ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); - - res += - (((GoJob) apigen.job).noCopy - ? - "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" - + "for i := 0; i < len(b); i++ {\n" - + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" + res += "var tmp " + extName + "\n" + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + + "if err := " + sEpRecv + "[i]" + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(&tmp)" + + "; err != nil {\n" + + "log.Fatal(err)\n" + "}\n" - + "*arg0 = reduceFn0(data)\n" - : - /*"data := make(map[int]" - + extName//a.payload.elems.get(0) - + ", " + foo.apply(g.end) + ")\n"*/ - "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args - - + (a.mid.toString().equals("") ? "" : // HACK - "var lab string\n" - + "if err := " + sEpRecv - + "[\"" + r.getName() + "\"][i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL - + "(" //+ sEpProto + "." + r.getName() + ", " - + "&lab" + "); err != nil {\n" - + "log.Fatal(err)\n" - + "}\n") - - + "var tmp " + extName + "\n" - + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? - - + "if err := " + sEpRecv - + "[\"" + r.getName() + "\"][i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL - + "(" - + "&tmp" - + "); err != nil {\n" - + "log.Fatal(err)\n" - + "}\n" - + "arg0[i-1] = tmp\n" - + "}\n" - - - /*+ "f := func(m map[int] " + extName + ") []" + extName + " {\n" - + "xs := make([]" + extName + ", len(m))\n" - + "keys := make([]int, 0)\n" - + "for k, _ := range m {\n" - + "keys = append(keys, k)\n" - + "}\n" - + "sort.Ints(keys)\n" - + "for i, k := range keys {\n" - + "xs[i] = m[k]\n" - + "}\n" - + "return xs\n" - + "}\n" - + "*arg0 = f(data)\n"*/ - ); - // : "") + + "arg0[i-1] = tmp\n" + + "}\n"; } + } - return res - + buildReturn(apigen, curr, succ); + return res + buildReturn(rpapi, curr, succ); } - protected static String hackGetValues(String t) + /*protected static String hackGetValues(String t) { if (t.equals("int")) { @@ -191,5 +118,5 @@ else if (t.equals("[]byte")) throw new RuntimeException("[TODO] " + t); //return t; } - } + }*/ } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java index a52bcca0b..03cf68579 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java @@ -34,12 +34,12 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) { DataType[] pet = new DataType[1]; return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG + i + " *" + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0] = (DataType) a.payload.elems.get(i)) //a.payload.elems.get(i) // HACK + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "" : - ", reduceFn" + i + " func(" + RPCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + ", reduceFn" + i + " func(" + RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i //+ " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) + " []" @@ -62,13 +62,13 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES } String sEpRecv = - RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; String sEpProto = //"s.ep.Proto" - RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO; /*String sEpErr = //"s.ep.Err" @@ -85,7 +85,7 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES } else if (e instanceof RPIndexVar) { - return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index a955ca255..b6d829b83 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -45,7 +45,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_ARG + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG + i + " *" + a.payload.elems.get(i) //+ ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" // No: singleton choice subj (not multichoices) ).collect(Collectors.joining(", ")); @@ -89,7 +89,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } else if (e instanceof RPIndexVar) { - return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else @@ -98,7 +98,7 @@ else if (e instanceof RPIndexVar) } }; String sEpRecv = - RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + ".Ept"; @@ -109,7 +109,7 @@ else if (e instanceof RPIndexVar) + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ RPCoreSTStateChanApiBuilder apigen = (RPCoreSTStateChanApiBuilder) api; - String sEp = RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; if (!a.payload.elems.isEmpty()) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index 062273851..3d2cdc95f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -31,7 +31,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) RPRoleVariant actual = ((RPCoreSTStateChanApiBuilder) api).variant; String sEpRecv = - RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + ".Ept"; @@ -72,10 +72,10 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "}\n"; res += "\n" - + "func (ep *" + epType + ") New" - + ((s.id != api.graph.init.id) ? tname + + "func (ep *" + epType + ") NewBranchInit" + /*+ ((s.id != api.graph.init.id) ? tname //: ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case - : "Init") + : "Init")*/ + "() *" + tname + " {\n" // FIXME: factor out + "s := &" + tname + " { " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " @@ -109,7 +109,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) } else if (e instanceof RPIndexVar) { - return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 7be128bc0..1b90ddca7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -1,18 +1,14 @@ package org.scribble.ext.go.core.codegen.statetype3; import java.util.List; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; -import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexInt; -import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; @@ -23,8 +19,7 @@ public class RPCoreSTSendActionBuilder extends STSendActionBuilder @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return //ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_PREFIX + "_" - "Scatter_" // FIXME: make unary Send special case + return RPCoreSTApiGenConstants.RP_SCATTER_METHOD_PREFIX + "_" // FIXME: make unary Send special case + RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + "_" + a.mid; } @@ -33,13 +28,13 @@ public String getActionName(STStateChanApiBuilder api, EAction a) public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG - + i + " []" + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i)) //a.payload.elems.get(i) - ).collect(Collectors.joining(", ")); + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + + i + " []" + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i))) //a.payload.elems.get(i) + .collect(Collectors.joining(", ")); } @Override - public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, EState succ) + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { if(a.payload.elems.size() > 1) { @@ -49,86 +44,51 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES List as = curr.getActions(); if (as.size() > 1 && as.stream().anyMatch(b -> b.mid.toString().equals(""))) // HACK { - throw new //ParamCoreException - RuntimeException("[param-core] Empty labels not allowed in non-unary choices: " + curr.getActions()); + throw new RuntimeException("[param-core] Empty labels not allowed in non-unary choices: " + curr.getActions()); } - - String sEpWrite = - //s.ep.Write - RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT - + ".Ept" - //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; - + ".Conn"; - /*String sEpProto = - //"s.ep.Proto" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; RPIndexedRole r = (RPIndexedRole) a.peer; RPInterval g = r.intervals.iterator().next(); - Function foo = e -> - { - if (e instanceof RPIndexInt) - { - return e.toString(); - } - else if (e instanceof RPIndexVar) - { - return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; - } - else - { - throw new RuntimeException("[param-core] TODO: " + e); - } - }; - - // FIXME: single arg // Currently never true because of ParamCoreSTOutputStateBuilder + + String sEpWrite = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + "[\"" + r.getName() + "\"]"; + + // FIXME: single arg // Currently never true because of RPCoreSTOutputStateBuilder boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem - ((RPCoreSTStateChanApiBuilder) apigen).isDelegType((DataType) pet)); + rpapi.isDelegType((DataType) pet)); - String res = - //st1.Use() - "j := 0\n" - + "for i := " + foo.apply(g.start) + "; i <= "+foo.apply(g.end)+"; i++ {\n" + String res = "for i, j := " + RPCoreSTStateChanApiBuilder.generateIndexExpr(g.start) + ", 0;" + + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(g.end)+"; i, j = i+1, j+1 {\n"; - //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + (a.mid.toString().equals("") ? "" : // HACK - "if err := " + sEpWrite - //+ "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "[\"" + r.getName() + "\"][i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL - + "(" //+ sEpProto + "." + r.getName() + ", " - + "\"" + a.mid + "\"" + "); err != nil {\n" - + "log.Fatal(err)\n" - + "}\n") + // Write label + if (!a.mid.toString().equals("")) { // HACK FIXME? + res += "if err := " + sEpWrite + "[i]" + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(\"" + a.mid + "\"" + ")" + + "; err != nil {\n" + + "log.Fatal(err)\n" // FIXME + + "}\n"; + } - //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + ((isDeleg) //... FIXME: delegation: take pointer? send underlying ept? -- don't do (multi)"send"? - ? - "log.Fatal(\"TODO\")\n" - : - "if err := " + sEpWrite - //+ "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "[\"" + r.getName() + "\"][i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL - + "(" //+ sEpProto + "." + r.getName() + ", " - + "arg0[j]" //+ "splitFn0(arg0, i)" // FIXME: hardcoded arg0 - + "); err != nil {\n" - + "log.Fatal(err)\n" - + "}\n" - + "j = j+1\n" - + "}\n"); + // Write payload + if (isDeleg) //... FIXME: delegation: take pointer? send underlying ept? -- don't do (multi)"send"? + { + res += "log.Fatal(\"TODO\")\n"; + } + else + { + res += "if err := " + sEpWrite + "[i]" + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "(" + "arg0[j])" // FIXME: hardcoded arg0 + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n"; + } - /*for i, v := range pl { - st1.ept.Conn[Worker][i].Send(a.mid) - st1.ept.Conn[Worker][i].Send(v) - }*/ + res += "}\n"; - return - res - + buildReturn(apigen, curr, succ); + return res + buildReturn(api, curr, succ); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 4edbf8cc8..19ba84a2b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -100,7 +100,7 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map v + " int, ").collect(Collectors.joining("")) + "self int" + ")" - + "(*_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) + "." + epkindTypeName + ") {\n" + + " *_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) + "." + epkindTypeName + " {\n" + "params := make(map[string]int)\n" + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) + "return _" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + ".New" + "(p, params, self)\n" @@ -149,7 +149,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< // Endpoint Kind type constructor -- makes connection maps + "\n" - + "func New(p session.Protocol, params map[string]int, self int) *" + epkindTypeName + "{\n" + + "func New(p session.Protocol, params map[string]int, self int) *" + epkindTypeName + " {\n" + "conns := make(map[string]map[int]transport.Channel)\n" + this.apigen.variants.entrySet().stream() .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + "make(map[int]transport.Channel)\n") @@ -160,12 +160,12 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< // Dial/Accept methdos -- FIXME: internalise peers + "\n" + "func (ini *" + epkindTypeName + ") Accept(rolename string, id int, acc transport.Transport) error {\n" - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Conn[rolename][id] = acc.Accept()\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = acc.Accept()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n" + "func (ini *" + epkindTypeName + ") Dial(rolename string, id int, req transport.Transport) error {\n" - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".Conn[rolename][id] = req.Connect()\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = req.Connect()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n"; @@ -174,7 +174,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< + "ini.Use()\n" // FIXME: int-counter linearity + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".CheckConnection()\n" + ((this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) // FIXME: type-switch? - ? "end := f(ini.NewInit())\n" + ? "end := f(ini.NewBranchInit())\n" // FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble : "end := f(&Init{ new(session.LinearResource), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + "return &end\n" + "}"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java index 01ffd94b9..bb3ff69ca 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java @@ -33,14 +33,14 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) { DataType[] pet = new DataType[1]; return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i + " " // HACK + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0] = ((DataType) a.payload.elems.get(i)))) ? "*" : "") + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) //a.payload.elems.get(i) - + ", splitFn" + i + " func(" + RPCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " " + + ", splitFn" + i + " func(" + RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i + " " // HACK + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") @@ -71,13 +71,13 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat String sEpWrite = //s.ep.Write - RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; + ".Conn"; String sEpProto = //"s.ep.Proto" - RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO; /*String sEpErr = //"s.ep.Err" @@ -94,7 +94,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } else if (e instanceof RPIndexVar) { - return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; } else diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 75058cde2..29c46afdf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -16,6 +16,9 @@ import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EState; @@ -154,7 +157,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) if (getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1) { return - "func (" + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(this, a) + ") <-chan *" + ab.getReturnType(this, curr, succ) + " {\n" @@ -164,11 +167,11 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) else { return - "func (" + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(this, a) + ") *" + ab.getReturnType(this, curr, succ) + " {\n" - + RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + ab.buildBody(this, curr, a, succ) + "\n" + "}"; @@ -179,7 +182,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) @Override public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) { - String sEp = RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; String res = ""; res += "return " + getSuccStateChan(ab, curr, succ, sEp); return res; @@ -189,8 +192,8 @@ protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, { if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { - return RPCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." - + "NewInit()"; // For branch states (hacky?) + return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + + "NewBranchInit()"; // For branch states (hacky?) // FIXME: factor out with RPCoreSTSessionApiBuilder and RPCoreSTSelectStateBuilder#getPreamble /*+ ((succ.id != this.graph.init.id) ? getStateChanName(succ) : "Init") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + "()";*/ } @@ -244,6 +247,23 @@ public static String getGeneratedIndexedRoleName(RPIndexedRole r) return r.getName() + "_" + g.start + "To" + g.end; } + public static String generateIndexExpr(RPIndexExpr e) + { + if (e instanceof RPIndexInt) + { + return e.toString(); + } + else if (e instanceof RPIndexVar) + { + return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PARAMS + "[\"" + e + "\"]"; + } + else + { + throw new RuntimeException("[param-core] TODO: " + e); + } + } + @@ -286,6 +306,7 @@ private String getExtSource(DataType t) return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extSource; // FIXME: make a map } + // FIXME: deprecate? array/slice types now handled via ext names? protected String batesHack(PayloadElemType t) { /*String tmp = t.toString(); From c7aff85d276661ab781c0b71a767158c96350e6e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 17:00:15 +0100 Subject: [PATCH 216/433] Continued revising param-core API gen. --- .../core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index b865ea63a..600c2cb77 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -72,7 +72,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat if (!a.mid.toString().equals("")) // HACK FIXME? { - res += "var lab string\n" + res += "var lab string\n" // var decl needed for deserializatoin -- FIXME? + "if err := " + sEpRecv + "[i]" + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&lab" + ")" @@ -83,7 +83,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat if (!a.payload.elems.isEmpty()) { - res += "var tmp " + extName + "\n" + res += "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + "if err := " + sEpRecv + "[i]" + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL From 5c00183100cd8e465ddf37b06e1929fb35a9a35b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 17:37:01 +0100 Subject: [PATCH 217/433] Continued revising param-core API gen. --- .../RPCoreSTSelectStateBuilder.java | 195 ++++++------------ 1 file changed, 64 insertions(+), 131 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index 3d2cdc95f..606beb62e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -1,17 +1,13 @@ package org.scribble.ext.go.core.codegen.statetype3; -import java.util.function.Function; import java.util.stream.Collectors; import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.type.RPRoleVariant; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexInt; -import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.model.endpoint.actions.EReceive; @@ -24,140 +20,98 @@ public RPCoreSTSelectStateBuilder(RPCoreSTSelectActionBuilder bb) { super(bb); } + + @Override + public String build(STStateChanApiBuilder api, EState s) + { + String out = getPreamble(api, s); + + for (EAction a : s.getActions()) + { + out += "\n\n"; + if (a instanceof EReceive) // FIXME: factor out action kind + { + out += this.bb.build(api, s, a); // Getting 1 checks non-unary + } + else + { + throw new RuntimeException("Shouldn't get in here: " + a); + } + } + + return out; + } + // Cf. RPCoreSTStateChanApiBuilder -- the hierarchy splits off branch state building separately @Override public String getPreamble(STStateChanApiBuilder api, EState s) { - RPRoleVariant actual = ((RPCoreSTStateChanApiBuilder) api).variant; + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + + GProtocolName simpname = rpapi.apigen.proto.getSimpleName(); + RPRoleVariant variant = ((RPCoreSTStateChanApiBuilder) api).variant; + String scTypeName = rpapi.getStateChanName(s); + String epTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, rpapi.variant); String sEpRecv = - RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; - + ".Ept"; - //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; - /*String sEpProto = - //"s.ep.Proto" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; - //return ((ParamCoreSTStateChanApiBuilder) api).getStateChanPremable(s); - RPCoreSTStateChanApiBuilder apigen = (RPCoreSTStateChanApiBuilder) api; - //Role r = apigen.actual.getName(); - GProtocolName simpname = apigen.apigen.proto.getSimpleName(); - String tname = apigen.getStateChanName(s); - //String epType = ParamCoreSTEndpointApiGenerator.getGeneratedEndpointType(simpname, r); - String epType = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, apigen.variant); String res = - //apigen.apigen.generateRootPackageDecl() + "\n" - "package " + RPCoreSTApiGenerator.getGeneratedRoleVariantName(actual) + "\n" + "package " + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) + "\n" + "\n" - //+ apigen.apigen.generateScribbleRuntimeImports() + "\n" + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "import \"log\"\n" - - //+ (((GoJob) api.job).noCopy ? "" : Stream.of(ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_BYTES_PACKAGE, ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_GOB_PACKAGE) .map(x -> "import \"" + x + "\"").collect(Collectors.joining("\n"))) + // State channel type + "\n" - + "type " + tname + " struct{\n" - //+ ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + ParamCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epType + "\n" + + "type " + scTypeName + " struct{\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epTypeName + "\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" - + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan string\n") // chan *" + apigen.getStateChanName(s.getSuccessor(a)) + "\n") - .collect(Collectors.joining("")) - /*+ (((GoJob) apigen.job).noCopy ? "data chan []interface{}" : - //"data chan [][]byte\n" - "data chan interface{}\n" - )*/ + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan chan string\n").collect(Collectors.joining("")) + "}\n"; + // Explicit constructor -- for creating internal channels res += "\n" - + "func (ep *" + epType + ") NewBranchInit" - /*+ ((s.id != api.graph.init.id) ? tname - //: ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(actual) + "_1") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case - : "Init")*/ - + "() *" + tname + " {\n" // FIXME: factor out - + "s := &" + tname + " { " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" - + ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " - + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan "//chan *" + apigen.getStateChanName(s.getSuccessor(a)) - + "string" + - ", 1)") - .collect(Collectors.joining(", ")) + ", " - - /*+ "data: make(chan " + (((GoJob) api.job).noCopy ? "[]interface{}" : - //"[][]byte" - " interface{}" - ) + ", 1)"*/ - + + "func (ep *" + epTypeName + ") NewBranchInit" // FIXME: factor out + + "() *" + scTypeName + " {\n" + + "s := &" + scTypeName + " { " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan string, 1)").collect(Collectors.joining(", ")) + ", " + "}\n" - + "go s.foo()\n" + + "go s.branch()\n" + "return s\n" + "}\n"; + RPIndexedRole peer = (RPIndexedRole) s.getActions().iterator().next().peer; + RPInterval d = peer.intervals.iterator().next(); + + // Branch background thread -- receive label, and signal corresponding channel res += "\n" - + "func (s *" + tname + ") foo() {\n" - + "s." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + ") branch() {\n" + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + "var op string\n"; - - RPIndexedRole peer = (RPIndexedRole) s.getActions().iterator().next().peer; - RPInterval g = peer.intervals.iterator().next(); - Function foo = e -> - { - if (e instanceof RPIndexInt) - { - return e.toString(); - } - else if (e instanceof RPIndexVar) - { - return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; - } - else - { - throw new RuntimeException("[param-core] TODO: " + e); - } - }; - - if (((GoJob) apigen.job).noCopy) + if (((GoJob) rpapi.job).noCopy) { - res += - "label := " + sEpRecv + "Raw(\"" + peer.getName() + "\", " - + foo.apply(g.start) + ", " + foo.apply(g.end) + ")\n" - + "op := *label[0].(*string)\n"; // FIXME: cast for safety? + /*res += + "label := " + sEpRecv + "Raw(\"" + peer.getName() + "\", " + + RPCoreSTStateChanApiBuilder.generateIndexExpr(g.start) + ", " + RPCoreSTStateChanApiBuilder.generateIndexExpr(g.end) + ")\n" + + "op := *label[0].(*string)\n"; // FIXME: cast for safety?*/ + throw new RuntimeException("[rp-core] TODO: -nocopy: " + s); } else - { - res += - "if err := " + sEpRecv + ".Conn[\"" + peer.getName() + "\"][" - + foo.apply(g.start) + "].Recv(&op); err != nil {\n" // g.end = g.start - + "log.Fatal(err)\n" - + "}\n"; - } - - /*List as = s.getActions(); - boolean allEmpty = as.stream().allMatch(a -> a.payload.elems.isEmpty()); - if (!allEmpty) // FIXME: { res += - "var b string\n" // HACK? - //"var b int\n" - + "if err := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") - + ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "-1].Recv(&b); err != nil {\n" - + "log.Fatal(err)\n" - + "}\n" - + "s.data <- b\n"; - // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args - }*/ - - res+= "if " - + s.getActions().stream().map(a -> + "if err := " + sEpRecv + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + peer.getName() + "\"][" + + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&op); err != nil {\n" // g.end = g.start -- CFSM only has ? for input + + "log.Fatal(err)\n" + + "}\n"; + } + res+= "if " + s.getActions().stream().map(a -> { - //String sEp = ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; - return - "op == \"" + a.mid + "\" {\n" - /*+ "\tch := make(chan *" + apigen.getStateChanName(s.getSuccessor(a)) + ", 1)\n" - + "\tch <- " + apigen.getSuccStateChan(this.bb, s, s.getSuccessor(a), sEp) + "\n" - + "\ts._" + a.mid + "_Chan <- ch\n"*/ + return "op == \"" + a.mid + "\" {\n" + "\ts._" + a.mid + "_Chan <- \"" + a.mid +"\"\n" + "\t" + s.getActions().stream() .filter(otheract -> otheract.mid != a.mid) @@ -169,25 +123,4 @@ else if (e instanceof RPIndexVar) return res; } - - @Override - public String build(STStateChanApiBuilder api, EState s) - { - String out = getPreamble(api, s); - - for (EAction a : s.getActions()) - { - out += "\n\n"; - if (a instanceof EReceive) // FIXME: factor out action kind - { - out += this.bb.build(api, s, a); // Getting 1 checks non-unary - } - else - { - throw new RuntimeException("Shouldn't get in here: " + a); - } - } - - return out; - } } From 2ef3778749427f19564183cb1cd1e0b6fbb73812 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 17:48:24 +0100 Subject: [PATCH 218/433] Continued revising RP-core API gen. --- .../RPCoreSTSelectActionBuilder.java | 122 ++++-------------- 1 file changed, 28 insertions(+), 94 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index b6d829b83..8ce0b00dc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -1,18 +1,14 @@ package org.scribble.ext.go.core.codegen.statetype3; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.scribble.codegen.statetype.STBranchActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexInt; -import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; @@ -20,18 +16,6 @@ // N.B. Select means Go select statement for input-choice; not output-choice public class RPCoreSTSelectActionBuilder extends STBranchActionBuilder { - /*@Override - public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME: "overriding" GSTStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out - { - EState succ = curr.getSuccessor(a); - return - "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" - + buildArgs(a) - + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: Return type is interface, so no need for *return (unlike other state chans) - + "s.state.Use()\n" - + buildBody(api, curr, a, succ) + "\n" - + "}"; - }*/ @Override public String getActionName(STStateChanApiBuilder api, EAction a) @@ -42,7 +26,7 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(STStateChanApiBuilder apigen, EAction a) + public String buildArgs(STStateChanApiBuilder api, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG @@ -51,15 +35,11 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) ).collect(Collectors.joining(", ")); } - /*@Override - public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) - { - return api.cb.getCaseStateChanName(api, curr); - }*/ - @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { + RPCoreSTStateChanApiBuilder apigen = (RPCoreSTStateChanApiBuilder) api; + if(a.payload.elems.size() > 1) { throw new RuntimeException("[param-core] TODO: " + a); @@ -73,86 +53,40 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat throw new RuntimeException("[param-core] TODO: " + a); } - String res = - "_, selected := <-s._" + a.mid + "_Chan\n" - + "if !selected {\n" - + "\treturn nil // select ignores nilchan\n" - + "}\n"; + String res = "_, selected := <-s._" + a.mid + "_Chan\n" + + "if !selected {\n" + + "\treturn nil // select ignores nilchan\n" + + "}\n"; RPIndexedRole peer = (RPIndexedRole) curr.getActions().iterator().next().peer; - RPInterval g = peer.intervals.iterator().next(); - Function foo = e -> - { - if (e instanceof RPIndexInt) - { - return e.toString(); - } - else if (e instanceof RPIndexVar) - { - return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Params[\"" + e + "\"]"; - } - else - { - throw new RuntimeException("[param-core] TODO: " + e); - } - }; - String sEpRecv = - RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER - + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; - + ".Ept"; - //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; - /*String sEpProto = - //"s.ep.Proto" - ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." - + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_PROTO;*/ + RPInterval d = peer.intervals.iterator().next(); - RPCoreSTStateChanApiBuilder apigen = (RPCoreSTStateChanApiBuilder) api; String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + String sEpRecv = sEp + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + peer.getName() + "\"]"; - if (!a.payload.elems.isEmpty()) + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) { - if (a.payload.elems.size() > 1) - { - throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); - } - - res += - //+ "data := make([]int, " + foo.apply(g.end) + ")\n" - //+ "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args - ""; - - res += - ((((GoJob) api.job).noCopy) - ? - "decoded = *bs[0].(*" + a.payload.elems.get(0) + ")\n" - : - "" - //+ "data[0] = decoded\n" - //+ "}\n" - ); - - //+ "*arg0 = reduceFn0(data)\n" // FIXME: arg0 - // + "*arg0 = data[0]\n" - - //+ "*arg0 = (<-s.data).(" + ((DataType) a.payload.elems.get(0)).getSimpleName() + ")\n"; + throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + } - res += - "if err := " + sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") - //+ ".Conn[" + sEpProto + "." + peer.getName() + ".Name()][" + foo.apply(g.start) + "].Recv(&arg0); err != nil {\n" - + ".Conn[\"" + peer.getName() + "\"][" + foo.apply(g.start) + "].Recv(&arg0); err != nil {\n" - + "log.Fatal(err)\n" - + "}\n" - + "\n" - + "\tch := make(chan *" + apigen.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" - + "\tch <- " + apigen.getSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; + if (((GoJob) api.job).noCopy) + { + //res += "decoded = *bs[0].(*" + a.payload.elems.get(0) + ")\n"; + throw new RuntimeException("[rp-core] TODO: -nocopy: " + a); + } - // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + res += "if err := " + sEpRecv; // + (((GoJob) api.job).noCopy ? "Raw" : ""); + res += "[" + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&arg0); err != nil {\n" + + "log.Fatal(err)\n" + "}\n" + + "ch := make(chan *" + apigen.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" + + "ch <- " + apigen.getSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; + // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args } - return res - + "return ch"; + return res + "return ch"; } } From e46a6cf207e1cca22d4c29338ca4db71e57b2a78 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 17:56:30 +0100 Subject: [PATCH 219/433] Minor. --- .../core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 600c2cb77..355ec3219 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -63,7 +63,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "data[i] = *b[i].(*" + a.payload.elems.get(0) + ")\n" + "}\n" + "*arg0 = reduceFn0(data)\n";*/ - throw new RuntimeException("[rp-core] TODO: -nocopy" + a); // FIXME: currently missing from sender side? + throw new RuntimeException("[rp-core] TODO: -nocopy: " + a); // FIXME: currently missing from sender side? } else { From 094bd64887bf648a0157165b153a193588c2a690 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 20:58:41 +0100 Subject: [PATCH 220/433] Added type switch branches to rp-core API gen. --- .../statetype/STBranchStateBuilder.java | 2 +- .../statetype/go/GoSTStateChanApiBuilder.java | 3 +- .../statetype3/RPCoreSTApiGenerator.java | 8 +- .../RPCoreSTBranchActionBuilder.java | 90 +++++++++++++++++++ .../RPCoreSTBranchStateBuilder.java | 40 +++++++++ .../statetype3/RPCoreSTCaseActionBuilder.java | 81 +++++++++++++++++ .../statetype3/RPCoreSTCaseBuilder.java | 79 ++++++++++++++++ .../RPCoreSTReceiveActionBuilder.java | 10 ++- .../RPCoreSTSelectStateBuilder.java | 8 +- .../statetype3/RPCoreSTSendActionBuilder.java | 10 ++- .../RPCoreSTStateChanApiBuilder.java | 19 ++-- 11 files changed, 331 insertions(+), 19 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java index ed6a96647..18afc9fdd 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java @@ -30,7 +30,7 @@ public String build(STStateChanApiBuilder api, EState s) String out = getPreamble(api, s); out += "\n\n"; - out += this.bb.build(api, s, s.getActions().get(1)); // Getting 1 checks non-unary + out += this.bb.build(api, s, s.getActions().get(1)); // Getting #1 checks non-unary return out; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java index 7e1044b9d..eb48a02bb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java @@ -90,8 +90,9 @@ protected static String getStateChanPremable(GoSTStateChanApiBuilder api, EState return res; } + // Here because action builder hierarchy not suitable (extended by action kind, not by target language) @Override - public String buildAction(STActionBuilder ab, EState curr, EAction a) // Here because action builder hierarchy not suitable (extended by action kind, not by target language) + public String buildAction(STActionBuilder ab, EState curr, EAction a) { EState succ = curr.getSuccessor(a); return diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 99a3bbb6a..b937eac1e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -74,16 +74,16 @@ public String getApiRootPackageName() // Derives only from proto name return "package " + getApiRootPackageName(); }*/ - public static String getEndpointKindPackageName(RPRoleVariant r) + public static String getEndpointKindPackageName(RPRoleVariant variant) { - return getGeneratedRoleVariantName(r); + return getGeneratedRoleVariantName(variant); } // Role variant = Endpoint kind -- e.g., S_1To1, W_1Ton - public static String getEndpointKindTypeName(GProtocolName simpname, RPRoleVariant r) + public static String getEndpointKindTypeName(GProtocolName simpname, RPRoleVariant variant) { //return simpname + "_" + getGeneratedActualRoleName(r); - return getGeneratedRoleVariantName(r); + return getGeneratedRoleVariantName(variant); } public static String getGeneratedRoleVariantName(RPRoleVariant variant) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java new file mode 100644 index 000000000..3e13cef0a --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -0,0 +1,90 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.stream.Collectors; + +import org.scribble.codegen.statetype.STBranchActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class RPCoreSTBranchActionBuilder extends STBranchActionBuilder +{ + @Override + public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME: "overriding" STStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out + { + //RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + //String scTypeName = rpapi.getStateChanName(curr); + + EState succ = curr.getSuccessor(a); + return + "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + + buildArgs(null, a) + + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: Return type is interface, so no need for *return (unlike other state chans) + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + buildBody(api, curr, a, succ) + "\n" + + "}"; + } + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName((RPIndexedRole) a.peer) + "_Branch"; + } + + @Override + public String buildArgs(STStateChanApiBuilder apigen, EAction a) + { + return ""; + } + + @Override + public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) + { + return api.cb.getCaseStateChanName(api, curr); + } + + // CHECKME: what is succ for Branch action? + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + //RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + RPIndexedRole peer = (RPIndexedRole) a.peer; // Singleton interval + String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + "[\"" + peer.getName() + "\"]"; + + /*//"tmp := " + api.getChannelName(api, a) + ".Read()\n" + "tmp := s.ep.Read(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")\n" + //+ "op := tmp.(" + GSTBranchStateBuilder.getBranchEnumType(api, curr) + ")\n" + + "if s.ep.Err != nil {\n" + + "return nil\n" + + "}\n" + + "op := tmp.(string)\n"*/ + + String res = ""; + + // Duplicated from RPCoreSTReceiveActionBuilder + res += "var lab string\n" // var decl needed for deserializatoin -- FIXME? + + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" + "&lab" + ")" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n"; + + res += "\n" + + "switch lab {\n" + + curr.getActions().stream().map(x -> + "case \"" + x.mid + "\":\n" + + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{ Ept: s.Ept, Res: new(session.LinearResource) }\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder buildActionReturn/getSuccStateChan + //+ rpapi.buildActionReturn(((RPCoreSTReceiveStateBuilder) rpapi.rb).vb, curr, curr.getSuccessor(a)) + "\n" // No: need to return Cases object, not state chan + ).collect(Collectors.joining("")) + + "default: panic(\"Shouldn't get in here: \" + lab)\n" + + "}\n" + + "return nil"; // FIXME: panic instead + + return res; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java new file mode 100644 index 000000000..e7ea491bd --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java @@ -0,0 +1,40 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import org.scribble.codegen.statetype.STBranchStateBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.model.endpoint.EState; +import org.scribble.type.name.GProtocolName; + +// Type switch branch -- cf., RPCoreSTSelectStateBuilder +public class RPCoreSTBranchStateBuilder extends STBranchStateBuilder +{ + public RPCoreSTBranchStateBuilder(RPCoreSTBranchActionBuilder bb) + { + super(bb); + } + + // Cf. RPCoreSTStateChanApiBuilder -- the hierarchy splits off branch state building separately + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + + GProtocolName simpname = rpapi.apigen.proto.getSimpleName(); + String scTypeName = rpapi.getStateChanName(s); + String epTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, rpapi.variant); + + String res = rpapi.getStateChanPremable(s); + + // Explicit constructor -- for compatibility with RPCoreSTSelectStateBuilder + res += "\n" + + "func (ep *" + epTypeName + ") NewBranchInit" // FIXME: factor out + + "() *" + scTypeName + " {\n" + + "s := &" + scTypeName + " { " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ") " + + "}\n" + + "return s\n" + + "}\n"; + + return res; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java new file mode 100644 index 000000000..9ae34f854 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -0,0 +1,81 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.scribble.codegen.statetype.STCaseActionBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; + +public class RPCoreSTCaseActionBuilder extends STCaseActionBuilder +{ + + @Override + public String getActionName(STStateChanApiBuilder api, EAction a) + { + return RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName((RPIndexedRole) a.peer) + "_Recv_" + a.mid; + } + + @Override + public String buildArgs(STStateChanApiBuilder apigen, EAction a) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> "arg" + i + " *" + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + } + + @Override + public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) + { + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + RPIndexedRole peer = (RPIndexedRole) a.peer; // Singleton interval + + String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + "[\"" + peer.getName() + "\"]"; + + String extName = rpapi.batesHack(a.payload.elems.get(0)); + + String res = ""; + + // Duplicated from RPCoreSTReceiveActionBuilder + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("TODO: " + a); + } + + res += "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(&tmp)" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "arg0 = &tmp\n"; + } + return res + buildReturn(rpapi, curr, succ); + + + /*return + IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> + //"val" + i + " := " + api.getChannelName(api, a) + ".Read()\n" + "val" + i + " := s.ep.Read(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")\n" + + "if s.ep.Err != nil {\n" + + "return nil\n" + + "}\n" + + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" + ).collect(Collectors.joining("\n")) + "\n" + + buildReturn(api, curr, succ);*/ + } + + @Override + public String getStateChanType(STStateChanApiBuilder api, EState curr, EAction a) + { + return RPCoreSTCaseBuilder.getOpTypeName(api, curr, a.mid); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java new file mode 100644 index 000000000..6203741cc --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -0,0 +1,79 @@ +package org.scribble.ext.go.core.codegen.statetype3; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import org.scribble.codegen.statetype.STCaseBuilder; +import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.main.RuntimeScribbleException; +import org.scribble.model.endpoint.EState; +import org.scribble.type.name.MessageId; + +public class RPCoreSTCaseBuilder extends STCaseBuilder +{ + public RPCoreSTCaseBuilder(RPCoreSTCaseActionBuilder cb) + { + super(cb); + } + + protected static String getCaseActionName(STStateChanApiBuilder api, EState s) + { + return api.getStateChanName(s) + "_Case"; + } + + @Override + public String getCaseStateChanName(STStateChanApiBuilder api, EState s) + { + String name = api.getStateChanName(s) + "_Cases"; + return name; + } + + @Override + public String getPreamble(STStateChanApiBuilder api, EState s) + { + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + String casename = getCaseActionName(api, s); + return "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(rpapi.variant) + "\n" + + "\n" + + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + + "import \"log\"\n" + + "\n" + + "type " + getCaseStateChanName(api, s) + " interface {\n" + + casename + "()\n" + + "}" + + s.getActions().stream().map(a -> + "\n\ntype " + getOpTypeName(api, s, a.mid) + " struct {\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(null, rpapi.variant) + "\n" + + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + + "}\n" + + "\n" + + "func (*" + getOpTypeName(api, s, a.mid) + ") " + casename + "() {}" + ).collect(Collectors.joining("")); + } + + private static Map seen = new HashMap<>(); // FIXME HACK + + protected static String getOpTypeName(STStateChanApiBuilder api, EState s, MessageId mid) + { + String op = mid.toString(); + char c = op.charAt(0); + if (c < 'A' || c > 'Z') + { + throw new RuntimeScribbleException("[rp-core] Branch message op should start with a capital letter: " + op); // FIXME: + } + if (RPCoreSTCaseBuilder.seen.containsKey(op)) + { + if (RPCoreSTCaseBuilder.seen.get(op) != s.id) + { + String n = api.getStateChanName(s); // HACK + op = op + "_" + api.role + "_" + n.substring(n.lastIndexOf('_') + 1); + } + } + else + { + RPCoreSTCaseBuilder.seen.put(op, s.id); + } + return op; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 355ec3219..fc40d0fcb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -41,12 +41,16 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; - RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval d = r.intervals.iterator().next(); + RPIndexedRole peer = (RPIndexedRole) a.peer; + RPInterval d = peer.intervals.iterator().next(); + if (peer.intervals.size() > 1) + { + throw new RuntimeException("[rp-core] TODO: " + a); + } String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP - + "[\"" + r.getName() + "\"]"; + + "[\"" + peer.getName() + "\"]"; String res = ""; if (a.payload.elems.size() > 1) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index 606beb62e..55ba01891 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -78,14 +78,18 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "() *" + scTypeName + " {\n" + "s := &" + scTypeName + " { " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " - + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan string, 1)").collect(Collectors.joining(", ")) + ", " + + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan string, 1)").collect(Collectors.joining(", ")) + " " + "}\n" + "go s.branch()\n" + "return s\n" + "}\n"; - RPIndexedRole peer = (RPIndexedRole) s.getActions().iterator().next().peer; + RPIndexedRole peer = (RPIndexedRole) s.getActions().iterator().next().peer; // All branch actions have same subject RPInterval d = peer.intervals.iterator().next(); + if (peer.intervals.size() > 1) + { + throw new RuntimeException("[rp-core] TODO: " + s); + } // Branch background thread -- receive label, and signal corresponding channel res += "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 1b90ddca7..222666214 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -49,7 +49,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; RPIndexedRole r = (RPIndexedRole) a.peer; - RPInterval g = r.intervals.iterator().next(); + RPInterval d = r.intervals.iterator().next(); + if (r.intervals.size() > 1) + { + throw new RuntimeException("[rp-core] TODO: " + a); + } String sEpWrite = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP @@ -60,8 +64,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem rpapi.isDelegType((DataType) pet)); - String res = "for i, j := " + RPCoreSTStateChanApiBuilder.generateIndexExpr(g.start) + ", 0;" - + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(g.end)+"; i, j = i+1, j+1 {\n"; + String res = "for i, j := " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + ", 0;" + + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.end)+"; i, j = i+1, j+1 {\n"; // Write label if (!a.mid.toString().equals("")) { // HACK FIXME? diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 29c46afdf..9ca474893 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -32,7 +32,7 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder { protected final RPCoreSTApiGenerator apigen; - public final RPRoleVariant variant; + public final RPRoleVariant variant; // variant.getName().equals(this.role) //public final RPCoreSTReceiveActionBuilder vb; @@ -46,8 +46,10 @@ public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant va super(apigen.job, apigen.proto, apigen.self, graph, new RPCoreSTOutputStateBuilder(new RPCoreSTSplitActionBuilder(), new RPCoreSTSendActionBuilder()), new RPCoreSTReceiveStateBuilder(new RPCoreSTReduceActionBuilder(), new RPCoreSTReceiveActionBuilder()), - new RPCoreSTSelectStateBuilder(new RPCoreSTSelectActionBuilder()), - null, //new GoSTCaseBuilder(new GoSTCaseActionBuilder()), + /*new RPCoreSTSelectStateBuilder(new RPCoreSTSelectActionBuilder()), + null, */ + new RPCoreSTBranchStateBuilder(new RPCoreSTBranchActionBuilder()), + new RPCoreSTCaseBuilder(new RPCoreSTCaseActionBuilder()), new RPCoreSTEndStateBuilder()); this.apigen = apigen; @@ -75,7 +77,12 @@ public Map build() // filepath -> source { if (s.getActions().size() > 1) { + // Select-based branch + //res.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + + // Type switch -based branch res.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + res.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); } else { @@ -154,7 +161,8 @@ protected String getStateChanPremable(EState s) public String buildAction(STActionBuilder ab, EState curr, EAction a) { EState succ = curr.getSuccessor(a); - if (getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1) + if (getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1 + && this.bb instanceof RPCoreSTSelectStateBuilder) // HACK { return "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER @@ -190,7 +198,8 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) { - if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) + if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1 + && this.bb instanceof RPCoreSTSelectStateBuilder) // HACK { return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "NewBranchInit()"; // For branch states (hacky?) // FIXME: factor out with RPCoreSTSessionApiBuilder and RPCoreSTSelectStateBuilder#getPreamble From 3b58fb2a9e94cb42b128ff2ec0c6d7a9b85da179 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 21:04:37 +0100 Subject: [PATCH 221/433] Continued revising rp-core API gen. --- .../RPCoreSTBranchActionBuilder.java | 17 ++----- .../statetype3/RPCoreSTCaseActionBuilder.java | 46 +++++++------------ .../statetype3/RPCoreSTCaseBuilder.java | 6 +-- 3 files changed, 23 insertions(+), 46 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 3e13cef0a..ba69ce9e9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -49,19 +49,10 @@ public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { - //RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; RPIndexedRole peer = (RPIndexedRole) a.peer; // Singleton interval String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + peer.getName() + "\"]"; - - /*//"tmp := " + api.getChannelName(api, a) + ".Read()\n" - "tmp := s.ep.Read(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")\n" - //+ "op := tmp.(" + GSTBranchStateBuilder.getBranchEnumType(api, curr) + ")\n" - + "if s.ep.Err != nil {\n" - + "return nil\n" - + "}\n" - + "op := tmp.(string)\n"*/ String res = ""; @@ -74,16 +65,16 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "log.Fatal(err)\n" + "}\n"; + // Switch and return Cases value res += "\n" + "switch lab {\n" + curr.getActions().stream().map(x -> - "case \"" + x.mid + "\":\n" - + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) +"{ Ept: s.Ept, Res: new(session.LinearResource) }\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder buildActionReturn/getSuccStateChan - //+ rpapi.buildActionReturn(((RPCoreSTReceiveStateBuilder) rpapi.rb).vb, curr, curr.getSuccessor(a)) + "\n" // No: need to return Cases object, not state chan + "case \"" + x.mid + "\":\n" + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) + + "{ Ept: s.Ept, Res: new(session.LinearResource) }\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder buildActionReturn/getSuccStateChan ).collect(Collectors.joining("")) + "default: panic(\"Shouldn't get in here: \" + lab)\n" + "}\n" - + "return nil"; // FIXME: panic instead + + "return nil\n"; // FIXME: panic instead return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index 9ae34f854..1187783fa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -39,38 +39,24 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat String res = ""; - // Duplicated from RPCoreSTReceiveActionBuilder - if (!a.payload.elems.isEmpty()) + // Duplicated from RPCoreSTReceiveActionBuilder + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) { - if (a.payload.elems.size() > 1) - { - throw new RuntimeException("TODO: " + a); - } - - res += "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? - + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? - + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL - + "(&tmp)" - + "; err != nil {\n" - + "log.Fatal(err)\n" - + "}\n" - + "arg0 = &tmp\n"; + throw new RuntimeException("TODO: " + a); } - return res + buildReturn(rpapi, curr, succ); - - - /*return - IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> - //"val" + i + " := " + api.getChannelName(api, a) + ".Read()\n" - "val" + i + " := s.ep.Read(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")\n" - + "if s.ep.Err != nil {\n" - + "return nil\n" - + "}\n" - + "*arg" + i + " = val" + i + ".(" + a.payload.elems.get(i) + ")" - ).collect(Collectors.joining("\n")) + "\n" - + buildReturn(api, curr, succ);*/ + + res += "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "arg0 = &tmp\n"; + } + return res + buildReturn(rpapi, curr, succ); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java index 6203741cc..bbd17d475 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -41,14 +41,14 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "\n" + "type " + getCaseStateChanName(api, s) + " interface {\n" + casename + "()\n" - + "}" + + "}\n" + s.getActions().stream().map(a -> - "\n\ntype " + getOpTypeName(api, s, a.mid) + " struct {\n" + "\ntype " + getOpTypeName(api, s, a.mid) + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(null, rpapi.variant) + "\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + "}\n" + "\n" - + "func (*" + getOpTypeName(api, s, a.mid) + ") " + casename + "() {}" + + "func (*" + getOpTypeName(api, s, a.mid) + ") " + casename + "() {}\n" ).collect(Collectors.joining("")); } From 0c59e1895a0989021172fc37d53c5c6004eb67ed Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 21:13:18 +0100 Subject: [PATCH 222/433] Continued revising rp-core API gen. --- .../go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index 1187783fa..efcba927e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -15,7 +15,8 @@ public class RPCoreSTCaseActionBuilder extends STCaseActionBuilder @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName((RPIndexedRole) a.peer) + "_Recv_" + a.mid; + return //RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName((RPIndexedRole) a.peer) + "_" + + "Recv_" + a.mid; } @Override From 22be51868bb37e6aa2211f4419cc25e1e8b5c0a4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 22 Apr 2018 21:27:35 +0100 Subject: [PATCH 223/433] Minor. --- .../codegen/statetype/STActionBuilder.java | 18 +++++++++--------- .../RPCoreSTStateChanApiBuilder.java | 12 ++++-------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java index 5eb4cb359..0b884c039 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STActionBuilder.java @@ -18,23 +18,23 @@ public abstract class STActionBuilder { - public abstract String getActionName(STStateChanApiBuilder api, EAction a); - public abstract String buildArgs(STStateChanApiBuilder api, EAction a); - public abstract String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ); - - public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) + public String build(STStateChanApiBuilder api, EState curr, EAction a) { - return api.getStateChanName(succ); + return api.buildAction(this, curr, a); // Because action builder hierarchy not suitable (extended by action kinds, not by target language) } public String buildReturn(STStateChanApiBuilder api, EState curr, EState succ) { return api.buildActionReturn(this, curr, succ); } - - public String build(STStateChanApiBuilder api, EState curr, EAction a) + + public abstract String getActionName(STStateChanApiBuilder api, EAction a); + public abstract String buildArgs(STStateChanApiBuilder api, EAction a); + public abstract String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ); + + public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) { - return api.buildAction(this, curr, a); // Because action builder hierarchy not suitable (extended by action kinds, not by target language) + return api.getStateChanName(succ); } public String getStateChanType(STStateChanApiBuilder api, EState curr, EAction a) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 9ca474893..914922915 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -34,8 +34,6 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder protected final RPCoreSTApiGenerator apigen; public final RPRoleVariant variant; // variant.getName().equals(this.role) - //public final RPCoreSTReceiveActionBuilder vb; - private int counter = 1; private final Set dtds; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams @@ -46,17 +44,15 @@ public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant va super(apigen.job, apigen.proto, apigen.self, graph, new RPCoreSTOutputStateBuilder(new RPCoreSTSplitActionBuilder(), new RPCoreSTSendActionBuilder()), new RPCoreSTReceiveStateBuilder(new RPCoreSTReduceActionBuilder(), new RPCoreSTReceiveActionBuilder()), - /*new RPCoreSTSelectStateBuilder(new RPCoreSTSelectActionBuilder()), - null, */ - new RPCoreSTBranchStateBuilder(new RPCoreSTBranchActionBuilder()), - new RPCoreSTCaseBuilder(new RPCoreSTCaseActionBuilder()), + + //new RPCoreSTSelectStateBuilder(new RPCoreSTSelectActionBuilder()), null, // Select-based branch + new RPCoreSTBranchStateBuilder(new RPCoreSTBranchActionBuilder()), new RPCoreSTCaseBuilder(new RPCoreSTCaseActionBuilder()), // Type switch branch + new RPCoreSTEndStateBuilder()); this.apigen = apigen; this.variant = variant; - //this.vb = ((RPCoreSTReceiveStateBuilder) this.rb).vb; - this.dtds = this.apigen.job.getContext().getMainModule().getNonProtocolDecls().stream() .filter(d -> (d instanceof DataTypeDecl)).map(d -> ((DataTypeDecl) d)).collect(Collectors.toSet()); } From ea9d77daf405253656c25b84af7fdd49fa5d49b4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 13:00:44 +0100 Subject: [PATCH 224/433] Added -param-select flag torp-core CL. --- .../ext/go/core/cli/RPCoreCLArgFlag.java | 12 +-- .../ext/go/core/cli/RPCoreCLArgParser.java | 93 ++++++++++--------- .../ext/go/core/cli/RPCoreCommandLine.java | 30 +++--- .../statetype3/RPCoreSTApiGenerator.java | 6 +- .../RPCoreSTStateChanApiBuilder.java | 37 +++++--- .../ext/go/core/main/RPCoreMainContext.java | 8 +- .../java/org/scribble/ext/go/main/GoJob.java | 4 +- .../scribble/ext/go/main/GoMainContext.java | 2 +- 8 files changed, 106 insertions(+), 86 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java index 081d56e85..43782d7fb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java @@ -3,12 +3,12 @@ public enum RPCoreCLArgFlag { // Unique flags - PARAM_CORE_PARAM, - - PARAM_CORE_NO_COPY, + RPCORE_PARAM, + RPCORE_SELECT_BRANCH, // Default is type switch + RPCORE_NO_COPY, // Non-unique flags - PARAM_CORE_EFSM, - PARAM_CORE_EFSM_PNG, - PARAM_CORE_API_GEN, + RPCORE_EFSM, + RPCORE_EFSM_PNG, + RPCORE_API_GEN, } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java index fde4cb347..b3b0e7043 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java @@ -10,34 +10,35 @@ public class RPCoreCLArgParser extends CLArgParser { // Unique flags - public static final String PARAM_CORE_PARAM_FLAG = "-param"; - public static final String PARAM_CORE_NOCOPY_FLAG = "-nocopy"; + public static final String RPCORE_PARAM_FLAG = "-param"; + public static final String RPCORE_SELECT_BRANCH_FLAG = "-param-select"; + public static final String RPCORE_NOCOPY_FLAG = "-nocopy"; // Non-unique flags - public static final String PARAM_CORE_EFSM_FLAG = "-param-fsm"; - public static final String PARAM_CORE_EFSM_PNG_FLAG = "-param-fsmpng"; - public static final String PARAM_CORE_API_GEN_FLAG = "-param-api"; + public static final String RPCORE_EFSM_FLAG = "-param-fsm"; + public static final String RPCORE_EFSM_PNG_FLAG = "-param-fsmpng"; + public static final String RPCORE_API_GEN_FLAG = "-param-api"; - private static final Map PARAM_UNIQUE_FLAGS = new HashMap<>(); + private static final Map RPCORE_UNIQUE_FLAGS = new HashMap<>(); { - RPCoreCLArgParser.PARAM_UNIQUE_FLAGS.put(RPCoreCLArgParser.PARAM_CORE_PARAM_FLAG, RPCoreCLArgFlag.PARAM_CORE_PARAM); - RPCoreCLArgParser.PARAM_UNIQUE_FLAGS.put(RPCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG, RPCoreCLArgFlag.PARAM_CORE_NO_COPY); + RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_PARAM_FLAG, RPCoreCLArgFlag.RPCORE_PARAM); + RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_NOCOPY_FLAG, RPCoreCLArgFlag.RPCORE_NO_COPY); } - private static final Map PARAM_NON_UNIQUE_FLAGS = new HashMap<>(); + private static final Map RPCORE_NON_UNIQUE_FLAGS = new HashMap<>(); { - RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(RPCoreCLArgParser.PARAM_CORE_EFSM_FLAG, RPCoreCLArgFlag.PARAM_CORE_EFSM); - RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(RPCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG, RPCoreCLArgFlag.PARAM_CORE_EFSM_PNG); - RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.put(RPCoreCLArgParser.PARAM_CORE_API_GEN_FLAG, RPCoreCLArgFlag.PARAM_CORE_API_GEN); + RPCoreCLArgParser.RPCORE_NON_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_EFSM_FLAG, RPCoreCLArgFlag.RPCORE_EFSM); + RPCoreCLArgParser.RPCORE_NON_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_EFSM_PNG_FLAG, RPCoreCLArgFlag.RPCORE_EFSM_PNG); + RPCoreCLArgParser.RPCORE_NON_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_API_GEN_FLAG, RPCoreCLArgFlag.RPCORE_API_GEN); } - private static final Map PARAM_FLAGS = new HashMap<>(); + private static final Map RPCORE_FLAGS = new HashMap<>(); { - RPCoreCLArgParser.PARAM_FLAGS.putAll(RPCoreCLArgParser.PARAM_UNIQUE_FLAGS); - RPCoreCLArgParser.PARAM_FLAGS.putAll(RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS); + RPCoreCLArgParser.RPCORE_FLAGS.putAll(RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS); + RPCoreCLArgParser.RPCORE_FLAGS.putAll(RPCoreCLArgParser.RPCORE_NON_UNIQUE_FLAGS); } - private final Map paramParsed = new HashMap<>(); + private final Map rpParsed = new HashMap<>(); public RPCoreCLArgParser(String[] args) throws CommandLineException { @@ -47,13 +48,13 @@ public RPCoreCLArgParser(String[] args) throws CommandLineException public Map getParamArgs() throws CommandLineException { //super.parseArgs(); // Needed - return this.paramParsed; + return this.rpParsed; } @Override protected boolean isFlag(String arg) { - return RPCoreCLArgParser.PARAM_FLAGS.containsKey(arg) || super.isFlag(arg); + return RPCoreCLArgParser.RPCORE_FLAGS.containsKey(arg) || super.isFlag(arg); } // Pre: i is the index of the current flag to parse @@ -65,22 +66,16 @@ protected int parseFlag(int i) throws CommandLineException switch (flag) { // Unique flags - - case RPCoreCLArgParser.PARAM_CORE_PARAM_FLAG: - { - return paramParseParam(i); - } - case RPCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG: return paramParseNoCopy(i); + case RPCoreCLArgParser.RPCORE_PARAM_FLAG: return rpParseParam(i); + case RPCoreCLArgParser.RPCORE_SELECT_BRANCH_FLAG: return rpParseSelectBranch(i); + case RPCoreCLArgParser.RPCORE_NOCOPY_FLAG: return rpParseNoCopy(i); - // Non-unique flags - case RPCoreCLArgParser.PARAM_CORE_EFSM_FLAG: return paramParseRoleArg(flag, i); - case RPCoreCLArgParser.PARAM_CORE_EFSM_PNG_FLAG: return paramParseRoleAndFileArgs(flag, i); - case RPCoreCLArgParser.PARAM_CORE_API_GEN_FLAG: return paramParsePackagePathAndRoleArgs(flag, i); + case RPCoreCLArgParser.RPCORE_EFSM_FLAG: return rpParseRoleArg(flag, i); + case RPCoreCLArgParser.RPCORE_EFSM_PNG_FLAG: return rpParseRoleAndFileArgs(flag, i); + case RPCoreCLArgParser.RPCORE_API_GEN_FLAG: return rpParsePackagePathAndRoleArgs(flag, i); - // Base CL - default: { return super.parseFlag(i); @@ -88,36 +83,42 @@ protected int parseFlag(int i) throws CommandLineException } } - private int paramParseParam(int i) throws CommandLineException + private int rpParseParam(int i) throws CommandLineException { if ((i + 1) >= this.args.length) { throw new CommandLineException("Missing simple global protocol name argument."); } String proto = this.args[++i]; - paramCheckAndAddUniqueFlag(RPCoreCLArgParser.PARAM_CORE_PARAM_FLAG, new String[] { proto }); + rpCheckAndAddUniqueFlag(RPCoreCLArgParser.RPCORE_PARAM_FLAG, new String[] { proto }); + return i; + } + + private int rpParseSelectBranch(int i) throws CommandLineException + { + rpCheckAndAddUniqueFlag(RPCoreCLArgParser.RPCORE_SELECT_BRANCH_FLAG, new String[] { }); return i; } - private int paramParseNoCopy(int i) throws CommandLineException + private int rpParseNoCopy(int i) throws CommandLineException { - paramCheckAndAddUniqueFlag(RPCoreCLArgParser.PARAM_CORE_NOCOPY_FLAG, new String[] { }); + rpCheckAndAddUniqueFlag(RPCoreCLArgParser.RPCORE_NOCOPY_FLAG, new String[] { }); return i; } - private void paramCheckAndAddUniqueFlag(String flag, String[] args) throws CommandLineException + private void rpCheckAndAddUniqueFlag(String flag, String[] args) throws CommandLineException { - RPCoreCLArgFlag argFlag = RPCoreCLArgParser.PARAM_UNIQUE_FLAGS.get(flag); - if (this.paramParsed.containsKey(argFlag)) + RPCoreCLArgFlag argFlag = RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.get(flag); + if (this.rpParsed.containsKey(argFlag)) { throw new CommandLineException("Duplicate flag: " + flag); } - this.paramParsed.put(argFlag, args); + this.rpParsed.put(argFlag, args); } - private int paramParseRoleArg(String f, int i) throws CommandLineException + private int rpParseRoleArg(String f, int i) throws CommandLineException { - RPCoreCLArgFlag flag = RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + RPCoreCLArgFlag flag = RPCoreCLArgParser.RPCORE_NON_UNIQUE_FLAGS.get(f); if ((i + 1) >= this.args.length) { throw new CommandLineException("Missing role argument"); @@ -127,9 +128,9 @@ private int paramParseRoleArg(String f, int i) throws CommandLineException return i; } - protected int paramParseRoleAndFileArgs(String f, int i) throws CommandLineException + protected int rpParseRoleAndFileArgs(String f, int i) throws CommandLineException { - RPCoreCLArgFlag flag = RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + RPCoreCLArgFlag flag = RPCoreCLArgParser.RPCORE_NON_UNIQUE_FLAGS.get(f); if ((i + 2) >= this.args.length) { throw new CommandLineException("Missing role/file arguments"); @@ -141,9 +142,9 @@ protected int paramParseRoleAndFileArgs(String f, int i) throws CommandLineExcep } // path is absolute package path prefix for API imports - protected int paramParsePackagePathAndRoleArgs(String f, int i) throws CommandLineException + protected int rpParsePackagePathAndRoleArgs(String f, int i) throws CommandLineException { - RPCoreCLArgFlag flag = RPCoreCLArgParser.PARAM_NON_UNIQUE_FLAGS.get(f); + RPCoreCLArgFlag flag = RPCoreCLArgParser.RPCORE_NON_UNIQUE_FLAGS.get(f); if ((i + 2) >= this.args.length) { throw new CommandLineException("Missing role/path arguments"); @@ -171,7 +172,7 @@ private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException // FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag private void goConcatArgs(RPCoreCLArgFlag flag, String... toAdd) { - String[] args = this.paramParsed.get(flag); + String[] args = this.rpParsed.get(flag); if (args == null) { args = Arrays.copyOf(toAdd, toAdd.length); @@ -183,6 +184,6 @@ private void goConcatArgs(RPCoreCLArgFlag flag, String... toAdd) System.arraycopy(toAdd, 0, tmp, args.length, toAdd.length); args = tmp; } - this.paramParsed.put(flag, args); + this.rpParsed.put(flag, args); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 56dd9ea0b..03601f8a6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -48,7 +48,7 @@ // N.B. this is the CL for both -goapi and param-core extensions public class RPCoreCommandLine extends CommandLine { - protected final Map paramArgs; // Maps each flag to list of associated argument values + protected final Map rpArgs; // Maps each flag to list of associated argument values // HACK: store in (Core) Job/JobContext? protected GProtocolDecl gpd; @@ -74,7 +74,7 @@ private RPCoreCommandLine(RPCoreCLArgParser p) throws CommandLineException { throw new CommandLineException("No main module has been specified\r\n"); } - this.paramArgs = p.getParamArgs(); + this.rpArgs = p.getParamArgs(); } @Override @@ -89,7 +89,8 @@ protected RPCoreMainContext newMainContext() throws ScribParserException, Scribb boolean noAcceptCorrelationCheck = this.args.containsKey(CLArgFlag.NO_ACCEPT_CORRELATION_CHECK); boolean noValidation = this.args.containsKey(CLArgFlag.NO_VALIDATION); - boolean noCopy = this.paramArgs.containsKey(RPCoreCLArgFlag.PARAM_CORE_NO_COPY); + boolean selectApi = this.rpArgs.containsKey(RPCoreCLArgFlag.RPCORE_SELECT_BRANCH); + boolean noCopy = this.rpArgs.containsKey(RPCoreCLArgFlag.RPCORE_NO_COPY); List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) ? CommandLine.parseImportPaths(this.args.get(CLArgFlag.IMPORT_PATH)[0]) @@ -105,7 +106,7 @@ protected RPCoreMainContext newMainContext() throws ScribParserException, Scribb { Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); return new RPCoreMainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, noCopy); + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, noCopy, selectApi); } } @@ -117,7 +118,7 @@ public static void main(String[] args) throws CommandLineException, AntlrSourceE @Override protected void doValidationTasks(Job job) throws RPCoreSyntaxException, AntlrSourceException, ScribParserException, CommandLineException { - if (this.paramArgs.containsKey(RPCoreCLArgFlag.PARAM_CORE_PARAM)) + if (this.rpArgs.containsKey(RPCoreCLArgFlag.RPCORE_PARAM)) { doParamCoreValidationTasks((GoJob) job); } @@ -130,13 +131,14 @@ protected void doValidationTasks(Job job) throws RPCoreSyntaxException, AntlrSou @Override protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, CommandLineException { - if (this.paramArgs.containsKey(RPCoreCLArgFlag.PARAM_CORE_API_GEN)) + GoJob gjob = (GoJob) job; + if (this.rpArgs.containsKey(RPCoreCLArgFlag.RPCORE_API_GEN)) { JobContext jcontext = job.getContext(); - String[] args = this.paramArgs.get(RPCoreCLArgFlag.PARAM_CORE_API_GEN); + String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_API_GEN); for (int i = 0; i < args.length; i += 2) { - String simpname = this.paramArgs.get(RPCoreCLArgFlag.PARAM_CORE_PARAM)[0]; + String simpname = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_PARAM)[0]; GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); Role role = checkRoleArg(jcontext, fullname, args[i]); String impath = args[i+1]; @@ -151,7 +153,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co Map goClasses = new ParamCoreSTSessionApiBuilder((GoJob) job, fullname, this.E0).build();*/ //Map actuals = this.E0.get(role); - Map goClasses = new RPCoreSTApiGenerator(job, fullname, this.E0, impath, role).build(); + Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, this.E0, impath, role).build(); outputClasses(goClasses); } } @@ -171,7 +173,7 @@ private void doParamCoreValidationTasks(GoJob j) throws RPCoreSyntaxException, S paramCorePreContextBuilding(j); - GProtocolName simpname = new GProtocolName(this.paramArgs.get(RPCoreCLArgFlag.PARAM_CORE_PARAM)[0]); + GProtocolName simpname = new GProtocolName(this.rpArgs.get(RPCoreCLArgFlag.RPCORE_PARAM)[0]); if (simpname.toString().equals("[ParamCoreAllTest]")) // HACK: ParamCoreAllTest { paramCoreParseAndCheckWF(j); // Includes base passes @@ -418,9 +420,9 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws @Override protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleException { - if (this.paramArgs.containsKey(RPCoreCLArgFlag.PARAM_CORE_EFSM)) + if (this.rpArgs.containsKey(RPCoreCLArgFlag.RPCORE_EFSM)) { - String[] args = this.paramArgs.get(RPCoreCLArgFlag.PARAM_CORE_EFSM); + String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_EFSM); for (int i = 0; i < args.length; i += 1) { Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); @@ -431,9 +433,9 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce }); } } - if (this.paramArgs.containsKey(RPCoreCLArgFlag.PARAM_CORE_EFSM_PNG)) + if (this.rpArgs.containsKey(RPCoreCLArgFlag.RPCORE_EFSM_PNG)) { - String[] args = this.paramArgs.get(RPCoreCLArgFlag.PARAM_CORE_EFSM_PNG); + String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_EFSM_PNG); for (int i = 0; i < args.length; i += 2) { Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index b937eac1e..36622ebae 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -7,7 +7,7 @@ import java.util.stream.Collectors; import org.scribble.ext.go.core.type.RPRoleVariant; -import org.scribble.main.Job; +import org.scribble.ext.go.main.GoJob; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; import org.scribble.type.name.GProtocolName; @@ -16,7 +16,7 @@ // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTEndpointApiGenerator public class RPCoreSTApiGenerator { - public final Job job; + public final GoJob job; public final GProtocolName proto; // Full name public final Map> variants; @@ -25,7 +25,7 @@ public class RPCoreSTApiGenerator // FIXME: just a role name -- cf. CL arg // FIXME: any way to separate Session API (Protocol) from Endpoint/StateChan APIs? - public RPCoreSTApiGenerator(Job job, GProtocolName fullname, Map> variants, String packpath, Role self) + public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> variants, String packpath, Role self) { this.job = job; this.proto = fullname; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 914922915..8de928883 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -16,6 +16,7 @@ import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexVar; @@ -45,8 +46,13 @@ public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant va new RPCoreSTOutputStateBuilder(new RPCoreSTSplitActionBuilder(), new RPCoreSTSendActionBuilder()), new RPCoreSTReceiveStateBuilder(new RPCoreSTReduceActionBuilder(), new RPCoreSTReceiveActionBuilder()), - //new RPCoreSTSelectStateBuilder(new RPCoreSTSelectActionBuilder()), null, // Select-based branch - new RPCoreSTBranchStateBuilder(new RPCoreSTBranchActionBuilder()), new RPCoreSTCaseBuilder(new RPCoreSTCaseActionBuilder()), // Type switch branch + // Select-based branch, or type switch branch by default + (apigen.job.selectApi) + ? new RPCoreSTSelectStateBuilder(new RPCoreSTSelectActionBuilder()) + : new RPCoreSTBranchStateBuilder(new RPCoreSTBranchActionBuilder()), + (apigen.job.selectApi) + ? null + : new RPCoreSTCaseBuilder(new RPCoreSTCaseActionBuilder()), new RPCoreSTEndStateBuilder()); @@ -73,12 +79,15 @@ public Map build() // filepath -> source { if (s.getActions().size() > 1) { - // Select-based branch - //res.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); - - // Type switch -based branch - res.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); - res.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); + if (((GoJob) this.job).selectApi) // Select-based branch + { + res.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + } + else // Type switch -based branch + { + res.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + res.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); + } } else { @@ -157,9 +166,11 @@ protected String getStateChanPremable(EState s) public String buildAction(STActionBuilder ab, EState curr, EAction a) { EState succ = curr.getSuccessor(a); - if (getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1 - && this.bb instanceof RPCoreSTSelectStateBuilder) // HACK + if (((GoJob) this.job).selectApi && + getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1) + //&& this.bb instanceof RPCoreSTSelectStateBuilder) { + // HACK FIXME: move to action builder return "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" @@ -194,9 +205,11 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) { - if (getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1 - && this.bb instanceof RPCoreSTSelectStateBuilder) // HACK + if (((GoJob) this.job).selectApi && + getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) + //&& this.bb instanceof RPCoreSTSelectStateBuilder) { + // HACK FIXME: move to action builder return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "NewBranchInit()"; // For branch states (hacky?) // FIXME: factor out with RPCoreSTSessionApiBuilder and RPCoreSTSelectStateBuilder#getPreamble /*+ ((succ.id != this.graph.init.id) ? getStateChanName(succ) : "Init") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java index d5f66a044..7d92c4818 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java @@ -17,23 +17,25 @@ public class RPCoreMainContext extends MainContext { + protected final boolean selectApi; protected final boolean noCopy; // Load main module from file system public RPCoreMainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean noCopy) + boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean noCopy, boolean selectApi) throws ScribParserException, ScribbleException { super(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); this.noCopy = noCopy; + this.selectApi = selectApi; } @Override - public GoJob newJob() + public GoJob newJob() // FIXME: make RPCoreJob? { return new GoJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, - this.af, this.ef, this.sf, this.noCopy); + this.af, this.ef, this.sf, this.noCopy, this.selectApi); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java b/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java index 687901d3d..c32ee16a5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java @@ -11,15 +11,17 @@ public class GoJob extends Job { + public final boolean selectApi; public final boolean noCopy; public GoJob(boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, - AstFactory af, EModelFactory ef, SModelFactory sf, boolean noCopy) + AstFactory af, EModelFactory ef, SModelFactory sf, boolean noCopy, boolean selectApi) { super(debug, parsed, main, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, af, ef, sf); this.noCopy = noCopy; + this.selectApi = selectApi; } /*// FIXME: move to MainContext::newJob? diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java index 6aaacdcb9..fde6ef1af 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java @@ -22,6 +22,6 @@ public GoJob newJob() { return new GoJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, - this.af, this.ef, this.sf, false); + this.af, this.ef, this.sf, false, false); } } From 1e0b2c77c1af490239e385656672a4775188dcf4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 13:37:00 +0100 Subject: [PATCH 225/433] Minor. --- .../java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java index b3b0e7043..506e9e680 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java @@ -22,6 +22,7 @@ public class RPCoreCLArgParser extends CLArgParser private static final Map RPCORE_UNIQUE_FLAGS = new HashMap<>(); { RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_PARAM_FLAG, RPCoreCLArgFlag.RPCORE_PARAM); + RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_SELECT_BRANCH_FLAG, RPCoreCLArgFlag.RPCORE_SELECT_BRANCH); RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_NOCOPY_FLAG, RPCoreCLArgFlag.RPCORE_NO_COPY); } From 9cf3bc39bf6146b939b90de7604f9954397c86ab Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 14:19:10 +0100 Subject: [PATCH 226/433] Minor. --- .../RPCoreSTSelectActionBuilder.java | 30 ++++++++-- .../RPCoreSTStateChanApiBuilder.java | 58 +++++++------------ 2 files changed, 48 insertions(+), 40 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index 8ce0b00dc..b8ff57290 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -5,6 +5,7 @@ import org.scribble.codegen.statetype.STBranchActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.codegen.statetype3.RPCoreSTStateChanApiBuilder.RPCoreEStateKind; import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; @@ -13,9 +14,31 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; +// Case/Recv action on select case objects // N.B. Select means Go select statement for input-choice; not output-choice public class RPCoreSTSelectActionBuilder extends STBranchActionBuilder { + @Override + public String build(STStateChanApiBuilder api, EState curr, EAction a) + { + EState succ = curr.getSuccessor(a); + if (//((GoJob) api.job).selectApi && + RPCoreSTStateChanApiBuilder.getStateKind(curr) == RPCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1) + { + // HACK FIXME: move to action builder + return + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + + " *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + + buildArgs(api, a) + + ") <-chan *" + getReturnType(api, curr, succ) + " {\n" + + buildBody(api, curr, a, succ) + "\n" + + "}"; + } + else + { + return super.build(api, curr, a); + } + } @Override public String getActionName(STStateChanApiBuilder api, EAction a) @@ -42,7 +65,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat if(a.payload.elems.size() > 1) { - throw new RuntimeException("[param-core] TODO: " + a); + throw new RuntimeException("[rp-core] TODO: " + a); } boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> @@ -50,7 +73,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat ((RPCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet)); if (isDeleg) { - throw new RuntimeException("[param-core] TODO: " + a); + throw new RuntimeException("[rp-core] TODO: " + a); } String res = "_, selected := <-s._" + a.mid + "_Chan\n" @@ -69,7 +92,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { if (a.payload.elems.size() > 1) { - throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); + throw new RuntimeException("[rp-core] TODO: payload size > 1: " + a); } if (((GoJob) api.job).noCopy) @@ -84,7 +107,6 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "ch := make(chan *" + apigen.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" + "ch <- " + apigen.getSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args - } return res + "return ch"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 8de928883..1233effe2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -161,38 +161,24 @@ protected String getStateChanPremable(EState s) return res; } + // "Base case" -- more specific versions should be overriden in action builders // Here because action builder hierarchy not suitable (extended by action kind, not by target language) @Override public String buildAction(STActionBuilder ab, EState curr, EAction a) { EState succ = curr.getSuccessor(a); - if (((GoJob) this.job).selectApi && - getStateKind(curr) == ParamCoreEStateKind.CROSS_RECEIVE && curr.getActions().size() > 1) - //&& this.bb instanceof RPCoreSTSelectStateBuilder) - { - // HACK FIXME: move to action builder - return - "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER - + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(this, a) - + ") <-chan *" + ab.getReturnType(this, curr, succ) + " {\n" - + ab.buildBody(this, curr, a, succ) + "\n" - + "}"; - } - else - { - return - "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER - + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(this, a) - + ") *" + ab.getReturnType(this, curr, succ) + " {\n" - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE - + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" - + ab.buildBody(this, curr, a, succ) + "\n" - + "}"; - } + return + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(this, a) + + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + ab.buildBody(this, curr, a, succ) + "\n" + + "}"; } + // "Base case" -- more specific versions should be overriden in action builders // FIXME: refactor action builders as interfaces and use generic parameter for kind @Override public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) @@ -205,15 +191,15 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) { + // Needs to be here (not in action builder) -- build (hacked) return for all state kinds if (((GoJob) this.job).selectApi && - getStateKind(succ) == ParamCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) - //&& this.bb instanceof RPCoreSTSelectStateBuilder) + getStateKind(succ) == RPCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { - // HACK FIXME: move to action builder return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." - + "NewBranchInit()"; // For branch states (hacky?) // FIXME: factor out with RPCoreSTSessionApiBuilder and RPCoreSTSelectStateBuilder#getPreamble - /*+ ((succ.id != this.graph.init.id) ? getStateChanName(succ) : "Init") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case - + "()";*/ + + "NewBranch" // For branch states (hacky?) // FIXME: factor out with RPCoreSTSessionApiBuilder and RPCoreSTSelectStateBuilder#getPreamble + //+ ((succ.id != this.graph.init.id) ? getStateChanName(succ) : "Init") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case + + getStateChanName(succ) + + "()"; } else { @@ -359,22 +345,22 @@ protected String batesHack(PayloadElemType t) // FIXME: make a ParamCoreEState - protected enum ParamCoreEStateKind { CROSS_SEND, CROSS_RECEIVE, DOT_SEND, DOT_RECEIVE, MULTICHOICES_RECEIVE, TERMINAL } + protected enum RPCoreEStateKind { CROSS_SEND, CROSS_RECEIVE, DOT_SEND, DOT_RECEIVE, MULTICHOICES_RECEIVE, TERMINAL } - protected static ParamCoreEStateKind getStateKind(EState s) + protected static RPCoreEStateKind getStateKind(EState s) { List as = s.getActions(); if (as.isEmpty()) { - return ParamCoreEStateKind.TERMINAL; + return RPCoreEStateKind.TERMINAL; } else if (as.stream().allMatch(a -> a instanceof RPCoreECrossSend)) { - return ParamCoreEStateKind.CROSS_SEND; + return RPCoreEStateKind.CROSS_SEND; } else if (as.stream().allMatch(a -> a instanceof RPCoreECrossReceive)) { - return ParamCoreEStateKind.CROSS_RECEIVE; + return RPCoreEStateKind.CROSS_RECEIVE; } /*else if (as.stream().allMatch(a -> a instanceof RPCoreEDotSend)) // FIXME: CFSMs should have only !^1, ! and ? { From 56189a98c57d5254464c6bd697be489a2e9a679c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 14:22:12 +0100 Subject: [PATCH 227/433] Minor. --- .../go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 1233effe2..f46addb93 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -191,10 +191,10 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) { - // Needs to be here (not in action builder) -- build (hacked) return for all state kinds if (((GoJob) this.job).selectApi && getStateKind(succ) == RPCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { + // Needs to be here (not in action builder) -- build (hacked) return for all state kinds return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "NewBranch" // For branch states (hacky?) // FIXME: factor out with RPCoreSTSessionApiBuilder and RPCoreSTSelectStateBuilder#getPreamble //+ ((succ.id != this.graph.init.id) ? getStateChanName(succ) : "Init") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case From fbb33d076a939efd7448044a42a78d24226daa76 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 14:48:40 +0100 Subject: [PATCH 228/433] Continued revising rp-core API gen. --- .../statetype3/RPCoreSTBranchStateBuilder.java | 9 ++++----- .../statetype3/RPCoreSTSessionApiBuilder.java | 5 ++++- .../statetype3/RPCoreSTStateChanApiBuilder.java | 13 +++++++------ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java index e7ea491bd..9aef524a7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java @@ -3,7 +3,6 @@ import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.model.endpoint.EState; -import org.scribble.type.name.GProtocolName; // Type switch branch -- cf., RPCoreSTSelectStateBuilder public class RPCoreSTBranchStateBuilder extends STBranchStateBuilder @@ -19,13 +18,13 @@ public String getPreamble(STStateChanApiBuilder api, EState s) { RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; - GProtocolName simpname = rpapi.apigen.proto.getSimpleName(); + /*GProtocolName simpname = rpapi.apigen.proto.getSimpleName(); String scTypeName = rpapi.getStateChanName(s); - String epTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, rpapi.variant); + String epTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, rpapi.variant); */ String res = rpapi.getStateChanPremable(s); - // Explicit constructor -- for compatibility with RPCoreSTSelectStateBuilder + /*// Explicit constructor -- for compatibility with RPCoreSTSelectStateBuilder -- not currently needed: assuming select/typeswitch API gen mutually exclusive res += "\n" + "func (ep *" + epTypeName + ") NewBranchInit" // FIXME: factor out + "() *" + scTypeName + " {\n" @@ -33,7 +32,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ") " + "}\n" + "return s\n" - + "}\n"; + + "}\n";*/ return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 19ba84a2b..48ece6cea 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -173,9 +173,12 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< + "func (ini *" + epkindTypeName + ") Run(f func(*Init) End) *End {\n" // f specifies non-pointer End + "ini.Use()\n" // FIXME: int-counter linearity + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".CheckConnection()\n" - + ((this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) // FIXME: type-switch? + + // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) + + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) ? "end := f(ini.NewBranchInit())\n" // FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble : "end := f(&Init{ new(session.LinearResource), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + + "return &end\n" + "}"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index f46addb93..244fdc6e3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -126,6 +126,7 @@ public String getFilePath(String filename) + "/" + filename + ".go"; } + // Factored out here from state-specific builders protected String getStateChanPremable(EState s) { GProtocolName simpname = this.apigen.proto.getSimpleName(); @@ -140,13 +141,13 @@ protected String getStateChanPremable(EState s) // FIXME: error handling via Err field -- fallback should be panic + "import \"log\"\n" - // FIXME: refactor into state-specific builders + // FIXME: refactor back into state-specific builders + ((s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) ? s.getActions().stream().flatMap(a -> a.payload.elems.stream()).collect(Collectors.toSet()).stream() .map(p -> makeExtNameImport((DataType) p)).collect(Collectors.joining("")) : "") - // FIXME: refactor into state-specific builders + // FIXME: refactor back into state-specific builders + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) ? "import \"sort\"\n\nvar _ = sort.Sort\n" : "") @@ -169,9 +170,9 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) EState succ = curr.getSuccessor(a); return "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER - + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" - + ab.buildArgs(this, a) - + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + + ab.buildArgs(this, a) + + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + ab.buildBody(this, curr, a, succ) + "\n" @@ -264,7 +265,7 @@ else if (e instanceof RPIndexVar) } else { - throw new RuntimeException("[param-core] TODO: " + e); + throw new RuntimeException("[rp-core] TODO: " + e); } } From 7b5b87c03ecb1852c45d92900f2f5a5459f9bbb1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 14:51:13 +0100 Subject: [PATCH 229/433] Minor. --- .../go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 48ece6cea..249dfefba 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -169,14 +169,16 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n"; + // Top-level Run method epkindFile += "\n" + "func (ini *" + epkindTypeName + ") Run(f func(*Init) End) *End {\n" // f specifies non-pointer End + "ini.Use()\n" // FIXME: int-counter linearity + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".CheckConnection()\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) + // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) - ? "end := f(ini.NewBranchInit())\n" // FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble + ? "end := f(ini.NewBranchInit())\n" : "end := f(&Init{ new(session.LinearResource), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + "return &end\n" From ac70f92d15996abd7ab8a415385267a0f8717aea Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 17:05:47 +0100 Subject: [PATCH 230/433] [rp-core] Removed param decls from protocol sigs. -a --- .../org/scribble/ext/go/ast/RPDefaultDel.java | 10 +++ .../java/org/scribble/ext/go/ast/RPDel.java | 20 +++++ .../org/scribble/ext/go/ast/RPDelBase.java | 54 +++++++++++ .../core/visit/RPCoreIndexVarCollector.java | 90 +++++++++++++++++++ 4 files changed, 174 insertions(+) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/RPDefaultDel.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/RPDel.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/RPDelBase.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/visit/RPCoreIndexVarCollector.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPDefaultDel.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPDefaultDel.java new file mode 100644 index 000000000..daae7be2d --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPDefaultDel.java @@ -0,0 +1,10 @@ +package org.scribble.ext.go.ast; + +// Cf. DefaultDel +public class RPDefaultDel extends RPDelBase +{ + public RPDefaultDel() + { + + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPDel.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPDel.java new file mode 100644 index 000000000..88292a85c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPDel.java @@ -0,0 +1,20 @@ +package org.scribble.ext.go.ast; + +import org.scribble.ast.ScribNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; +import org.scribble.main.ScribbleException; + +public interface RPDel extends ScribDel +{ + + default void enterIndexVarCollection(ScribNode parent, ScribNode child, RPCoreIndexVarCollector coll) + { + + } + + default ScribNode leaveIndexVarCollection(ScribNode parent, ScribNode child, RPCoreIndexVarCollector coll, ScribNode visited) throws ScribbleException + { + return visited; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPDelBase.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPDelBase.java new file mode 100644 index 000000000..e43ff20a8 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPDelBase.java @@ -0,0 +1,54 @@ +package org.scribble.ext.go.ast; + +import org.scribble.ast.ScribNode; +import org.scribble.del.ScribDel; +import org.scribble.visit.EnvVisitor; +import org.scribble.visit.env.Env; + +// Mutable for pass-specific Envs (by visitors) +// Only used by RPDefaultDel? -- concrete RPDel's should extend base Dels and implement RPDel i/face +public abstract class RPDelBase implements RPDel +{ + private Env env; + + public RPDelBase() + { + + } + + @Override + public Env env() + { + return this.env; + } + + // "setEnv" rather than "env" as a non-defensive setter (cf. ModelNodeBase#del) + @Override + //protected void setEnv(Env env) + public void setEnv(Env env) + { + this.env = env; + } + + public static > void pushVisitorEnv(ScribDel del, EnvVisitor ev) + { + T env = castEnv(ev, ev.peekEnv().enterContext()); // By default: copy + ev.pushEnv(env); + } + + public static , T2 extends ScribNode> + T2 popAndSetVisitorEnv(ScribDel del, EnvVisitor ev, T2 visited) + { + // No merge here: merging of child contexts into parent context is handled "manually" for each pass and (compound) interaction node as needed (e.g. WF-choice and reachability) + T1 env = ev.popEnv(); + ((RPDelBase) del).setEnv(env); + return visited; + } + + private static > T castEnv(EnvVisitor ev, Env env) + { + @SuppressWarnings("unchecked") + T tmp = (T) env; + return tmp; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/visit/RPCoreIndexVarCollector.java b/scribble-go/src/main/java/org/scribble/ext/go/core/visit/RPCoreIndexVarCollector.java new file mode 100644 index 000000000..ba413bc52 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/visit/RPCoreIndexVarCollector.java @@ -0,0 +1,90 @@ +package org.scribble.ext.go.core.visit; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import org.scribble.ast.ScribNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.RPDel; +import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.main.Job; +import org.scribble.main.ScribbleException; +import org.scribble.visit.NoEnvInlinedProtocolVisitor; + +// FIXME: move out of Core to main RP +// Duplicated from EGraphBuilder +public class RPCoreIndexVarCollector extends NoEnvInlinedProtocolVisitor +{ + private final Set ivars = new HashSet<>(); + + public RPCoreIndexVarCollector(Job job) + { + super(job); + } + + public void clear() + { + this.ivars.clear(); + } + + public void addIndexVars(Collection ivars) + { + this.ivars.addAll(ivars); + } + + public Set getIndexVars() + { + return new HashSet<>(this.ivars); + } + + /*// Override visitInlinedProtocol -- not visit, or else enter/exit is lost + @Override + public ScribNode visitInlinedProtocol(ScribNode parent, ScribNode child) throws ScribbleException + { + if (child instanceof LInteractionSeq) + { + return visitOverrideForLInteractionSeq((LProtocolBlock) parent, (LInteractionSeq) child); + } + else if (child instanceof LChoice) + { + return visitOverrideForLChoice((LInteractionSeq) parent, (LChoice) child); + } + else + { + return super.visitInlinedProtocol(parent, child); + } + } + + protected LInteractionSeq visitOverrideForLInteractionSeq(LProtocolBlock parent, LInteractionSeq child) throws ScribbleException + { + return ((LInteractionSeqDel) child.del()).visitForFsmConversion(this, child); + } + + protected LChoice visitOverrideForLChoice(LInteractionSeq parent, LChoice child) + { + return ((LChoiceDel) child.del()).visitForFsmConversion(this, child); + }*/ + + @Override + protected final void inlinedEnter(ScribNode parent, ScribNode child) throws ScribbleException + { + super.inlinedEnter(parent, child); + ScribDel del = child.del(); + if (del instanceof RPDel) + { + ((RPDel) child.del()).enterIndexVarCollection(parent, child, this); + } + } + + @Override + protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException + { + ScribDel del = visited.del(); + if (del instanceof RPDel) + { + visited = ((RPDel) visited.del()).leaveIndexVarCollection(parent, child, this, visited); + } + return super.inlinedLeave(parent, child, visited); + } +} From 423a6210b7347662e7a735a85cb191b84f258967 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 17:07:19 +0100 Subject: [PATCH 231/433] [rp-core] Removed param decls from protocol sigs. --- .../org/scribble/parser/antlr/ParamScribble.g | 21 ++----- .../scribble/ext/go/ast/RPAstFactoryImpl.java | 9 +++ .../statetype3/RPCoreSTSessionApiBuilder.java | 58 ++++++++++--------- .../ext/go/del/global/RPGChoiceDel.java | 12 +++- .../go/del/global/RPGMessageTransferDel.java | 16 ++++- .../parser/scribble/ast/RPAntlrRoleDecl.java | 1 + .../ext/go/type/index/RPIndexVar.java | 2 +- 7 files changed, 74 insertions(+), 45 deletions(-) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index b7b209ba3..4b3225113 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -174,7 +174,7 @@ tokens PARAM_BININDEXEXPR = 'PARAM_BININDEXEXPR'; // FIXME: rename bin part - PARAM_ROLEDECL = 'PARAM_ROLEDECL'; + //PARAM_ROLEDECL = 'PARAM_ROLEDECL'; PARAM_GLOBALCROSSMESSAGETRANSFER = 'PARAM_GLOBALCROSSMESSAGETRANSFER'; PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; PARAM_GLOBALCHOICE = 'PARAM_GLOBALCHOICE'; @@ -599,10 +599,10 @@ roledecl: -> ^(ROLEDECL rolename) -| +/*| ROLE_KW rolename '(' simplename (',' simplename)* ')' -> - ^(PARAM_ROLEDECL rolename simplename+) + ^(PARAM_ROLEDECL rolename simplename+)*/ ; parameterdecllist: @@ -688,24 +688,15 @@ globalmessagetransfer: ^(GLOBALMESSAGETRANSFER message rolename rolename+) | - message FROM_KW rolename '[' paramindexexpr '..' paramindexexpr ']' TO_KW rolename '[' paramindexexpr '..' paramindexexpr ']' ';' + message FROM_KW rolename '[' paramindexexpr ',' paramindexexpr ']' TO_KW rolename '[' paramindexexpr ',' paramindexexpr ']' ';' -> ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr) -| +/*| message DOT_KW rolename '[' paramindexexpr '..' paramindexexpr ']' TO_KW rolename '[' paramindexexpr '..' paramindexexpr ']' ';' -> - ^(PARAM_GLOBALDOTMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr) + ^(PARAM_GLOBALDOTMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr)*/ ; -/*| - message FROM_KW rolename '[' simplename '..' simplename ']' TO_KW rolename '[' simplename '..' simplename ']' ';' --> - ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename simplename simplename simplename simplename) -| - message DOT_KW rolename '[' simplename '..' simplename ']' TO_KW rolename '[' simplename '..' simplename ']' ';' --> - ^(PARAM_GLOBALDOTMESSAGETRANSFER message rolename rolename simplename simplename simplename simplename) -;*/ paramindexexpr: unaryparamindexexpr (op=('+' | '-' | '*') unaryparamindexexpr)? diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index 66a0ee627..4000106cd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -70,6 +70,7 @@ public RPGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, Rol return mt; } + // FIXME: deprecate -- pipe/pair instead @Override public RPGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd) @@ -89,6 +90,7 @@ public RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr return gc; } + // FIXME: deprecate -- explicit foreach instead @Override public RPGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, List blocks) @@ -98,6 +100,7 @@ public RPGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, RPIn return gc; } + // FIXME: deprecate -- explicit foreach instead @Override public RPGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, RPIndexVar var, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd) @@ -138,4 +141,10 @@ public RPCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, Stri return dtd; } + + @Override + protected RPDel createDefaultDelegate() + { + return new RPDefaultDel(); + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 249dfefba..7c3499d13 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -10,7 +10,9 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ext.go.ast.RPRoleDecl; import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -79,34 +81,36 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map + for (Role rname : rolenames) + { + for (RPRoleVariant variant : this.apigen.variants.get(rname).keySet()) + { + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); + RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); + try { - Set variants = this.apigen.variants.get(rname).keySet(); - return - variants.stream().map(variant -> - { - String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); - List decls = - gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(variant.getName())) - .map(rd -> (RPRoleDecl) rd).collect(Collectors.toList()); - if (decls.size() > 1) - { - throw new RuntimeException("Shouldn't get in here: " + variant); - } - List ivars = decls.stream().flatMap(d -> d.params.stream()).collect(Collectors.toList()); - // FIXME: get index vars from protocol body -- index var decls in sig now deprecated - - // Endpoint Kind constructor -- makes index var value maps - return "func (p *" + simpname + ") New" + "_" + epkindTypeName - + "(" + ivars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" - + " *_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) + "." + epkindTypeName + " {\n" - + "params := make(map[string]int)\n" - + decls.iterator().next().params.stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) - + "return _" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + ".New" + "(p, params, self)\n" - + "}\n"; - }).collect(Collectors.joining("")); - }).collect(Collectors.joining("\n")); + gpd.accept(coll); + } + catch (ScribbleException e) + { + throw new RuntimeException("[rp-core] Shouldn't get in here: ", e); + } + List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList()); + + // Endpoint Kind constructor -- makes index var value maps + String tmp = "func (p *" + simpname + ") New" + "_" + epkindTypeName + + "(" + ivars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" + + " *_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) + "." + epkindTypeName + " {\n" + + "params := make(map[string]int)\n" + //+ decls.iterator().next().params + + ivars + .stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) + + "return _" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + ".New" + "(p, params, self)\n" + + "}\n"; + + protoFile += "\n" + tmp; + } + } res.put(basedir + simpname + ".go", protoFile); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java index df8972625..45668cd83 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java @@ -9,12 +9,14 @@ import org.scribble.del.ScribDelBase; import org.scribble.del.global.GChoiceDel; import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.RPDel; import org.scribble.ext.go.ast.global.RPGChoice; +import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.main.ScribbleException; import org.scribble.visit.ProtocolDefInliner; import org.scribble.visit.env.InlineProtocolEnv; -public class RPGChoiceDel extends GChoiceDel +public class RPGChoiceDel extends GChoiceDel implements RPDel { @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException @@ -31,4 +33,12 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc //return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); } + + @Override + public ScribNode leaveIndexVarCollection(ScribNode parent, ScribNode child, RPCoreIndexVarCollector coll, ScribNode visited) throws ScribbleException + { + RPGChoice c = (RPGChoice) visited; + coll.addIndexVars(c.expr.getVars()); // FIXME: subject should be PRIndexedRole, currently index expr is separate from RoleNode + return visited; + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java index d8338c43a..101216c19 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java @@ -5,11 +5,14 @@ import org.scribble.ast.ScribNode; import org.scribble.ast.global.GMessageTransfer; import org.scribble.del.global.GMessageTransferDel; +import org.scribble.ext.go.ast.RPDel; +import org.scribble.ext.go.ast.global.RPGMessageTransfer; +import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.main.ScribbleException; import org.scribble.type.name.Role; import org.scribble.visit.wf.NameDisambiguator; -public class RPGMessageTransferDel extends GMessageTransferDel +public class RPGMessageTransferDel extends GMessageTransferDel implements RPDel { public RPGMessageTransferDel() { @@ -29,4 +32,15 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisa } return gmt; } + + @Override + public ScribNode leaveIndexVarCollection(ScribNode parent, ScribNode child, RPCoreIndexVarCollector coll, ScribNode visited) throws ScribbleException + { + RPGMessageTransfer mt = (RPGMessageTransfer) visited; + coll.addIndexVars(mt.srcRangeStart.getVars()); + coll.addIndexVars(mt.srcRangeEnd.getVars()); + coll.addIndexVars(mt.destRangeStart.getVars()); + coll.addIndexVars(mt.destRangeEnd.getVars()); + return visited; + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java index 8976978a6..e90786a50 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java @@ -34,6 +34,7 @@ public static CommonTree getNameChild(CommonTree root) return (CommonTree) root.getChild(NAME_CHILD_INDEX); } + // FIXME: deprecate public static List getParamChildren(CommonTree root) { List children = root.getChildren(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java index 4b2fae42c..e75659703 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java @@ -6,7 +6,7 @@ import org.scribble.ext.go.type.name.RPRoleParam; // Variable occurrence -public class RPIndexVar extends RPIndexExpr +public class RPIndexVar extends RPIndexExpr // FIXME: extend AbstractName? cf. Role -- e.g., for compatibility with NameCollector { public final String name; From 1d8755c1d9499f85aaae6533fc9337da5f0e3e3f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 17:47:11 +0100 Subject: [PATCH 232/433] [rp-core] Refactored params as Endpoint fields in API gen. --- .../statetype3/RPCoreSTSendActionBuilder.java | 2 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 39 ++++++++++++------- .../RPCoreSTStateChanApiBuilder.java | 3 +- .../scribble/ast/index/RPAntlrIndexExpr.java | 19 ++++++++- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 222666214..a35926565 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -61,7 +61,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // FIXME: single arg // Currently never true because of RPCoreSTOutputStateBuilder boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> - //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem + //pet.isGDelegationType() // FIXME: currently deleg specified by ParamCoreDelegDecl, not GDelegationElem rpapi.isDelegType((DataType) pet)); String res = "for i, j := " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + ", 0;" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 7c3499d13..87b20f36e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -8,7 +8,6 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.ext.go.ast.RPRoleDecl; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.ext.go.type.index.RPIndexVar; @@ -85,17 +84,18 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList()); + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); // Endpoint Kind constructor -- makes index var value maps String tmp = "func (p *" + simpname + ") New" + "_" + epkindTypeName @@ -105,7 +105,9 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) - + "return _" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + ".New" + "(p, params, self)\n" + + "return _" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + ".New" + "(p" //", params" + + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + + ", self)\n" + "}\n"; protoFile += "\n" + tmp; @@ -115,6 +117,7 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map gpd, String basedir, Map res) { GProtocolName simpname = this.apigen.proto.getSimpleName(); @@ -130,15 +133,18 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< Set variants = this.apigen.variants.get(rname).keySet(); for (RPRoleVariant variant : variants) { - String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); - List decls = - gpd.getHeader().roledecls.getDecls().stream().filter(rd -> rd.getDeclName().equals(variant.getName())) - .map(rd -> (RPRoleDecl) rd).collect(Collectors.toList()); - if (decls.size() > 1) + RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); + try { - throw new RuntimeException("Shouldn't get in here: " + variant); + gpd.accept(coll); // FIXME: should be lpd } - // FIXME: get index vars from protocol body -- index var decls in sig now deprecated + catch (ScribbleException e) + { + throw new RuntimeException("[rp-core] Shouldn't get in here: ", e); + } + + List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList()); + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); String epkindFile = epkindImports + "\n" @@ -148,17 +154,22 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< + "Self int\n" + "*session.LinearResource\n" + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + " *" + RPCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" - + "Params map[string]int\n" + //+ "Params map[string]int\n" + + ivars.stream().map(x -> x + " int\n").collect(Collectors.joining("")) + "}\n" // Endpoint Kind type constructor -- makes connection maps + "\n" - + "func New(p session.Protocol, params map[string]int, self int) *" + epkindTypeName + " {\n" + + "func New(p session.Protocol, " //+"params map[string]int," + + ivars.stream().map(x -> x + " int, ").collect(Collectors.joining("")) + + "self int) *" + epkindTypeName + " {\n" + "conns := make(map[string]map[int]transport.Channel)\n" + this.apigen.variants.entrySet().stream() .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + "make(map[int]transport.Channel)\n") .collect(Collectors.joining("")) - + "return &" + epkindTypeName + "{p, self, &session.LinearResource{}, session.NewEndpoint(self, conns), params}\n" + + "return &" + epkindTypeName + "{p, self, &session.LinearResource{}, session.NewEndpoint(self, conns)" //"params + + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + + "}\n" + "}\n" // Dial/Accept methdos -- FIXME: internalise peers diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 244fdc6e3..f74eaf2a2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -261,7 +261,8 @@ public static String generateIndexExpr(RPIndexExpr e) else if (e instanceof RPIndexVar) { return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PARAMS + "[\"" + e + "\"]"; + //+ "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PARAMS + "[\"" + e + "\"]"; + + "." + e; } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java index 474034c9c..264fe5fab 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java @@ -33,15 +33,30 @@ public static RPIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) } default: { - try + if (isInteger(type)) { return RPIndexFactory.ParamIntVal(Integer.parseInt(type)); } - catch (NumberFormatException e) + else { + if (!type.equals(type.toUpperCase())) + { + throw new RuntimeException("[param] Index variables must be uppercase for Go accessibility: " + type); // FIXME: return proper parsing error + } return RPIndexFactory.ParamIntVar(type); } } } } + + private static boolean isInteger(String s) + { + // return Arrays.stream(s.getBytes()).stream().allMatch(c -> // Character.digit((char) c,radix) < 0); // no Byte stream + if (s.isEmpty()) return false; + for (int i = 0; i < s.length(); i++) + { + if (Character.digit(s.charAt(i), 10) < 0) return false; + } + return true; + } } From 8c927c3f159501b2a7ccdf080dc45b5db7efc0ca Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 18:32:41 +0100 Subject: [PATCH 233/433] [rp-core] Inferring index vars from target variant intervals and its RPLCoreType projection. --- .../go/core/ast/local/RPCoreLCrossChoice.java | 12 +++++++++ .../go/core/ast/local/RPCoreLDotChoice.java | 10 ++++++- .../ext/go/core/ast/local/RPCoreLEnd.java | 10 +++++++ .../core/ast/local/RPCoreLMultiChoices.java | 7 +++++ .../ext/go/core/ast/local/RPCoreLRec.java | 9 +++++++ .../ext/go/core/ast/local/RPCoreLRecVar.java | 10 +++++++ .../ext/go/core/ast/local/RPCoreLType.java | 5 +++- .../ext/go/core/cli/RPCoreCommandLine.java | 16 ++++++------ .../statetype3/RPCoreSTApiGenerator.java | 12 ++++++++- .../statetype3/RPCoreSTSessionApiBuilder.java | 26 +++++++++++-------- .../ext/go/core/type/RPIndexedRole.java | 9 +++++++ .../ext/go/core/type/RPRoleVariant.java | 13 ++++++++++ .../core/visit/RPCoreIndexVarCollector.java | 3 ++- .../ext/go/del/global/RPGChoiceDel.java | 1 + .../go/del/global/RPGMessageTransferDel.java | 1 + 15 files changed, 121 insertions(+), 23 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java index 2b35f5e13..8aa3374bd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java @@ -1,9 +1,12 @@ package org.scribble.ext.go.core.ast.local; +import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.Set; import org.scribble.ext.go.core.ast.RPCoreMessage; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.type.index.RPIndexVar; public class RPCoreLCrossChoice extends RPCoreLChoice { @@ -16,6 +19,15 @@ public RPCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHash } } + @Override + public Set getIndexVars() + { + Set ivars = new HashSet<>(); + ivars.addAll(this.role.getIndexVars()); + this.cases.values().stream().forEach(c -> ivars.addAll(c.getIndexVars())); + return ivars; + } + @Override public int hashCode() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java index 2a93a437c..da39433f2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java @@ -1,11 +1,13 @@ package org.scribble.ext.go.core.ast.local; import java.util.LinkedHashMap; +import java.util.Set; import org.scribble.ext.go.core.ast.RPCoreMessage; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; public class RPCoreLDotChoice extends RPCoreLChoice { @@ -20,6 +22,12 @@ public RPCoreLDotChoice(RPIndexedRole role, RPIndexExpr offset, RPCoreLActionKin } this.offset = offset; } + + @Override + public Set getIndexVars() + { + throw new RuntimeException("[param] Shouldn't get in here: " + this); + } @Override public String toString() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java index dc9b7482b..5fa1ebe26 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java @@ -1,6 +1,10 @@ package org.scribble.ext.go.core.ast.local; +import java.util.Collections; +import java.util.Set; + import org.scribble.ext.go.core.ast.RPCoreEnd; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; @@ -13,6 +17,12 @@ private RPCoreLEnd() } + @Override + public Set getIndexVars() + { + return Collections.emptySet(); + } + @Override public boolean equals(Object obj) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java index e0583262f..07ccf33b6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java @@ -3,6 +3,7 @@ import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; +import java.util.Set; import org.scribble.ext.go.core.ast.RPCoreMessage; import org.scribble.ext.go.core.type.RPIndexedRole; @@ -20,6 +21,12 @@ public RPCoreLMultiChoices(RPIndexedRole role, RPIndexVar var, List getIndexVars() + { + throw new RuntimeException("[param] Shouldn't get in here: " + this); + } + private static LinkedHashMap foo(List cases, RPCoreLType cont) { LinkedHashMap tmp = new LinkedHashMap<>(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java index 178e360bf..d830359ec 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java @@ -1,6 +1,9 @@ package org.scribble.ext.go.core.ast.local; +import java.util.Set; + import org.scribble.ext.go.core.ast.RPCoreRec; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; @@ -11,6 +14,12 @@ public RPCoreLRec(RecVar recvar, RPCoreLType body) //super(recvar, annot, init, body); super(recvar, body); } + + @Override + public Set getIndexVars() + { + return this.body.getIndexVars(); + } @Override public boolean equals(Object obj) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java index 48ecc3592..52ea517a2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java @@ -1,6 +1,10 @@ package org.scribble.ext.go.core.ast.local; +import java.util.Collections; +import java.util.Set; + import org.scribble.ext.go.core.ast.RPCoreRecVar; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; @@ -11,6 +15,12 @@ public RPCoreLRecVar(RecVar var) { super(var); } + + @Override + public Set getIndexVars() + { + return Collections.emptySet(); + } @Override public boolean equals(Object obj) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java index 81a66b3be..7697ae148 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java @@ -1,10 +1,13 @@ package org.scribble.ext.go.core.ast.local; +import java.util.Set; + import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; public interface RPCoreLType extends RPCoreType { - + Set getIndexVars(); // FIXME: factor up? } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 03601f8a6..769b43a36 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -52,7 +52,7 @@ public class RPCoreCommandLine extends CommandLine // HACK: store in (Core) Job/JobContext? protected GProtocolDecl gpd; - protected Map> P0; + protected Map> L0; protected Map> E0; //protected ParamCoreSModel model; @@ -153,7 +153,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co Map goClasses = new ParamCoreSTSessionApiBuilder((GoJob) job, fullname, this.E0).build();*/ //Map actuals = this.E0.get(role); - Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, this.E0, impath, role).build(); + Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, this.L0, this.E0, impath, role).build(); outputClasses(goClasses); } } @@ -238,7 +238,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws job.debugPrintln("\n[param-core] Computed roles: " + protoRoles); - this.P0 = new HashMap<>(); + this.L0 = new HashMap<>(); for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? { //for (Set ranges : protoRoles.get(r)) @@ -247,11 +247,11 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws //ParamCoreLType lt = gt.project(af, r, ranges); RPCoreLType lt = gt.project(af, ranges); //Map, ParamCoreLType> tmp = P0.get(r); - Map tmp = P0.get(r); + Map tmp = L0.get(r); if (tmp == null) { tmp = new HashMap<>(); - P0.put(r, tmp); + L0.put(r, tmp); } tmp.put(ranges, lt); @@ -261,12 +261,12 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws RPCoreEGraphBuilder builder = new RPCoreEGraphBuilder(job); this.E0 = new HashMap<>(); - for (Role r : P0.keySet()) + for (Role r : L0.keySet()) { //for (Set ranges : this.P0.get(r).keySet()) - for (RPRoleVariant ranges : this.P0.get(r).keySet()) + for (RPRoleVariant ranges : this.L0.get(r).keySet()) { - EGraph g = builder.build(this.P0.get(r).get(ranges)); + EGraph g = builder.build(this.L0.get(r).get(ranges)); //Map, EGraph> tmp = this.E0.get(r); Map tmp = this.E0.get(r); if (tmp == null) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 36622ebae..d17dd5306 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -6,6 +6,7 @@ import java.util.Map.Entry; import java.util.stream.Collectors; +import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.main.ScribbleException; @@ -18,6 +19,9 @@ public class RPCoreSTApiGenerator { public final GoJob job; public final GProtocolName proto; // Full name + + // FIXME: factor out an RPCoreJob(Context) + public final Map> projections; public final Map> variants; public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module @@ -25,10 +29,16 @@ public class RPCoreSTApiGenerator // FIXME: just a role name -- cf. CL arg // FIXME: any way to separate Session API (Protocol) from Endpoint/StateChan APIs? - public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> variants, String packpath, Role self) + public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> projections, + Map> variants, String packpath, Role self) { this.job = job; this.proto = fullname; + this.projections = Collections.unmodifiableMap( + projections.entrySet().stream().collect(Collectors.toMap( + e -> e.getKey(), + e -> Collections.unmodifiableMap(e.getValue()) + ))); this.variants = Collections.unmodifiableMap( variants.entrySet().stream().collect(Collectors.toMap( e -> e.getKey(), diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 87b20f36e..61e8227c4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -9,9 +9,7 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ext.go.core.type.RPRoleVariant; -import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.ext.go.type.index.RPIndexVar; -import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -84,27 +82,30 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList()); + List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList());*/ + + List ivars = this.apigen.projections.get(rname).get(variant) + .getIndexVars().stream().sorted().collect(Collectors.toList()); // N.B., params only from action subjects (not self) + ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); // Endpoint Kind constructor -- makes index var value maps String tmp = "func (p *" + simpname + ") New" + "_" + epkindTypeName + "(" + ivars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" + " *_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) + "." + epkindTypeName + " {\n" - + "params := make(map[string]int)\n" + /*+ "params := make(map[string]int)\n" //+ decls.iterator().next().params + ivars - .stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining("")) + .stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining(""))*/ + "return _" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + ".New" + "(p" //", params" + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + ", self)\n" @@ -133,17 +134,20 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< Set variants = this.apigen.variants.get(rname).keySet(); for (RPRoleVariant variant : variants) { - RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); + /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); try { - gpd.accept(coll); // FIXME: should be lpd + gpd.accept(coll); // FIXME: should be lpd -- not currently used due to using RPCoreType } catch (ScribbleException e) { throw new RuntimeException("[rp-core] Shouldn't get in here: ", e); } + List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList());*/ - List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList()); + List ivars = this.apigen.projections.get(rname).get(variant) + .getIndexVars().stream().sorted().collect(Collectors.toList()); // N.B., params only from action subjects (not self) + ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); String epkindFile = epkindImports + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java index e2cad585c..f11116ad9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java @@ -3,7 +3,9 @@ import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.name.Role; // FIXME: make distinct kind? i.e., don't extend Role? -- yes: ParamRole is not a Role (Role should actually be a ParamRole in that sense) @@ -22,6 +24,13 @@ public RPIndexedRole(String name, Set ranges) super(name); this.intervals = Collections.unmodifiableSet(ranges); } + + public Set getIndexVars() + { + return this.intervals.stream() + .flatMap(d -> Stream.of(d.start.getVars(), d.end.getVars()).flatMap(vs -> vs.stream())) + .collect(Collectors.toSet()); + } public RPInterval getParsedRange() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java index c41e8c645..d8e3810c6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java @@ -3,6 +3,9 @@ import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.ext.go.type.index.RPIndexVar; public class RPRoleVariant extends RPIndexedRole { @@ -19,6 +22,16 @@ public RPRoleVariant(String name, Set ranges, Set corang this.cointervals = Collections.unmodifiableSet(coranges); } + @Override + public Set getIndexVars() + { + Set ivars = super.getIndexVars(); + ivars.addAll(this.cointervals.stream() + .flatMap(d -> Stream.of(d.start.getVars(), d.end.getVars()).flatMap(vs -> vs.stream())) + .collect(Collectors.toSet())); + return ivars; + } + @Override public String toString() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/visit/RPCoreIndexVarCollector.java b/scribble-go/src/main/java/org/scribble/ext/go/core/visit/RPCoreIndexVarCollector.java index ba413bc52..11a688b38 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/visit/RPCoreIndexVarCollector.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/visit/RPCoreIndexVarCollector.java @@ -12,7 +12,8 @@ import org.scribble.main.ScribbleException; import org.scribble.visit.NoEnvInlinedProtocolVisitor; -// FIXME: move out of Core to main RP +// FIXME: move out of Core to main RP -- currently not actually used (due to RPCoreType), but eventually should be used on locals +// Currently done for globals (e.g., RPGMessageTransferDel), but should be on locals // Duplicated from EGraphBuilder public class RPCoreIndexVarCollector extends NoEnvInlinedProtocolVisitor { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java index 45668cd83..cec8e5f72 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java @@ -34,6 +34,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); } + // FIXME: not needed for global -- should be local @Override public ScribNode leaveIndexVarCollection(ScribNode parent, ScribNode child, RPCoreIndexVarCollector coll, ScribNode visited) throws ScribbleException { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java index 101216c19..d8e6a945b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java @@ -33,6 +33,7 @@ public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisa return gmt; } + // FIXME: not needed for global -- should be local @Override public ScribNode leaveIndexVarCollection(ScribNode parent, ScribNode child, RPCoreIndexVarCollector coll, ScribNode visited) throws ScribbleException { From 8a41886fe41b62645c01c6991fb627f66123d799 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 19:05:53 +0100 Subject: [PATCH 234/433] [rp-core] Added role/param name initial uppercase checks for Go accessbility. --- .../org/scribble/ext/go/ast/RPAstFactory.java | 4 +- .../scribble/ext/go/ast/RPAstFactoryImpl.java | 25 +++++-- .../org/scribble/ext/go/ast/RPRoleDecl.java | 6 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 69 ++++++++++++------- .../parser/scribble/RPAntlrToScribParser.java | 3 +- .../parser/scribble/ast/RPAntlrRoleDecl.java | 12 ++-- .../scribble/ast/index/RPAntlrIndexExpr.java | 15 +--- .../ext/go/type/index/RPIndexFactory.java | 5 ++ 8 files changed, 86 insertions(+), 53 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java index 1536aabf6..d78e290f3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java @@ -20,8 +20,8 @@ public interface RPAstFactory extends AstFactory { - //ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); - RPRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); + ////ParamRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); + //RPRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params); RPGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index 4000106cd..4b2ca2c6c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -5,10 +5,10 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.MessageNode; +import org.scribble.ast.RoleDecl; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.RoleDeclDel; import org.scribble.ext.go.ast.global.RPGChoice; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; @@ -39,25 +39,25 @@ public GProtocolDecl GProtocolDecl(CommonTree source, List params) public RPRoleDecl ParamRoleDecl(CommonTree source, RoleNode namenode, List params) { RPRoleDecl rd = new RPRoleDecl(source, namenode, params); rd = del(rd, new RoleDeclDel()); return rd; - } + }*/ @Override public RPGCrossMessageTransfer ParamGCrossMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, @@ -147,4 +147,19 @@ protected RPDel createDefaultDelegate() { return new RPDefaultDel(); } + + + + // Extra parsing checks + + @Override + public RoleDecl RoleDecl(CommonTree source, RoleNode namenode) + { + char c = namenode.toString().charAt(0); + if (c < 'A' || c > 'Z') + { + throw new RuntimeException("[param] Role names must start uppercase for Go accessibility: " + namenode); // FIXME: return proper parsing error + } + return super.RoleDecl(source, namenode); + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPRoleDecl.java index 679e94015..54f75ad4e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPRoleDecl.java @@ -15,6 +15,7 @@ import org.scribble.type.name.Role; import org.scribble.visit.AstVisitor; +// FIXME: deprecate -- not done yet due to statetype and statetype2 API gen packages public class RPRoleDecl extends RoleDecl { //public final List params; @@ -41,10 +42,11 @@ protected RPRoleDecl copy() @Override public RPRoleDecl clone(AstFactory af) { - RoleNode role = (RoleNode) this.name.clone(af); + /*RoleNode role = (RoleNode) this.name.clone(af); //List params = ScribUtil.cloneList(af, this.params); List params = this.params; - return ((RPAstFactory) af).ParamRoleDecl(this.source, role, params); + return ((RPAstFactory) af).ParamRoleDecl(this.source, role, params);*/ + return null; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 61e8227c4..249cab178 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -131,8 +131,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< // Endpoint Kind API per role variant for (Role rname : roles) { - Set variants = this.apigen.variants.get(rname).keySet(); - for (RPRoleVariant variant : variants) + for (RPRoleVariant variant : this.apigen.variants.get(rname).keySet()) { /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); try @@ -174,37 +173,61 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< + "return &" + epkindTypeName + "{p, self, &session.LinearResource{}, session.NewEndpoint(self, conns)" //"params + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + "}\n" - + "}\n" + + "}\n"; // Dial/Accept methdos -- FIXME: internalise peers - + "\n" + /*+ "\n" + "func (ini *" + epkindTypeName + ") Accept(rolename string, id int, acc transport.Transport) error {\n" - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = acc.Accept()\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = acc.Accept()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n" + "func (ini *" + epkindTypeName + ") Dial(rolename string, id int, req transport.Transport) error {\n" - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = req.Connect()\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = req.Connect()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error - + "}\n"; + + "}\n";*/ + for (RPRoleVariant v : (Iterable) + this.apigen.variants.values().stream() + .flatMap(m -> m.keySet().stream())::iterator) + { + if (!v.equals(variant)) // FIXME: endpoint families -- and id value checks + { + String r = v.getLastElement(); + String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(v); + epkindFile += "\n" + + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int, acc transport.Transport) error {\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + r + "\"][id] = acc.Accept()\n" // CHECKME: connection map keys (cf. variant?) + + "return nil\n" // FIXME: runtime currently does log.Fatal on error + + "}\n" + + "\n" + + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id int, req transport.Transport) error {\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + r + "\"][id] = req.Connect()\n" // CHECKME: connection map keys (cf. variant?) + + "return nil\n" // FIXME: runtime currently does log.Fatal on error + + "}\n"; + } + } - // Top-level Run method - epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") Run(f func(*Init) End) *End {\n" // f specifies non-pointer End - + "ini.Use()\n" // FIXME: int-counter linearity - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".CheckConnection()\n" - - // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) - // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) - + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) - ? "end := f(ini.NewBranchInit())\n" - : "end := f(&Init{ new(session.LinearResource), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + // Top-level Run method + epkindFile += "\n" + + "func (ini *" + epkindTypeName + ") Run(f func(*Init) End) *End {\n" // f specifies non-pointer End + + "ini.Use()\n" // FIXME: int-counter linearity + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".CheckConnection()\n" + + // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) + // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) + + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) + ? "end := f(ini.NewBranchInit())\n" + : "end := f(&Init{ new(session.LinearResource), ini })\n") // cf. state chan builder // FIXME: chan struct reuse - + "return &end\n" - + "}"; - - res.put(basedir + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "/" + RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant) + ".go", - "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "\n" + epkindFile); + + "return &end\n" + + "}"; + + res.put(basedir + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "/" + RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant) + ".go", + "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "\n" + epkindFile); } } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java index 4b7ebce5e..55afec959 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java @@ -6,7 +6,6 @@ import org.scribble.ext.go.ast.RPAstFactory; import org.scribble.ext.go.parser.scribble.ast.RPAntlrGChoice; import org.scribble.ext.go.parser.scribble.ast.RPAntlrGMultiChoices; -import org.scribble.ext.go.parser.scribble.ast.RPAntlrRoleDecl; import org.scribble.ext.go.parser.scribble.ast.RPCoreAntlrDelegDecl; import org.scribble.ext.go.parser.scribble.ast.RPCoreAntlrModule; import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGCrossMessageTransfer; @@ -44,7 +43,7 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException case ScribbleAntlrConstants.MODULE_NODE_TYPE: return RPCoreAntlrModule.parseModule(this, ct, af); - case PARAM_ROLEDECL_NODE_TYPE: return RPAntlrRoleDecl.parseParamRoleDecl(this, ct, aaf); + //case PARAM_ROLEDECL_NODE_TYPE: return RPAntlrRoleDecl.parseParamRoleDecl(this, ct, aaf); case PARAM_GLOBALCROSSMESSAGETRANSFER_NODE_TYPE: return RPAntlrGCrossMessageTransfer.parseParamGCrossMessageTransfer(this, ct, aaf); case PARAM_GLOBALDOTMESSAGETRANSFER_NODE_TYPE: diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java index e90786a50..6e7b7c2dc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrRoleDecl.java @@ -5,13 +5,10 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.RoleDecl; -import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.RPAstFactory; -import org.scribble.ext.go.type.index.RPIndexFactory; -import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.parser.scribble.AntlrToScribParser; -import org.scribble.parser.scribble.ast.name.AntlrSimpleName; +@Deprecated public class RPAntlrRoleDecl { // Same as original @@ -21,12 +18,13 @@ public class RPAntlrRoleDecl public static RoleDecl parseParamRoleDecl(AntlrToScribParser parser, CommonTree root, RPAstFactory af) { - RoleNode name = AntlrSimpleName.toRoleNode(getNameChild(root), af); + /*RoleNode name = AntlrSimpleName.toRoleNode(getNameChild(root), af); /*List params = getParamChildren(root) - .stream().map(p -> ParamAntlrSimpleName.toParamRoleParamNode(p, af)).collect(Collectors.toList());*/ + .stream().map(p -> ParamAntlrSimpleName.toParamRoleParamNode(p, af)).collect(Collectors.toList());* / List params = getParamChildren(root) .stream().map(p -> RPIndexFactory.ParamIntVar(p.getText())).collect(Collectors.toList()); - return af.ParamRoleDecl(root, name, params); + return af.ParamRoleDecl(root, name, params);*/ + return null; } public static CommonTree getNameChild(CommonTree root) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java index 264fe5fab..a61c5b707 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java @@ -33,18 +33,9 @@ public static RPIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) } default: { - if (isInteger(type)) - { - return RPIndexFactory.ParamIntVal(Integer.parseInt(type)); - } - else - { - if (!type.equals(type.toUpperCase())) - { - throw new RuntimeException("[param] Index variables must be uppercase for Go accessibility: " + type); // FIXME: return proper parsing error - } - return RPIndexFactory.ParamIntVar(type); - } + return isInteger(type) + ? RPIndexFactory.ParamIntVal(Integer.parseInt(type)) + : RPIndexFactory.ParamIntVar(type); } } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java index b16c09b60..4120dad17 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java @@ -16,6 +16,11 @@ public static RPIndexInt ParamIntVal(int i) public static RPIndexVar ParamIntVar(String text) { + char c = text.charAt(0); + if (c < 'A' || c > 'Z') + { + throw new RuntimeException("[param] Index variables must be uppercase for Go accessibility: " + text); // FIXME: return proper parsing error + } return new RPIndexVar(text); } } From e1ac5ea01fc64da2f5f0d8b62b0a94abb25b1f41 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 22:12:45 +0100 Subject: [PATCH 235/433] [rp-core] Fixed case action pointer bug. --- .../scribble/ext/go/ast/RPAstFactoryImpl.java | 41 ++++++++++++++++++- .../statetype3/RPCoreSTCaseActionBuilder.java | 2 +- .../RPCoreSTReceiveActionBuilder.java | 4 +- .../statetype3/RPCoreSTSendActionBuilder.java | 4 +- .../RPCoreSTStateChanApiBuilder.java | 2 +- .../ext/go/type/index/RPIndexFactory.java | 4 +- 6 files changed, 49 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index 4b2ca2c6c..77b096e0d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -7,7 +7,9 @@ import org.scribble.ast.MessageNode; import org.scribble.ast.RoleDecl; import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.NameNode; import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.qualified.QualifiedNameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.global.RPGChoice; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; @@ -20,6 +22,9 @@ import org.scribble.ext.go.del.global.RPGMultiChoicesDel; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.kind.Kind; +import org.scribble.type.kind.OpKind; +import org.scribble.type.kind.SigKind; public class RPAstFactoryImpl extends AstFactoryImpl implements RPAstFactory @@ -155,11 +160,45 @@ protected RPDel createDefaultDelegate() @Override public RoleDecl RoleDecl(CommonTree source, RoleNode namenode) { + // Check here? Or in API gen -- cf. RPIndexFactory#ParamIntVar char c = namenode.toString().charAt(0); if (c < 'A' || c > 'Z') { - throw new RuntimeException("[param] Role names must start uppercase for Go accessibility: " + namenode); // FIXME: return proper parsing error + throw new RuntimeException("[param] Role names must start uppercase for Go accessibility: " + namenode); + // FIXME: return proper parsing error -- refactor as param API gen errors } return super.RoleDecl(source, namenode); } + + @Override + public NameNode SimpleNameNode(CommonTree source, K kind, String identifier) + { + // Check here? Or in API gen + if (kind.equals(OpKind.KIND)) + { + char c = identifier.charAt(0); + if (c < 'A' || c > 'Z') + { + throw new RuntimeException("[param] Op names must start uppercase for Go accessibility: " + identifier); + // FIXME: return proper parsing error -- refactor as param API gen errors + } + } + return super.SimpleNameNode(source, kind, identifier); + } + + @Override + public QualifiedNameNode QualifiedNameNode(CommonTree source, K kind, String... elems) + { + // Check here? Or in API gen + if (kind.equals(SigKind.KIND)) + { + char c = elems[elems.length-1].charAt(0); + if (c < 'A' || c > 'Z') + { + throw new RuntimeException("[param] Op names must start uppercase for Go accessibility: " + elems[elems.length-1]); + // FIXME: return proper parsing error -- refactor as param API gen errors + } + } + return super.QualifiedNameNode(source, kind, elems); + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index efcba927e..0cd851341 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -55,7 +55,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "arg0 = &tmp\n"; + + "*arg0 = tmp\n"; } return res + buildReturn(rpapi, curr, succ); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index fc40d0fcb..0065fa4fa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -18,8 +18,8 @@ public class RPCoreSTReceiveActionBuilder extends STReceiveActionBuilder @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return RPCoreSTApiGenConstants.RP_GATHER_METHOD_PREFIX + "_" // FIXME: make unary Receive special case - + RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + return RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + + "_" + RPCoreSTApiGenConstants.RP_GATHER_METHOD_PREFIX // FIXME: make unary Receive special case + "_" + a.mid; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index a35926565..737336dc0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -19,8 +19,8 @@ public class RPCoreSTSendActionBuilder extends STSendActionBuilder @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return RPCoreSTApiGenConstants.RP_SCATTER_METHOD_PREFIX + "_" // FIXME: make unary Send special case - + RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + return RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + + "_" + RPCoreSTApiGenConstants.RP_SCATTER_METHOD_PREFIX // FIXME: make unary Send special case + "_" + a.mid; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index f74eaf2a2..d7556abb2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -35,7 +35,7 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder protected final RPCoreSTApiGenerator apigen; public final RPRoleVariant variant; // variant.getName().equals(this.role) - private int counter = 1; + private int counter = 2; // 1 named as Init private final Set dtds; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) rp-core class later diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java index 4120dad17..33b2d82e6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java @@ -16,10 +16,12 @@ public static RPIndexInt ParamIntVal(int i) public static RPIndexVar ParamIntVar(String text) { + // Check here? Or in API gen char c = text.charAt(0); if (c < 'A' || c > 'Z') { - throw new RuntimeException("[param] Index variables must be uppercase for Go accessibility: " + text); // FIXME: return proper parsing error + throw new RuntimeException("[param] Index variables must be uppercase for Go accessibility: " + text); + // FIXME: return proper parsing error -- refactor as param API gen errors } return new RPIndexVar(text); } From 1da4102e3267da7543a7ebe9e6eee683c7a51d4a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 23 Apr 2018 22:23:45 +0100 Subject: [PATCH 236/433] Minor. --- .../core/codegen/statetype3/RPCoreSTSelectActionBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index b8ff57290..de6982c11 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -43,8 +43,8 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) @Override public String getActionName(STStateChanApiBuilder api, EAction a) { - return RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" - + RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + return RPCoreSTStateChanApiBuilder.getGeneratedIndexedRoleName(((RPCoreEAction) a).getPeer()) + + "_" + RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_FUN_PREFIX + "_" + a.mid; } From 264b51950ce9f64dca7fb0ece836d2cd46ee07f2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 12:14:45 +0100 Subject: [PATCH 237/433] [rp-core] Fixed select-based branch API gen bug. --- .../codegen/statetype3/RPCoreSTSelectStateBuilder.java | 4 ++-- .../core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 2 +- .../codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 7 ++----- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index 55ba01891..c9bec2e2e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -74,8 +74,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) // Explicit constructor -- for creating internal channels res += "\n" - + "func (ep *" + epTypeName + ") NewBranchInit" // FIXME: factor out - + "() *" + scTypeName + " {\n" + + "func newBranch" // FIXME: factor out, RPCoreSTStateChanApiBuilder#getSuccStateChan and RPCoreSTSelectActionBuilder#buildEndpointKindApi + + scTypeName + "(ep *" + epTypeName + ") *" + scTypeName + " {\n" + "s := &" + scTypeName + " { " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": ep" + ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + s.getActions().stream().map(a -> "_" + a.mid + "_Chan: make(chan string, 1)").collect(Collectors.joining(", ")) + " " diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 249cab178..fa983a56e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -220,7 +220,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) - ? "end := f(ini.NewBranchInit())\n" + ? "end := f(newBranchInit(ini))\n" : "end := f(&Init{ new(session.LinearResource), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + "return &end\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index d7556abb2..9bbf271d6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -196,11 +196,8 @@ protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, getStateKind(succ) == RPCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { // Needs to be here (not in action builder) -- build (hacked) return for all state kinds - return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." - + "NewBranch" // For branch states (hacky?) // FIXME: factor out with RPCoreSTSessionApiBuilder and RPCoreSTSelectStateBuilder#getPreamble - //+ ((succ.id != this.graph.init.id) ? getStateChanName(succ) : "Init") // cf. ParamCoreSTStateChanApiBuilder::getStateChanPremable init state case - + getStateChanName(succ) - + "()"; + // FIXME: factor out with RPCoreSTSessionApiBuilder and RPCoreSTSelectStateBuilder#getPreamble + return "newBranch" + getStateChanName(succ) + "(" + sEp + ")"; } else { From baeb0b4eda279e8440310108cecb5ba6768804f6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 12:58:51 +0100 Subject: [PATCH 238/433] [rp-core] Revised API gen ext-name imports. --- .../statetype3/RPCoreSTCaseActionBuilder.java | 3 +- .../RPCoreSTReceiveActionBuilder.java | 13 ++-- .../RPCoreSTReduceActionBuilder.java | 10 +-- .../statetype3/RPCoreSTSendActionBuilder.java | 6 +- .../RPCoreSTSplitActionBuilder.java | 6 +- .../RPCoreSTStateChanApiBuilder.java | 68 +++---------------- 6 files changed, 31 insertions(+), 75 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index 0cd851341..be35769bf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -8,6 +8,7 @@ import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; public class RPCoreSTCaseActionBuilder extends STCaseActionBuilder { @@ -36,7 +37,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + peer.getName() + "\"]"; - String extName = rpapi.batesHack(a.payload.elems.get(0)); + String extName = rpapi.getExtName((DataType) a.payload.elems.get(0)); String res = ""; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 0065fa4fa..e085ff9a1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -11,6 +11,7 @@ import org.scribble.ext.go.main.GoJob; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; public class RPCoreSTReceiveActionBuilder extends STReceiveActionBuilder { @@ -27,9 +28,9 @@ public String getActionName(STStateChanApiBuilder api, EAction a) public String buildArgs(STStateChanApiBuilder api, EAction a) { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG - + i + " []" + ((RPCoreSTStateChanApiBuilder) api).batesHack(a.payload.elems.get(i))) //a.payload.elems.get(i) - .collect(Collectors.joining(", ")); + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG + i + " []" + + ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) a.payload.elems.get(i))) //a.payload.elems.get(i) + .collect(Collectors.joining(", ")); } @Override @@ -58,7 +59,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); } - String extName = rpapi.batesHack(a.payload.elems.get(0)); + String extName = rpapi.getExtName((DataType) a.payload.elems.get(0)); if (((GoJob) rpapi.job).noCopy) { @@ -87,8 +88,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat if (!a.payload.elems.isEmpty()) { - res += "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? - + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + res += "var tmp " + extName + "\n" // tmp var decl needed for deserialization -- FIXME? + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? + "if err := " + sEpRecv + "[i]" + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java index 03cf68579..d4c164d6a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java @@ -35,7 +35,7 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) DataType[] pet = new DataType[1]; return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG - + i + " *" + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0] = (DataType) a.payload.elems.get(i)) //a.payload.elems.get(i) + + i + " *" + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0] = (DataType) a.payload.elems.get(i)) //a.payload.elems.get(i) // HACK + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "" : @@ -43,11 +43,11 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) //+ " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) + " []" - + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0]) + ") " - + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0]) ) ).collect(Collectors.joining(", ")); @@ -138,7 +138,7 @@ else if (e instanceof RPIndexVar) st.ept.ConnMu.RUnlock() return sesss, &ClientA_p_End{}*/ - String extName = ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + String extName = ((RPCoreSTStateChanApiBuilder) apigen).getExtName((DataType) a.payload.elems.get(0)); res = "for i := " + foo.apply(g.start) + "; i <= " + foo.apply(g.end) + "; i++ {\n" // FIXME: num args @@ -177,7 +177,7 @@ else if (!a.payload.elems.isEmpty()) throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); } - String extName = ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(0)); + String extName = ((RPCoreSTStateChanApiBuilder) apigen).getExtName((DataType) a.payload.elems.get(0)); res += (((GoJob) apigen.job).noCopy diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 737336dc0..476f9c1cc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -28,9 +28,9 @@ public String getActionName(STStateChanApiBuilder api, EAction a) public String buildArgs(STStateChanApiBuilder apigen, EAction a) { return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG - + i + " []" + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(a.payload.elems.get(i))) //a.payload.elems.get(i) - .collect(Collectors.joining(", ")); + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i + " []" + + ((RPCoreSTStateChanApiBuilder) apigen).getExtName((DataType) a.payload.elems.get(i))) //a.payload.elems.get(i) + .collect(Collectors.joining(", ")); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java index bb3ff69ca..fe43b1356 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java @@ -38,18 +38,18 @@ public String buildArgs(STStateChanApiBuilder apigen, EAction a) // HACK + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0] = ((DataType) a.payload.elems.get(i)))) ? "*" : "") - + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) //a.payload.elems.get(i) + + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0]) //a.payload.elems.get(i) + ", splitFn" + i + " func(" + RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i + " " // HACK + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") - + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0]) + ", i" + i + " int) " + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") - + ((RPCoreSTStateChanApiBuilder) apigen).batesHack(pet[0]) + + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0]) ).collect(Collectors.joining(", ")); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 9bbf271d6..966b9f706 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -27,7 +27,6 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.PayloadElemType; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder @@ -267,6 +266,14 @@ else if (e instanceof RPIndexVar) } } + protected String makeExtNameImport(DataType t) + { + String extName = getExtName(t); + return extName.matches("(\\[\\])*(int|string|byte)") + ? "" + : "import \"" + getExtSource(t) + "\"\n"; + } + @@ -274,70 +281,17 @@ protected boolean isDelegType(DataType t) { return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof RPCoreDelegDecl; // FIXME: make a map } - - protected String makeExtNameImport(DataType t) - { - String extName = getExtName(t); - switch (extName) - { - case "int": // FIXME: factor out with batesHack - case "[]int": - case "[][]int": - case "string": - case "[]string": - case "[][]string": - case "byte": - case "[]byte": - case "[][]byte": - { - return ""; - } - default: - { - return "import \"" + getExtSource(t) + "\"\n"; - } - } - } - private String getExtName(DataType t) + protected String getExtName(DataType t) { - return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; // FIXME: make a map + return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; } - + private String getExtSource(DataType t) { return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extSource; // FIXME: make a map } - // FIXME: deprecate? array/slice types now handled via ext names? - protected String batesHack(PayloadElemType t) - { - /*String tmp = t.toString(); - return (tmp.equals("bates")) ? "[]byte" : tmp;*/ - DataType dt = (DataType) t; - String extName = getExtName(dt); - - switch (extName) - { - case "int": - case "[]int": // FIXME: generalise arbitrary dimension array - case "[][]int": - case "string": - case "[]string": - case "[][]string": - case "byte": - case "[]byte": - case "[][]byte": - { - return extName; - } - default: - { - return extName; // FIXME - } - } - } - From f4c905f7ce66a1ff6df12334cc7fe0ac3c517ba3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 12:59:22 +0100 Subject: [PATCH 239/433] Minor. --- .../core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 966b9f706..ec81df42a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -266,7 +266,7 @@ else if (e instanceof RPIndexVar) } } - protected String makeExtNameImport(DataType t) + public String makeExtNameImport(DataType t) { String extName = getExtName(t); return extName.matches("(\\[\\])*(int|string|byte)") @@ -287,7 +287,7 @@ protected String getExtName(DataType t) return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; } - private String getExtSource(DataType t) + protected String getExtSource(DataType t) { return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extSource; // FIXME: make a map } From 9557c360bcd3d57f00740585e21ced1e8c42cf98 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 13:27:49 +0100 Subject: [PATCH 240/433] Minor. --- .../ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java | 4 ++-- .../core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index d17dd5306..956d7cb3d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -107,10 +107,10 @@ public static String getGeneratedRoleVariantName(RPRoleVariant variant) ParamRange g = actual.ranges.iterator().next(); return actual.getName() + "_" + g.start + "To" + g.end;*/ return variant.getName() + "_" - + variant.intervals.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and")) + + variant.intervals.stream().map(g -> g.start + "to" + g.end).sorted().collect(Collectors.joining("and")) + (variant.cointervals.isEmpty() ? "" - : "_not_" + variant.cointervals.stream().map(g -> g.start + "To" + g.end).sorted().collect(Collectors.joining("and"))); + : "_not_" + variant.cointervals.stream().map(g -> g.start + "to" + g.end).sorted().collect(Collectors.joining("and"))); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index ec81df42a..f344ef221 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -245,7 +245,7 @@ public static String getGeneratedIndexedRoleName(RPIndexedRole r) throw new RuntimeException("[rp-core] TODO: " + r); } RPInterval g = r.intervals.iterator().next(); - return r.getName() + "_" + g.start + "To" + g.end; + return r.getName() + "_" + g.start + "to" + g.end; } public static String generateIndexExpr(RPIndexExpr e) From 850256761a449347e77764ab93a39fb11f0aaf96 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 16:17:22 +0100 Subject: [PATCH 241/433] [rp-core] Fixed API gen gather method bug. --- .../codegen/statetype3/RPCoreSTReceiveActionBuilder.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index e085ff9a1..bc30e44f9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -72,7 +72,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } else { - res += "for i := " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + ";" + String start = RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start); + res += "for i := " + start + ";" + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.end) + "; i++ {\n"; if (!a.mid.toString().equals("")) // HACK FIXME? @@ -96,7 +97,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "arg0[i-1] = tmp\n" + + "arg0[i-" + start + "] = tmp\n" + "}\n"; } } From e81724b30c5d6856303c7f2aad14f9120c1911ca Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 16:35:13 +0100 Subject: [PATCH 242/433] [rp-core] Minor. --- .../java/org/scribble/ext/go/ast/RPAstFactoryImpl.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index 77b096e0d..b9f04dd5b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -176,8 +176,9 @@ public NameNode SimpleNameNode(CommonTree source, K kind, St // Check here? Or in API gen if (kind.equals(OpKind.KIND)) { - char c = identifier.charAt(0); - if (c < 'A' || c > 'Z') + char c; + if (identifier.length() == 0 + || ((c = identifier.charAt(0))) < 'A' || c > 'Z') { throw new RuntimeException("[param] Op names must start uppercase for Go accessibility: " + identifier); // FIXME: return proper parsing error -- refactor as param API gen errors @@ -192,8 +193,9 @@ public QualifiedNameNode QualifiedNameNode(CommonTree source // Check here? Or in API gen if (kind.equals(SigKind.KIND)) { - char c = elems[elems.length-1].charAt(0); - if (c < 'A' || c > 'Z') + char c; + if (elems[elems.length-1].length() == 0 + || ((c = elems[elems.length-1].charAt(0))) < 'A' || c > 'Z') { throw new RuntimeException("[param] Op names must start uppercase for Go accessibility: " + elems[elems.length-1]); // FIXME: return proper parsing error -- refactor as param API gen errors From 00e419d3d0af95f37dd171f7f95308b17a271f56 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 17:38:18 +0100 Subject: [PATCH 243/433] [rp-core] Minor. --- .../scribble/ext/go/ast/RPAstFactoryImpl.java | 10 +--- .../statetype3/RPCoreSTApiGenerator.java | 48 +++++++++++++++++++ .../ext/go/type/index/RPIndexFactory.java | 4 +- 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index b9f04dd5b..cca8d8238 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -5,11 +5,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.MessageNode; -import org.scribble.ast.RoleDecl; import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.name.NameNode; import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ast.name.qualified.QualifiedNameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.global.RPGChoice; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; @@ -22,9 +19,6 @@ import org.scribble.ext.go.del.global.RPGMultiChoicesDel; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; -import org.scribble.type.kind.Kind; -import org.scribble.type.kind.OpKind; -import org.scribble.type.kind.SigKind; public class RPAstFactoryImpl extends AstFactoryImpl implements RPAstFactory @@ -157,7 +151,7 @@ protected RPDel createDefaultDelegate() // Extra parsing checks - @Override + /*@Override public RoleDecl RoleDecl(CommonTree source, RoleNode namenode) { // Check here? Or in API gen -- cf. RPIndexFactory#ParamIntVar @@ -202,5 +196,5 @@ public QualifiedNameNode QualifiedNameNode(CommonTree source } } return super.QualifiedNameNode(source, kind, elems); - } + }*/ } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 956d7cb3d..14b0a074a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -6,13 +6,22 @@ import java.util.Map.Entry; import java.util.stream.Collectors; +import org.scribble.ast.Module; +import org.scribble.ast.ProtocolDecl; +import org.scribble.del.ModuleDel; import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.cli.RPCoreCLArgParser; import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; +import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.visit.util.MessageIdCollector; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTEndpointApiGenerator public class RPCoreSTApiGenerator @@ -51,6 +60,45 @@ public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map build() throws ScribbleException { + for (Role r : this.variants.keySet()) + { + char c = r.toString().charAt(0); + if (c < 'A' || c > 'Z') + { + throw new ScribbleException("[rp-core] [" + RPCoreCLArgParser.RPCORE_API_GEN_FLAG + "]" + + " Role names must start uppercase for Go accessibility: " + r); + } + } + + // Duplicated from RPCoreSTSessionApiBuilder#build + Module mod = this.job.getContext().getModule(this.proto.getPrefix()); + MessageIdCollector midcol = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); + ProtocolDecl gpd = mod.getProtocolDecl(this.proto.getSimpleName()); + // Duplicated from. SessionApiGeneration#constructOpClasses + gpd.accept(midcol); + for (MessageId mid : midcol.getNames()) + { + String mname = mid.toString(); + char c; + if (mname.length() == 0 || ((c = mname.charAt(0))) < 'A' || c > 'Z') + { + throw new ScribbleException("[rpcore] [" + RPCoreCLArgParser.RPCORE_API_GEN_FLAG + "]" + + " Message identifiers must start uppercase for Go accessibility: " + mname); + } + } + + RPCoreIndexVarCollector ivarcol = new RPCoreIndexVarCollector(this.job); + gpd.accept(ivarcol); + for (RPIndexVar ivar : ivarcol.getIndexVars()) + { + char c = ivar.name.charAt(0); + if (c < 'A' || c > 'Z') + { + throw new ScribbleException("[rp-core] [" + RPCoreCLArgParser.RPCORE_API_GEN_FLAG + "]" + + " Index variables must be uppercase for Go accessibility: " + ivar); + } + } + Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); for (Entry variant : this.variants.get(this.self).entrySet()) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java index 33b2d82e6..7c8c786af 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java @@ -16,13 +16,13 @@ public static RPIndexInt ParamIntVal(int i) public static RPIndexVar ParamIntVar(String text) { - // Check here? Or in API gen + /*// Check here? Or in API gen char c = text.charAt(0); if (c < 'A' || c > 'Z') { throw new RuntimeException("[param] Index variables must be uppercase for Go accessibility: " + text); // FIXME: return proper parsing error -- refactor as param API gen errors - } + }*/ return new RPIndexVar(text); } } From ed71539c76da4b4755e27f3a51a22260c4de1502 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 18:17:01 +0100 Subject: [PATCH 244/433] [rp-core] Refactored Message in place of RPCoreMessage in core syntax. --- .../org/scribble/ast/ConnectionAction.java | 2 +- .../java/org/scribble/ast/MessageSigNode.java | 16 ++-- .../org/scribble/del/MessageTransferDel.java | 2 +- .../org/scribble/del/local/LAcceptDel.java | 2 +- .../org/scribble/del/local/LReceiveDel.java | 2 +- .../org/scribble/del/local/LRequestDel.java | 2 +- .../java/org/scribble/del/local/LSendDel.java | 2 +- .../scribble/type/name/MessageSigName.java | 2 +- .../ext/go/core/ast/RPCoreAstFactory.java | 31 +++---- .../ext/go/core/ast/RPCoreChoice.java | 7 +- .../ext/go/core/ast/RPCoreMessage.java | 45 +-------- .../ext/go/core/ast/RPCoreMessageSig.java | 48 ++++++++++ .../ext/go/core/ast/global/RPCoreGChoice.java | 58 +++++++----- .../core/ast/global/RPCoreGMultiChoices.java | 38 +++++--- .../global/RPCoreGProtocolDeclTranslator.java | 92 ++++++++++--------- .../ext/go/core/ast/local/RPCoreLChoice.java | 5 +- .../go/core/ast/local/RPCoreLCrossChoice.java | 5 +- .../go/core/ast/local/RPCoreLDotChoice.java | 6 +- .../core/ast/local/RPCoreLMultiChoices.java | 14 ++- .../model/endpoint/RPCoreEGraphBuilder.java | 43 +++++---- 20 files changed, 236 insertions(+), 186 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessageSig.java diff --git a/scribble-core/src/main/java/org/scribble/ast/ConnectionAction.java b/scribble-core/src/main/java/org/scribble/ast/ConnectionAction.java index bbdb11151..5c3528b22 100644 --- a/scribble-core/src/main/java/org/scribble/ast/ConnectionAction.java +++ b/scribble-core/src/main/java/org/scribble/ast/ConnectionAction.java @@ -58,6 +58,6 @@ protected boolean isUnitMessage() return false; } MessageSigNode msn = (MessageSigNode) this.msg; - return msn.op.isEmpty() && msn.payloads.isEmpty(); + return msn.op.isEmpty() && msn.payload.isEmpty(); } } diff --git a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java b/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java index 6eed9f625..1192f40f2 100644 --- a/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/MessageSigNode.java @@ -23,32 +23,32 @@ public class MessageSigNode extends ScribNodeBase implements MessageNode { public final OpNode op; - public final PayloadElemList payloads; + public final PayloadElemList payload; public MessageSigNode(CommonTree source, OpNode op, PayloadElemList payload) { super(source); this.op = op; - this.payloads = payload; + this.payload = payload; } @Override public MessageNode project(AstFactory af) // Currently outside of visitor/env pattern { - return af.MessageSigNode(this.source, this.op, this.payloads.project(af)); // Original del not retained by projection + return af.MessageSigNode(this.source, this.op, this.payload.project(af)); // Original del not retained by projection } @Override protected MessageSigNode copy() { - return new MessageSigNode(this.source, this.op, this.payloads); + return new MessageSigNode(this.source, this.op, this.payload); } @Override public MessageSigNode clone(AstFactory af) { OpNode op = this.op.clone(af); - PayloadElemList payload = this.payloads.clone(af); + PayloadElemList payload = this.payload.clone(af); return af.MessageSigNode(this.source, op, payload); } @@ -64,7 +64,7 @@ public MessageSigNode reconstruct(OpNode op, PayloadElemList payload) public MessageSigNode visitChildren(AstVisitor nv) throws ScribbleException { OpNode op = (OpNode) visitChild(this.op, nv); - PayloadElemList payload = (PayloadElemList) visitChild(this.payloads, nv); + PayloadElemList payload = (PayloadElemList) visitChild(this.payload, nv); return reconstruct(op, payload); } @@ -79,7 +79,7 @@ public boolean isMessageSigNode() @Override public MessageSig toArg() { - return new MessageSig(this.op.toName(), this.payloads.toPayload()); + return new MessageSig(this.op.toName(), this.payload.toPayload()); } @Override @@ -91,6 +91,6 @@ public MessageSig toMessage() @Override public String toString() { - return this.op.toString() + this.payloads.toString(); + return this.op.toString() + this.payload.toString(); } } diff --git a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java b/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java index 4dba242a1..da1daf82d 100644 --- a/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java +++ b/scribble-core/src/main/java/org/scribble/del/MessageTransferDel.java @@ -91,7 +91,7 @@ public MessageTransfer leaveProtocolDeclContextBuilding(ScribNode parent, Scr MessageTransfer mt = (MessageTransfer) visited; if (mt.msg.isMessageSigNode()) { - for (PayloadElem pe : ((MessageSigNode) mt.msg).payloads.getElements()) + for (PayloadElem pe : ((MessageSigNode) mt.msg).payload.getElements()) { if (pe.isGlobalDelegationElem()) // FIXME: should always be GMessageTransfer { diff --git a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java b/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java index 1f25ba9da..a3df498fa 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LAcceptDel.java @@ -36,7 +36,7 @@ public LAccept leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuil Role peer = la.src.toName(); MessageId mid = la.msg.toMessage().getId(); Payload payload = la.msg.isMessageSigNode() // Hacky? - ? ((MessageSigNode) la.msg).payloads.toPayload() + ? ((MessageSigNode) la.msg).payload.toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newEAccept(peer, mid, payload), builder.util.getExit()); //builder.builder.addEdge(builder.builder.getEntry(), new Accept(peer), builder.builder.getExit()); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java index 801b8510b..37fa8856c 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LReceiveDel.java @@ -34,7 +34,7 @@ public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBu Role peer = lr.src.toName(); MessageId mid = lr.msg.toMessage().getId(); Payload payload = (lr.msg.isMessageSigNode()) // Hacky? - ? ((MessageSigNode) lr.msg).payloads.toPayload() + ? ((MessageSigNode) lr.msg).payload.toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newEReceive(peer, mid, payload), builder.util.getExit()); //builder.builder.addEdge(builder.builder.getEntry(), Receive.get(peer, mid, payload), builder.builder.getExit()); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java b/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java index b4f49ad9c..0552c5389 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LRequestDel.java @@ -34,7 +34,7 @@ public LRequest leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBui Role peer = dest.toName(); MessageId mid = lc.msg.toMessage().getId(); Payload payload = lc.msg.isMessageSigNode() // Hacky? - ? ((MessageSigNode) lc.msg).payloads.toPayload() + ? ((MessageSigNode) lc.msg).payload.toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newERequest(peer, mid, payload), builder.util.getExit()); //graph.builder.addEdge(graph.builder.getEntry(), new Connect(peer), graph.builder.getExit()); diff --git a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java index 9433e1a56..428b8231c 100644 --- a/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java +++ b/scribble-core/src/main/java/org/scribble/del/local/LSendDel.java @@ -43,7 +43,7 @@ public ScribNode leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBu Role peer = dests.get(0).toName(); MessageId mid = ls.msg.toMessage().getId(); Payload payload = ls.msg.isMessageSigNode() // Hacky? - ? ((MessageSigNode) ls.msg).payloads.toPayload() + ? ((MessageSigNode) ls.msg).payload.toPayload() : Payload.EMPTY_PAYLOAD; builder.util.addEdge(builder.util.getEntry(), builder.job.ef.newESend(peer, mid, payload), builder.util.getExit()); //builder.builder.addEdge(builder.builder.getEntry(), Send.get(peer, mid, payload), builder.builder.getExit()); diff --git a/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java b/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java index f8e3f039c..5ed32e6ae 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java +++ b/scribble-core/src/main/java/org/scribble/type/name/MessageSigName.java @@ -17,7 +17,7 @@ import org.scribble.type.kind.SigKind; -// The name of a declared (imported) message signature member +// The name of a declared (imported) message signature member -- basically a session types "message label" public class MessageSigName extends MemberName implements Message, MessageId { private static final long serialVersionUID = 1L; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java index 835e7973d..437989de6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java @@ -1,31 +1,24 @@ package org.scribble.ext.go.core.ast; import java.util.LinkedHashMap; -import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; import org.scribble.ext.go.core.ast.global.RPCoreGActionKind; import org.scribble.ext.go.core.ast.global.RPCoreGChoice; import org.scribble.ext.go.core.ast.global.RPCoreGEnd; -import org.scribble.ext.go.core.ast.global.RPCoreGMultiChoices; import org.scribble.ext.go.core.ast.global.RPCoreGRec; import org.scribble.ext.go.core.ast.global.RPCoreGRecVar; import org.scribble.ext.go.core.ast.global.RPCoreGType; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; import org.scribble.ext.go.core.ast.local.RPCoreLCrossChoice; -import org.scribble.ext.go.core.ast.local.RPCoreLDotChoice; import org.scribble.ext.go.core.ast.local.RPCoreLEnd; -import org.scribble.ext.go.core.ast.local.RPCoreLMultiChoices; import org.scribble.ext.go.core.ast.local.RPCoreLRec; import org.scribble.ext.go.core.ast.local.RPCoreLRecVar; import org.scribble.ext.go.core.ast.local.RPCoreLType; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; -import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexVar; -import org.scribble.type.Payload; -import org.scribble.type.name.Op; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.type.Message; import org.scribble.type.name.RecVar; @@ -41,22 +34,23 @@ public RPIndexedRole ParamRole(String name, RPInterval range) // ParamRange not return new RPIndexedRole(name, Stream.of(range).collect(Collectors.toSet())); } - // Pre: not null - public RPCoreMessage ParamCoreAction(Op op, Payload pay) + // Pre: not null -- ? + /*public RPCoreMessage ParamCoreAction(Op op, Payload pay) { return new RPCoreMessage(op, pay); - } + }*/ - public RPCoreGChoice ParamCoreGChoice(RPIndexedRole src, RPCoreGActionKind kind, RPIndexedRole dest, LinkedHashMap cases) + public RPCoreGChoice ParamCoreGChoice(RPIndexedRole src, RPCoreGActionKind kind, RPIndexedRole dest, //LinkedHashMap cases) + LinkedHashMap cases) { return new RPCoreGChoice(src, kind, dest, cases); } - public RPCoreGMultiChoices ParamCoreGMultiChoices(RPIndexedRole src, RPIndexVar var, + /*public RPCoreGMultiChoices ParamCoreGMultiChoices(RPIndexedRole src, RPIndexVar var, RPIndexedRole dest, List cases, RPCoreGType cont) { return new RPCoreGMultiChoices(src, var, dest, cases, cont); - } + }*/ public RPCoreGRec ParamCoreGRec(RecVar recvar, RPCoreGType body) { @@ -74,12 +68,13 @@ public RPCoreGEnd ParamCoreGEnd() } public RPCoreLCrossChoice ParamCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, - LinkedHashMap cases) + //LinkedHashMap cases) + LinkedHashMap cases) { return new RPCoreLCrossChoice(role, kind, cases); } - public RPCoreLDotChoice ParamCoreLDotChoice(RPIndexedRole role, RPIndexExpr offset, RPCoreLActionKind kind, + /*public RPCoreLDotChoice ParamCoreLDotChoice(RPIndexedRole role, RPIndexExpr offset, RPCoreLActionKind kind, LinkedHashMap cases) { return new RPCoreLDotChoice(role, offset, kind, cases); @@ -89,7 +84,7 @@ public RPCoreLMultiChoices ParamCoreLMultiChoices(RPIndexedRole role, RPIndexVar List cases, RPCoreLType cont) { return new RPCoreLMultiChoices(role, var, cases, cont); - } + }*/ /*public ParamCoreLSend LSend(Role self, Role peer, Op op, Payload pay) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreChoice.java index de39667fc..8041fa7ba 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreChoice.java @@ -4,16 +4,19 @@ import java.util.stream.Collectors; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.type.Message; import org.scribble.type.kind.ProtocolKind; public abstract class RPCoreChoice, K extends ProtocolKind> implements RPCoreType { public final RPIndexedRole role; public final RPCoreActionKind kind; - public final LinkedHashMap cases; + //public final LinkedHashMap cases; + public final LinkedHashMap cases; // Pre: cases.size() > 1 - public RPCoreChoice(RPIndexedRole role, RPCoreActionKind kind, LinkedHashMap cases) + //public RPCoreChoice(RPIndexedRole role, RPCoreActionKind kind, LinkedHashMap cases) + public RPCoreChoice(RPIndexedRole role, RPCoreActionKind kind, LinkedHashMap cases) { this.role = role; this.kind = kind; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessage.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessage.java index f77406ad9..48c4a78ad 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessage.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessage.java @@ -1,48 +1,7 @@ package org.scribble.ext.go.core.ast; -import org.scribble.type.Payload; -import org.scribble.type.name.Op; - - -public class RPCoreMessage +@Deprecated +public interface RPCoreMessage { - public final Op op; - public final Payload pay; - - public RPCoreMessage(Op op, Payload pay) - { - this.op = op; - this.pay = pay; - } - - @Override - public String toString() - { - return this.op.toString() + this.pay.toString(); - } - - @Override - public int hashCode() - { - int hash = 43; - hash = 31 * hash + this.op.hashCode(); - hash = 31 * hash + this.pay.hashCode(); - return hash; - } - @Override - public boolean equals(Object obj) - { - if (obj == this) - { - return true; - } - if (!(obj instanceof RPCoreMessage)) - { - return false; - } - RPCoreMessage them = (RPCoreMessage) obj; - return //them.canEquals(this) && - this.op.equals(them.op) && this.pay.equals(them.pay); - } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessageSig.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessageSig.java new file mode 100644 index 000000000..fd251f9e1 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreMessageSig.java @@ -0,0 +1,48 @@ +package org.scribble.ext.go.core.ast; + +import org.scribble.type.Payload; +import org.scribble.type.name.Op; + +@Deprecated +public class RPCoreMessageSig implements RPCoreMessage +{ + public final Op op; + public final Payload pay; + + public RPCoreMessageSig(Op op, Payload pay) + { + this.op = op; + this.pay = pay; + } + + @Override + public String toString() + { + return this.op.toString() + this.pay.toString(); + } + + @Override + public int hashCode() + { + int hash = 43; + hash = 31 * hash + this.op.hashCode(); + hash = 31 * hash + this.pay.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == this) + { + return true; + } + if (!(obj instanceof RPCoreMessageSig)) + { + return false; + } + RPCoreMessageSig them = (RPCoreMessageSig) obj; + return //them.canEquals(this) && + this.op.equals(them.op) && this.pay.equals(them.pay); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 8a1438da0..cf5d4a10e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -13,20 +13,17 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreChoice; -import org.scribble.ext.go.core.ast.RPCoreMessage; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; -import org.scribble.ext.go.core.ast.local.RPCoreLDotChoice; import org.scribble.ext.go.core.ast.local.RPCoreLType; -import org.scribble.ext.go.core.type.RPRoleVariant; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.RPBinIndexExpr; -import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexFactory; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.ext.go.util.Z3Wrapper; +import org.scribble.type.Message; +import org.scribble.type.MessageSig; import org.scribble.type.kind.Global; import org.scribble.type.name.GDelegationType; import org.scribble.type.name.PayloadElemType; @@ -37,7 +34,9 @@ public class RPCoreGChoice extends RPCoreChoice implements public final RPIndexedRole src; // "Singleton" -- checked by isWellFormed public final RPIndexedRole dest; // this.dest == super.role -- arbitrary? - public RPCoreGChoice(RPIndexedRole src, RPCoreGActionKind kind, RPIndexedRole dest, LinkedHashMap cases) + public RPCoreGChoice(RPIndexedRole src, RPCoreGActionKind kind, RPIndexedRole dest, + //LinkedHashMap cases) + LinkedHashMap cases) { super(dest, kind, cases); this.src = src; @@ -176,27 +175,38 @@ public Set getParamRoles() //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { - LinkedHashMap projs = new LinkedHashMap<>(); - for (Entry e : this.cases.entrySet()) + //LinkedHashMap projs = new LinkedHashMap<>(); + LinkedHashMap projs = new LinkedHashMap<>(); + //for (Entry e : this.cases.entrySet()) + for (Entry e : this.cases.entrySet()) { - RPCoreMessage a = e.getKey(); + //RPCoreMessage a = e.getKey(); + Message a = e.getKey(); //projs.put(a, e.getValue().project(af, r, ranges)); projs.put(a, e.getValue().project(af, subj)); // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) // FIXME: receive assertion projection -- should not be the same as send? - for (PayloadElemType pet : a.pay.elems) + if (a instanceof MessageSig) { - if (pet instanceof GDelegationType) + //for (PayloadElemType pet : a.pay.elems) + for (PayloadElemType pet : ((MessageSig) a).payload.elems) { - GDelegationType gdt = (GDelegationType) pet; // Payload types come from ParamCoreGProtocolDeclTranslator#parsePayload (toMessage) - System.out.println("aaa: " + this + ", " + gdt.getGlobalProtocol() + ", " + gdt.getRole()); - - // cf. GDelegationElem#project - - //new LProtocolName(); // FIXME: need actual role (not just role name) + if (pet instanceof GDelegationType) + { + GDelegationType gdt = (GDelegationType) pet; // Payload types come from ParamCoreGProtocolDeclTranslator#parsePayload (toMessage) + System.out.println("aaa: " + this + ", " + gdt.getGlobalProtocol() + ", " + gdt.getRole()); + + // cf. GDelegationElem#project + + //new LProtocolName(); // FIXME: need actual role (not just role name) + } } } + else + { + throw new RuntimeException("[rp-core] TODO: " + a); + } } // "Simple" cases @@ -217,7 +227,7 @@ else if (destName.equals(subjName) && subj.intervals.contains(destRange)) return af.ParamCoreLCrossChoice(this.src, RPCoreLActionKind.CROSS_RECEIVE, projs); } } - else if (this.kind == RPCoreGActionKind.DOT_TRANSFER) + /*else if (this.kind == RPCoreGActionKind.DOT_TRANSFER) { if (srcName.equals(subjName) && subj.intervals.contains(srcRange)) // FIXME: factor out? { @@ -229,7 +239,7 @@ else if (this.kind == RPCoreGActionKind.DOT_TRANSFER) /*Map tmp = projs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, p -> new ParamCoreLDotChoice(this.dest, offset, ParamCoreLActionKind.DOT_SEND, Stream.of(p.getKey()).collect(Collectors.toMap(k -> k, k -> p.getValue()))) - ));*/ + ));* / Function, LinkedHashMap> foo = e -> { LinkedHashMap res = new LinkedHashMap<>(); @@ -259,7 +269,7 @@ else if (destName.equals(subjName) && subj.intervals.contains(destRange)) RPIndexFactory.ParamBinIndexExpr(RPBinIndexExpr.Op.Subt, srcRange.start, destRange.start)); return af.ParamCoreLDotChoice(this.src, offset, RPCoreLActionKind.DOT_RECEIVE, projs); } - } + }*/ else { throw new RuntimeException("[param-core] TODO: " + this); @@ -271,7 +281,9 @@ else if (destName.equals(subjName) && subj.intervals.contains(destRange)) } //private ParamCoreLType merge(ParamCoreAstFactory af, Role r, Set ranges, Map projs) throws ParamCoreSyntaxException - private RPCoreLType merge(RPCoreAstFactory af, RPRoleVariant r, Map projs) throws RPCoreSyntaxException + private RPCoreLType merge(RPCoreAstFactory af, RPRoleVariant r, + //Map projs) throws RPCoreSyntaxException + Map projs) throws RPCoreSyntaxException { // "Merge" Set values = new HashSet<>(projs.values()); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java index 25972fae1..06e5f36eb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java @@ -12,17 +12,18 @@ import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreChoice; -import org.scribble.ext.go.core.ast.RPCoreMessage; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; import org.scribble.ext.go.core.ast.local.RPCoreLType; -import org.scribble.ext.go.core.type.RPRoleVariant; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.Message; import org.scribble.type.kind.Global; +@Deprecated public class RPCoreGMultiChoices extends RPCoreChoice implements RPCoreGType { public final RPIndexedRole src; // Gives the Scribble choices-subj range // Cf. ParamCoreGChoice singleton src @@ -30,7 +31,9 @@ public class RPCoreGMultiChoices extends RPCoreChoice imple public final RPIndexedRole dest; // this.dest == super.role -- arbitrary? - public RPCoreGMultiChoices(RPIndexedRole src, RPIndexVar var, RPIndexedRole dest, List cases, RPCoreGType cont) + public RPCoreGMultiChoices(RPIndexedRole src, RPIndexVar var, RPIndexedRole dest, //List cases, + List cases, + RPCoreGType cont) { //super(dest, ParamCoreGActionKind.CROSS_TRANSFER, cases.stream().collect(Collectors.toMap(c -> c, c -> cont))); // FIXME super(dest, RPCoreGActionKind.CROSS_TRANSFER, foo(cases, cont)); // FIXME @@ -39,9 +42,12 @@ public RPCoreGMultiChoices(RPIndexedRole src, RPIndexVar var, RPIndexedRole dest this.var = var; } - private static LinkedHashMap foo(List cases, RPCoreGType cont) + private static //LinkedHashMap foo(List cases, RPCoreGType cont) + LinkedHashMap foo(List cases, RPCoreGType cont) { - LinkedHashMap tmp = new LinkedHashMap<>(); + //LinkedHashMap + LinkedHashMap + tmp = new LinkedHashMap<>(); cases.stream().forEach(c -> tmp.put(c, cont)); return tmp; } @@ -162,10 +168,16 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor throw new RuntimeException("[param-core] TODO: " + this); } - LinkedHashMap projs = new LinkedHashMap<>(); - for (Entry e : this.cases.entrySet()) + //LinkedHashMap projs + LinkedHashMap projs + = new LinkedHashMap<>(); + //for (Entry + for (Entry + e : this.cases.entrySet()) { - RPCoreMessage a = e.getKey(); + //RPCoreMessage a + Message a + = e.getKey(); //projs.put(a, e.getValue().project(af, r, ranges)); projs.put(a, e.getValue().project(af, subj)); // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) @@ -188,8 +200,9 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor } else if (this.dest.getName().equals(subj.getName()) && subj.intervals.contains(this.dest.getParsedRange())) { - return af.ParamCoreLMultiChoices(this.src, this.var, projs.keySet().stream().collect(Collectors.toList()), - values.iterator().next()); + /*return af.ParamCoreLMultiChoices(this.src, this.var, projs.keySet().stream().collect(Collectors.toList()), + values.iterator().next());*/ + throw new RuntimeException("[rp-core] Shouldn't get in here: " + this); } // src name != dest name @@ -198,7 +211,8 @@ else if (this.dest.getName().equals(subj.getName()) && subj.intervals.contains(t } //private ParamCoreLType merge(ParamCoreAstFactory af, Role r, Set ranges, Map projs) throws ParamCoreSyntaxException - private RPCoreLType merge(RPCoreAstFactory af, RPRoleVariant r, Map projs) throws RPCoreSyntaxException + private RPCoreLType merge(RPCoreAstFactory af, RPRoleVariant r, //Map projs) throws RPCoreSyntaxException + Map projs) throws RPCoreSyntaxException { // "Merge" Set values = new HashSet<>(projs.values()); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index 79daf2d32..9c77d6735 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -1,17 +1,12 @@ package org.scribble.ext.go.core.ast.global; import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.scribble.ast.MessageNode; -import org.scribble.ast.MessageSigNode; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GContinue; import org.scribble.ast.global.GInteractionNode; @@ -27,18 +22,14 @@ import org.scribble.ext.go.ast.RPAstFactory; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; -import org.scribble.ext.go.ast.global.RPGMultiChoices; -import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; import org.scribble.ext.go.core.ast.RPCoreAstFactory; -import org.scribble.ext.go.core.ast.RPCoreMessage; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.main.Job; -import org.scribble.type.Payload; +import org.scribble.type.Message; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.DataType; -import org.scribble.type.name.Op; import org.scribble.type.name.RecVar; public class RPCoreGProtocolDeclTranslator @@ -85,27 +76,27 @@ private RPCoreGType parseSeq(List is, Map rvs, } else { - throw new RuntimeException("[param-core] Shouldn't get in here: " + first); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + first); } } else { if (checkChoiceGuard) // No "flattening" of nested choices not allowed? { - throw new RPCoreSyntaxException(first.getSource(), "[param-core] Unguarded in choice case: " + first); + throw new RPCoreSyntaxException(first.getSource(), "[rp-core] Unguarded in choice case: " + first); } if (is.size() > 1) { - throw new RPCoreSyntaxException(is.get(1).getSource(), "[param-core] Bad sequential composition after: " + first); + throw new RPCoreSyntaxException(is.get(1).getSource(), "[rp-core] Bad sequential composition after: " + first); } if (first instanceof GChoice) { - if (first instanceof RPGMultiChoices) + /*if (first instanceof RPGMultiChoices) { return parseParamGMultiChoices(rvs, checkRecGuard, (RPGMultiChoices) first); } - else // GChoice or ParamGChoice + else*/ // GChoice or ParamGChoice { return parseGChoice(rvs, checkRecGuard, (GChoice) first); } @@ -120,7 +111,7 @@ else if (first instanceof GContinue) } else { - throw new RuntimeException("[param-core] Shouldn't get in here: " + first); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + first); } } } @@ -137,18 +128,20 @@ private RPCoreGType parseGChoice(Map rvs, RPCoreGActionKind kind = null; RPIndexedRole src = null; RPIndexedRole dest = null; - LinkedHashMap cases = new LinkedHashMap<>(); + //LinkedHashMap + LinkedHashMap + cases = new LinkedHashMap<>(); for (RPCoreGType c : children) { // Because all cases should be action guards (unary choices) if (!(c instanceof RPCoreGChoice)) { - throw new RuntimeException("[param-core] Shouldn't get in here: " + c); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + c); } RPCoreGChoice tmp = (RPCoreGChoice) c; if (tmp.cases.size() > 1) { - throw new RuntimeException("[param-core] Shouldn't get in here: " + c); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + c); } if (src == null) @@ -159,22 +152,26 @@ private RPCoreGType parseGChoice(Map rvs, } else if (!kind.equals(tmp.kind)) { - throw new RuntimeException("[param-core] Shouldn't get in here: " + gc + ", " + kind + ", " + tmp.kind); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + gc + ", " + kind + ", " + tmp.kind); } else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) { throw new RPCoreSyntaxException(gc.getSource(), - "[param-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); + "[rp-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); } // "Flatten" nested choices (already checked they are guarded) -- Scribble choice subjects ignored - for (Entry e : tmp.cases.entrySet()) - { - RPCoreMessage k = e.getKey(); - if (cases.keySet().stream().anyMatch(x -> x.op.equals(k.op))) + for //(Entry + (Entry + e : tmp.cases.entrySet()) + { + //RPCoreMessage k = e.getKey(); + Message k = e.getKey(); + if (cases.keySet().stream().anyMatch(x -> //x.op.equals(k.op))) + x.equals(k))) { throw new RPCoreSyntaxException(gc.getSource(), - "[param-core] Non-deterministic actions not supported: " + k.op); + "[rp-core] Non-deterministic actions not supported: " + k); } cases.put(k, e.getValue()); } @@ -183,12 +180,12 @@ else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) return this.af.ParamCoreGChoice(src, kind, dest, cases); } - private RPCoreGMultiChoices parseGMultiChoicesTransfer(List is, Map rvs) throws RPCoreSyntaxException + /*private RPCoreGMultiChoices parseGMultiChoicesTransfer(List is, Map rvs) throws RPCoreSyntaxException { GInteractionNode in = is.get(0); if (!(in instanceof RPGMultiChoicesTransfer)) { - throw new RPCoreSyntaxException(in.getSource(), "[param-core] Expected GMultiChoicesTransfer: " + in.getClass()); + throw new RPCoreSyntaxException(in.getSource(), "[rp-core] Expected GMultiChoicesTransfer: " + in.getClass()); } RPGMultiChoicesTransfer gmt = (RPGMultiChoicesTransfer) in; @@ -222,7 +219,7 @@ private RPCoreGType parseParamGMultiChoices(Map rvs, RPCoreGMultiChoices tmp = (RPCoreGMultiChoices) c; if (tmp.cases.size() > 1) { - throw new RuntimeException("[param-core] Shouldn't get in here: " + c); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + c); } if (src == null) @@ -233,12 +230,12 @@ private RPCoreGType parseParamGMultiChoices(Map rvs, } else if (!kind.equals(tmp.kind)) { - throw new RuntimeException("[param-core] Shouldn't get in here: " + gc + ", " + kind + ", " + tmp.kind); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + gc + ", " + kind + ", " + tmp.kind); } else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) { throw new RPCoreSyntaxException(gc.getSource(), - "[param-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); + "[rp-core] Non-directed choice not supported: " + gc + ", " + src + ", " + tmp.src + ", " + dest + ", " + tmp.dest); } // "Flatten" nested choices (already checked they are guarded) -- Scribble choice subjects ignored @@ -248,7 +245,7 @@ else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) if (cases.keySet().stream().anyMatch(x -> x.op.equals(k.op))) { throw new RPCoreSyntaxException(gc.getSource(), - "[param-core] Non-deterministic actions not supported: " + k.op); + "[rp-core] Non-deterministic actions not supported: " + k.op); } cases.put(k, e.getValue()); } @@ -257,14 +254,14 @@ else if (!src.equals(tmp.src) || !dest.equals(tmp.dest)) if (new HashSet<>(cases.values()).size() > 1) { throw new RPCoreSyntaxException(gc.getSource(), - "[param-core] Continuations not syntactically equal: " + cases.values()); + "[rp-core] Continuations not syntactically equal: " + cases.values()); } return this.af.ParamCoreGMultiChoices( //src, new RPIndexedRole(gc.subj.toString(), Stream.of(new RPInterval(gc.start, gc.end)).collect(Collectors.toSet())), gc.var, dest, cases.keySet().stream().collect(Collectors.toList()), cases.values().iterator().next()); - } + }*/ private RPCoreGType parseGRecursion(Map rvs, boolean checkChoiceGuard, GRecursion gr) throws RPCoreSyntaxException @@ -286,7 +283,7 @@ private RPCoreGType parseGContinue(Map rvs, boolean checkRecGuar { if (checkRecGuard) { - throw new RPCoreSyntaxException(gc.getSource(), "[param-core] Unguarded in recursion: " + gc); // FIXME: too conservative, e.g., rec X . A -> B . rec Y . X + throw new RPCoreSyntaxException(gc.getSource(), "[rp-core] Unguarded in recursion: " + gc); // FIXME: too conservative, e.g., rec X . A -> B . rec Y . X } RecVar recvar = gc.recvar.toName(); if (rvs.containsKey(recvar)) @@ -299,7 +296,8 @@ private RPCoreGType parseGContinue(Map rvs, boolean checkRecGuar // Parses message interactions as unary choices private RPCoreGChoice parseGMessageTransfer(List is, Map rvs, GMessageTransfer gmt) throws RPCoreSyntaxException { - RPCoreMessage a = this.af.ParamCoreAction(parseOp(gmt), parsePayload(gmt)); + //RPCoreMessage a = this.af.ParamCoreAction(parseOp(gmt), parsePayload(gmt)); + Message a = gmt.msg.toMessage(); String srcName = parseSourceRole(gmt); String destName = parseDestinationRole(gmt); RPCoreGActionKind kind; @@ -327,7 +325,7 @@ else if (gmt instanceof RPGDotMessageTransfer) { /*src = af.ParamRole(srcName, 1, 1); dest = af.ParamRole(destName, 1, 1);*/ - throw new RPCoreSyntaxException(gmt.getSource(), "[param-core] Not supported: " + gmt.getClass() + "\n " + gmt); + throw new RPCoreSyntaxException(gmt.getSource(), "[rp-core] Not supported: " + gmt.getClass() + "\n " + gmt); } return parseGSimpleInteractionNode(is, rvs, src, kind, a, dest); } @@ -336,21 +334,25 @@ else if (gmt instanceof RPGDotMessageTransfer) private RPCoreGChoice parseGSimpleInteractionNode( List is, Map rvs, - RPIndexedRole src, RPCoreGActionKind kind, RPCoreMessage a, RPIndexedRole dest) throws RPCoreSyntaxException + RPIndexedRole src, RPCoreGActionKind kind, //RPCoreMessage a, + Message a, + RPIndexedRole dest) throws RPCoreSyntaxException { if (src.equals(dest)) { - throw new RuntimeException("[param-core] Shouldn't get in here (self-communication): " + src + ", " + dest); + throw new RuntimeException("[rp-core] Shouldn't get in here (self-communication): " + src + ", " + dest); } RPCoreGType cont = parseSeq(is.subList(1, is.size()), rvs, false, false); // Subseqeuent choice/rec is guarded by (at least) this action - LinkedHashMap tmp = new LinkedHashMap<>(); + //LinkedHashMap + LinkedHashMap + tmp = new LinkedHashMap<>(); tmp.put(a, cont); return this.af.ParamCoreGChoice(src, kind, dest, tmp); //Stream.of(a).collect(Collectors.toMap(x -> x, x -> cont))); } - private Op parseOp(GMessageTransfer gmt) throws RPCoreSyntaxException + /*private Op parseOp(GMessageTransfer gmt) throws RPCoreSyntaxException { return parseOp(gmt.msg); } @@ -359,7 +361,7 @@ private Op parseOp(MessageNode mn) throws RPCoreSyntaxException { if (!mn.isMessageSigNode()) { - throw new RPCoreSyntaxException(mn.getSource(), " [param-core] Message sig names not supported: " + mn); // TODO: MessageSigName + throw new RPCoreSyntaxException(mn.getSource(), " [rp-core] Message sig names not supported: " + mn); // TODO: MessageSigName } MessageSigNode msn = ((MessageSigNode) mn); return msn.op.toName(); @@ -374,10 +376,10 @@ private Payload parsePayload(MessageNode mn) throws RPCoreSyntaxException { if (!mn.isMessageSigNode()) { - throw new RPCoreSyntaxException(mn.getSource(), " [param-core] Message sig names not supported: " + mn); // TODO: MessageSigName + throw new RPCoreSyntaxException(mn.getSource(), " [rp-core] Message sig names not supported: " + mn); // TODO: MessageSigName } return ((MessageSigNode) mn).toMessage().payload; - } + }*/ private String parseSourceRole(GMessageTransfer gmt) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java index 1f6a0d8cf..03947b57a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java @@ -4,13 +4,14 @@ import java.util.stream.Collectors; import org.scribble.ext.go.core.ast.RPCoreChoice; -import org.scribble.ext.go.core.ast.RPCoreMessage; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.type.Message; import org.scribble.type.kind.Local; public abstract class RPCoreLChoice extends RPCoreChoice implements RPCoreLType { - protected RPCoreLChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMap cases) + //protected RPCoreLChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMap cases) + protected RPCoreLChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMap cases) { super(role, kind, cases); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java index 8aa3374bd..7b3a6bd82 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java @@ -4,13 +4,14 @@ import java.util.LinkedHashMap; import java.util.Set; -import org.scribble.ext.go.core.ast.RPCoreMessage; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.Message; public class RPCoreLCrossChoice extends RPCoreLChoice { - public RPCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMap cases) + //public RPCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMap cases) + public RPCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMap cases) { super(role, kind, cases); if (kind != RPCoreLActionKind.CROSS_SEND && kind != RPCoreLActionKind.CROSS_RECEIVE) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java index da39433f2..cdcfeeb54 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java @@ -3,17 +3,19 @@ import java.util.LinkedHashMap; import java.util.Set; -import org.scribble.ext.go.core.ast.RPCoreMessage; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.Message; +@Deprecated public class RPCoreLDotChoice extends RPCoreLChoice { public final RPIndexExpr offset; - public RPCoreLDotChoice(RPIndexedRole role, RPIndexExpr offset, RPCoreLActionKind kind, LinkedHashMap cases) + public RPCoreLDotChoice(RPIndexedRole role, RPIndexExpr offset, RPCoreLActionKind kind, //LinkedHashMap cases) + LinkedHashMap cases) { super(role, kind, cases); if (kind != RPCoreLActionKind.DOT_SEND && kind != RPCoreLActionKind.DOT_RECEIVE) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java index 07ccf33b6..91aae9439 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java @@ -5,17 +5,20 @@ import java.util.List; import java.util.Set; -import org.scribble.ext.go.core.ast.RPCoreMessage; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.Message; // FIXME: factor out better with ParamCore(L)Choice -- or deprecate and just use kind? +@Deprecated public class RPCoreLMultiChoices extends RPCoreLChoice { public final RPIndexVar var; // Redundant? // Pre: cases.size() > 1 - public RPCoreLMultiChoices(RPIndexedRole role, RPIndexVar var, List cases, RPCoreLType cont) + public RPCoreLMultiChoices(RPIndexedRole role, RPIndexVar var, //List cases, + List cases, + RPCoreLType cont) { super(role, RPCoreLActionKind.MULTICHOICES_RECEIVE, foo(cases, cont)); this.var = var; @@ -27,9 +30,12 @@ public Set getIndexVars() throw new RuntimeException("[param] Shouldn't get in here: " + this); } - private static LinkedHashMap foo(List cases, RPCoreLType cont) + private static //LinkedHashMap foo(List cases, RPCoreLType cont) + LinkedHashMap foo(List cases, RPCoreLType cont) { - LinkedHashMap tmp = new LinkedHashMap<>(); + //LinkedHashMap + LinkedHashMap + tmp = new LinkedHashMap<>(); cases.stream().forEach(c -> tmp.put(c, cont)); return tmp; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java index 343b111af..c24527858 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java @@ -2,17 +2,12 @@ import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.stream.Collectors; -import org.scribble.ext.go.core.ast.RPCoreMessage; import org.scribble.ext.go.core.ast.RPCoreRecVar; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; import org.scribble.ext.go.core.ast.local.RPCoreLChoice; -import org.scribble.ext.go.core.ast.local.RPCoreLDotChoice; import org.scribble.ext.go.core.ast.local.RPCoreLEnd; -import org.scribble.ext.go.core.ast.local.RPCoreLMultiChoices; import org.scribble.ext.go.core.ast.local.RPCoreLRec; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPIndexedRole; @@ -22,6 +17,8 @@ import org.scribble.model.endpoint.EGraphBuilderUtil; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.Message; +import org.scribble.type.MessageSig; import org.scribble.type.Payload; import org.scribble.type.name.MessageId; import org.scribble.type.name.RecVar; @@ -49,7 +46,7 @@ private void build(RPCoreLType lt, EState s1, EState s2, Map rec { if (lt instanceof RPCoreLChoice) { - if (lt instanceof RPCoreLMultiChoices) + /*if (lt instanceof RPCoreLMultiChoices) { RPCoreLMultiChoices lc = (RPCoreLMultiChoices) lt; List> mids = lc.cases.keySet().stream().map(x -> x.op).collect(Collectors.toList()); @@ -58,12 +55,11 @@ private void build(RPCoreLType lt, EState s1, EState s2, Map rec // N.B. this directly constructs a single continuation for the multichoices-receiver // cf. multichoices sender side, standard cross-send with separate (but identical) continuations -- could also build single contination for sender by introducing explicit multichoices-send constructor } - else + else*/ { RPCoreLChoice lc = (RPCoreLChoice) lt; - RPIndexExpr offset = (lc instanceof RPCoreLDotChoice) - ? ((RPCoreLDotChoice) lc).offset - : null; + RPIndexExpr offset = //(lc instanceof RPCoreLDotChoice) ? ((RPCoreLDotChoice) lc).offset : + null; lc.cases.entrySet().stream().forEach(e -> buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue(), offset) ); @@ -83,7 +79,9 @@ else if (lt instanceof RPCoreLRec) } private void buildEdgeAndContinuation(EState s1, EState s2, Map recs, - RPIndexedRole r, RPCoreLActionKind k, RPCoreMessage a, RPCoreLType cont, RPIndexExpr offset) + RPIndexedRole r, RPCoreLActionKind k, //RPCoreMessage a, + Message a, + RPCoreLType cont, RPIndexExpr offset) { EAction ea = toEAction(r, k, a, offset); if (cont instanceof RPCoreLEnd) @@ -103,7 +101,7 @@ else if (cont instanceof RPCoreRecVar) } } - // FIXME: factor out with above + /*// FIXME: factor out with above private void buildMultiChoicesEdgeAndContinuation(EState s1, EState s2, Map recs, RPIndexedRole r, RPCoreLActionKind k, List> mids, List pays, RPCoreLType cont) { @@ -123,27 +121,36 @@ else if (cont instanceof RPCoreRecVar) this.util.addEdge(s1, ea, s); build(cont, s, s2, recs); } - } + }*/ - private EAction toEAction(RPIndexedRole r, RPCoreLActionKind k, RPCoreMessage a, RPIndexExpr offset) + private EAction toEAction(RPIndexedRole r, RPCoreLActionKind k, //RPCoreMessage a, + Message a, + RPIndexExpr offset) { RPCoreEModelFactory ef = (RPCoreEModelFactory) this.util.ef; // FIXME: factor out + + // Cf. LSendDel#leaveEGraphBuilding + MessageId mid = a.getId(); + Payload pay = (a instanceof MessageSig) // Hacky? + ? ((MessageSig) a).payload + : Payload.EMPTY_PAYLOAD; + if (k.equals(RPCoreLActionKind.CROSS_SEND)) { - return ef.newParamCoreECrossSend(r, a.op, a.pay); + return ef.newParamCoreECrossSend(r, mid, pay); } else if (k.equals(RPCoreLActionKind.CROSS_RECEIVE)) { - return ef.newParamCoreECrossReceive(r, a.op, a.pay); + return ef.newParamCoreECrossReceive(r, mid, pay); } else if (k.equals(RPCoreLActionKind.DOT_SEND)) { - return ef.newParamCoreEDotSend(r, offset, a.op, a.pay); + return ef.newParamCoreEDotSend(r, offset, mid, pay); } else if (k.equals(RPCoreLActionKind.DOT_RECEIVE)) { - return ef.newParamCoreEDotReceive(r, offset, a.op, a.pay); + return ef.newParamCoreEDotReceive(r, offset, mid, pay); } /*else if (k.equals(ParamCoreLActionKind.MULTICHOICES_RECEIVE)) { From b6b47f65a00aad012c0a54ea5b299e0cd2a680f6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 18:53:21 +0100 Subject: [PATCH 245/433] [rp-core] Factored message sign names into API gen. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 24 +++++------ .../statetype3/RPCoreSTCaseActionBuilder.java | 40 +++++++++++-------- .../RPCoreSTReceiveActionBuilder.java | 15 +++++-- .../statetype3/RPCoreSTSendActionBuilder.java | 16 ++++++-- .../model/endpoint/RPCoreEGraphBuilder.java | 10 ++--- 5 files changed, 64 insertions(+), 41 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index cf5d4a10e..5ad0b117b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -172,13 +172,15 @@ public Set getParamRoles() } @Override - //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException - public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, //Role r, Set ranges) throws ParamCoreSyntaxException + RPRoleVariant subj) throws RPCoreSyntaxException { - //LinkedHashMap projs = new LinkedHashMap<>(); - LinkedHashMap projs = new LinkedHashMap<>(); - //for (Entry e : this.cases.entrySet()) - for (Entry e : this.cases.entrySet()) + //LinkedHashMap + LinkedHashMap + projs = new LinkedHashMap<>(); + //for (Entry + for (Entry + e : this.cases.entrySet()) { //RPCoreMessage a = e.getKey(); Message a = e.getKey(); @@ -189,12 +191,13 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor if (a instanceof MessageSig) { - //for (PayloadElemType pet : a.pay.elems) - for (PayloadElemType pet : ((MessageSig) a).payload.elems) + for (PayloadElemType pet : //a.pay.elems) + ((MessageSig) a).payload.elems) { if (pet instanceof GDelegationType) { GDelegationType gdt = (GDelegationType) pet; // Payload types come from ParamCoreGProtocolDeclTranslator#parsePayload (toMessage) + System.out.println("aaa: " + this + ", " + gdt.getGlobalProtocol() + ", " + gdt.getRole()); // cf. GDelegationElem#project @@ -203,10 +206,7 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor } } } - else - { - throw new RuntimeException("[rp-core] TODO: " + a); - } + // MessageSigName is not delegation // FIXME: cf. "Sync@A" } // "Simple" cases diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index be35769bf..8be49f58f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.core.codegen.statetype3; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -36,27 +37,34 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + peer.getName() + "\"]"; - - String extName = rpapi.getExtName((DataType) a.payload.elems.get(0)); - String res = ""; - // Duplicated from RPCoreSTReceiveActionBuilder - if (!a.payload.elems.isEmpty()) + Function f = extName -> + "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? + + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "*arg0 = tmp\n"; + + String res = ""; + if (a.mid.isOp()) { - if (a.payload.elems.size() > 1) + if (!a.payload.elems.isEmpty()) { - throw new RuntimeException("TODO: " + a); - } + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("TODO: " + a); + } - res += "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? - + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? - + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" - + "; err != nil {\n" - + "log.Fatal(err)\n" - + "}\n" - + "*arg0 = tmp\n"; + res += f.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); + } + } + else //if (a.mid.isMessageSigName()) + { + res += f.apply(a.mid.toString()); } return res + buildReturn(rpapi, curr, succ); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index bc30e44f9..e2c9bc9fa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -27,10 +27,17 @@ public String getActionName(STStateChanApiBuilder api, EAction a) @Override public String buildArgs(STStateChanApiBuilder api, EAction a) { - return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG + i + " []" - + ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) a.payload.elems.get(i))) //a.payload.elems.get(i) - .collect(Collectors.joining(", ")); + if (a.mid.isOp()) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG + i + " []" + + ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) a.payload.elems.get(i))) //a.payload.elems.get(i) + .collect(Collectors.joining(", ")); + } + else //if (a.mid.isMessageSigName()) + { + return "a *" + a.mid; + } } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 476f9c1cc..92a936810 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -27,10 +27,18 @@ public String getActionName(STStateChanApiBuilder api, EAction a) @Override public String buildArgs(STStateChanApiBuilder apigen, EAction a) { - return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i + " []" - + ((RPCoreSTStateChanApiBuilder) apigen).getExtName((DataType) a.payload.elems.get(i))) //a.payload.elems.get(i) - .collect(Collectors.joining(", ")); + System.out.println("aaa: "+ a + ", " + a.mid + ", " + (a.mid.getClass()) + ", " + a.mid.isOp()); + if (a.mid.isOp()) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i + " []" + + ((RPCoreSTStateChanApiBuilder) apigen).getExtName((DataType) a.payload.elems.get(i))) //a.payload.elems.get(i) + .collect(Collectors.joining(", ")); + } + else //if (a.mid.isMessageSigName()) + { + return "a *" + a.mid; + } } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java index c24527858..67ff374fd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java @@ -74,7 +74,7 @@ else if (lt instanceof RPCoreLRec) } else { - throw new RuntimeException("[param-core] Shouldn't get in here: " + lt); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + lt); } } @@ -144,7 +144,7 @@ else if (k.equals(RPCoreLActionKind.CROSS_RECEIVE)) { return ef.newParamCoreECrossReceive(r, mid, pay); } - else if (k.equals(RPCoreLActionKind.DOT_SEND)) + /*else if (k.equals(RPCoreLActionKind.DOT_SEND)) { return ef.newParamCoreEDotSend(r, offset, mid, pay); } @@ -152,13 +152,13 @@ else if (k.equals(RPCoreLActionKind.DOT_RECEIVE)) { return ef.newParamCoreEDotReceive(r, offset, mid, pay); } - /*else if (k.equals(ParamCoreLActionKind.MULTICHOICES_RECEIVE)) + else if (k.equals(ParamCoreLActionKind.MULTICHOICES_RECEIVE)) { - return ef.newParamCoreEMultiChoicesReceive(r, a.op, a.pay); + return ef.newParamCoreEMultiChoicesReceive(r, mid, pay); }*/ else { - throw new RuntimeException("[param-core] Shouldn't get in here: " + k); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + k); } } } From 3945101d6e9176796105da41275b82a52886c82c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 20:31:08 +0100 Subject: [PATCH 246/433] [rp-core] Continued adding message sig names to API gen. --- .../statetype3/RPCoreSTApiGenConstants.java | 1 + .../statetype3/RPCoreSTCaseActionBuilder.java | 39 ++++++---- .../statetype3/RPCoreSTCaseBuilder.java | 5 ++ .../RPCoreSTReceiveActionBuilder.java | 66 ++++++++++------ .../statetype3/RPCoreSTSendActionBuilder.java | 9 ++- .../RPCoreSTStateChanApiBuilder.java | 76 ++++++++++++++----- 6 files changed, 135 insertions(+), 61 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index 0cf5e14de..8a77a39a4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -48,6 +48,7 @@ public class RPCoreSTApiGenConstants public static final String GO_CROSS_REDUCE_FUN_PREFIX = "Reduce"; public static final String GO_CROSS_RECEIVE_FUN_PREFIX = "Recv"; public static final String GO_CROSS_RECEIVE_METHOD_ARG = "arg"; + public static final String GO_CASE_METHOD_ARG = "arg"; public static final String RP_SCATTER_METHOD_PREFIX = "Scatter"; public static final String RP_GATHER_METHOD_PREFIX = "Gather"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index 8be49f58f..efbd3d450 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -10,6 +10,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; +import org.scribble.type.name.MessageSigName; public class RPCoreSTCaseActionBuilder extends STCaseActionBuilder { @@ -22,10 +23,21 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(STStateChanApiBuilder apigen, EAction a) + public String buildArgs(STStateChanApiBuilder api, EAction a) { - return IntStream.range(0, a.payload.elems.size()) - .mapToObj(i -> "arg" + i + " *" + a.payload.elems.get(i)).collect(Collectors.joining(", ")); + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + if (a.mid.isOp()) + { + return IntStream.range(0, a.payload.elems.size()) + .mapToObj(i -> RPCoreSTApiGenConstants.GO_CASE_METHOD_ARG + i + + " *" + rpapi.getExtName((DataType) a.payload.elems.get(i))) + .collect(Collectors.joining(", ")); + } + else //if (a.mid.isMessageSigName()) + { + return RPCoreSTApiGenConstants.GO_CASE_METHOD_ARG + "0 *" + + rpapi.getExtName((MessageSigName) a.mid); + } } @Override @@ -40,14 +52,14 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // Duplicated from RPCoreSTReceiveActionBuilder Function f = extName -> - "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? - + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK? for passthru? - + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" - + "; err != nil {\n" - + "log.Fatal(err)\n" - + "}\n" - + "*arg0 = tmp\n"; + "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK: [] // N.B. *arg0 matches buildArgs + + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "*arg0 = tmp\n"; // N.B. *arg0 matches buildArgs String res = ""; if (a.mid.isOp()) @@ -56,7 +68,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { if (a.payload.elems.size() > 1) { - throw new RuntimeException("TODO: " + a); + throw new RuntimeException("[rp-core] [-param-api] TODO: " + a); } res += f.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); @@ -64,7 +76,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } else //if (a.mid.isMessageSigName()) { - res += f.apply(a.mid.toString()); + // FIXME: no -- Branch() should already receive the sig message and case action should just return it + res += f.apply(rpapi.getExtName((MessageSigName) a.mid)); } return res + buildReturn(rpapi, curr, succ); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java index bbd17d475..4a3f66d8b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -38,10 +38,15 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "\n" + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "import \"log\"\n" + + ((RPCoreSTStateChanApiBuilder) api).makeMessageImports(s) + "\n" + + // Case object interface + "type " + getCaseStateChanName(api, s) + " interface {\n" + casename + "()\n" + "}\n" + + // Case object types + s.getActions().stream().map(a -> "\ntype " + getOpTypeName(api, s, a.mid) + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(null, rpapi.variant) + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index e2c9bc9fa..e30d4dfb6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.core.codegen.statetype3; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -12,6 +13,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; +import org.scribble.type.name.MessageSigName; public class RPCoreSTReceiveActionBuilder extends STReceiveActionBuilder { @@ -27,16 +29,18 @@ public String getActionName(STStateChanApiBuilder api, EAction a) @Override public String buildArgs(STStateChanApiBuilder api, EAction a) { + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; if (a.mid.isOp()) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG + i + " []" - + ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) a.payload.elems.get(i))) //a.payload.elems.get(i) + + rpapi.getExtName((DataType) a.payload.elems.get(i))) .collect(Collectors.joining(", ")); } else //if (a.mid.isMessageSigName()) { - return "a *" + a.mid; + return RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG + "0 []" + + rpapi.getExtName((MessageSigName) a.mid); } } @@ -66,8 +70,6 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat throw new RuntimeException("[param-core] [TODO] payload size > 1: " + a); } - String extName = rpapi.getExtName((DataType) a.payload.elems.get(0)); - if (((GoJob) rpapi.job).noCopy) { /*res += "data := make([]" + a.payload.elems.get(0) + ", len(b))\n" @@ -83,33 +85,47 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat res += "for i := " + start + ";" + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.end) + "; i++ {\n"; - if (!a.mid.toString().equals("")) // HACK FIXME? - { - res += "var lab string\n" // var decl needed for deserializatoin -- FIXME? - + "if err := " + sEpRecv + "[i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL - + "(" + "&lab" + ")" - + "; err != nil {\n" - + "log.Fatal(err)\n" - + "}\n"; - } - - if (!a.payload.elems.isEmpty()) - { - res += "var tmp " + extName + "\n" // tmp var decl needed for deserialization -- FIXME? - + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? - + "if err := " + sEpRecv + "[i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL - + "(&tmp)" + // For payloads -- FIXME: currently hardcoded for exactly one payload + Function f = x -> + "var tmp " + x + "\n" // var tmp needed for deserialization -- FIXME? + + (x.startsWith("[]") ? "tmp = make(" + x + ", len(arg0))\n" : "") // HACK? for passthru? + + "if err := " + sEpRecv + "[i]" // FIXME: use peer interval + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "arg0[i-" + start + "] = tmp\n" - + "}\n"; + + "arg0[i-" + start + "] = tmp\n"; + + if (a.mid.isOp()) + { + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[rp-core] [-param-api] TODO: " + a); + } + + //if (!a.mid.toString().equals("")) // HACK FIXME? // Now redundant, -param-api checks mid starts uppercase + { + res += "var lab string\n" // var decl needed for deserializatoin -- FIXME? + + "if err := " + sEpRecv + "[i]" + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" + "&lab" + ")" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n"; + } + + res += f.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); + } + } + else //if (a.mid.isMessageSigName()) + { + res += f.apply(rpapi.getExtName((MessageSigName) a.mid)); } } - return res + buildReturn(rpapi, curr, succ); + return res + "}\n" + buildReturn(rpapi, curr, succ); } /*protected static String hackGetValues(String t) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 92a936810..9f1d4dcdb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -12,6 +12,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; +import org.scribble.type.name.MessageSigName; public class RPCoreSTSendActionBuilder extends STSendActionBuilder { @@ -25,19 +26,19 @@ public String getActionName(STStateChanApiBuilder api, EAction a) } @Override - public String buildArgs(STStateChanApiBuilder apigen, EAction a) + public String buildArgs(STStateChanApiBuilder api, EAction a) { - System.out.println("aaa: "+ a + ", " + a.mid + ", " + (a.mid.getClass()) + ", " + a.mid.isOp()); if (a.mid.isOp()) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i + " []" - + ((RPCoreSTStateChanApiBuilder) apigen).getExtName((DataType) a.payload.elems.get(i))) //a.payload.elems.get(i) + + ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) a.payload.elems.get(i))) //a.payload.elems.get(i) .collect(Collectors.joining(", ")); } else //if (a.mid.isMessageSigName()) { - return "a *" + a.mid; + return RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + "0 []" + + ((RPCoreSTStateChanApiBuilder) api).getExtName((MessageSigName) a.mid); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index f344ef221..f918b3082 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -8,6 +8,8 @@ import java.util.stream.Collectors; import org.scribble.ast.DataTypeDecl; +import org.scribble.ast.MessageSigNameDecl; +import org.scribble.ast.Module; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.ast.RPCoreDelegDecl; @@ -27,6 +29,7 @@ import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.MessageSigName; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder @@ -36,6 +39,7 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder private int counter = 2; // 1 named as Init private final Set dtds; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams + private final Set msnds; // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) rp-core class later // Pre: variant.getName().equals(this.role) @@ -58,8 +62,11 @@ public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant va this.apigen = apigen; this.variant = variant; - this.dtds = this.apigen.job.getContext().getMainModule().getNonProtocolDecls().stream() + Module mod = apigen.job.getContext().getModule(this.apigen.proto.getPrefix()); + this.dtds = mod.getNonProtocolDecls().stream() .filter(d -> (d instanceof DataTypeDecl)).map(d -> ((DataTypeDecl) d)).collect(Collectors.toSet()); + this.msnds = mod.getNonProtocolDecls().stream() + .filter(d -> (d instanceof MessageSigNameDecl)).map(d -> ((MessageSigNameDecl) d)).collect(Collectors.toSet()); } @Override @@ -138,21 +145,22 @@ protected String getStateChanPremable(EState s) + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" // FIXME: error handling via Err field -- fallback should be panic - + "import \"log\"\n" + + "import \"log\"\n"; - // FIXME: refactor back into state-specific builders - + ((s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) - ? s.getActions().stream().flatMap(a -> a.payload.elems.stream()).collect(Collectors.toSet()).stream() - .map(p -> makeExtNameImport((DataType) p)).collect(Collectors.joining("")) - : "") + // Not needed by Branch/Case objects // FIXME: refactor back into state-specific builders? + if (s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT)// || s.getStateKind() == EStateKind.POLY_INPUT) + { + res += makeMessageImports(s); + } - // FIXME: refactor back into state-specific builders - + ((s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) - ? "import \"sort\"\n\nvar _ = sort.Sort\n" - : "") + // FIXME: still needed? -- refactor back into state-specific builders? + if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + { + res += "import \"sort\"\n\nvar _ = sort.Sort\n"; + } // State channel type - + "\n" + res += "\n" + "type " + scTypeName + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" @@ -161,6 +169,28 @@ protected String getStateChanPremable(EState s) return res; } + public String makeMessageImports(EState s) + { + String res = ""; + for (String extSource : (Iterable) + s.getAllActions().stream() + .filter(a -> a.mid.isOp()) + .flatMap(a -> a.payload.elems.stream() + .filter(p -> !getExtName((DataType) p).matches("(\\[\\])*(int|string|byte)"))) + .map(p -> getExtSource((DataType) p)) + .distinct()::iterator) + { + res += "import \"" + extSource + "\"\n"; + } + for (String extSource : (Iterable) + s.getAllActions().stream().filter(a -> a.mid.isMessageSigName()) + .map(a -> getExtSource((MessageSigName) a.mid)).distinct()::iterator) + { + res += "import \"" + extSource + "\"\n"; + } + return res; + } + // "Base case" -- more specific versions should be overriden in action builders // Here because action builder hierarchy not suitable (extended by action kind, not by target language) @Override @@ -266,33 +296,41 @@ else if (e instanceof RPIndexVar) } } - public String makeExtNameImport(DataType t) + /*public String makeExtNameImport(DataType t) { String extName = getExtName(t); return extName.matches("(\\[\\])*(int|string|byte)") ? "" : "import \"" + getExtSource(t) + "\"\n"; - } + }*/ protected boolean isDelegType(DataType t) { - return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next() instanceof RPCoreDelegDecl; // FIXME: make a map + return this.dtds.stream().filter(x -> x.getDeclName().equals(t)).findAny().get() instanceof RPCoreDelegDecl; // FIXME: make a map } protected String getExtName(DataType t) { - return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extName; + return this.dtds.stream().filter(x -> x.getDeclName().equals(t)).findAny().get().extName; } protected String getExtSource(DataType t) { - return this.dtds.stream().filter(i -> i.getDeclName().equals(t)).iterator().next().extSource; // FIXME: make a map + return this.dtds.stream().filter(x -> x.getDeclName().equals(t)).findAny().get().extSource; // FIXME: make a map + } + + protected String getExtName(MessageSigName n) + { + return this.msnds.stream().filter(x -> x.getDeclName().equals(n)).findAny().get().extName; + } + + protected String getExtSource(MessageSigName n) + { + return this.msnds.stream().filter(x -> x.getDeclName().equals(n)).findAny().get().extSource; } - - From a1649fc9b54b11b5eb0378f31c103acafbdedae9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 20:32:22 +0100 Subject: [PATCH 247/433] [rp-core] Minor. --- .../codegen/statetype3/RPCoreSTCaseActionBuilder.java | 2 +- .../statetype3/RPCoreSTReceiveActionBuilder.java | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index efbd3d450..d6171c5f8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -56,7 +56,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK: [] // N.B. *arg0 matches buildArgs + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" - + "; err != nil {\n" + + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" + "*arg0 = tmp\n"; // N.B. *arg0 matches buildArgs diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index e30d4dfb6..74b73f664 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -86,9 +86,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.end) + "; i++ {\n"; // For payloads -- FIXME: currently hardcoded for exactly one payload - Function f = x -> - "var tmp " + x + "\n" // var tmp needed for deserialization -- FIXME? - + (x.startsWith("[]") ? "tmp = make(" + x + ", len(arg0))\n" : "") // HACK? for passthru? + Function f = extName -> + "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? + + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? + "if err := " + sEpRecv + "[i]" // FIXME: use peer interval + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + "; err != nil {\n" @@ -109,9 +109,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { res += "var lab string\n" // var decl needed for deserializatoin -- FIXME? + "if err := " + sEpRecv + "[i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL - + "(" + "&lab" + ")" - + "; err != nil {\n" + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&lab" + ")" + + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; } From bc64157604fa0f8bf1392ee358e6ae2cf137a607 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 24 Apr 2018 23:48:58 +0100 Subject: [PATCH 248/433] [rp-core] Continued adding message sig names to API gen. --- .../statetype/STBranchStateBuilder.java | 2 +- .../RPCoreSTBranchActionBuilder.java | 78 +++++++++++++------ .../statetype3/RPCoreSTCaseActionBuilder.java | 5 +- .../statetype3/RPCoreSTCaseBuilder.java | 26 ++++--- .../RPCoreSTReceiveActionBuilder.java | 4 +- .../statetype3/RPCoreSTSendActionBuilder.java | 32 +++++--- .../RPCoreSTStateChanApiBuilder.java | 11 ++- 7 files changed, 110 insertions(+), 48 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java index 18afc9fdd..387bd7ccd 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STBranchStateBuilder.java @@ -30,7 +30,7 @@ public String build(STStateChanApiBuilder api, EState s) String out = getPreamble(api, s); out += "\n\n"; - out += this.bb.build(api, s, s.getActions().get(1)); // Getting #1 checks non-unary + out += this.bb.build(api, s, s.getActions().get(1)); // .get(1) checks non-unary return out; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index ba69ce9e9..e423ebefa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.core.codegen.statetype3; +import java.util.List; import java.util.stream.Collectors; import org.scribble.codegen.statetype.STBranchActionBuilder; @@ -7,9 +8,11 @@ import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.MessageSigName; public class RPCoreSTBranchActionBuilder extends STBranchActionBuilder { + // Called by STBranchStateBuilder#build on .get(1) action (a hack for Branch states) @Override public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME: "overriding" STStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out { @@ -19,8 +22,8 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME EState succ = curr.getSuccessor(a); return "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" - + buildArgs(null, a) - + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: Return type is interface, so no need for *return (unlike other state chans) + + buildArgs(null, a) + + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: return type is interface, so no need for *return (unlike other state chans) + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + buildBody(api, curr, a, succ) + "\n" @@ -45,36 +48,67 @@ public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) return api.cb.getCaseStateChanName(api, curr); } - // CHECKME: what is succ for Branch action? + // "a" and "succ" are the .get(1) action (a hack for Branch states) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { + List as = curr.getAllActions(); + if (!as.stream().allMatch(x -> x.mid.isOp()) && !as.stream().allMatch(x -> x.mid.isMessageSigName())) + { + throw new RuntimeException("[rp-core] [-param-api] Mixed choice of message sig and sig names not supported: " + as); + } + RPIndexedRole peer = (RPIndexedRole) a.peer; // Singleton interval String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + peer.getName() + "\"]"; String res = ""; + + if (a.mid.isOp()) + { + // Duplicated from RPCoreSTReceiveActionBuilder + res += "var lab string\n" // var decl needed for deserializatoin -- FIXME? + + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" + "&lab" + ")" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n"; - // Duplicated from RPCoreSTReceiveActionBuilder - res += "var lab string\n" // var decl needed for deserializatoin -- FIXME? - + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL - + "(" + "&lab" + ")" - + "; err != nil {\n" - + "log.Fatal(err)\n" - + "}\n"; - - // Switch and return Cases value - res += "\n" - + "switch lab {\n" - + curr.getActions().stream().map(x -> - "case \"" + x.mid + "\":\n" + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) - + "{ Ept: s.Ept, Res: new(session.LinearResource) }\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder buildActionReturn/getSuccStateChan - ).collect(Collectors.joining("")) - + "default: panic(\"Shouldn't get in here: \" + lab)\n" - + "}\n" - + "return nil\n"; // FIXME: panic instead + // Switch and return Cases value + res += "\n" + + "switch lab {\n" + + as.stream().map(x -> + "case \"" + x.mid + "\":\n" + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) + + "{ Ept: s.Ept, Res: new(session.LinearResource) }\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder buildActionReturn/getSuccStateChan + ).collect(Collectors.joining("")) + + "default: panic(\"Shouldn't get in here: \" + lab)\n" + + "}\n" + + "return nil\n"; // FIXME: panic instead + } + else //if (a.mid.isMessageSigName()) + { + // FIXME: factor out futher (receive, case) + res += "var msg session.T\n" // var decl needed for deserializatoin -- FIXME? + + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "(" + "&msg" + ")" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n"; + + res += "\n" + + "switch x := msg.(type) {\n" + + as.stream().map(x -> + "case " + ((RPCoreSTStateChanApiBuilder) api).getExtName((MessageSigName) x.mid) + ":\n" + + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) + + " { Ept: s.Ept, Res: new(session.LinearResource), msg: &x }\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder buildActionReturn/getSuccStateChan + ).collect(Collectors.joining("")) + + "default: panic(\"Shouldn't get in here: \" + reflect.TypeOf(msg).String())\n" + + "}\n" + + "return nil\n"; // FIXME: panic instead + } return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index d6171c5f8..c04725058 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -76,8 +76,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } else //if (a.mid.isMessageSigName()) { - // FIXME: no -- Branch() should already receive the sig message and case action should just return it - res += f.apply(rpapi.getExtName((MessageSigName) a.mid)); + //res += f.apply(rpapi.getExtName((MessageSigName) a.mid)); + // FIXME: no -- Branch() should already receive the sig message and case action should just return it + res += "*arg0 = *s.msg\n"; } return res + buildReturn(rpapi, curr, succ); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java index 4a3f66d8b..da85bfcea 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -2,13 +2,15 @@ import java.util.HashMap; import java.util.Map; -import java.util.stream.Collectors; import org.scribble.codegen.statetype.STCaseBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.main.RuntimeScribbleException; import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.DataType; import org.scribble.type.name.MessageId; +import org.scribble.type.name.MessageSigName; public class RPCoreSTCaseBuilder extends STCaseBuilder { @@ -34,31 +36,37 @@ public String getPreamble(STStateChanApiBuilder api, EState s) { RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; String casename = getCaseActionName(api, s); - return "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(rpapi.variant) + "\n" + String res = "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(rpapi.variant) + "\n" + "\n" + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" - + "import \"log\"\n" + //+ "import \"log\"\n" + ((RPCoreSTStateChanApiBuilder) api).makeMessageImports(s) + "\n" // Case object interface + "type " + getCaseStateChanName(api, s) + " interface {\n" + casename + "()\n" - + "}\n" + + "}\n"; - // Case object types - + s.getActions().stream().map(a -> - "\ntype " + getOpTypeName(api, s, a.mid) + " struct {\n" + // Case object types + for (EAction a: s.getAllActions()) + { + String extName = (a.mid.isOp()) ? rpapi.getExtName((DataType) a.mid) : rpapi.getExtName((MessageSigName) a.mid); + res += "\ntype " + getOpTypeName(api, s, a.mid) + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(null, rpapi.variant) + "\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + + (a.mid.isMessageSigName() ? "msg *" + extName + "\n" : "") + "}\n" + "\n" - + "func (*" + getOpTypeName(api, s, a.mid) + ") " + casename + "() {}\n" - ).collect(Collectors.joining("")); + + "func (*" + getOpTypeName(api, s, a.mid) + ") " + casename + "() {}\n"; + } + + return res; } private static Map seen = new HashMap<>(); // FIXME HACK + // For type switch on Ops as types ("enum") protected static String getOpTypeName(STStateChanApiBuilder api, EState s, MessageId mid) { String op = mid.toString(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 74b73f664..28249c5cb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -122,9 +122,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { res += f.apply(rpapi.getExtName((MessageSigName) a.mid)); } + + res += "}\n"; } - return res + "}\n" + buildReturn(rpapi, curr, succ); + return res + buildReturn(rpapi, curr, succ); } /*protected static String hackGetValues(String t) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 9f1d4dcdb..a51110f7e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -76,26 +76,38 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat String res = "for i, j := " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + ", 0;" + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.end)+"; i, j = i+1, j+1 {\n"; - // Write label - if (!a.mid.toString().equals("")) { // HACK FIXME? - res += "if err := " + sEpWrite + "[i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(\"" + a.mid + "\"" + ")" - + "; err != nil {\n" - + "log.Fatal(err)\n" // FIXME - + "}\n"; + if (a.mid.isOp()) + { + // Write label + if (!a.mid.toString().equals("")) { // HACK FIXME? + res += "if err := " + sEpWrite + "[i]" + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(\"" + a.mid + "\"" + ")" + + "; err != nil {\n" + + "log.Fatal(err)\n" // FIXME + + "}\n"; + } } - // Write payload + // Write message sig or payload if (isDeleg) //... FIXME: delegation: take pointer? send underlying ept? -- don't do (multi)"send"? { res += "log.Fatal(\"TODO\")\n"; } else { + if (a.mid.isOp() && a.payload.elems.size() < 1) + { + throw new RuntimeException("[rp-core] [param-api] TODO: " + a); + } + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[rp-core] [param-api] TODO: " + a); + } + res += "if err := " + sEpWrite + "[i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(" + "arg0[j])" // FIXME: hardcoded arg0 - + "; err != nil {\n" + + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index f918b3082..f0921cc85 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -147,8 +147,9 @@ protected String getStateChanPremable(EState s) // FIXME: error handling via Err field -- fallback should be panic + "import \"log\"\n"; - // Not needed by Branch/Case objects // FIXME: refactor back into state-specific builders? - if (s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT)// || s.getStateKind() == EStateKind.POLY_INPUT) + // Not needed by select-branch or Case objects // FIXME: refactor back into state-specific builders? + if (s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT + || (s.getStateKind() == EStateKind.POLY_INPUT && !this.apigen.job.selectApi)) { res += makeMessageImports(s); } @@ -156,7 +157,11 @@ protected String getStateChanPremable(EState s) // FIXME: still needed? -- refactor back into state-specific builders? if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) { - res += "import \"sort\"\n\nvar _ = sort.Sort\n"; + res += "import \"sort\"\n"; + res += "import \"reflect\"\n"; + res += "\n"; + res += "var _ = sort.Sort\n"; + res += "var _ = reflect.TypeOf\n"; } // State channel type From a04f8cfc4e45ec27a28286e21290a6122a764f00 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 25 Apr 2018 17:23:00 +0100 Subject: [PATCH 249/433] [rp-core] Started adding custom message formatting to API gen. --- .../statetype3/RPCoreSTApiGenConstants.java | 1 + .../codegen/statetype3/RPCoreSTCaseBuilder.java | 7 ++++--- .../statetype3/RPCoreSTSessionApiBuilder.java | 17 ++++++++++++----- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index 8a77a39a4..e410c1281 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -24,6 +24,7 @@ public class RPCoreSTApiGenConstants public static final String GO_ENDPOINT_PARAMS = "Params"; public static final String GO_CONNECTION_MAP = "Conn"; + public static final String GO_FORMATTER_MAP = "Fmt"; public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java index da85bfcea..602953e5e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -8,7 +8,6 @@ import org.scribble.main.RuntimeScribbleException; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; import org.scribble.type.name.MessageId; import org.scribble.type.name.MessageSigName; @@ -39,7 +38,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) String res = "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(rpapi.variant) + "\n" + "\n" + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" - //+ "import \"log\"\n" + + "import \"log\"\n" + ((RPCoreSTStateChanApiBuilder) api).makeMessageImports(s) + "\n" @@ -51,7 +50,9 @@ public String getPreamble(STStateChanApiBuilder api, EState s) // Case object types for (EAction a: s.getAllActions()) { - String extName = (a.mid.isOp()) ? rpapi.getExtName((DataType) a.mid) : rpapi.getExtName((MessageSigName) a.mid); + String extName = (a.mid.isOp()) ? //rpapi.getExtName((DataType) a.mid) + getOpTypeName(api, s, a.mid) + : rpapi.getExtName((MessageSigName) a.mid); res += "\ntype " + getOpTypeName(api, s, a.mid) + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(null, rpapi.variant) + "\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index fa983a56e..286b5f136 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -166,11 +166,12 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< + "func New(p session.Protocol, " //+"params map[string]int," + ivars.stream().map(x -> x + " int, ").collect(Collectors.joining("")) + "self int) *" + epkindTypeName + " {\n" - + "conns := make(map[string]map[int]transport.Channel)\n" + /*+ "conns := make(map[string]map[int]transport.Channel)\n" + this.apigen.variants.entrySet().stream() .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + "make(map[int]transport.Channel)\n") - .collect(Collectors.joining("")) - + "return &" + epkindTypeName + "{p, self, &session.LinearResource{}, session.NewEndpoint(self, conns)" //"params + .collect(Collectors.joining(""))*/ + + "return &" + epkindTypeName + "{p, self, &session.LinearResource{}, session.NewEndpoint(self, "//conns)" //"params + + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "})" + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + "}\n" + "}\n"; @@ -197,15 +198,21 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< String r = v.getLastElement(); String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(v); epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int, acc transport.Transport) error {\n" + + "func (ini *" + epkindTypeName + ") " + vname + + "_Accept(id int, acc transport.Transport, sfmt session.ScribMessageFormatter) error {\n" + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + r + "\"][id] = acc.Accept()\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + + RPCoreSTApiGenConstants.GO_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id int, req transport.Transport) error {\n" + + "func (ini *" + epkindTypeName + ") " + vname + + "_Dial(id int, req transport.Transport, sfmt session.ScribMessageFormatter) error {\n" + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + r + "\"][id] = req.Connect()\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + + RPCoreSTApiGenConstants.GO_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n"; } From 6619878a19f9dae47b2649c1a8e118cbefb8bccc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 26 Apr 2018 17:08:07 +0100 Subject: [PATCH 250/433] [rp-core] Continued custom message formatting for API gen. --- .../statetype3/RPCoreSTApiGenConstants.java | 62 +++++++++++-------- .../RPCoreSTBranchActionBuilder.java | 6 +- .../statetype3/RPCoreSTCaseActionBuilder.java | 4 +- .../RPCoreSTReceiveActionBuilder.java | 19 +++--- .../RPCoreSTReduceActionBuilder.java | 12 ++-- .../RPCoreSTSelectActionBuilder.java | 4 +- .../RPCoreSTSelectStateBuilder.java | 4 +- .../statetype3/RPCoreSTSendActionBuilder.java | 10 ++- .../statetype3/RPCoreSTSessionApiBuilder.java | 53 +++++++++------- .../RPCoreSTSplitActionBuilder.java | 8 +-- 10 files changed, 106 insertions(+), 76 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index e410c1281..da5996405 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -3,37 +3,49 @@ public class RPCoreSTApiGenConstants { //public static final String GO_SCRIBBLERUNTIME_PACKAGE = "org/scribble/runtime/net"; - public static final String GO_SCRIBBLERUNTIME_SESSION_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/session"; - public static final String GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE = "github.com/scribble/go-runtime/session/param"; - public static final String GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/transport"; - public static final String GO_SCRIBBLERUNTIME_SHM_PACKAGE = "github.com/scribble/go-runtime/transport/shm"; + public static final String GO_SCRIBBLERUNTIME_SESSION_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/session2"; + public static final String GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/transport2"; + public static final String GO_SCRIBBLERUNTIME_SHM_PACKAGE = "github.com/scribble/go-runtime/transport2/shm"; public static final String GO_SCRIBBLERUNTIME_BYTES_PACKAGE = "bytes"; public static final String GO_SCRIBBLERUNTIME_GOB_PACKAGE = "encoding/gob"; + + public static final String GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE = "github.com/scribble/go-runtime/session2/param"; - public static final String GO_ENDPOINT_TYPE = "session.Endpoint"; // net.MPSTEndpoint; - public static final String GO_ENDPOINT_CONSTRUCTOR = "session.NewEndpoint"; - public static final String GO_ENDPOINT_PROTO = "Proto"; - public static final String GO_ENDPOINT_ERR = "Err"; - public static final String GO_ENDPOINT_WRITEALL = "Send"; - public static final String GO_ENDPOINT_READALL = "Recv"; - public static final String GO_ENDPOINT_STARTPROTOCOL = "StartProtocol"; - public static final String GO_ENDPOINT_FINISHPROTOCOL = "FinishProtocol"; - public static final String GO_ENDPOINT_FINALISE = "Finalise"; - //public static final String GO_ENDPOINT_ENDPOINT = "Endpoint"; - public static final String GO_ENDPOINT_ENDPOINT = "Ept"; - public static final String GO_ENDPOINT_PARAMS = "Params"; - - public static final String GO_CONNECTION_MAP = "Conn"; - public static final String GO_FORMATTER_MAP = "Fmt"; - - public static final String GO_FINALISER_TYPE = "session.Finaliser"; // net.MPSTEndpoint; + public static final String GO_MPCHAN_TYPE = "session2.MPChan"; // net.MPSTEndpoint; + public static final String GO_MPCHAN_CONSTRUCTOR = "session2.NewMPChan"; + public static final String GO_MPCHAN_PROTO = "Proto"; + public static final String GO_MPCHAN_ERR = "Err"; + public static final String GO_MPCHAN_FINALISE = "Finalise"; + public static final String GO_MPCHAN_SESSCHAN = "MPChan"; + public static final String GO_MPCHAN_PARAMS = "Params"; + public static final String GO_MPCHAN_CONN_MAP = "Conns"; + public static final String GO_MPCHAN_FORMATTER_MAP = "Fmts"; + public static final String GO_MPCHAN_WRITEALL = "Send"; + public static final String GO_MPCHAN_READALL = "Recv"; + + public static final String GO_MPCHAN_STARTPROTOCOL = "StartProtocol"; + public static final String GO_MPCHAN_FINISHPROTOCOL = "FinishProtocol"; + + public static final String GO_FORMATTER_SERIALIZE = "Serialize"; + public static final String GO_FORMATTER_DESERIALIZE = "Deserialize"; + public static final String GO_FORMATTER_ENCODE_INT = "EncodeInt"; + public static final String GO_FORMATTER_DECODE_INT = "DecodeInt"; + public static final String GO_FORMATTER_ENCODE_STRING = "EncodeString"; + public static final String GO_FORMATTER_DECODE_STRING = "DecodeString"; + + public static final String GO_FINALISER_TYPE = "session2.Finaliser"; // net.MPSTEndpoint; - public static final String GO_ROLE_TYPE = "session.Role"; - public static final String GO_ROLE_CONSTRUCTOR = "session.NewRole"; + public static final String GO_ROLE_TYPE = "session2.Role"; + public static final String GO_ROLE_CONSTRUCTOR = "session2.NewRole"; + + public static final String GO_PARAMROLE_TYPE = "session2.ParamRole"; - public static final String GO_PARAMROLE_TYPE = "session.ParamRole"; + public static final String GO_PROTOCOL_TYPE = "session2.Protocol"; + public static final String GO_FORMATTER_TYPE = "session2.ScribMessageFormatter"; + public static final String GO_SCRIB_LISTENER_TYPE = "transport2.ScribListener"; + public static final String GO_SCRIB_BINARY_CHAN_TYPE = "transport2.BinChannel"; - public static final String GO_LINEARRESOURCE_TYPE = "session.LinearResource"; // net.LinearResource + public static final String GO_LINEARRESOURCE_TYPE = "session2.LinearResource"; // net.LinearResource public static final String GO_LINEARRESOURCE_USE = "Use"; // net.LinearResource public static final String GO_SCHAN_ENDPOINT = "Ept"; // ep; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index e423ebefa..3ff979e2c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -60,7 +60,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat RPIndexedRole peer = (RPIndexedRole) a.peer; // Singleton interval String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + peer.getName() + "\"]"; String res = ""; @@ -70,7 +70,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // Duplicated from RPCoreSTReceiveActionBuilder res += "var lab string\n" // var decl needed for deserializatoin -- FIXME? + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" + "&lab" + ")" + "; err != nil {\n" + "log.Fatal(err)\n" @@ -92,7 +92,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // FIXME: factor out futher (receive, case) res += "var msg session.T\n" // var decl needed for deserializatoin -- FIXME? + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" + "&msg" + ")" + "; err != nil {\n" + "log.Fatal(err)\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index c04725058..fd5c5ae7b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -47,7 +47,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat RPIndexedRole peer = (RPIndexedRole) a.peer; // Singleton interval String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + peer.getName() + "\"]"; // Duplicated from RPCoreSTReceiveActionBuilder @@ -55,7 +55,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK: [] // N.B. *arg0 matches buildArgs + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(&tmp)" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 28249c5cb..492235aec 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -61,7 +61,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." //+ RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + peer.getName() + "\"]"; String res = ""; @@ -82,15 +83,18 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat else { String start = RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start); - res += "for i := " + start + ";" + res += "var err error\n" + + "for i := " + start + ";" + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.end) + "; i++ {\n"; // For payloads -- FIXME: currently hardcoded for exactly one payload Function f = extName -> "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? - + "if err := " + sEpRecv + "[i]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + + "if tmp, err = " + sEpRecv + "[i]" // FIXME: use peer interval + + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()" + + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" @@ -107,9 +111,10 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //if (!a.mid.toString().equals("")) // HACK FIXME? // Now redundant, -param-api checks mid starts uppercase { - res += "var lab string\n" // var decl needed for deserializatoin -- FIXME? - + "if err := " + sEpRecv + "[i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&lab" + ")" + res += //"var lab string\n" // var decl needed for deserialization -- FIXME? + "if _, err = " + sEpRecv + "[i]" + + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&lab" + ")" + + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_STRING + "()" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java index d4c164d6a..8f9d6e270 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java @@ -64,12 +64,12 @@ public String buildBody(STStateChanApiBuilder apigen, EState curr, EAction a, ES String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + "Conn";//ParamCoreSTApiGenConstants.GO_ENDPOINT_READALL; String sEpProto = //"s.ep.Proto" RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_MPCHAN_PROTO; /*String sEpErr = //"s.ep.Err" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." @@ -147,7 +147,7 @@ else if (e instanceof RPIndexVar) "var lab string\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" @@ -159,7 +159,7 @@ else if (e instanceof RPIndexVar) + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" //+ sEpProto + "." + r.getName() + ", " //+ "&data[i-1]" + "&tmp" @@ -197,7 +197,7 @@ else if (!a.payload.elems.isEmpty()) "var lab string\n" + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" //+ sEpProto + "." + r.getName() + ", " + "&lab" + "); err != nil {\n" + "log.Fatal(err)\n" @@ -209,7 +209,7 @@ else if (!a.payload.elems.isEmpty()) + "if err := " + sEpRecv + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" //+ sEpProto + "." + r.getName() + ", " //+ "&data[i-1]" + "&tmp" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index de6982c11..5ac83ef53 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -85,8 +85,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat RPInterval d = peer.intervals.iterator().next(); String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; - String sEpRecv = sEp + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." - + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + peer.getName() + "\"]"; + String sEpRecv = sEp + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + peer.getName() + "\"]"; if (!a.payload.elems.isEmpty()) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index c9bec2e2e..58ace3c00 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -56,7 +56,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT; + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN; String res = "package " + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) + "\n" @@ -108,7 +108,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) else { res += - "if err := " + sEpRecv + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + peer.getName() + "\"][" + "if err := " + sEpRecv + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + peer.getName() + "\"][" + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&op); err != nil {\n" // g.end = g.start -- CFSM only has ? for input + "log.Fatal(err)\n" + "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index a51110f7e..1144940a8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -65,7 +65,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } String sEpWrite = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." //+ RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r.getName() + "\"]"; // FIXME: single arg // Currently never true because of RPCoreSTOutputStateBuilder @@ -81,7 +82,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // Write label if (!a.mid.toString().equals("")) { // HACK FIXME? res += "if err := " + sEpWrite + "[i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + "(\"" + a.mid + "\"" + ")" + + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_STRING + + "(\"" + a.mid + "\"" + ")" + "; err != nil {\n" + "log.Fatal(err)\n" // FIXME + "}\n"; @@ -105,7 +108,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } res += "if err := " + sEpWrite + "[i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_INT + "(" + "arg0[j])" // FIXME: hardcoded arg0 + "; err != nil {\n" + "log.Fatal(err)\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 286b5f136..09c501721 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -153,24 +153,25 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< // Endpoint Kind type + "type " + epkindTypeName + " struct {\n" - + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO + " session.Protocol\n" + + RPCoreSTApiGenConstants.GO_MPCHAN_PROTO + " " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + "\n" + "Self int\n" - + "*session.LinearResource\n" - + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + " *" + RPCoreSTApiGenConstants.GO_ENDPOINT_TYPE + "\n" + + "*" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + " *" + RPCoreSTApiGenConstants.GO_MPCHAN_TYPE + "\n" //+ "Params map[string]int\n" + ivars.stream().map(x -> x + " int\n").collect(Collectors.joining("")) + "}\n" // Endpoint Kind type constructor -- makes connection maps + "\n" - + "func New(p session.Protocol, " //+"params map[string]int," + + "func New(p " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + ", " //+"params map[string]int," + ivars.stream().map(x -> x + " int, ").collect(Collectors.joining("")) + "self int) *" + epkindTypeName + " {\n" /*+ "conns := make(map[string]map[int]transport.Channel)\n" + this.apigen.variants.entrySet().stream() .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + "make(map[int]transport.Channel)\n") .collect(Collectors.joining(""))*/ - + "return &" + epkindTypeName + "{p, self, &session.LinearResource{}, session.NewEndpoint(self, "//conns)" //"params + + "return &" + epkindTypeName + "{p, self, &" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + + "{}, " + RPCoreSTApiGenConstants.GO_MPCHAN_CONSTRUCTOR + "(self, "//conns)" //"params + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "})" + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + "}\n" @@ -198,37 +199,45 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< String r = v.getLastElement(); String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(v); epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") " + vname - + "_Accept(id int, acc transport.Transport, sfmt session.ScribMessageFormatter) error {\n" - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." - + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + r + "\"][id] = acc.Accept()\n" // CHECKME: connection map keys (cf. variant?) - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." - + RPCoreSTApiGenConstants.GO_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" - + "return nil\n" // FIXME: runtime currently does log.Fatal on error + + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int" + + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE + + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + "c, err := ss.Accept()\n" + + "sfmt.Wrap(c)\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" + + "return err\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n" - + "func (ini *" + epkindTypeName + ") " + vname - + "_Dial(id int, req transport.Transport, sfmt session.ScribMessageFormatter) error {\n" - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." - + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[\"" + r + "\"][id] = req.Connect()\n" // CHECKME: connection map keys (cf. variant?) - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." - + RPCoreSTApiGenConstants.GO_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept - + "return nil\n" // FIXME: runtime currently does log.Fatal on error + + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id int" + + ", host string, port int" + + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" + + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + "c, err := dialler(host, port)\n" + + "sfmt.Wrap(c)\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept + + "return err\n" // FIXME: runtime currently does log.Fatal on error + "}\n"; } } - // Top-level Run method + // Top-level Run method // FIXME: add session completion check epkindFile += "\n" + "func (ini *" + epkindTypeName + ") Run(f func(*Init) End) *End {\n" // f specifies non-pointer End + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".Close()\n" + "ini.Use()\n" // FIXME: int-counter linearity - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + ".CheckConnection()\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".CheckConnection()\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) ? "end := f(newBranchInit(ini))\n" - : "end := f(&Init{ new(session.LinearResource), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + : "end := f(&Init{ new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + "return &end\n" + "}"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java index fe43b1356..ca1c0b078 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java @@ -72,13 +72,13 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat String sEpWrite = //s.ep.Write RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN //+ "." + ParamCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL; + ".Conn"; String sEpProto = //"s.ep.Proto" RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PROTO; + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_MPCHAN_PROTO; /*String sEpErr = //"s.ep.Err" ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." @@ -168,7 +168,7 @@ else if (e instanceof RPIndexVar) + (a.mid.toString().equals("") ? "" : // HACK "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "\"" + a.mid + "\"" + "); err != nil {\n" + "log.Fatal(err)\n" @@ -179,7 +179,7 @@ else if (e instanceof RPIndexVar) //+ ParamCoreSTApiGenConstants.GO_IO_FUN_RECEIVER + "." + ParamCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "if err := " + sEpWrite + "[" + sEpProto + "." + r.getName() + ".Name()][i]" - + "." + RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_WRITEALL + "(" //+ sEpProto + "." + r.getName() + ", " + "splitFn0(arg0, i)" + "); err != nil {\n" From b534f501297fab32153454a53b74c377c2412e2e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 26 Apr 2018 17:37:30 +0100 Subject: [PATCH 251/433] [rp-core] Continued custom message formatting for API gen. --- .../statetype3/RPCoreSTReceiveActionBuilder.java | 16 +++++++++------- .../statetype3/RPCoreSTSendActionBuilder.java | 14 ++++++++------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 492235aec..d1a752491 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -61,9 +61,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." //+ RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN; /*+ "." //+ RPCoreSTApiGenConstants.GO_CONNECTION_MAP + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP - + "[\"" + peer.getName() + "\"]"; + + "[\"" + peer.getName() + "\"]";*/ String res = ""; if (a.payload.elems.size() > 1) @@ -91,9 +91,10 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat Function f = extName -> "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? - + "if tmp, err = " + sEpRecv + "[i]" // FIXME: use peer interval + + "if err = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" - + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()" + + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ + + ".RecvInt(\"" + peer.getName() + "\", i, &tmp)" + "; err != nil {\n" + "log.Fatal(err)\n" @@ -111,10 +112,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //if (!a.mid.toString().equals("")) // HACK FIXME? // Now redundant, -param-api checks mid starts uppercase { - res += //"var lab string\n" // var decl needed for deserialization -- FIXME? - "if _, err = " + sEpRecv + "[i]" + res += "var lab string\n" // var decl needed for deserialization -- FIXME? + + "if err = " + sEpRecv /*+ "[i]" + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&lab" + ")" - + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_STRING + "()" + + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_STRING + "()"*/ + + ".RecvString(\"" + peer.getName() + "\", i, &lab)" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 1144940a8..c313f7a42 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -65,9 +65,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } String sEpWrite = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." //+ RPCoreSTApiGenConstants.GO_CONNECTION_MAP + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN; /*+ "." //+ RPCoreSTApiGenConstants.GO_CONNECTION_MAP + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP - + "[\"" + r.getName() + "\"]"; + + "[\"" + r.getName() + "\"]";*/ // FIXME: single arg // Currently never true because of RPCoreSTOutputStateBuilder boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> @@ -81,10 +81,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { // Write label if (!a.mid.toString().equals("")) { // HACK FIXME? - res += "if err := " + sEpWrite + "[i]" + res += "if err := " + sEpWrite /*+ "[i]" + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_STRING - + "(\"" + a.mid + "\"" + ")" + + "(\"" + a.mid + "\"" + ")" */ + + ".SendString(\"" + r.getName() + "\", i, \"" + a.mid + "\")" + "; err != nil {\n" + "log.Fatal(err)\n" // FIXME + "}\n"; @@ -107,10 +108,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat throw new RuntimeException("[rp-core] [param-api] TODO: " + a); } - res += "if err := " + sEpWrite + "[i]" + res += "if err := " + sEpWrite /*+ "[i]" + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_INT - + "(" + "arg0[j])" // FIXME: hardcoded arg0 + + "(" + "arg0[j])" // FIXME: hardcoded arg0*/ + + ".SendInt(\"" + r.getName() + "\", i, arg0[j])" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; From 95ba4430620c3eeb68fd703de92eb48c24c4d02a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 26 Apr 2018 18:28:34 +0100 Subject: [PATCH 252/433] [rp-core] Continued custom message formatting for API gen. --- .../codegen/statetype3/RPCoreSTApiGenConstants.java | 6 +++++- .../statetype3/RPCoreSTReceiveActionBuilder.java | 10 +++++----- .../codegen/statetype3/RPCoreSTSendActionBuilder.java | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index da5996405..414b1fae2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -20,9 +20,13 @@ public class RPCoreSTApiGenConstants public static final String GO_MPCHAN_PARAMS = "Params"; public static final String GO_MPCHAN_CONN_MAP = "Conns"; public static final String GO_MPCHAN_FORMATTER_MAP = "Fmts"; + public static final String GO_MPCHAN_MSEND = "MSend"; + public static final String GO_MPCHAN_MRECV = "MRecv"; + public static final String GO_MPCHAN_ISEND = "ISend"; + public static final String GO_MPCHAN_IRECV = "IRecv"; + public static final String GO_MPCHAN_WRITEALL = "Send"; public static final String GO_MPCHAN_READALL = "Recv"; - public static final String GO_MPCHAN_STARTPROTOCOL = "StartProtocol"; public static final String GO_MPCHAN_FINISHPROTOCOL = "FinishProtocol"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index d1a752491..c45a67df1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -89,17 +89,17 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // For payloads -- FIXME: currently hardcoded for exactly one payload Function f = extName -> - "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? + "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? + "if err = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ - + ".RecvInt(\"" + peer.getName() + "\", i, &tmp)" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &tmp)" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "arg0[i-" + start + "] = tmp\n"; + + "arg0[i-" + start + "] = tmp.(" + extName + ")\n"; if (a.mid.isOp()) { @@ -112,11 +112,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //if (!a.mid.toString().equals("")) // HACK FIXME? // Now redundant, -param-api checks mid starts uppercase { - res += "var lab string\n" // var decl needed for deserialization -- FIXME? + res += "var lab interface{}\n" // string // var decl needed for deserialization -- FIXME? + "if err = " + sEpRecv /*+ "[i]" + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&lab" + ")" + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_STRING + "()"*/ - + ".RecvString(\"" + peer.getName() + "\", i, &lab)" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &lab)" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index c313f7a42..ce85e3a9b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -85,7 +85,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_STRING + "(\"" + a.mid + "\"" + ")" */ - + ".SendString(\"" + r.getName() + "\", i, \"" + a.mid + "\")" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_ISEND + "(\"" + r.getName() + "\", i, \"" + a.mid + "\")" + "; err != nil {\n" + "log.Fatal(err)\n" // FIXME + "}\n"; @@ -112,7 +112,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_INT + "(" + "arg0[j])" // FIXME: hardcoded arg0*/ - + ".SendInt(\"" + r.getName() + "\", i, arg0[j])" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_ISEND + "(\"" + r.getName() + "\", i, arg0[j])" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; From e0a05512edf9f65b3ff085678b9b68e72992f2a5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 26 Apr 2018 19:07:45 +0100 Subject: [PATCH 253/433] [rp-core] Continued custom message formatting for API gen. --- .../RPCoreSTBranchActionBuilder.java | 37 +++++++++++-------- .../statetype3/RPCoreSTCaseActionBuilder.java | 15 ++++---- .../RPCoreSTReceiveActionBuilder.java | 2 +- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 3ff979e2c..8e3672ec5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -60,18 +60,23 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat RPIndexedRole peer = (RPIndexedRole) a.peer; // Singleton interval String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP - + "[\"" + peer.getName() + "\"]"; + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN; /*+ "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + + "[\"" + peer.getName() + "\"]";*/ String res = ""; + + // FIXME: factor out with RPCoreSTStateChanApiBuilder#getSuccStateChan -- don't need terminal check for succ though + String ret = RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ", " + + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; - if (a.mid.isOp()) + if (a.mid.isOp()) // Currently, assuming all mids are Ops; else all mids are sig names { // Duplicated from RPCoreSTReceiveActionBuilder - res += "var lab string\n" // var decl needed for deserializatoin -- FIXME? - + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL - + "(" + "&lab" + ")" + res += "var lab interface{}\n" // string // cf. RPCoreSTReceiveActionBuilder // var decl needed for deserializatoin -- FIXME? + + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(" + "&lab" + ")"*/ + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", 1, &lab" + ")" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; @@ -81,29 +86,31 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "switch lab {\n" + as.stream().map(x -> "case \"" + x.mid + "\":\n" + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) - + "{ Ept: s.Ept, Res: new(session.LinearResource) }\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder buildActionReturn/getSuccStateChan + //+ "{ Ept: s.Ept, Res: new(session.LinearResource) }\n" + + "{" + ret + "}\n" ).collect(Collectors.joining("")) - + "default: panic(\"Shouldn't get in here: \" + lab)\n" + + "default: panic(\"Shouldn't get in here: \" + lab.(string))\n" + "}\n" + "return nil\n"; // FIXME: panic instead } else //if (a.mid.isMessageSigName()) { // FIXME: factor out futher (receive, case) - res += "var msg session.T\n" // var decl needed for deserializatoin -- FIXME? + res += //"var msg session.T\n" // var decl needed for deserialization -- FIXME? + "var msg session2.ScribMessage\n" + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL - + "(" + "&msg" + ")" + + "." //+ RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" + "&msg" + ")" + + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", 1, &msg" + ")" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; - + res += "\n" + "switch x := msg.(type) {\n" + as.stream().map(x -> "case " + ((RPCoreSTStateChanApiBuilder) api).getExtName((MessageSigName) x.mid) + ":\n" - + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) - + " { Ept: s.Ept, Res: new(session.LinearResource), msg: &x }\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder buildActionReturn/getSuccStateChan + + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) + " { " + + ret + ", msg: &x }\n" ).collect(Collectors.joining("")) + "default: panic(\"Shouldn't get in here: \" + reflect.TypeOf(msg).String())\n" + "}\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index fd5c5ae7b..c20f04f4a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -47,19 +47,20 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat RPIndexedRole peer = (RPIndexedRole) a.peer; // Singleton interval String sEpRecv = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP - + "[\"" + peer.getName() + "\"]"; + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN; /*+ "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + + "[\"" + peer.getName() + "\"]";*/ // Duplicated from RPCoreSTReceiveActionBuilder Function f = extName -> - "var tmp " + extName + "\n" // var tmp needed for deserialization -- FIXME? - + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK: [] // N.B. *arg0 matches buildArgs - + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(&tmp)" + "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? + //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK: [] // N.B. *arg0 matches buildArgs + + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(&tmp)"*/ + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", 1, &tmp)" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "*arg0 = tmp\n"; // N.B. *arg0 matches buildArgs + + "*arg0 = tmp.(" + extName + ")\n"; // N.B. *arg0 matches buildArgs String res = ""; if (a.mid.isOp()) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index c45a67df1..1a8512ba3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -90,7 +90,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // For payloads -- FIXME: currently hardcoded for exactly one payload Function f = extName -> "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? - + (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? + //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? + "if err = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ From 497d3fede8c87b408c871653030e6a00435234ca Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 26 Apr 2018 19:34:00 +0100 Subject: [PATCH 254/433] [rp-core] Continued custom message formatting for API gen. --- .../RPCoreSTSelectActionBuilder.java | 65 +++++++++++-------- .../RPCoreSTSelectStateBuilder.java | 17 +++-- .../RPCoreSTStateChanApiBuilder.java | 36 ++++++++++ 3 files changed, 86 insertions(+), 32 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index 5ac83ef53..868b2033b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -53,7 +53,7 @@ public String buildArgs(STStateChanApiBuilder api, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG - + i + " *" + a.payload.elems.get(i) + + i + " *" + ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) a.payload.elems.get(i)) //+ ", reduceFn" + i + " func(" + ParamCoreSTApiGenConstants.GO_CROSS_SEND_FUN_ARG + i + " []int) int" // No: singleton choice subj (not multichoices) ).collect(Collectors.joining(", ")); } @@ -63,11 +63,6 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { RPCoreSTStateChanApiBuilder apigen = (RPCoreSTStateChanApiBuilder) api; - if(a.payload.elems.size() > 1) - { - throw new RuntimeException("[rp-core] TODO: " + a); - } - boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem ((RPCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet)); @@ -75,38 +70,52 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { throw new RuntimeException("[rp-core] TODO: " + a); } - - String res = "_, selected := <-s._" + a.mid + "_Chan\n" - + "if !selected {\n" - + "\treturn nil // select ignores nilchan\n" - + "}\n"; RPIndexedRole peer = (RPIndexedRole) curr.getActions().iterator().next().peer; RPInterval d = peer.intervals.iterator().next(); String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; - String sEpRecv = sEp + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + peer.getName() + "\"]"; + String sEpRecv = sEp + "." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN; /*+ "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + peer.getName() + "\"]";*/ + + String res = "_, selected := <-s._" + a.mid + "_Chan\n" + + "if !selected {\n" + + "\treturn nil // select ignores nilchan\n" + + "}\n"; - if (!a.payload.elems.isEmpty()) + if (a.mid.isOp()) { - if (a.payload.elems.size() > 1) + if (!a.payload.elems.isEmpty()) { - throw new RuntimeException("[rp-core] TODO: payload size > 1: " + a); - } + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[rp-core] TODO: payload size > 1: " + a); + } + String extName = ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) a.payload.elems.get(0)); - if (((GoJob) api.job).noCopy) - { - //res += "decoded = *bs[0].(*" + a.payload.elems.get(0) + ")\n"; - throw new RuntimeException("[rp-core] TODO: -nocopy: " + a); - } + if (((GoJob) api.job).noCopy) + { + //res += "decoded = *bs[0].(*" + a.payload.elems.get(0) + ")\n"; + throw new RuntimeException("[rp-core] TODO: -nocopy: " + a); + } - res += "if err := " + sEpRecv; // + (((GoJob) api.job).noCopy ? "Raw" : ""); - res += "[" + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&arg0); err != nil {\n" - + "log.Fatal(err)\n" + "}\n" - + "ch := make(chan *" + apigen.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" - + "ch <- " + apigen.getSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; - // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + res += "var tmp interface{}\n"; + res += "if err := " + sEpRecv // + (((GoJob) api.job).noCopy ? "Raw" : ""); + //+ "[" + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&arg0)" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", " + + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + ", &tmp)" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n" + + "*arg0 = tmp.(" + extName + ")\n" + + "ch := make(chan *" + apigen.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" + + "ch <- " + apigen.getSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; + // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args + } + } + else //if (a.mid.isMessageSigName()) + { + throw new RuntimeException("[rp-core] TODO: " + a.mid); } return res + "return ch"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index 58ace3c00..c8f7d03eb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -92,11 +92,16 @@ public String getPreamble(STStateChanApiBuilder api, EState s) } // Branch background thread -- receive label, and signal corresponding channel + if (s.getAllActions().get(1).mid.isMessageSigName()) + { + throw new RuntimeException("[rp-core] TODO: " + s.getAllActions()); + } + res += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + ") branch() {\n" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" - + "var op string\n"; + + "var tmp interface{}\n"; if (((GoJob) rpapi.job).noCopy) { /*res += @@ -108,10 +113,14 @@ public String getPreamble(STStateChanApiBuilder api, EState s) else { res += - "if err := " + sEpRecv + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + peer.getName() + "\"][" - + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&op); err != nil {\n" // g.end = g.start -- CFSM only has ? for input + "if err := " + sEpRecv + "." /*+ RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + peer.getName() + "\"][" + + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&op)*/ + + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", " + + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + ", &tmp)" + + "; err != nil {\n" // g.end = g.start -- CFSM only has ? for input + "log.Fatal(err)\n" - + "}\n"; + + "}\n" + + "op := tmp.(string)\n"; } res+= "if " + s.getActions().stream().map(a -> { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index f0921cc85..57b6fa5b5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -316,6 +316,42 @@ protected boolean isDelegType(DataType t) { return this.dtds.stream().filter(x -> x.getDeclName().equals(t)).findAny().get() instanceof RPCoreDelegDecl; // FIXME: make a map } + + /*protected String getExtName(AbstractName n) + { + if (n instanceof DataType) + { + DataType t = (DataType) n; + return this.dtds.stream().filter(x -> x.getDeclName().equals(t)).findAny().get().extName; + } + else if (n instanceof MessageSigName) + { + MessageSigName msn = (MessageSigName) n; + return this.msnds.stream().filter(x -> x.getDeclName().equals(msn)).findAny().get().extName; + } + else + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + n); + } + } + + protected String getExtSource(AbstractName n) + { + if (n instanceof DataType) + { + DataType t = (DataType) n; + return this.dtds.stream().filter(x -> x.getDeclName().equals(t)).findAny().get().extSource; // FIXME: make a map + } + else if (n instanceof MessageSigName) + { + MessageSigName msn = (MessageSigName) n; + return this.msnds.stream().filter(x -> x.getDeclName().equals(msn)).findAny().get().extSource; + } + else + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + n); + } + }*/ protected String getExtName(DataType t) { From 47bafb80d90a6fe91e177ed407ffc21006775d5f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 26 Apr 2018 20:37:52 +0100 Subject: [PATCH 255/433] [rp-core] Continued custom message formatting for API gen. --- .../codegen/statetype3/RPCoreSTBranchActionBuilder.java | 6 +++--- .../ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java | 2 ++ .../core/codegen/statetype3/RPCoreSTSendActionBuilder.java | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 8e3672ec5..df51a4286 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -98,9 +98,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // FIXME: factor out futher (receive, case) res += //"var msg session.T\n" // var decl needed for deserialization -- FIXME? "var msg session2.ScribMessage\n" - + "if err := " + sEpRecv + "[1]" // FIXME: use peer interval - + "." //+ RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" + "&msg" + ")" - + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", 1, &msg" + ")" + + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + + "." //+ RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" + "&msg" + ")"*/ + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", 1, &msg" + ")" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java index 602953e5e..dccad9add 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -41,6 +41,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "import \"log\"\n" + ((RPCoreSTStateChanApiBuilder) api).makeMessageImports(s) + "\n" + + "var _ = log.Fatal\n" + + "\n" // Case object interface + "type " + getCaseStateChanName(api, s) + " interface {\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index ce85e3a9b..b1cf74511 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -112,7 +112,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_INT + "(" + "arg0[j])" // FIXME: hardcoded arg0*/ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_ISEND + "(\"" + r.getName() + "\", i, arg0[j])" + + "." + + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) + + "(\"" + r.getName() + "\", i, arg0[j])" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; From 69809afd7cca645a4345b58676016b09093afe73 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 27 Apr 2018 16:57:16 +0100 Subject: [PATCH 256/433] [rp-core] Continued custom message formatting for API gen. --- .../codegen/statetype3/RPCoreSTReceiveActionBuilder.java | 3 ++- .../core/codegen/statetype3/RPCoreSTSendActionBuilder.java | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 1a8512ba3..e2dfcc93a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -99,7 +99,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "arg0[i-" + start + "] = tmp.(" + extName + ")\n"; + //+ "arg0[i-" + start + "] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder + + "arg0[i-" + start + "] = tmp.(" + extName + ")\n"; // FIXME: gob pointer decoding seems flattened? ("*" dropped) if (a.mid.isOp()) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index b1cf74511..1b90f7105 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -81,11 +81,12 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { // Write label if (!a.mid.toString().equals("")) { // HACK FIXME? - res += "if err := " + sEpWrite /*+ "[i]" + res += "op := \"" + a.mid + "\"\n" // FIXME: API constant? + + "if err := " + sEpWrite /*+ "[i]" + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_STRING + "(\"" + a.mid + "\"" + ")" */ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_ISEND + "(\"" + r.getName() + "\", i, \"" + a.mid + "\")" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_ISEND + "(\"" + r.getName() + "\", i, &op)" + "; err != nil {\n" + "log.Fatal(err)\n" // FIXME + "}\n"; @@ -114,7 +115,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "(" + "arg0[j])" // FIXME: hardcoded arg0*/ + "." + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) - + "(\"" + r.getName() + "\", i, arg0[j])" + + "(\"" + r.getName() + "\", i, &arg0[j])" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n"; From 12603ee0268f9cd64610382270a352820bec2900 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 27 Apr 2018 18:59:08 +0100 Subject: [PATCH 257/433] [rp-core] Adding foreach. --- .../org/scribble/parser/antlr/ParamScribble.g | 24 ++++-- .../org/scribble/ext/go/ast/RPAstFactory.java | 5 ++ .../scribble/ext/go/ast/RPAstFactoryImpl.java | 10 +++ .../org/scribble/ext/go/ast/RPForeach.java | 52 ++++++++++++ .../ext/go/ast/global/RPGForeach.java | 65 ++++++++++++++ .../ext/go/ast/global/RPGMultiChoices.java | 1 + .../ast/global/RPGMultiChoicesTransfer.java | 1 + .../ext/go/core/ast/RPCoreAstFactory.java | 15 ++++ .../ext/go/core/ast/RPCoreForeach.java | 66 +++++++++++++++ .../ext/go/core/ast/global/RPCoreGChoice.java | 4 +- .../ext/go/core/ast/global/RPCoreGEnd.java | 2 +- .../go/core/ast/global/RPCoreGForeach.java | 84 +++++++++++++++++++ .../core/ast/global/RPCoreGMultiChoices.java | 4 +- .../global/RPCoreGProtocolDeclTranslator.java | 16 +++- .../ext/go/core/ast/global/RPCoreGRec.java | 4 +- .../ext/go/core/ast/global/RPCoreGRecVar.java | 2 +- .../ext/go/core/ast/global/RPCoreGType.java | 2 +- .../ext/go/core/ast/local/RPCoreLForeach.java | 52 ++++++++++++ .../ext/go/core/cli/RPCoreCommandLine.java | 2 +- .../parser/scribble/RPAntlrToScribParser.java | 4 +- .../ast/{ => global}/RPAntlrGChoice.java | 2 +- .../scribble/ast/global/RPAntlrGForeach.java | 59 +++++++++++++ .../{ => global}/RPAntlrGMultiChoices.java | 2 +- 23 files changed, 457 insertions(+), 21 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/{ => global}/RPAntlrGChoice.java (96%) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGForeach.java rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/{ => global}/RPAntlrGMultiChoices.java (97%) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 4b3225113..531599b9f 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -67,6 +67,7 @@ tokens PARAM_DELEG_KW = 'deleg'; + PARAM_FOREACH_KW = 'foreach'; /* @@ -178,10 +179,11 @@ tokens PARAM_GLOBALCROSSMESSAGETRANSFER = 'PARAM_GLOBALCROSSMESSAGETRANSFER'; PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; PARAM_GLOBALCHOICE = 'PARAM_GLOBALCHOICE'; - PARAM_GLOBALMULTICHOICES = 'PARAM_GLOBALMULTICHOICES'; - PARAM_GLOBALMULTICHOICESTRANSFER = 'PARAM_GLOBALMULTICHOICESTRANSFER'; + /*PARAM_GLOBALMULTICHOICES = 'PARAM_GLOBALMULTICHOICES'; + PARAM_GLOBALMULTICHOICESTRANSFER = 'PARAM_GLOBALMULTICHOICESTRANSFER';*/ //PARAM_DELEGATION = 'PARAM_DELEGATION'; PARAM_DELEGDECL = 'PARAM_DELEGDECL'; + PARAM_FOREACH = 'PARAM_FOREACH'; } @@ -668,15 +670,25 @@ globalinteraction: | globalwrap -| +/*| globalmultichoices | - globalmultichoicetransfer + globalmultichoicetransfer*/ +| + globalforeach ; /*| globalparallel | globalinterruptible*/ + + +globalforeach: + PARAM_FOREACH_KW '[' simplename ':' paramindexexpr ',' paramindexexpr ']' globalprotocolblock // TODO: generalise +-> + ^(PARAM_FOREACH rolename simplename paramindexexpr paramindexexpr globalprotocolblock) +; + /** @@ -774,7 +786,7 @@ globalchoice: ; -globalmultichoices: +/*globalmultichoices: CHOICES_KW AT_KW rolename '[' simplename ':' paramindexexpr '..' paramindexexpr ']' globalprotocolblock (OR_KW globalprotocolblock)* -> ^(PARAM_GLOBALMULTICHOICES rolename simplename paramindexexpr paramindexexpr globalprotocolblock+) @@ -784,7 +796,7 @@ globalmultichoicetransfer: message FROM_KW rolename '[' simplename ']' TO_KW rolename '[' paramindexexpr '..' paramindexexpr ']' ';' -> ^(PARAM_GLOBALMULTICHOICESTRANSFER message rolename rolename simplename paramindexexpr paramindexexpr) -; +;*/ diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java index d78e290f3..7fd79dc9a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java @@ -11,6 +11,7 @@ import org.scribble.ext.go.ast.global.RPGChoice; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; +import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.ast.global.RPGMultiChoices; import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; import org.scribble.ext.go.core.ast.RPCoreDelegDecl; @@ -30,8 +31,12 @@ RPGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd); RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr, List blocks); + RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block); + + @Deprecated RPGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, List blocks); + @Deprecated RPGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest, RPIndexVar var, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index cca8d8238..cc1c6e559 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -8,9 +8,11 @@ import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.DefaultDel; import org.scribble.ext.go.ast.global.RPGChoice; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; +import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.ast.global.RPGMultiChoices; import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; import org.scribble.ext.go.core.ast.RPCoreDelegDecl; @@ -89,6 +91,14 @@ public RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr return gc; } + @Override + public RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block) + { + RPGForeach gf = new RPGForeach(source, subj, var, start, end, block); + gf = del(gf, new DefaultDel()); + return gf; + } + // FIXME: deprecate -- explicit foreach instead @Override public RPGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, RPIndexVar var, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java new file mode 100644 index 000000000..29389077c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java @@ -0,0 +1,52 @@ +package org.scribble.ext.go.ast; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.CompoundInteractionNode; +import org.scribble.ast.ProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.ProtocolKind; +import org.scribble.visit.AstVisitor; + +public abstract class RPForeach extends CompoundInteractionNode +{ + public final RoleNode subj; + public final RPIndexVar var; + public final RPIndexExpr start; + public final RPIndexExpr end; + public final ProtocolBlock block; + + protected RPForeach(CommonTree source, RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block) + { + super(source); + this.subj = subj; + this.var = var; + this.start = start; + this.end = end; + this.block = block; + } + + public abstract RPForeach reconstruct(RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block); + + @Override + public abstract RPForeach clone(AstFactory af); + + @Override + public RPForeach visitChildren(AstVisitor nv) throws ScribbleException + { + RoleNode subj = (RoleNode) visitChild(this.subj, nv); + ProtocolBlock block = visitChildWithClassEqualityCheck(this, this.block, nv); + return reconstruct(subj, var, start, end, block); + } + + public abstract ProtocolBlock getBlock(); + + @Override + public String toString() + { + return "foreach " + this.subj + "[" + this.var + ":" + this.start + "," + this.end + "] " + this.block; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java new file mode 100644 index 000000000..70bf5c71f --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java @@ -0,0 +1,65 @@ +package org.scribble.ext.go.ast.global; + +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.ProtocolBlock; +import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.global.GCompoundInteractionNode; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.local.LCompoundInteractionNode; +import org.scribble.ast.local.LProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.RPForeach; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; + +public class RPGForeach extends RPForeach implements GCompoundInteractionNode +{ + public RPGForeach(CommonTree source, RoleNode subj, RPIndexVar var, + RPIndexExpr start, RPIndexExpr end, GProtocolBlock block) + { + super(source, subj, var, start, end, block); + } + + @Override + public GProtocolBlock getBlock() + { + return (GProtocolBlock) this.block; + } + + // Similar pattern to reconstruct + // Idea is, if extending the AST class (more fields), then reconstruct/project should also be extended (and called from extended del) + public LCompoundInteractionNode project(AstFactory af, Role self, List blocks) + { + throw new RuntimeException("[param] TODO: " + this); // Because -rp-core only // Not just project, but most passes after parsing + } + + @Override + protected ScribNodeBase copy() + { + return new RPGForeach(this.source, this.subj, this.var, this.start, this.end, getBlock()); + } + + @Override + public RPGForeach clone(AstFactory af) + { + RoleNode subj = this.subj.clone(af); + GProtocolBlock block = getBlock().clone(af); + return ((RPAstFactory) af).RPGForeach(this.source, subj, this.var, this.start, this.end, block); + } + + @Override + public RPGForeach reconstruct(RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block) + { + ScribDel del = del(); + RPGForeach gc = new RPGForeach(this.source, subj, var, start, end, (GProtocolBlock) block); + gc = (RPGForeach) gc.del(del); + return gc; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoices.java index 58f515edd..45398139e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoices.java @@ -23,6 +23,7 @@ import org.scribble.util.ScribUtil; import org.scribble.visit.AstVisitor; +@Deprecated public class RPGMultiChoices extends GChoice { public final RPIndexVar var; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoicesTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoicesTransfer.java index 52ab8e4a1..fe347571b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoicesTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGMultiChoicesTransfer.java @@ -21,6 +21,7 @@ import org.scribble.visit.AstVisitor; // Subsumes scatter/gather, src/dest range length one +@Deprecated public class RPGMultiChoicesTransfer extends GMessageTransfer { public final RPIndexVar var; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java index 437989de6..5fa8dca32 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java @@ -7,19 +7,24 @@ import org.scribble.ext.go.core.ast.global.RPCoreGActionKind; import org.scribble.ext.go.core.ast.global.RPCoreGChoice; import org.scribble.ext.go.core.ast.global.RPCoreGEnd; +import org.scribble.ext.go.core.ast.global.RPCoreGForeach; import org.scribble.ext.go.core.ast.global.RPCoreGRec; import org.scribble.ext.go.core.ast.global.RPCoreGRecVar; import org.scribble.ext.go.core.ast.global.RPCoreGType; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; import org.scribble.ext.go.core.ast.local.RPCoreLCrossChoice; import org.scribble.ext.go.core.ast.local.RPCoreLEnd; +import org.scribble.ext.go.core.ast.local.RPCoreLForeach; import org.scribble.ext.go.core.ast.local.RPCoreLRec; import org.scribble.ext.go.core.ast.local.RPCoreLRecVar; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.Message; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; public class RPCoreAstFactory @@ -67,6 +72,11 @@ public RPCoreGEnd ParamCoreGEnd() return RPCoreGEnd.END; } + public RPCoreGForeach RPCoreGForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr dest, RPCoreGType body, RPCoreGType cont) + { + return new RPCoreGForeach(role, var, src, dest, body, cont); + } + public RPCoreLCrossChoice ParamCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, //LinkedHashMap cases) LinkedHashMap cases) @@ -125,4 +135,9 @@ public RPCoreLEnd ParamCoreLEnd() { return RPCoreLEnd.END; } + + public RPCoreLForeach RPCoreLForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr dest, RPCoreLType body, RPCoreLType cont) + { + return new RPCoreLForeach(role, var, src, dest, body, cont); + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java new file mode 100644 index 000000000..4d62aaa98 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java @@ -0,0 +1,66 @@ +package org.scribble.ext.go.core.ast; + +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.kind.ProtocolKind; +import org.scribble.type.name.Role; + +public abstract class RPCoreForeach, K extends ProtocolKind> implements RPCoreType +{ + public final Role role; + public final RPIndexVar var; + public final RPIndexExpr start; // Gives the Scribble choices-subj range // Cf. ParamCoreGChoice singleton src + public final RPIndexExpr end; // this.dest == super.role -- arbitrary? + public final B body; + public final B cont; + + public RPCoreForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, B body, B cont) + { + this.role = role; + this.var = var; + this.start = start; + this.end = end; + this.body = body; + this.cont = cont; + } + + @Override + public String toString() + { + return "foreach " + this.role + "[" + var + ":" + this.start + "," + this.end + "] do " + this.body + " ; " + this.cont; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof RPCoreForeach)) + { + return false; + } + RPCoreForeach them = (RPCoreForeach) obj; + return them.canEquals(this) && this.role.equals(them.role) + && this.var.equals(them.var) && this.start.equals(them.start) + && this.end.equals(them.end) && this.body.equals(them.body) && this.cont.equals(them.cont); // FIXME: check B kind is equal? + } + + @Override + public abstract boolean canEquals(Object o); + + @Override + public int hashCode() + { + final int prime = 4271; + int result = 1; + result = prime * result + this.role.hashCode(); + result = prime * result + this.var.hashCode(); + result = prime * result + this.start.hashCode(); + result = prime * result + this.end.hashCode(); + result = prime * result + this.body.hashCode(); + result = prime * result + this.cont.hashCode(); + return result; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 5ad0b117b..818037e14 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -164,10 +164,10 @@ public RPCoreGActionKind getKind() } @Override - public Set getParamRoles() + public Set getIndexedRoles() { Set res = Stream.of(this.src, this.dest).collect(Collectors.toSet()); - this.cases.values().forEach(c -> res.addAll(c.getParamRoles())); + this.cases.values().forEach(c -> res.addAll(c.getIndexedRoles())); return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java index 280d76943..6c3f16dbb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java @@ -30,7 +30,7 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } @Override - public Set getParamRoles() + public Set getIndexedRoles() { return Collections.emptySet(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java new file mode 100644 index 000000000..ccc66c13c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -0,0 +1,84 @@ +package org.scribble.ext.go.core.ast.global; + +import java.util.Set; + +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreForeach; +import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; + +public class RPCoreGForeach extends RPCoreForeach implements RPCoreGType +{ + public RPCoreGForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr dest, RPCoreGType body, RPCoreGType cont) + { + super(role, var, src, dest, body, cont); + } + + @Override + public boolean isWellFormed(GoJob job, GProtocolDecl gpd) + { + //return this.body.isWellFormed(job, gpd); + throw new RuntimeException("TODO: "); + } + + @Override + public Set getIndexedRoles() + { + //return this.body.getIndexedRoles(); // foreach subjects? + throw new RuntimeException("TODO: "); + } + + @Override + //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException + { + /*//ParamCoreLType proj = this.body.project(af, r, ranges); + RPCoreLType proj = this.body.project(af, subj); + if (proj instanceof RPCoreLRecVar) + { + RPCoreLRecVar rv = (RPCoreLRecVar) proj; + return rv.recvar.equals(this.recvar) ? RPCoreLEnd.END : rv; + } + else + { + return af.ParamCoreLRec(this.recvar, proj); + }*/ + throw new RuntimeException("TODO: "); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof RPCoreGForeach)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof RPCoreGForeach; + } + + @Override + public int hashCode() + { + int hash = 4273; + hash = 31 * hash + super.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java index 06e5f36eb..f61aae208 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java @@ -152,10 +152,10 @@ public RPCoreGActionKind getKind() } @Override - public Set getParamRoles() + public Set getIndexedRoles() { Set res = Stream.of(this.src, this.dest).collect(Collectors.toSet()); - res.addAll(this.cases.values().iterator().next().getParamRoles()); + res.addAll(this.cases.values().iterator().next().getIndexedRoles()); return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index 9c77d6735..f2ebef269 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.core.ast.global; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -22,6 +23,7 @@ import org.scribble.ext.go.ast.RPAstFactory; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; +import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.type.RPIndexedRole; @@ -85,7 +87,7 @@ private RPCoreGType parseSeq(List is, Map rvs, { throw new RPCoreSyntaxException(first.getSource(), "[rp-core] Unguarded in choice case: " + first); } - if (is.size() > 1) + if (!(first instanceof RPGForeach) && is.size() > 1) // Using Scribble sequencing for foreach continuation { throw new RPCoreSyntaxException(is.get(1).getSource(), "[rp-core] Bad sequential composition after: " + first); } @@ -109,6 +111,12 @@ else if (first instanceof GContinue) { return parseGContinue(rvs, checkRecGuard, (GContinue) first); } + else if (first instanceof RPGForeach) + { + Map tmp = new HashMap<>(rvs); + RPCoreGType seq = parseSeq(is.subList(1, is.size()), tmp, false, false); // CHECKME: false guards + return parseRPGForeach(rvs, checkRecGuard, (RPGForeach) first, seq); + } else { throw new RuntimeException("[rp-core] Shouldn't get in here: " + first); @@ -292,6 +300,12 @@ private RPCoreGType parseGContinue(Map rvs, boolean checkRecGuar } return this.af.ParamCoreGRecVar(recvar); } + + private RPCoreGForeach parseRPGForeach(Map rvs, boolean checkRecGuard, RPGForeach gf, RPCoreGType cont) throws RPCoreSyntaxException + { + RPCoreGType body = parseSeq(gf.getBlock().getInteractionSeq().getInteractions(), Collections.emptyMap(), false, true); + return this.af.RPCoreGForeach(gf.subj.toName(), gf.var, gf.start, gf.end, body, cont); + } // Parses message interactions as unary choices private RPCoreGChoice parseGMessageTransfer(List is, Map rvs, GMessageTransfer gmt) throws RPCoreSyntaxException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java index 8bc19dc5e..b06f00f7d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java @@ -29,9 +29,9 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } @Override - public Set getParamRoles() + public Set getIndexedRoles() { - return this.body.getParamRoles(); + return this.body.getIndexedRoles(); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java index 1bb44995c..8e3260144 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java @@ -29,7 +29,7 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } @Override - public Set getParamRoles() + public Set getIndexedRoles() { return Collections.emptySet(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java index a7d08ce98..26601e561 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java @@ -22,5 +22,5 @@ public interface RPCoreGType extends RPCoreType //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException; - Set getParamRoles(); + Set getIndexedRoles(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java new file mode 100644 index 000000000..e6658fd68 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java @@ -0,0 +1,52 @@ +package org.scribble.ext.go.core.ast.local; + +import java.util.Set; + +import org.scribble.ext.go.core.ast.RPCoreForeach; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.kind.Local; +import org.scribble.type.name.Role; + +public class RPCoreLForeach extends RPCoreForeach implements RPCoreLType +{ + public RPCoreLForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr dest, RPCoreLType body, RPCoreLType cont) + { + super(role, var, src, dest, body, cont); + } + + @Override + public Set getIndexVars() + { + //return this.body.getIndexVars(); + throw new RuntimeException("TODO: "); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof RPCoreLForeach)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof RPCoreLForeach; + } + + @Override + public int hashCode() + { + int hash = 4283; + hash = 31 * hash + super.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 769b43a36..e3e959b38 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -313,7 +313,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws Map> getProtoRoles(GoJob job, RPCoreGType gt) { - Set prs = gt.getParamRoles(); + Set prs = gt.getIndexedRoles(); Map> map = prs.stream() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java index 55afec959..dc2a7defa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java @@ -4,12 +4,12 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.ScribNode; import org.scribble.ext.go.ast.RPAstFactory; -import org.scribble.ext.go.parser.scribble.ast.RPAntlrGChoice; -import org.scribble.ext.go.parser.scribble.ast.RPAntlrGMultiChoices; import org.scribble.ext.go.parser.scribble.ast.RPCoreAntlrDelegDecl; import org.scribble.ext.go.parser.scribble.ast.RPCoreAntlrModule; +import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGChoice; import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGCrossMessageTransfer; import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGDotMessageTransfer; +import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGMultiChoices; import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGMultiChoicesTransfer; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ScribbleAntlrConstants; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGChoice.java similarity index 96% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGChoice.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGChoice.java index 3b1cd9530..218fbd03c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGChoice.java @@ -1,4 +1,4 @@ -package org.scribble.ext.go.parser.scribble.ast; +package org.scribble.ext.go.parser.scribble.ast.global; import java.util.LinkedList; import java.util.List; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGForeach.java new file mode 100644 index 000000000..ba1222f75 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGForeach.java @@ -0,0 +1,59 @@ +package org.scribble.ext.go.parser.scribble.ast.global; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.global.RPGForeach; +import org.scribble.ext.go.parser.scribble.ast.index.RPAntlrIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.ast.name.AntlrSimpleName; +import org.scribble.util.ScribParserException; + +public class RPAntlrGForeach +{ + public static final int SUBJECT_CHILD_INDEX = 0; + + public static final int BLOCK_CHILD_INDEX = 4; + + public static final int INDEX_VAR_CHILD_INDEX = 1; + public static final int START_INDEX_EXPR_CHILD_INDEX = 2; + public static final int END_INDEX_EXPR_CHILD_INDEX = 3; + + public static RPGForeach parseRPGForeach(AntlrToScribParser parser, CommonTree root, RPAstFactory af) throws ScribParserException + { + RoleNode subj = AntlrSimpleName.toRoleNode(getSubjectChild(root), af); + RPIndexVar var = (RPIndexVar) RPAntlrIndexExpr.parseParamIndexExpr(getIndexVarChild(root), af); + RPIndexExpr start = RPAntlrIndexExpr.parseParamIndexExpr(getStartIndexExprChild(root), af); + RPIndexExpr end = RPAntlrIndexExpr.parseParamIndexExpr(getEndIndexExprChild(root), af); + GProtocolBlock block = (GProtocolBlock) parser.parse(getBlockChild(root), af); + return af.RPGForeach(root, subj, var, start, end, block); + } + + public static CommonTree getSubjectChild(CommonTree ct) + { + return (CommonTree) ct.getChild(SUBJECT_CHILD_INDEX); + } + + public static CommonTree getIndexVarChild(CommonTree ct) + { + return (CommonTree) ct.getChild(INDEX_VAR_CHILD_INDEX); + } + + public static CommonTree getStartIndexExprChild(CommonTree ct) + { + return (CommonTree) ct.getChild(START_INDEX_EXPR_CHILD_INDEX); + } + + public static CommonTree getEndIndexExprChild(CommonTree ct) + { + return (CommonTree) ct.getChild(END_INDEX_EXPR_CHILD_INDEX); + } + + public static CommonTree getBlockChild(CommonTree ct) + { + return (CommonTree) ct.getChild(BLOCK_CHILD_INDEX); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGMultiChoices.java similarity index 97% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGMultiChoices.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGMultiChoices.java index f2966a0f4..4b0cb4df1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGMultiChoices.java @@ -1,4 +1,4 @@ -package org.scribble.ext.go.parser.scribble.ast; +package org.scribble.ext.go.parser.scribble.ast.global; import java.util.LinkedList; import java.util.List; From 00b661ab40e145339447fd73cf585f8bf3b3b29f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 28 Apr 2018 17:01:14 +0100 Subject: [PATCH 258/433] [rp-core] Continued adding foreach. --- .../org/scribble/parser/antlr/ParamScribble.g | 6 +- .../scribble/ext/go/ast/RPAstFactoryImpl.java | 4 +- .../ext/go/core/ast/RPCoreAstFactory.java | 8 +- .../ext/go/core/ast/RPCoreForeach.java | 10 +- .../scribble/ext/go/core/ast/RPCoreType.java | 2 + .../ext/go/core/ast/global/RPCoreGChoice.java | 16 +++ .../ext/go/core/ast/global/RPCoreGEnd.java | 13 ++- .../go/core/ast/global/RPCoreGForeach.java | 50 ++++++--- .../core/ast/global/RPCoreGMultiChoices.java | 7 ++ .../global/RPCoreGProtocolDeclTranslator.java | 5 +- .../ext/go/core/ast/global/RPCoreGRec.java | 16 ++- .../ext/go/core/ast/global/RPCoreGRecVar.java | 13 ++- .../ext/go/core/ast/global/RPCoreGType.java | 5 +- .../ext/go/core/ast/local/RPCoreLChoice.java | 17 +++ .../ext/go/core/ast/local/RPCoreLEnd.java | 12 ++ .../ext/go/core/ast/local/RPCoreLForeach.java | 19 +++- .../ext/go/core/ast/local/RPCoreLRec.java | 15 +++ .../ext/go/core/ast/local/RPCoreLRecVar.java | 12 ++ .../ext/go/core/ast/local/RPCoreLType.java | 4 + .../org/scribble/ext/go/del/RPForeachDel.java | 103 ++++++++++++++++++ .../ext/go/del/global/RPGChoiceDel.java | 2 +- .../ext/go/del/global/RPGForeachDel.java | 27 +++++ .../parser/scribble/RPAntlrToScribParser.java | 15 +-- ...GForeach.java => RPCoreAntlrGForeach.java} | 2 +- 24 files changed, 337 insertions(+), 46 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/del/RPForeachDel.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java rename scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/{RPAntlrGForeach.java => RPCoreAntlrGForeach.java} (98%) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 531599b9f..5104c786b 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -183,7 +183,7 @@ tokens PARAM_GLOBALMULTICHOICESTRANSFER = 'PARAM_GLOBALMULTICHOICESTRANSFER';*/ //PARAM_DELEGATION = 'PARAM_DELEGATION'; PARAM_DELEGDECL = 'PARAM_DELEGDECL'; - PARAM_FOREACH = 'PARAM_FOREACH'; + PARAM_GLOBALFOREACH = 'PARAM_GLOBALFOREACH'; } @@ -684,9 +684,9 @@ globalinteraction: globalforeach: - PARAM_FOREACH_KW '[' simplename ':' paramindexexpr ',' paramindexexpr ']' globalprotocolblock // TODO: generalise + PARAM_FOREACH_KW rolename '[' simplename ':' paramindexexpr ',' paramindexexpr ']' globalprotocolblock // TODO: generalise -> - ^(PARAM_FOREACH rolename simplename paramindexexpr paramindexexpr globalprotocolblock) + ^(PARAM_GLOBALFOREACH rolename simplename paramindexexpr paramindexexpr globalprotocolblock) ; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index cc1c6e559..d8e363247 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -8,7 +8,6 @@ import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.DefaultDel; import org.scribble.ext.go.ast.global.RPGChoice; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; @@ -17,6 +16,7 @@ import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; import org.scribble.ext.go.core.ast.RPCoreDelegDecl; import org.scribble.ext.go.del.global.RPGChoiceDel; +import org.scribble.ext.go.del.global.RPGForeachDel; import org.scribble.ext.go.del.global.RPGMessageTransferDel; import org.scribble.ext.go.del.global.RPGMultiChoicesDel; import org.scribble.ext.go.type.index.RPIndexExpr; @@ -95,7 +95,7 @@ public RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr public RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block) { RPGForeach gf = new RPGForeach(source, subj, var, start, end, block); - gf = del(gf, new DefaultDel()); + gf = del(gf, new RPGForeachDel()); return gf; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java index 5fa8dca32..0e118cde3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java @@ -72,9 +72,9 @@ public RPCoreGEnd ParamCoreGEnd() return RPCoreGEnd.END; } - public RPCoreGForeach RPCoreGForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr dest, RPCoreGType body, RPCoreGType cont) + public RPCoreGForeach RPCoreGForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, RPCoreGType body, RPCoreGType seq) { - return new RPCoreGForeach(role, var, src, dest, body, cont); + return new RPCoreGForeach(role, var, start, end, body, seq); } public RPCoreLCrossChoice ParamCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, @@ -136,8 +136,8 @@ public RPCoreLEnd ParamCoreLEnd() return RPCoreLEnd.END; } - public RPCoreLForeach RPCoreLForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr dest, RPCoreLType body, RPCoreLType cont) + public RPCoreLForeach RPCoreLForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, RPCoreLType body, RPCoreLType seq) { - return new RPCoreLForeach(role, var, src, dest, body, cont); + return new RPCoreLForeach(role, var, start, end, body, seq); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java index 4d62aaa98..1d3a39bac 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java @@ -12,7 +12,7 @@ public abstract class RPCoreForeach, K extends ProtocolK public final RPIndexExpr start; // Gives the Scribble choices-subj range // Cf. ParamCoreGChoice singleton src public final RPIndexExpr end; // this.dest == super.role -- arbitrary? public final B body; - public final B cont; + public final B seq; public RPCoreForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, B body, B cont) { @@ -21,13 +21,13 @@ public RPCoreForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr e this.start = start; this.end = end; this.body = body; - this.cont = cont; + this.seq = cont; } @Override public String toString() { - return "foreach " + this.role + "[" + var + ":" + this.start + "," + this.end + "] do " + this.body + " ; " + this.cont; + return "foreach " + this.role + "[" + var + ":" + this.start + "," + this.end + "] do " + this.body + " ; " + this.seq; } @Override @@ -44,7 +44,7 @@ public boolean equals(Object obj) RPCoreForeach them = (RPCoreForeach) obj; return them.canEquals(this) && this.role.equals(them.role) && this.var.equals(them.var) && this.start.equals(them.start) - && this.end.equals(them.end) && this.body.equals(them.body) && this.cont.equals(them.cont); // FIXME: check B kind is equal? + && this.end.equals(them.end) && this.body.equals(them.body) && this.seq.equals(them.seq); // FIXME: check B kind is equal? } @Override @@ -60,7 +60,7 @@ public int hashCode() result = prime * result + this.start.hashCode(); result = prime * result + this.end.hashCode(); result = prime * result + this.body.hashCode(); - result = prime * result + this.cont.hashCode(); + result = prime * result + this.seq.hashCode(); return result; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreType.java index 8f9c198c2..04425e569 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreType.java @@ -6,4 +6,6 @@ public interface RPCoreType { boolean canEquals(Object o); + + RPCoreType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 818037e14..febbe1e08 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -14,6 +14,7 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreChoice; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPIndexedRole; @@ -43,6 +44,21 @@ public RPCoreGChoice(RPIndexedRole src, RPCoreGActionKind kind, RPIndexedRole de this.dest = dest; } + @Override + public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreGType) neu; + } + else + { + LinkedHashMap tmp = new LinkedHashMap<>(); + this.cases.forEach((k, v) -> tmp.put(k, v.subs(af, old, neu))); // Immutable, so neu can be shared by multiple cases + return af.ParamCoreGChoice(this.src, RPCoreGActionKind.CROSS_TRANSFER, this.dest, tmp); + } + } + @Override public boolean isWellFormed(GoJob job, GProtocolDecl gpd) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java index 6c3f16dbb..9a3ac7190 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java @@ -7,9 +7,10 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreEnd; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLType; -import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; @@ -23,6 +24,16 @@ private RPCoreGEnd() } + @Override + public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreGType) neu; + } + return this; + } + @Override public boolean isWellFormed(GoJob job, GProtocolDecl gpd) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index ccc66c13c..4ff987c90 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -6,6 +6,8 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreForeach; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPRoleVariant; @@ -17,41 +19,59 @@ public class RPCoreGForeach extends RPCoreForeach implements RPCoreGType { - public RPCoreGForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr dest, RPCoreGType body, RPCoreGType cont) + public RPCoreGForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr dest, RPCoreGType body, RPCoreGType seq) { - super(role, var, src, dest, body, cont); + super(role, var, src, dest, body, seq); + } + + @Override + public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreGType) neu; + } + else + { + return af.RPCoreGForeach(this.role, this.var, this.start, this.end, + this.body.subs(af, old, neu), this.seq.subs(af, old, neu)); + } } @Override public boolean isWellFormed(GoJob job, GProtocolDecl gpd) { - //return this.body.isWellFormed(job, gpd); - throw new RuntimeException("TODO: "); + // FIXME TODO: interval constraints, nested foreach constraints, etc. -- cf. RPCoreGChoice + return this.body.isWellFormed(job, gpd); } @Override public Set getIndexedRoles() { - //return this.body.getIndexedRoles(); // foreach subjects? - throw new RuntimeException("TODO: "); + return this.body.getIndexedRoles(); // Foreach subjects not included, they are binders? -- cf. RPForeachDel#leaveIndexVarCollection } @Override //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { - /*//ParamCoreLType proj = this.body.project(af, r, ranges); - RPCoreLType proj = this.body.project(af, subj); - if (proj instanceof RPCoreLRecVar) + //ParamCoreLType proj = this.body.project(af, r, ranges); + RPCoreLType body = this.body.project(af, subj); + RPCoreLType seq = this.seq.project(af, subj); + + if (!subj.getName().equals(this.role)) // FIXME: check intervals { - RPCoreLRecVar rv = (RPCoreLRecVar) proj; - return rv.recvar.equals(this.recvar) ? RPCoreLEnd.END : rv; + return af.RPCoreLForeach(subj, this.var, this.start, this.end, body, seq); } - else - { - return af.ParamCoreLRec(this.recvar, proj); + /*else if () + { + // ...else substitute cont for end in body }*/ - throw new RuntimeException("TODO: "); + else + { + return body.subs(af, RPCoreLEnd.END, seq); + //throw new RuntimeException("[rp-core] TODO: " + this + " project onto " + subj); + } } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java index f61aae208..4ddb9aaed 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java @@ -13,6 +13,7 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreChoice; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPIndexedRole; @@ -265,4 +266,10 @@ public boolean canEquals(Object o) { return o instanceof RPCoreGMultiChoices; } + + @Override + public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + throw new RuntimeException("TODO:"); + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index f2ebef269..464ae845a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -301,10 +301,11 @@ private RPCoreGType parseGContinue(Map rvs, boolean checkRecGuar return this.af.ParamCoreGRecVar(recvar); } - private RPCoreGForeach parseRPGForeach(Map rvs, boolean checkRecGuard, RPGForeach gf, RPCoreGType cont) throws RPCoreSyntaxException + // FIXME: need "cont"? + private RPCoreGForeach parseRPGForeach(Map rvs, boolean checkRecGuard, RPGForeach gf, RPCoreGType seq) throws RPCoreSyntaxException { RPCoreGType body = parseSeq(gf.getBlock().getInteractionSeq().getInteractions(), Collections.emptyMap(), false, true); - return this.af.RPCoreGForeach(gf.subj.toName(), gf.var, gf.start, gf.end, body, cont); + return this.af.RPCoreGForeach(gf.subj.toName(), gf.var, gf.start, gf.end, body, seq); } // Parses message interactions as unary choices diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java index b06f00f7d..5b2fd058a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java @@ -6,11 +6,12 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreRec; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.ast.local.RPCoreLRecVar; import org.scribble.ext.go.core.ast.local.RPCoreLType; -import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; @@ -22,6 +23,19 @@ public RPCoreGRec(RecVar recvar, RPCoreGType body) super(recvar, body); } + @Override + public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreGType) neu; + } + else + { + return af.ParamCoreGRec(this.recvar, this.body.subs(af, old, neu)); + } + } + @Override public boolean isWellFormed(GoJob job, GProtocolDecl gpd) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java index 8e3260144..593e404f7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java @@ -7,9 +7,10 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreRecVar; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLType; -import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; @@ -22,6 +23,16 @@ public RPCoreGRecVar(RecVar var) super(var); } + @Override + public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) // Shouldn't happen? + { + return (RPCoreGType) neu; + } + return this; + } + @Override public boolean isWellFormed(GoJob job, GProtocolDecl gpd) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java index 26601e561..6153fe3a7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java @@ -7,8 +7,8 @@ import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLType; -import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; @@ -23,4 +23,7 @@ public interface RPCoreGType extends RPCoreType RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException; Set getIndexedRoles(); + + @Override + RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java index 03947b57a..3e25cd363 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java @@ -3,7 +3,9 @@ import java.util.LinkedHashMap; import java.util.stream.Collectors; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreChoice; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.type.Message; import org.scribble.type.kind.Local; @@ -15,6 +17,21 @@ protected RPCoreLChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMa { super(role, kind, cases); } + + @Override + public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreLType) neu; + } + else + { + LinkedHashMap tmp = new LinkedHashMap<>(); + this.cases.forEach((k, v) -> tmp.put(k, v.subs(af, old, neu))); + return af.ParamCoreLCrossChoice(this.role, RPCoreLActionKind.CROSS_SEND, tmp); + } + } @Override public RPCoreLActionKind getKind() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java index 5fa1ebe26..1c9628bae 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java @@ -3,7 +3,9 @@ import java.util.Collections; import java.util.Set; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreEnd; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; @@ -17,6 +19,16 @@ private RPCoreLEnd() } + @Override + public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreLType) neu; + } + return this; + } + @Override public Set getIndexVars() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java index e6658fd68..bbd417fcb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java @@ -2,7 +2,9 @@ import java.util.Set; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreForeach; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; @@ -15,11 +17,24 @@ public RPCoreLForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr de super(role, var, src, dest, body, cont); } + @Override + public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreLType) neu; + } + else + { + return af.RPCoreLForeach(this.role, this.var, this.start, this.end, + this.body.subs(af, old, neu), this.seq.subs(af, old, neu)); + } + } + @Override public Set getIndexVars() { - //return this.body.getIndexVars(); - throw new RuntimeException("TODO: "); + return this.body.getIndexVars(); // Foreach subjects not included, they are binders? -- cf. RPCoreGForeach#getIndexVars } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java index d830359ec..8d4a95953 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java @@ -2,7 +2,9 @@ import java.util.Set; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreRec; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; @@ -15,6 +17,19 @@ public RPCoreLRec(RecVar recvar, RPCoreLType body) super(recvar, body); } + @Override + public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreLType) neu; + } + else + { + return af.ParamCoreLRec(this.recvar, this.body.subs(af, old, neu)); + } + } + @Override public Set getIndexVars() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java index 52ea517a2..c509b9c02 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java @@ -3,7 +3,9 @@ import java.util.Collections; import java.util.Set; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreRecVar; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; @@ -16,6 +18,16 @@ public RPCoreLRecVar(RecVar var) super(var); } + @Override + public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) // Shouldn't happen? + { + return (RPCoreLType) neu; + } + return this; + } + @Override public Set getIndexVars() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java index 7697ae148..530449465 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java @@ -2,6 +2,7 @@ import java.util.Set; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; @@ -10,4 +11,7 @@ public interface RPCoreLType extends RPCoreType { Set getIndexVars(); // FIXME: factor up? + + @Override + RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/RPForeachDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/RPForeachDel.java new file mode 100644 index 000000000..2cbf28616 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/RPForeachDel.java @@ -0,0 +1,103 @@ +package org.scribble.ext.go.del; + +import org.scribble.ast.ScribNode; +import org.scribble.del.CompoundInteractionNodeDel; +import org.scribble.ext.go.ast.RPDel; +import org.scribble.ext.go.ast.RPForeach; +import org.scribble.main.ScribbleException; +import org.scribble.visit.InlinedProtocolUnfolder; +import org.scribble.visit.env.UnfoldingEnv; + +// Based on ChoiceDecl +public class RPForeachDel extends CompoundInteractionNodeDel implements RPDel +{ + /*// Role names not disambiguated? + @Override + public void enterDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb) throws ScribbleException + { + Recursion rec = (Recursion) child; + RecVar rv = rec.recvar.toName(); + //disamb.addRecVar(rv); + disamb.pushRecVar(rv); + } + + @Override + public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException + { + RecVar rv = ((Recursion) child).recvar.toName(); // visited may be already name mangled // Not any more (refactored to inlining) + disamb.popRecVar(rv); + return rec; + }*/ + + /*@Override // No special inlining behaviour for Foreach -- just visitChildren + public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inliner) throws ScribbleException + { + super.enterProtocolInlining(parent, child, inliner); + RPForeach rec = (RPForeach) child; + inliner.pushRecVar(rec.recvar.toName()); + } + + @Override + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inliner, ScribNode visited) throws ScribbleException + { + //Recursion rec = (Recursion) visited; + RecVar origRV = ((Recursion) child).recvar.toName(); // visited may be already name mangled + inliner.popRecVar(origRV); + return super.leaveProtocolInlining(parent, child, inliner, visited); + }*/ + + /*// Anything special needed? + @Override + public void enterInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf) throws ScribbleException + { + super.enterInlinedProtocolUnfolding(parent, child, unf); + Recursion lr = (Recursion) child; + RecVar recvar = lr.recvar.toName(); + unf.setRecVar(unf.job.af, recvar, lr); // Cloned on use (on continue) + + UnfoldingEnv env = unf.peekEnv().enterContext(); + env = env.pushChoiceParent(); // Above is already a copy, but fine + unf.pushEnv(env); + }*/ + + @Override + public RPForeach leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException + { + RPForeach fe = (RPForeach) visited; + UnfoldingEnv merged = unf.popEnv().mergeContext((UnfoldingEnv) fe.block.del().env()); // Merge child into current... + unf.pushEnv(merged); + return (RPForeach) super.leaveInlinedProtocolUnfolding(parent, child, unf, fe); // ...super merges current into parent + + /*Choice cho = (Choice) visited; + List benvs = + cho.getBlocks().stream().map(b -> (UnfoldingEnv) b.del().env()).collect(Collectors.toList()); + UnfoldingEnv merged = unf.popEnv().mergeContexts(benvs); + unf.pushEnv(merged); + return (Choice) super.leaveInlinedProtocolUnfolding(parent, child, unf, visited); // Done merge of children here, super does merge into parent*/ + } + + /*@Override + public ScribNode leaveIndexVarCollection(ScribNode parent, ScribNode child, RPCoreIndexVarCollector coll, ScribNode visited) throws ScribbleException + { + // No: the foreach index vars are bound + }*/ + + /*// Needed? -- how about Recursion? + @Override + public void enterExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker) throws ScribbleException + { + ExplicitCorrelationEnv env = checker.peekEnv().enterContext(); + checker.pushEnv(env); + } + + @Override + public Choice leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException + { + Choice cho = (Choice) visited; + List benvs = + cho.getBlocks().stream().map((b) -> (ExplicitCorrelationEnv) b.del().env()).collect(Collectors.toList()); + ExplicitCorrelationEnv merged = checker.popEnv().mergeContexts(benvs); + checker.pushEnv(merged); + return (Choice) super.leaveExplicitCorrelationCheck(parent, child, checker, visited); // Done merge of children here, super does merge into parent + }*/ +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java index cec8e5f72..e8a69e835 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGChoiceDel.java @@ -34,7 +34,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc return ScribDelBase.popAndSetVisitorEnv(this, inl, visited); } - // FIXME: not needed for global -- should be local + // FIXME: not really needed for global? -- should be local @Override public ScribNode leaveIndexVarCollection(ScribNode parent, ScribNode child, RPCoreIndexVarCollector coll, ScribNode visited) throws ScribbleException { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java new file mode 100644 index 000000000..c22238454 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java @@ -0,0 +1,27 @@ +package org.scribble.ext.go.del.global; + +import org.scribble.ast.ScribNode; +import org.scribble.ast.global.GProtocolBlock; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDelBase; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.ast.global.RPGForeach; +import org.scribble.ext.go.del.RPForeachDel; +import org.scribble.main.ScribbleException; +import org.scribble.visit.ProtocolDefInliner; +import org.scribble.visit.env.InlineProtocolEnv; + +public class RPGForeachDel extends RPForeachDel +{ + @Override + public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inlr, ScribNode visited) throws ScribbleException + { + RPGForeach fe = (RPGForeach) visited; + RoleNode subj = fe.subj.clone(inlr.job.af); + GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) fe.block.del().env()).getTranslation(); + RPGForeach inlined = ((RPAstFactory) inlr.job.af).RPGForeach(fe.getSource(), subj, fe.var, fe.start, fe.end, block); + inlr.pushEnv(inlr.popEnv().setTranslation(inlined)); + //return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); + return ScribDelBase.popAndSetVisitorEnv(this, inlr, visited); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java index dc2a7defa..de2b27155 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java @@ -9,8 +9,7 @@ import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGChoice; import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGCrossMessageTransfer; import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGDotMessageTransfer; -import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGMultiChoices; -import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGMultiChoicesTransfer; +import org.scribble.ext.go.parser.scribble.ast.global.RPCoreAntlrGForeach; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ScribbleAntlrConstants; import org.scribble.util.ScribParserException; @@ -22,9 +21,10 @@ public class RPAntlrToScribParser extends AntlrToScribParser public static final String PARAM_GLOBALCROSSMESSAGETRANSFER_NODE_TYPE = "PARAM_GLOBALCROSSMESSAGETRANSFER"; public static final String PARAM_GLOBALDOTMESSAGETRANSFER_NODE_TYPE = "PARAM_GLOBALDOTMESSAGETRANSFER"; public static final String PARAM_GLOBALCHOICE_NODE_TYPE = "PARAM_GLOBALCHOICE"; - public static final String PARAM_GLOBALMULTICHOICES_NODE_TYPE = "PARAM_GLOBALMULTICHOICES"; - public static final String PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE = "PARAM_GLOBALMULTICHOICESTRANSFER"; + /*public static final String PARAM_GLOBALMULTICHOICES_NODE_TYPE = "PARAM_GLOBALMULTICHOICES"; + public static final String PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE = "PARAM_GLOBALMULTICHOICESTRANSFER";*/ public static final String PARAM_DELEGDECL_NODE_TYPE = "PARAM_DELEGDECL"; + public static final String PARAM_GLOBALFOREACH = "PARAM_GLOBALFOREACH"; public RPAntlrToScribParser() { @@ -50,11 +50,12 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException return RPAntlrGDotMessageTransfer.parseParamGDotMessageTransfer(this, ct, aaf); case PARAM_GLOBALCHOICE_NODE_TYPE: return RPAntlrGChoice.parseParamGChoice(this, ct, aaf); - case PARAM_GLOBALMULTICHOICES_NODE_TYPE: + /*case PARAM_GLOBALMULTICHOICES_NODE_TYPE: return RPAntlrGMultiChoices.parseParamGMultiChoices(this, ct, aaf); case PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE: - return RPAntlrGMultiChoicesTransfer.parseParamGMultiChoicesTransfer(this, ct, aaf); - + return RPAntlrGMultiChoicesTransfer.parseParamGMultiChoicesTransfer(this, ct, aaf);*/ + case PARAM_GLOBALFOREACH: + return RPCoreAntlrGForeach.parseRPGForeach(this, ct, aaf); case PARAM_DELEGDECL_NODE_TYPE: return RPCoreAntlrDelegDecl.parseDelegDecl(this, ct, aaf); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java similarity index 98% rename from scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGForeach.java rename to scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java index ba1222f75..ba55565c7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java @@ -12,7 +12,7 @@ import org.scribble.parser.scribble.ast.name.AntlrSimpleName; import org.scribble.util.ScribParserException; -public class RPAntlrGForeach +public class RPCoreAntlrGForeach { public static final int SUBJECT_CHILD_INDEX = 0; From b4bc022cc2065c9cf465ee5e4e372edb796bf018 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 28 Apr 2018 18:19:27 +0100 Subject: [PATCH 259/433] [rp-core] Continued adding foreach. --- .../ast/name/simple/AmbigNameNode.java | 2 +- .../name/simple/DummyProjectionRoleNode.java | 2 +- .../org/scribble/ast/name/simple/OpNode.java | 2 +- .../scribble/ast/name/simple/RecVarNode.java | 2 +- .../scribble/ast/name/simple/RoleNode.java | 2 +- .../scribble/ast/name/simple/ScopeNode.java | 2 +- .../org/scribble/parser/antlr/ParamScribble.g | 19 +++++ .../org/scribble/ext/go/ast/RPAstFactory.java | 2 + .../scribble/ext/go/ast/RPAstFactoryImpl.java | 9 +++ .../ast/global/RPGCrossMessageTransfer.java | 1 + .../go/ast/name/simple/RPIndexedRoleNode.java | 75 +++++++++++++++++++ .../go/ast/name/simple/RPRoleParamNode.java | 65 ---------------- .../ext/go/core/ast/RPCoreForeach.java | 3 + .../ast/name/ParamAntlrSimpleName.java | 8 +- .../ext/go/type/index/RPIndexFactory.java | 1 + .../ext/go/type/index/RPIndexVar.java | 6 +- ...eParamKind.java => RPIndexedRoleKind.java} | 12 +-- .../ext/go/type/name/RPIndexedRole.java | 64 ++++++++++++++++ .../ext/go/type/name/RPRoleParam.java | 60 --------------- 19 files changed, 192 insertions(+), 145 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPRoleParamNode.java rename scribble-go/src/main/java/org/scribble/ext/go/type/kind/{RPRoleParamKind.java => RPIndexedRoleKind.java} (57%) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/name/RPIndexedRole.java delete mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/name/RPRoleParam.java diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java index e1730d08c..d74e07870 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/AmbigNameNode.java @@ -104,7 +104,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 331; - hash = 31 * super.hashCode(); + hash = 31*hash + super.hashCode(); return hash; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java index a45b6257d..b66ff7f25 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/DummyProjectionRoleNode.java @@ -86,7 +86,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 359; - hash = 31 * super.hashCode(); + hash = 31*hash + super.hashCode(); return hash; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java index 2bdb3047d..d7734fc5e 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/OpNode.java @@ -75,7 +75,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 347; - hash = 31 * super.hashCode(); + hash = 31*hash + super.hashCode(); return hash; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java index 4f0283826..60ba5a6ac 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RecVarNode.java @@ -77,7 +77,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 349; - hash = 31 * super.hashCode(); + hash = 31*hash + super.hashCode(); return hash; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java index 9f8c65069..f0a911ddf 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/RoleNode.java @@ -85,7 +85,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 353; - hash = 31 * super.hashCode(); + hash = 31*hash + super.hashCode(); return hash; } } diff --git a/scribble-core/src/main/java/org/scribble/ast/name/simple/ScopeNode.java b/scribble-core/src/main/java/org/scribble/ast/name/simple/ScopeNode.java index 3423fc362..6985d52a1 100644 --- a/scribble-core/src/main/java/org/scribble/ast/name/simple/ScopeNode.java +++ b/scribble-core/src/main/java/org/scribble/ast/name/simple/ScopeNode.java @@ -68,7 +68,7 @@ public boolean canEqual(Object o) public int hashCode() { int hash = 359; - hash = 31 * super.hashCode(); + hash = 31*hash + super.hashCode(); return hash; } } diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 5104c786b..57ba2f457 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -700,6 +700,7 @@ globalmessagetransfer: ^(GLOBALMESSAGETRANSFER message rolename rolename+) | + // For now require all "singleton indexed roles" to be written as singleton intervals message FROM_KW rolename '[' paramindexexpr ',' paramindexexpr ']' TO_KW rolename '[' paramindexexpr ',' paramindexexpr ']' ';' -> ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr) @@ -708,6 +709,24 @@ globalmessagetransfer: -> ^(PARAM_GLOBALDOTMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr)*/ ; + +/*rpindex: + rpsingletonindex +| + rpinterval +; + +rpsingletonindex: + '[' paramindexexpr ']' +-> + ... +; + +rpinterval: + '[' paramindexexpr ',' paramindexexpr ']' +-> + ... +;*/ paramindexexpr: diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java index 7fd79dc9a..26dbeca08 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java @@ -14,6 +14,7 @@ import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.ast.global.RPGMultiChoices; import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; +import org.scribble.ext.go.ast.name.simple.RPIndexedRoleNode; import org.scribble.ext.go.core.ast.RPCoreDelegDecl; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; @@ -32,6 +33,7 @@ RPGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd); RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr, List blocks); RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block); + RPIndexedRoleNode RPIndexedRoleNode(CommonTree source, String identifier, RPIndexExpr start, RPIndexExpr end); @Deprecated RPGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, RPIndexVar var, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index d8e363247..e7dedda72 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -14,6 +14,7 @@ import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.ast.global.RPGMultiChoices; import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; +import org.scribble.ext.go.ast.name.simple.RPIndexedRoleNode; import org.scribble.ext.go.core.ast.RPCoreDelegDecl; import org.scribble.ext.go.del.global.RPGChoiceDel; import org.scribble.ext.go.del.global.RPGForeachDel; @@ -99,6 +100,14 @@ public RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPIndexVar var, R return gf; } + @Override + public RPIndexedRoleNode RPIndexedRoleNode(CommonTree source, String identifier, RPIndexExpr start, RPIndexExpr end) + { + RPIndexedRoleNode irn = new RPIndexedRoleNode(source, identifier, start, end); + irn = del(irn, createDefaultDelegate()); + return irn; + } + // FIXME: deprecate -- explicit foreach instead @Override public RPGMultiChoices ParamGMultiChoices(CommonTree source, RoleNode subj, RPIndexVar var, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java index ba13fc165..07209311b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java @@ -11,6 +11,7 @@ import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.type.name.Role; +// FIXME: rename, and use RPIndexedRoleNode // Subsumes scatter/gather, src/dest range length one public class RPGCrossMessageTransfer extends RPGMessageTransfer { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java new file mode 100644 index 000000000..1cf9a624c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java @@ -0,0 +1,75 @@ +package org.scribble.ext.go.ast.name.simple; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.name.simple.SimpleNameNode; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.kind.RPIndexedRoleKind; +import org.scribble.ext.go.type.name.RPIndexedRole; + + +// Currently used for both "actual params" and int literals +public class RPIndexedRoleNode extends SimpleNameNode // Not RoleNode, for distinct Kind -- (though distinction maybe unecessary) +{ + public final RPIndexExpr start; // Use "types" directly -- source syntax parsed directly to types (cf. scrib-assrt, AssrtAntlrToFormulaParser) + public final RPIndexExpr end; + + public RPIndexedRoleNode(CommonTree source, String identifier, RPIndexExpr start, RPIndexExpr end) + { + super(source, identifier); + this.start = start; + this.end = end; + } + + @Override + protected RPIndexedRoleNode copy() + { + return new RPIndexedRoleNode(this.source, getIdentifier(), this.start, this.end); + } + + @Override + public RPIndexedRoleNode clone(AstFactory af) + { + return ((RPAstFactory) af).RPIndexedRoleNode(this.source, getIdentifier(), this.start, this.end); + } + + @Override + public RPIndexedRole toName() + { + String id = getIdentifier(); + return new RPIndexedRole(id, this.start, this.end); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPIndexedRoleNode)) + { + return false; + } + RPIndexedRoleNode them = (RPIndexedRoleNode) o; + return super.equals(o) // Doesn canEqual + && this.start.equals(them.start) && this.end.equals(them.end); + } + + @Override + public boolean canEqual(Object o) + { + return o instanceof RPIndexedRoleNode; + } + + @Override + public int hashCode() + { + int hash = 7159; + hash = 31*hash + super.hashCode(); + hash = 31*hash + this.start.hashCode(); + hash = 31*hash + this.end.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPRoleParamNode.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPRoleParamNode.java deleted file mode 100644 index f66135b07..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPRoleParamNode.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.scribble.ext.go.ast.name.simple; - -import org.antlr.runtime.tree.CommonTree; -import org.scribble.ast.AstFactory; -import org.scribble.ast.name.simple.SimpleNameNode; -import org.scribble.ext.go.type.kind.RPRoleParamKind; -import org.scribble.ext.go.type.name.RPRoleParam; - - -// Currently used for both "actual params" and int literals -@Deprecated -public class RPRoleParamNode extends SimpleNameNode -{ - public RPRoleParamNode(CommonTree source, String identifier) - { - super(source, identifier); - } - - @Override - protected RPRoleParamNode copy() - { - return new RPRoleParamNode(this.source, getIdentifier()); - } - - @Override - public RPRoleParamNode clone(AstFactory af) - { - return (RPRoleParamNode) af.SimpleNameNode(this.source, RPRoleParamKind.KIND, getIdentifier()); - } - - @Override - public RPRoleParam toName() - { - String id = getIdentifier(); - return new RPRoleParam(id); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof RPRoleParamNode)) - { - return false; - } - return ((RPRoleParamNode) o).canEqual(this) && super.equals(o); - } - - @Override - public boolean canEqual(Object o) - { - return o instanceof RPRoleParamNode; - } - - @Override - public int hashCode() - { - int hash = 7159; - hash = 31 * super.hashCode(); - return hash; - } -} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java index 1d3a39bac..563e8f1e6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java @@ -9,8 +9,11 @@ public abstract class RPCoreForeach, K extends ProtocolK { public final Role role; public final RPIndexVar var; + + // FIXME: use RPInterval public final RPIndexExpr start; // Gives the Scribble choices-subj range // Cf. ParamCoreGChoice singleton src public final RPIndexExpr end; // this.dest == super.role -- arbitrary? + public final B body; public final B seq; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java index 6da0ed74b..f0df63710 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/name/ParamAntlrSimpleName.java @@ -2,15 +2,15 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; -import org.scribble.ext.go.ast.name.simple.RPRoleParamNode; -import org.scribble.ext.go.type.kind.RPRoleParamKind; +import org.scribble.ext.go.ast.name.simple.RPIndexedRoleNode; +import org.scribble.ext.go.type.kind.RPIndexedRoleKind; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; @Deprecated public class ParamAntlrSimpleName { - public static RPRoleParamNode toParamRoleParamNode(CommonTree ct, AstFactory af) + public static RPIndexedRoleNode toParamRoleParamNode(CommonTree ct, AstFactory af) { - return (RPRoleParamNode) af.SimpleNameNode(ct, RPRoleParamKind.KIND, AntlrSimpleName.getName(ct)); + return (RPIndexedRoleNode) af.SimpleNameNode(ct, RPIndexedRoleKind.KIND, AntlrSimpleName.getName(ct)); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java index 7c8c786af..776bd8c59 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.type.index; +// Used directly by source ast parsing -- cf. scrib-assrt, AssrtAntlrToFormulaParser // Would correspond to a "types factory" -- cf. AST factory public class RPIndexFactory { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java index e75659703..1957b019d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java @@ -3,8 +3,6 @@ import java.util.HashSet; import java.util.Set; -import org.scribble.ext.go.type.name.RPRoleParam; - // Variable occurrence public class RPIndexVar extends RPIndexExpr // FIXME: extend AbstractName? cf. Role -- e.g., for compatibility with NameCollector { @@ -15,10 +13,10 @@ protected RPIndexVar(String name) this.name = name; } - public RPRoleParam toRoleParam() + /*public RPRoleParam toRoleParam() { return new RPRoleParam(this.name); - } + }*/ @Override public String toGoString() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/kind/RPRoleParamKind.java b/scribble-go/src/main/java/org/scribble/ext/go/type/kind/RPIndexedRoleKind.java similarity index 57% rename from scribble-go/src/main/java/org/scribble/ext/go/type/kind/RPRoleParamKind.java rename to scribble-go/src/main/java/org/scribble/ext/go/type/kind/RPIndexedRoleKind.java index ce06c67cf..c748b175d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/kind/RPRoleParamKind.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/kind/RPIndexedRoleKind.java @@ -4,13 +4,13 @@ import org.scribble.type.kind.AbstractKind; -public class RPRoleParamKind extends AbstractKind implements Serializable +public class RPIndexedRoleKind extends AbstractKind implements Serializable { private static final long serialVersionUID = 1L; - public static final RPRoleParamKind KIND = new RPRoleParamKind(); + public static final RPIndexedRoleKind KIND = new RPIndexedRoleKind(); - protected RPRoleParamKind() + protected RPIndexedRoleKind() { } @@ -28,16 +28,16 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof RPRoleParamKind)) + if (!(o instanceof RPIndexedRoleKind)) { return false; } - return ((RPRoleParamKind) o).canEqual(this); + return ((RPIndexedRoleKind) o).canEqual(this); } @Override public boolean canEqual(Object o) { - return o instanceof RPRoleParamKind; + return o instanceof RPIndexedRoleKind; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPIndexedRole.java new file mode 100644 index 000000000..735fee001 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPIndexedRole.java @@ -0,0 +1,64 @@ +package org.scribble.ext.go.type.name; + +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.kind.RPIndexedRoleKind; +import org.scribble.type.name.AbstractName; + +// Currently used for both "actual params" and int literals -- cf. ParamRoleParamRoleNode, and isConstant +public class RPIndexedRole extends AbstractName +{ + public final RPIndexExpr start; + public final RPIndexExpr end; + + private static final long serialVersionUID = 1L; + + protected RPIndexedRole(RPIndexExpr start, RPIndexExpr end) + { + super(RPIndexedRoleKind.KIND); + this.start = start; + this.end = end; + } + + public RPIndexedRole(String text, RPIndexExpr start, RPIndexExpr end) + { + super(RPIndexedRoleKind.KIND, text); + this.start = start; + this.end = end; + } + + public boolean isSingleton() + { + return this.start.equals(this.end); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPIndexedRole)) + { + return false; + } + RPIndexedRole them = (RPIndexedRole) o; + return super.equals(o) // Does canEqual + && this.start.equals(them.start) && this.end.equals(them.end); + } + + public boolean canEqual(Object o) + { + return o instanceof RPIndexedRole; + } + + @Override + public int hashCode() + { + int hash = 7187; + hash = 31*hash + super.hashCode(); + hash = 31*hash + this.start.hashCode(); + hash = 31*hash + this.end.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPRoleParam.java b/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPRoleParam.java deleted file mode 100644 index 86ec8750a..000000000 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPRoleParam.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.scribble.ext.go.type.name; - -import org.scribble.ext.go.type.kind.RPRoleParamKind; -import org.scribble.type.name.AbstractName; - -// Currently used for both "actual params" and int literals -- cf. ParamRoleParamRoleNode, and isConstant -public class RPRoleParam extends AbstractName -{ - private static final long serialVersionUID = 1L; - - protected RPRoleParam() - { - super(RPRoleParamKind.KIND); - } - - public RPRoleParam(String text) - { - super(RPRoleParamKind.KIND, text); - } - - public boolean isConstant() - { - try - { - Integer.valueOf(this.toString()); - return true; - } - catch (NumberFormatException e) - { - return false; - } - } - - @Override - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (!(o instanceof RPRoleParam)) - { - return false; - } - return super.equals(o); // Does canEqual - } - - public boolean canEqual(Object o) - { - return o instanceof RPRoleParam; - } - - @Override - public int hashCode() - { - int hash = 7187; - hash = 31 * super.hashCode(); - return hash; - } -} From 2e5d2d57b4d438aa8da93c3e4f886eef57440e03 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 28 Apr 2018 20:33:11 +0100 Subject: [PATCH 260/433] [rp-core] Continued adding foreach. --- .../model/endpoint/EModelFactory.java | 5 ++-- .../model/endpoint/EModelFactoryImpl.java | 12 ++++---- .../org/scribble/parser/antlr/ParamScribble.g | 2 +- .../go/ast/name/simple/RPIndexedRoleNode.java | 1 + .../go/core/ast/global/RPCoreGForeach.java | 29 ++++++++++++++----- .../global/RPCoreGProtocolDeclTranslator.java | 2 +- .../model/endpoint/RPCoreEModelFactory.java | 1 + .../endpoint/RPCoreEModelFactoryImpl.java | 2 ++ .../org/scribble/ext/go/del/RPForeachDel.java | 11 ++++++- 9 files changed, 47 insertions(+), 18 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java index 43e981467..bac432e54 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactory.java @@ -29,6 +29,9 @@ public interface EModelFactory { + + EState newEState(Set labs); + ESend newESend(Role peer, MessageId mid, Payload payload); EReceive newEReceive(Role peer, MessageId mid, Payload payload); ERequest newERequest(Role peer, MessageId mid, Payload payload); @@ -36,6 +39,4 @@ public interface EModelFactory EDisconnect newEDisconnect(Role peer); EWrapClient newEWrapClient(Role peer); EWrapServer newEWrapServer(Role peer); - - EState newEState(Set labs); } diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java index 3505dc96c..a06b3b288 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EModelFactoryImpl.java @@ -31,6 +31,12 @@ public class EModelFactoryImpl implements EModelFactory { + @Override + public EState newEState(Set labs) + { + return new EState(labs); + } + @Override public ESend newESend(Role peer, MessageId mid, Payload payload) { @@ -72,10 +78,4 @@ public EWrapServer newEWrapServer(Role peer) { return new EWrapServer(this, peer); } - - @Override - public EState newEState(Set labs) - { - return new EState(labs); - } } diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 57ba2f457..c9af250ae 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -700,7 +700,7 @@ globalmessagetransfer: ^(GLOBALMESSAGETRANSFER message rolename rolename+) | - // For now require all "singleton indexed roles" to be written as singleton intervals + // For now require all "singleton indexed roles" to be written as singleton intervals (including foreach-indexed roles) message FROM_KW rolename '[' paramindexexpr ',' paramindexexpr ']' TO_KW rolename '[' paramindexexpr ',' paramindexexpr ']' ';' -> ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java index 1cf9a624c..6fb54a4fc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java @@ -9,6 +9,7 @@ import org.scribble.ext.go.type.name.RPIndexedRole; +// FIXME: not currently used, but should use in, e.g., RPGCrossMessageTransfer // Currently used for both "actual params" and int literals public class RPIndexedRoleNode extends SimpleNameNode // Not RoleNode, for distinct Kind -- (though distinction maybe unecessary) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 4ff987c90..e512361a3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -1,6 +1,9 @@ package org.scribble.ext.go.core.ast.global; +import java.util.Collections; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.RPCoreAstFactory; @@ -10,6 +13,7 @@ import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexExpr; @@ -46,22 +50,32 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) } @Override - public Set getIndexedRoles() + public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCollection (though not currently used) { - return this.body.getIndexedRoles(); // Foreach subjects not included, they are binders? -- cf. RPForeachDel#leaveIndexVarCollection + Set d = Stream.of(new RPInterval(this.start, this.end)).collect(Collectors.toSet()); + Set var = Stream.of(new RPInterval(this.var, this.var)).collect(Collectors.toSet()); + Set irs = this.body.getIndexedRoles() + .stream().map( + ir -> ir.intervals.equals(var) + ? new RPIndexedRole(ir.getName().toString(), d) + : ir + ).collect(Collectors.toSet()); + return irs; } @Override //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { - //ParamCoreLType proj = this.body.project(af, r, ranges); - RPCoreLType body = this.body.project(af, subj); RPCoreLType seq = this.seq.project(af, subj); - if (!subj.getName().equals(this.role)) // FIXME: check intervals + RPInterval v = new RPInterval(this.start, this.end); + if (subj.getName().equals(this.role) && subj.intervals.contains(v)) // FIXME: proper interval inclusion? -- also RPCoreGChoice#project? + // FIXME: factor out // cf. RPCoreGChoice#project { - return af.RPCoreLForeach(subj, this.var, this.start, this.end, body, seq); + RPCoreLType body = this.body.project(af, new RPRoleVariant(subj.getName().toString(), + Stream.of(new RPInterval(this.var, this.var)).collect(Collectors.toSet()), Collections.emptySet())); + return body.subs(af, RPCoreLEnd.END, seq); } /*else if () { @@ -69,7 +83,8 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor }*/ else { - return body.subs(af, RPCoreLEnd.END, seq); + RPCoreLType body = this.body.project(af, subj); + return af.RPCoreLForeach(subj, this.var, this.start, this.end, body, seq); //throw new RuntimeException("[rp-core] TODO: " + this + " project onto " + subj); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index 464ae845a..a95930f81 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -45,7 +45,7 @@ public class RPCoreGProtocolDeclTranslator private static String makeFreshRecVarName() { - return "_X" + recCounter++; + return "_X" + RPCoreGProtocolDeclTranslator.recCounter++; } public RPCoreGProtocolDeclTranslator(Job job, RPCoreAstFactory af) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java index 88026dc8f..b24008309 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java @@ -15,6 +15,7 @@ public interface RPCoreEModelFactory extends EModelFactory { + ... // FIXME: new nested EState RPCoreECrossSend newParamCoreECrossSend(RPIndexedRole peer, MessageId mid, Payload payload); RPCoreECrossReceive newParamCoreECrossReceive(RPIndexedRole peer, MessageId mid, Payload payload); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java index c861e83c2..e85a784e3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java @@ -19,6 +19,8 @@ public class RPCoreEModelFactoryImpl extends EModelFactoryImpl implements RPCoreEModelFactory { + ... // FIXME: new nested EState + @Override public ESend newESend(Role peer, MessageId mid, Payload payload) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/RPForeachDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/RPForeachDel.java index 2cbf28616..b059f7a50 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/RPForeachDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/RPForeachDel.java @@ -79,7 +79,16 @@ public RPForeach leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode ch /*@Override public ScribNode leaveIndexVarCollection(ScribNode parent, ScribNode child, RPCoreIndexVarCollector coll, ScribNode visited) throws ScribbleException { - // No: the foreach index vars are bound + ... // cf. RPCoreGForeach#getIndexedRoles + Set d = Stream.of(new RPInterval(this.start, this.end)).collect(Collectors.toSet()); + Set var = Stream.of(new RPInterval(this.var, this.var)).collect(Collectors.toSet()); + Set irs = this.body.getIndexedRoles() + .stream().map( + ir -> ir.intervals.equals(var) + ? new RPIndexedRole(ir.getName().toString(), d) + : ir + ).collect(Collectors.toSet()); + return irs; }*/ /*// Needed? -- how about Recursion? From ffc8d721add8d638d01ca5ab4925ae90d56b3d35 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 29 Apr 2018 15:57:35 +0100 Subject: [PATCH 261/433] [rp-core] Continued adding foreach. --- .../model/endpoint/EGraphBuilderUtil.java | 2 +- .../go/core/ast/global/RPCoreGForeach.java | 5 +- .../core/ast/global/RPCoreGMultiChoices.java | 2 +- .../ext/go/core/ast/local/RPCoreLChoice.java | 17 --- .../go/core/ast/local/RPCoreLCrossChoice.java | 20 ++- .../go/core/ast/local/RPCoreLDotChoice.java | 9 ++ .../core/ast/local/RPCoreLMultiChoices.java | 11 +- .../ext/go/core/cli/RPCoreCommandLine.java | 4 +- .../model/endpoint/RPCoreEGraphBuilder.java | 61 +++++++- .../model/endpoint/RPCoreEModelFactory.java | 9 +- .../endpoint/RPCoreEModelFactoryImpl.java | 22 ++- .../go/core/model/endpoint/RPCoreEState.java | 131 ++++++++++++++++++ 12 files changed, 259 insertions(+), 34 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java diff --git a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java index d771f8b57..8b808a8f8 100644 --- a/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java +++ b/scribble-core/src/main/java/org/scribble/model/endpoint/EGraphBuilderUtil.java @@ -64,7 +64,7 @@ public EGraphBuilderUtil(EModelFactory ef) public void init(EState init) { clear(); - reset(this.ef.newEState(Collections.emptySet()), this.ef.newEState(Collections.emptySet())); + reset(init, this.ef.newEState(Collections.emptySet())); } protected void clear() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index e512361a3..67ff2a0ce 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -73,8 +73,9 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor if (subj.getName().equals(this.role) && subj.intervals.contains(v)) // FIXME: proper interval inclusion? -- also RPCoreGChoice#project? // FIXME: factor out // cf. RPCoreGChoice#project { - RPCoreLType body = this.body.project(af, new RPRoleVariant(subj.getName().toString(), - Stream.of(new RPInterval(this.var, this.var)).collect(Collectors.toSet()), Collections.emptySet())); + RPRoleVariant indexed = new RPRoleVariant(subj.getName().toString(), + Stream.of(new RPInterval(this.var, this.var)).collect(Collectors.toSet()), Collections.emptySet()); + RPCoreLType body = this.body.project(af, indexed); return body.subs(af, RPCoreLEnd.END, seq); } /*else if () diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java index 4ddb9aaed..b89faf81b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java @@ -49,7 +49,7 @@ LinkedHashMap foo(List cases, RPCoreGType cont) //LinkedHashMap LinkedHashMap tmp = new LinkedHashMap<>(); - cases.stream().forEach(c -> tmp.put(c, cont)); + cases.forEach(c -> tmp.put(c, cont)); return tmp; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java index 3e25cd363..03947b57a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLChoice.java @@ -3,9 +3,7 @@ import java.util.LinkedHashMap; import java.util.stream.Collectors; -import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreChoice; -import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.type.Message; import org.scribble.type.kind.Local; @@ -17,21 +15,6 @@ protected RPCoreLChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMa { super(role, kind, cases); } - - @Override - public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) - { - if (this.equals(old)) - { - return (RPCoreLType) neu; - } - else - { - LinkedHashMap tmp = new LinkedHashMap<>(); - this.cases.forEach((k, v) -> tmp.put(k, v.subs(af, old, neu))); - return af.ParamCoreLCrossChoice(this.role, RPCoreLActionKind.CROSS_SEND, tmp); - } - } @Override public RPCoreLActionKind getKind() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java index 7b3a6bd82..2e4fbec4f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java @@ -4,9 +4,12 @@ import java.util.LinkedHashMap; import java.util.Set; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.Message; +import org.scribble.type.kind.Local; public class RPCoreLCrossChoice extends RPCoreLChoice { @@ -20,12 +23,27 @@ public RPCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHash } } + @Override + public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreLType) neu; + } + else + { + LinkedHashMap tmp = new LinkedHashMap<>(); + this.cases.forEach((k, v) -> tmp.put(k, v.subs(af, old, neu))); + return af.ParamCoreLCrossChoice(this.role, getKind(), tmp); + } + } + @Override public Set getIndexVars() { Set ivars = new HashSet<>(); ivars.addAll(this.role.getIndexVars()); - this.cases.values().stream().forEach(c -> ivars.addAll(c.getIndexVars())); + this.cases.values().forEach(c -> ivars.addAll(c.getIndexVars())); return ivars; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java index cdcfeeb54..38f138c3b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java @@ -3,11 +3,14 @@ import java.util.LinkedHashMap; import java.util.Set; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.Message; +import org.scribble.type.kind.Local; @Deprecated public class RPCoreLDotChoice extends RPCoreLChoice @@ -24,6 +27,12 @@ public RPCoreLDotChoice(RPIndexedRole role, RPIndexExpr offset, RPCoreLActionKin } this.offset = offset; } + + @Override + public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + this); + } @Override public Set getIndexVars() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java index 91aae9439..fd04c8d86 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java @@ -5,9 +5,12 @@ import java.util.List; import java.util.Set; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.Message; +import org.scribble.type.kind.Local; // FIXME: factor out better with ParamCore(L)Choice -- or deprecate and just use kind? @Deprecated @@ -23,6 +26,12 @@ public RPCoreLMultiChoices(RPIndexedRole role, RPIndexVar var, //List old, RPCoreType neu) + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + this); + } @Override public Set getIndexVars() @@ -36,7 +45,7 @@ LinkedHashMap foo(List cases, RPCoreLType cont) //LinkedHashMap LinkedHashMap tmp = new LinkedHashMap<>(); - cases.stream().forEach(c -> tmp.put(c, cont)); + cases.forEach(c -> tmp.put(c, cont)); return tmp; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index e3e959b38..75577c02b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -28,9 +28,9 @@ import org.scribble.ext.go.core.main.RPCoreException; import org.scribble.ext.go.core.main.RPCoreMainContext; import org.scribble.ext.go.core.model.endpoint.RPCoreEGraphBuilder; -import org.scribble.ext.go.core.type.RPRoleVariant; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.ext.go.util.Z3Wrapper; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java index 67ff374fd..260727d2b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java @@ -4,13 +4,16 @@ import java.util.HashMap; import java.util.Map; +import org.scribble.ext.go.core.ast.RPCoreForeach; import org.scribble.ext.go.core.ast.RPCoreRecVar; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; import org.scribble.ext.go.core.ast.local.RPCoreLChoice; import org.scribble.ext.go.core.ast.local.RPCoreLEnd; +import org.scribble.ext.go.core.ast.local.RPCoreLForeach; import org.scribble.ext.go.core.ast.local.RPCoreLRec; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.model.endpoint.EGraph; @@ -27,24 +30,71 @@ public class RPCoreEGraphBuilder { private final GoJob job; + private final RPCoreEModelFactory ef; private final EGraphBuilderUtil util; // Not using any features for unguarded choice/recursion/continue (recursion manually tracked here) public RPCoreEGraphBuilder(GoJob job) { this.job = job; + this.ef = (RPCoreEModelFactory) job.ef; this.util = new EGraphBuilderUtil(job.ef); } + /*private Pair makeRPCoreEState(RPCoreLType lt) + { + RPCoreEState s; + RPCoreLType seq; + if (lt instanceof RPCoreLForeach) + { + RPCoreLForeach fe = (RPCoreLForeach) lt; + s = this.ef.newRPCoreEState(Collections.emptySet(), fe.var, + new RPInterval(fe.start, fe.end), (RPCoreEState) build(((RPCoreLForeach) lt).body).init); + if (fe.seq instanceof RPCoreForeach) // FIXME: consecutive foreach ("tau" action) + { + throw new RuntimeException("[rp-core] TODO: " + lt); + } + seq = fe.seq; + } + else + { + s = this.ef.newRPCoreEState(Collections.emptySet(), null, null, null); + seq = lt; + } + return new Pair<>(s, seq); + }*/ + public EGraph build(RPCoreLType lt) { - this.util.init(this.job.ef.newEState(Collections.emptySet())); - build(lt, this.util.getEntry(), this.util.getExit(), new HashMap<>()); - return this.util.finalise(); + /*Pair p = makeRPCoreEState(lt); // Currently always a top-level rec + this.util.init(p.left); + build(p.right, this.util.getEntry(), this.util.getExit(), new HashMap<>());*/ + this.util.init(this.ef.newEState(Collections.emptySet())); // RPCoreEState + build(lt, this.util.getEntry(), this.util.getExit(), new HashMap<>()); // lt is always a top-level rec + EGraph foo = this.util.finalise(); + return foo; } + // s1 is "current state", which may be mutably modified by foreach (and rec -- GraphBuilerUtil#addEntryLabel done by LRecursionDel) private void build(RPCoreLType lt, EState s1, EState s2, Map recs) { - if (lt instanceof RPCoreLChoice) + if (lt instanceof RPCoreLForeach) + { + RPCoreLForeach fe = (RPCoreLForeach) lt; + RPCoreEState s = (RPCoreEState) s1; // FIXME: modify method sig + s.setParam(fe.var); + s.setInterval(new RPInterval(fe.start, fe.end)); + RPCoreEGraphBuilder nested = new RPCoreEGraphBuilder(this.job); + s.setNested((RPCoreEState) nested.build(fe.body).init); + if (fe.seq instanceof RPCoreForeach) // FIXME: consecutive foreach ("tau" action) + { + throw new RuntimeException("[rp-core] TODO: " + lt); + } + else if (!(fe.seq instanceof RPCoreLEnd)) + { + build(fe.seq, s1, s2, recs); + } + } + else if (lt instanceof RPCoreLChoice) { /*if (lt instanceof RPCoreLMultiChoices) { @@ -60,7 +110,7 @@ private void build(RPCoreLType lt, EState s1, EState s2, Map rec RPCoreLChoice lc = (RPCoreLChoice) lt; RPIndexExpr offset = //(lc instanceof RPCoreLDotChoice) ? ((RPCoreLDotChoice) lc).offset : null; - lc.cases.entrySet().stream().forEach(e -> + lc.cases.entrySet().forEach(e -> buildEdgeAndContinuation(s1, s2, recs, lc.role, lc.getKind(), e.getKey(), e.getValue(), offset) ); } @@ -78,6 +128,7 @@ else if (lt instanceof RPCoreLRec) } } + // CHECKME: offset redundant? private void buildEdgeAndContinuation(EState s1, EState s2, Map recs, RPIndexedRole r, RPCoreLActionKind k, //RPCoreMessage a, Message a, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java index b24008309..116238571 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactory.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.core.model.endpoint; import java.util.List; +import java.util.Set; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; @@ -8,14 +9,20 @@ import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotSend; import org.scribble.ext.go.core.model.endpoint.action.RPCoreEMultiChoicesReceive; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EModelFactory; import org.scribble.type.Payload; import org.scribble.type.name.MessageId; +import org.scribble.type.name.RecVar; public interface RPCoreEModelFactory extends EModelFactory { - ... // FIXME: new nested EState + @Override + RPCoreEState newEState(Set labs); + + RPCoreEState newRPCoreEState(Set labs, RPIndexVar param, RPInterval interval, RPCoreEState nested); RPCoreECrossSend newParamCoreECrossSend(RPIndexedRole peer, MessageId mid, Payload payload); RPCoreECrossReceive newParamCoreECrossReceive(RPIndexedRole peer, MessageId mid, Payload payload); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java index e85a784e3..e2ed85bf5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.core.model.endpoint; import java.util.List; +import java.util.Set; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; @@ -8,29 +9,44 @@ import org.scribble.ext.go.core.model.endpoint.action.RPCoreEDotSend; import org.scribble.ext.go.core.model.endpoint.action.RPCoreEMultiChoicesReceive; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EModelFactoryImpl; import org.scribble.model.endpoint.actions.EReceive; import org.scribble.model.endpoint.actions.ESend; import org.scribble.type.Payload; import org.scribble.type.name.MessageId; +import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; public class RPCoreEModelFactoryImpl extends EModelFactoryImpl implements RPCoreEModelFactory { - ... // FIXME: new nested EState + @Override + public RPCoreEState newEState(Set labs) + { + //throw new RuntimeException("[rp-core] Shouldn't get in here: "); // No: needed by e.g., EGraphBuilderUtil#init + return new RPCoreEState(labs); + } + @Override + public RPCoreEState newRPCoreEState(Set labs, RPIndexVar param, RPInterval interval, RPCoreEState nested) + { + return new RPCoreEState(labs, param, interval, nested); + } + + @Override public ESend newESend(Role peer, MessageId mid, Payload payload) { - throw new RuntimeException("[param-core] Shouldn't get in here: "); + throw new RuntimeException("[rp-core] Shouldn't get in here: "); } @Override public EReceive newEReceive(Role peer, MessageId mid, Payload payload) { - throw new RuntimeException("[param-core] Shouldn't get in here: "); + throw new RuntimeException("[rp-core] Shouldn't get in here: "); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java new file mode 100644 index 000000000..e4fc94676 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java @@ -0,0 +1,131 @@ +package org.scribble.ext.go.core.model.endpoint; + +import java.util.Set; + +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EModelFactory; +import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.name.RecVar; + +// Cf. AssrtEState +public class RPCoreEState extends EState +{ + + // Mutable -- not used in hashCode/equals (state ID only) -- cf. EState#hashCode/equals (and mutable label set) + private RPIndexVar param; + private RPInterval interval; + private RPCoreEState nested; // null if no nested FSM (then above also null) + + protected RPCoreEState(Set labs) + { + this(labs, null, null, null); + } + + protected RPCoreEState(Set labs, RPIndexVar param, RPInterval interval, RPCoreEState nested) + { + super(labs); + this.param = param; + this.interval = interval; + this.nested = nested; + } + + @Override + protected RPCoreEState cloneNode(EModelFactory ef, Set labs) + { + return ((RPCoreEModelFactory) ef).newRPCoreEState(labs, this.param, this.interval, this.nested); + } + + public boolean hasNested() + { + return this.nested != null; + } + + // Mutable getters/setters -- cf. super label set + + public RPIndexVar getParam() + { + return this.param; + } + + public void setParam(RPIndexVar param) + { + this.param = param; + } + + public RPInterval getInterval() + { + return this.interval; + } + + public void setInterval(RPInterval interval) + { + this.interval = interval; + } + + public RPCoreEState getNested() + { + return this.nested; + } + + public void setNested(RPCoreEState nested) + { + this.nested = nested; + } + + @Override + protected String getNodeLabel() + { + String labs = this.labs.toString(); + return "label=\"" + this.id + ": " + labs.substring(1, labs.length() - 1) // From super.getNodeLabel + + (hasNested() ? this.param + ":" + this.interval + "; " + this.nested.id : "") + + "\""; // FIXME: would be more convenient for this method to return only the label body + } + + @Override + public RPCoreEState getSuccessor(EAction a) + { + return (RPCoreEState) super.getSuccessor(a); + } + + @Override + public int hashCode() + { + int hash = 4817; + hash = 31 * hash + super.hashCode(); + // N.B. use state ID only -- following super pattern -- to allow, e.g., mutable label set + /*if (hasNested()) + { + hash = 31 * hash + this.param.hashCode(); + hash = 31 * hash + this.interval.hashCode(); + hash = 31 * hash + this.nested.hashCode(); + }*/ + return hash; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPCoreEState)) + { + return false; + } + //RPCoreEState them = (RPCoreEState) o; + return super.equals(o); // Checks canEquals + /*&& hasNested() // No: use state ID only + ? (them.hasNested() && this.param.equals(them.param) && this.interval.equals(them.interval) && this.nested.equals(them.nested)) + : !them.hasNested();*/ + } + + @Override + protected boolean canEquals(MState s) + { + return s instanceof RPCoreEState; + } +} From 4fc5c51d39f119e839377cbc8551e1e855cbc8bf Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 29 Apr 2018 16:36:42 +0100 Subject: [PATCH 262/433] [rp-core] Continued adding foreach. --- .../ext/go/core/cli/RPCoreCommandLine.java | 21 +++++++++++++++++++ .../model/endpoint/RPCoreEGraphBuilder.java | 11 +++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 75577c02b..6c5264ffa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -10,7 +10,9 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; @@ -28,11 +30,13 @@ import org.scribble.ext.go.core.main.RPCoreException; import org.scribble.ext.go.core.main.RPCoreMainContext; import org.scribble.ext.go.core.model.endpoint.RPCoreEGraphBuilder; +import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.RecursiveFunctionalInterface; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; @@ -40,7 +44,9 @@ import org.scribble.main.ScribbleException; import org.scribble.main.resource.DirectoryResourceLocator; import org.scribble.main.resource.ResourceLocator; +import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; import org.scribble.util.ScribParserException; @@ -279,6 +285,21 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws job.debugPrintln("\n[param-core] Built endpoint graph for " //+ r + " for " + ranges + ":\n" + g.toDot()); + + RecursiveFunctionalInterface>> getNestedInits + = new RecursiveFunctionalInterface<>(); + getNestedInits.func = s -> + { + Set all = Stream.of(s).collect(Collectors.toSet()); + all.addAll(MState.getReachableStates(s)); + return all.stream() + .filter(y -> ((RPCoreEState) y).hasNested()) + .flatMap(y -> getNestedInits.func.apply(((RPCoreEState) y).getNested()).stream()) + .collect(Collectors.toSet()); + }; + + getNestedInits.func.apply(g.init).stream() + .forEach(s -> job.debugPrintln("\n" + s.toDot())); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java index 260727d2b..6791ccc66 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java @@ -69,13 +69,14 @@ public EGraph build(RPCoreLType lt) this.util.init(p.left); build(p.right, this.util.getEntry(), this.util.getExit(), new HashMap<>());*/ this.util.init(this.ef.newEState(Collections.emptySet())); // RPCoreEState - build(lt, this.util.getEntry(), this.util.getExit(), new HashMap<>()); // lt is always a top-level rec + build(lt, (RPCoreEState) this.util.getEntry(), + (RPCoreEState) this.util.getExit(), new HashMap<>()); // lt is always a top-level rec EGraph foo = this.util.finalise(); return foo; } // s1 is "current state", which may be mutably modified by foreach (and rec -- GraphBuilerUtil#addEntryLabel done by LRecursionDel) - private void build(RPCoreLType lt, EState s1, EState s2, Map recs) + private void build(RPCoreLType lt, RPCoreEState s1, RPCoreEState s2, Map recs) { if (lt instanceof RPCoreLForeach) { @@ -118,7 +119,7 @@ else if (lt instanceof RPCoreLChoice) else if (lt instanceof RPCoreLRec) { RPCoreLRec lr = (RPCoreLRec) lt; - Map tmp = new HashMap<>(recs); + Map tmp = new HashMap<>(recs); tmp.put(lr.recvar, s1); build(lr.body, s1, s2, tmp); } @@ -129,7 +130,7 @@ else if (lt instanceof RPCoreLRec) } // CHECKME: offset redundant? - private void buildEdgeAndContinuation(EState s1, EState s2, Map recs, + private void buildEdgeAndContinuation(RPCoreEState s1, RPCoreEState s2, Map recs, RPIndexedRole r, RPCoreLActionKind k, //RPCoreMessage a, Message a, RPCoreLType cont, RPIndexExpr offset) @@ -146,7 +147,7 @@ else if (cont instanceof RPCoreRecVar) } else { - EState s = this.util.ef.newEState(Collections.emptySet()); + RPCoreEState s = this.ef.newEState(Collections.emptySet()); this.util.addEdge(s1, ea, s); build(cont, s, s2, recs); } From 0981da24d98dee168716fa7fedf7dd7ffaa83cee Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 29 Apr 2018 16:36:53 +0100 Subject: [PATCH 263/433] [rp-core] Continued adding foreach. --- .../scribble/ext/go/util/RecursiveFunctionalInterface.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/util/RecursiveFunctionalInterface.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/RecursiveFunctionalInterface.java b/scribble-go/src/main/java/org/scribble/ext/go/util/RecursiveFunctionalInterface.java new file mode 100644 index 000000000..790289cec --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/RecursiveFunctionalInterface.java @@ -0,0 +1,7 @@ +package org.scribble.ext.go.util; + +// Duplicated from org.scribble.ext.assrt.util +public class RecursiveFunctionalInterface // F should be a functional interface +{ + public F func; +} From ae5d8a4fc5e66856fbe26a7b2c8583a6ef11e5a4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 29 Apr 2018 16:50:31 +0100 Subject: [PATCH 264/433] [rp-core] Continued adding foreach. --- .../ext/go/core/cli/RPCoreCommandLine.java | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 6c5264ffa..574ef3f22 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -12,7 +12,6 @@ import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; @@ -46,12 +45,11 @@ import org.scribble.main.resource.ResourceLocator; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EState; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; import org.scribble.util.ScribParserException; -// N.B. this is the CL for both -goapi and param-core extensions +// N.B. this is the CL for both -goapi and rp-core extensions public class RPCoreCommandLine extends CommandLine { protected final Map rpArgs; // Maps each flag to list of associated argument values @@ -155,7 +153,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co outputClasses(goClasses); }*/ - /*job.debugPrintln("\n[param-core] Running " + ParamCoreSTSessionApiBuilder.class + " for " + fullname); + /*job.debugPrintln("\n[rp-core] Running " + ParamCoreSTSessionApiBuilder.class + " for " + fullname); Map goClasses = new ParamCoreSTSessionApiBuilder((GoJob) job, fullname, this.E0).build();*/ //Map actuals = this.E0.get(role); @@ -189,7 +187,7 @@ private void doParamCoreValidationTasks(GoJob j) throws RPCoreSyntaxException, S paramCoreParseAndCheckWF(j, simpname); // Includes base passes } - // FIXME? param-core FSM building only used for param-core validation -- output tasks, e.g., -api, will still use default Scribble FSMs + // FIXME? rp-core FSM building only used for rp-core validation -- output tasks, e.g., -api, will still use default Scribble FSMs // -- but the FSMs should be the same? -- no: action assertions treated differently in core than base } @@ -224,25 +222,25 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws Module main = job.getContext().getMainModule(); if (!main.hasProtocolDecl(simpname)) { - throw new RPCoreException("[param-core] Global protocol not found: " + simpname); + throw new RPCoreException("[rp-core] Global protocol not found: " + simpname); } this.gpd = (GProtocolDecl) main.getProtocolDecl(simpname); RPCoreAstFactory af = new RPCoreAstFactory(); RPCoreGType gt = new RPCoreGProtocolDeclTranslator(job, af).translate(this.gpd); - job.debugPrintln("\n[param-core] Translated:\n " + gt); + job.debugPrintln("\n[rp-core] Translated:\n " + gt); if (!gt.isWellFormed(job, gpd)) { - throw new RPCoreException("[param-core] Global type not well-formed:\n " + gt); + throw new RPCoreException("[rp-core] Global type not well-formed:\n " + gt); } //Map>> Map> protoRoles = getProtoRoles(job, gt); - job.debugPrintln("\n[param-core] Computed roles: " + protoRoles); + job.debugPrintln("\n[rp-core] Computed roles: " + protoRoles); this.L0 = new HashMap<>(); for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? @@ -261,7 +259,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws } tmp.put(ranges, lt); - job.debugPrintln("\n[param-core] Projected onto " + r + " for " + ranges + ":\n " + lt); + job.debugPrintln("\n[rp-core] Projected onto " + r + " for " + ranges + ":\n " + lt); } } @@ -282,23 +280,28 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws } tmp.put(ranges, g); - job.debugPrintln("\n[param-core] Built endpoint graph for " + job.debugPrintln("\n[rp-core] Built endpoint graph for " //+ r + " for " + ranges + ":\n" + g.toDot()); - RecursiveFunctionalInterface>> getNestedInits + RecursiveFunctionalInterface>> getNestedInits = new RecursiveFunctionalInterface<>(); getNestedInits.func = s -> { - Set all = Stream.of(s).collect(Collectors.toSet()); - all.addAll(MState.getReachableStates(s)); - return all.stream() - .filter(y -> ((RPCoreEState) y).hasNested()) - .flatMap(y -> getNestedInits.func.apply(((RPCoreEState) y).getNested()).stream()) - .collect(Collectors.toSet()); + Set inits = new HashSet<>(); + if (s.hasNested()) + { + inits.add(s.getNested()); + } + inits.addAll(MState.getReachableStates(s).stream() + .filter(x -> ((RPCoreEState) x).hasNested()) + .map(x -> ((RPCoreEState) x).getNested()) + .collect(Collectors.toSet())); + inits.forEach(x -> inits.addAll(getNestedInits.func.apply(x))); + return inits; }; - getNestedInits.func.apply(g.init).stream() + getNestedInits.func.apply((RPCoreEState) g.init).stream() .forEach(s -> job.debugPrintln("\n" + s.toDot())); } } @@ -315,7 +318,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws job.debugPrintln //System.out.println - ("\n[param-core] Unfair transform for " + r + ":\n" + u.toDot()); + ("\n[rp-core] Unfair transform for " + r + ":\n" + u.toDot()); } //validate(job, gpd.isExplicitModifier(), U0, true); //TODO @@ -377,7 +380,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws int i = 1; int size = powset.size(); - job.debugPrintln("\n[param-core] Ranges powerset for " + r + ": " + powset); + job.debugPrintln("\n[rp-core] Ranges powerset for " + r + ": " + powset); for (Set cand : powset) { @@ -423,9 +426,9 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws z3 = //"(declare-const id Int)\n "(assert " + z3 + ")"; - job.debugPrintln("\n[param-core] Candidate (" + i++ + "/" + size + "): " + cand); - job.debugPrintln("[param-core] Co-set: " + coset); - job.debugPrintln("[param-core] Running Z3 on:\n" + z3); + job.debugPrintln("\n[rp-core] Candidate (" + i++ + "/" + size + "): " + cand); + job.debugPrintln("[rp-core] Co-set: " + coset); + job.debugPrintln("[rp-core] Running Z3 on:\n" + z3); if (Z3Wrapper.checkSat(job, this.gpd, z3)) { @@ -487,18 +490,18 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce { this.model = new ParamCoreSModelBuilder(job.sf).build(this.E0, isExplicit); - job.debugPrintln("\n[param-core] Built model:\n" + this.model.toDot()); + job.debugPrintln("\n[rp-core] Built model:\n" + this.model.toDot()); if (unfair.length == 0 || !unfair[0]) { ParamCoreSafetyErrors serrs = this.model.getSafetyErrors(job, simpname); // job just for debug printing if (serrs.isSafe()) { - job.debugPrintln("\n[param-core] Protocol safe."); + job.debugPrintln("\n[rp-core] Protocol safe."); } else { - throw new ParamException("[param-core] Protocol not safe:\n" + serrs); + throw new ParamException("[rp-core] Protocol not safe:\n" + serrs); } } From bb07fac7c0189ad1d048591d13a4581b4cc460b7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 29 Apr 2018 18:17:27 +0100 Subject: [PATCH 265/433] [rp-core] Continued adding foreach. --- .../statetype/STStateChanApiBuilder.java | 4 +- .../main/java/org/scribble/model/MState.java | 1 + .../statetype3/RPCoreSTApiGenerator.java | 2 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 9 +- .../RPCoreSTStateChanApiBuilder.java | 112 ++++++++++++++++-- 5 files changed, 114 insertions(+), 14 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java index 914c7300e..388fce37e 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java @@ -40,7 +40,7 @@ public abstract class STStateChanApiBuilder public final STCaseBuilder cb; public final STEndStateBuilder eb; - private Map names = new HashMap<>(); + protected Map names = new HashMap<>(); protected STStateChanApiBuilder(Job job, GProtocolName gpn, Role role, EGraph graph, STOutputStateBuilder ob, STReceiveStateBuilder rb, STBranchStateBuilder bb, STCaseBuilder cb, STEndStateBuilder eb) @@ -112,7 +112,7 @@ public String getStateChanName(EState s) public abstract String buildAction(STActionBuilder ab, EState curr, EAction a); - public abstract String getChannelName(STStateChanApiBuilder api, EAction a); + public abstract String getChannelName(STStateChanApiBuilder api, EAction a); // FIXME: redundant? (supposed to be for Runtime MPChan references?) public abstract String buildActionReturn(STActionBuilder ab, EState curr, EState succ); // FIXME: refactor action builders as interfaces and use generic parameter for kind } diff --git a/scribble-core/src/main/java/org/scribble/model/MState.java b/scribble-core/src/main/java/org/scribble/model/MState.java index 0dae3bb73..caf6a77de 100644 --- a/scribble-core/src/main/java/org/scribble/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/model/MState.java @@ -165,6 +165,7 @@ public final boolean isTerminal() return this.actions.isEmpty(); } + // Returns null if none public static , S extends MState, K extends ProtocolKind> S getTerminal(S start) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 14b0a074a..05f0b54e7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -35,7 +35,7 @@ public class RPCoreSTApiGenerator public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module public final Role self; - // FIXME: just a role name -- cf. CL arg + // FIXME? just a role name -- cf. CL arg // FIXME: any way to separate Session API (Protocol) from Endpoint/StateChan APIs? public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> projections, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 09c501721..021ad0b41 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -227,8 +227,11 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< } // Top-level Run method // FIXME: add session completion check + /*EGraph g = this.apigen.variants.get(variant.getName()).get(variant); + String endName = g.init.isTerminal() ? "Init" : "End"; // FIXME: factor out -- cf. RPCoreSTStateChanApiBuilder#makeSTStateName(*/ + String init = "Init_" + this.apigen.variants.get(variant.getName()).get(variant).init; epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") Run(f func(*Init) End) *End {\n" // f specifies non-pointer End + + "func (ini *" + epkindTypeName + ") Run(f func(*" + init + ") End) *End {\n" // f specifies non-pointer End + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".Close()\n" + "ini.Use()\n" // FIXME: int-counter linearity + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".CheckConnection()\n" @@ -236,8 +239,8 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) - ? "end := f(newBranchInit(ini))\n" - : "end := f(&Init{ new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + ? "end := f(newBranch" + init + "(ini))\n" + : "end := f(&" + init + "{ new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + "return &end\n" + "}"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 57b6fa5b5..1188dd76b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -13,6 +13,7 @@ import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.ast.RPCoreDelegDecl; +import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; import org.scribble.ext.go.core.type.RPIndexedRole; @@ -41,6 +42,8 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder private final Set dtds; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams private final Set msnds; + private Map imedNames = new HashMap<>(); // Cf. STStateChanApiBuilder.names + // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) rp-core class later // Pre: variant.getName().equals(this.role) public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph) @@ -76,6 +79,7 @@ public Map build() // filepath -> source Set states = new LinkedHashSet<>(); states.add(this.graph.init); states.addAll(MState.getReachableStates(this.graph.init)); + boolean hasTerm = false; for (EState s : states) { switch (RPCoreSTStateChanApiBuilder.getStateKind(s)) @@ -113,9 +117,33 @@ public Map build() // filepath -> source { throw new RuntimeException("[rp-core] TODO: " + s); }*/ - case TERMINAL: res.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; + case TERMINAL: + res.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); + hasTerm = s.id != this.graph.init.id; // "End" not built for for single (nested) state FSMs (will be "Init") + break; default: throw new RuntimeException("[rp-core] Shouldn't get in here: " + s); } + RPCoreEState s1 = (RPCoreEState) s; + if (s1.hasNested()) + { + res.putAll(buildForeachIntermediaryState(s1)); + } + } + if (!hasTerm) + { + // Always make and "End" (including non-terminating FSMs) -- doesn't matter it's not the actual end state + //RPCoreEState end = ((RPCoreEModelFactory) this.job.ef).newEState(Collections.emptySet()); + + // FIXME: factor out with getStateChanPremable + GProtocolName simpname = this.apigen.proto.getSimpleName(); + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, this.variant); + String end = "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) + "\n" + + "\n" + + "type End struct {\n" + + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + + "}\n"; + res.put(getFilePath("End"), end); } return res; } @@ -132,6 +160,43 @@ public String getFilePath(String filename) + "/" + filename + ".go"; } + // Pre: s.hasNested() + // FIXME: factor out with getStateChanPremable + protected Map buildForeachIntermediaryState(RPCoreEState s) + { + GProtocolName simpname = this.apigen.proto.getSimpleName(); + String scTypeName = this.getIntermediaryStateChanName(s); + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, this.variant); + + Map res = new HashMap<>(); + + String feach = + "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) + "\n" + + "\n" + + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; + + // State channel type + feach += "\n" + + "type " + scTypeName + " struct {\n" + + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + + "}\n"; + + + ... // TODO: foreach method + + + res.put(getFilePath(scTypeName), feach); + + RPCoreEState init = s.getNested(); + RPCoreEState term = (RPCoreEState) MState.getTerminal(init); + res.putAll(new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, new EGraph(init, term)).build()); + /*String x = tmp.keySet().stream().filter(y -> y.endsWith("Init")).findAny().get(); + String removed = tmp.remove(x);*/ + + return res; + } + // Factored out here from state-specific builders protected String getStateChanPremable(EState s) { @@ -226,16 +291,20 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) { + String name = ((RPCoreEState) succ).hasNested() + ? getIntermediaryStateChanName(succ) + : getStateChanName(succ); //ab.getReturnType(this, curr, succ) + if (((GoJob) this.job).selectApi && getStateKind(succ) == RPCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { // Needs to be here (not in action builder) -- build (hacked) return for all state kinds // FIXME: factor out with RPCoreSTSessionApiBuilder and RPCoreSTSelectStateBuilder#getPreamble - return "newBranch" + getStateChanName(succ) + "(" + sEp + ")"; + return "newBranch" + name + "(" + sEp + ")"; } else { - String res = "&" + ab.getReturnType(this, curr, succ) + "{ " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; + String res = "&" + name + "{ " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; if (!succ.isTerminal()) { res += ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE @@ -253,16 +322,43 @@ public String getChannelName(STStateChanApiBuilder api, EAction a) // Not used? //return "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; } + @Override + public String getStateChanName(EState s) + { + String name = this.imedNames.get(s.id); + if (name == null) + { + RPCoreEState s1 = (RPCoreEState) s; + name = makeSTStateName(s1); + if (s1.hasNested()) + { + this.imedNames.put(s1.id, name); // The "original" name, now used for foreach -- doing this way round for convenience of original state channel naming + name = name + "_"; // FIXME + } + this.names.put(s.id, name); + } + return name; + } + + public String getIntermediaryStateChanName(EState s) + { + if (!this.names.containsKey(s.id)) + { + throw new RuntimeException("Shouldn't get in here: " + s.id); + } + return this.imedNames.get(s.id); + } + @Override protected String makeSTStateName(EState s) { - return (s.isTerminal()) - ? makeEndStateName(this.apigen.proto.getSimpleName(), this.variant) - : (s.id == this.graph.init.id) - ? "Init" // FIXME: factor out (makeInitStateName) + return s.id == this.graph.init.id // Includes single (nested) state endpoint kinds (i.e, Init, not End) + ? "Init_" + s.id // FIXME: factor out (makeInitStateName) + : (s.isTerminal() + ? makeEndStateName(this.apigen.proto.getSimpleName(), this.variant) : //this.apigen.proto.getSimpleName() + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_" "State" - + this.counter++; + + this.counter++); } public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) From ad073d35e659aadfa3835d57559e0789154cf159 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 29 Apr 2018 20:10:27 +0100 Subject: [PATCH 266/433] [rp-core] Continued adding foreach. --- .../go/core/ast/global/RPCoreGForeach.java | 4 +- .../ext/go/core/ast/local/RPCoreLForeach.java | 13 +++++-- .../statetype3/RPCoreSTSessionApiBuilder.java | 15 ++++++- .../RPCoreSTStateChanApiBuilder.java | 39 +++++++++++++++---- 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 67ff2a0ce..96f485852 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -23,9 +23,9 @@ public class RPCoreGForeach extends RPCoreForeach implements RPCoreGType { - public RPCoreGForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr dest, RPCoreGType body, RPCoreGType seq) + public RPCoreGForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, RPCoreGType body, RPCoreGType seq) { - super(role, var, src, dest, body, seq); + super(role, var, start, end, body, seq); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java index bbd417fcb..577f274e4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java @@ -1,6 +1,8 @@ package org.scribble.ext.go.core.ast.local; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreForeach; @@ -12,9 +14,9 @@ public class RPCoreLForeach extends RPCoreForeach implements RPCoreLType { - public RPCoreLForeach(Role role, RPIndexVar var, RPIndexExpr src, RPIndexExpr dest, RPCoreLType body, RPCoreLType cont) + public RPCoreLForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, RPCoreLType body, RPCoreLType cont) { - super(role, var, src, dest, body, cont); + super(role, var, start, end, body, cont); } @Override @@ -34,7 +36,12 @@ public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType getIndexVars() { - return this.body.getIndexVars(); // Foreach subjects not included, they are binders? -- cf. RPCoreGForeach#getIndexVars + Set ivars = Stream.of(this.var).collect(Collectors.toSet()); + // FIXME: shouldn't include bound foreach params (cf. RPCoreGForeach#getIndexVars) -- currently included for hacked Foreach method loop (RPCoreSTStateChanApiBuilder) + ivars.addAll(this.start.getVars()); + ivars.addAll(this.end.getVars()); + ivars.addAll(this.body.getIndexVars()); + return ivars; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 021ad0b41..406d77442 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.core.codegen.statetype3; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -21,6 +22,15 @@ public class RPCoreSTSessionApiBuilder { private RPCoreSTApiGenerator apigen; + public static final Comparator IVAR_COMP = new Comparator() + { + @Override + public int compare(RPIndexVar i1, RPIndexVar i2) + { + return i1.toString().compareTo(i2.toString()); + } + }; + public RPCoreSTSessionApiBuilder(RPCoreSTApiGenerator apigen) { this.apigen = apigen; @@ -94,7 +104,8 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList());*/ List ivars = this.apigen.projections.get(rname).get(variant) - .getIndexVars().stream().sorted().collect(Collectors.toList()); // N.B., params only from action subjects (not self) + .getIndexVars().stream().sorted(IVAR_COMP) + .collect(Collectors.toList()); // N.B., params only from action subjects (not self) ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); @@ -145,7 +156,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList());*/ List ivars = this.apigen.projections.get(rname).get(variant) - .getIndexVars().stream().sorted().collect(Collectors.toList()); // N.B., params only from action subjects (not self) + .getIndexVars().stream().sorted(IVAR_COMP).collect(Collectors.toList()); // N.B., params only from action subjects (not self) ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 1188dd76b..193bdf3e5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -118,8 +118,12 @@ public Map build() // filepath -> source throw new RuntimeException("[rp-core] TODO: " + s); }*/ case TERMINAL: - res.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); - hasTerm = s.id != this.graph.init.id; // "End" not built for for single (nested) state FSMs (will be "Init") + String name = getStateChanName(s); // HACK FIXME: to generate names even if state not generated here + if (s.id != this.graph.init.id) // "End" not built for for single (nested) state FSMs (will be "Init") + { + res.put(getFilePath(name), this.eb.build(this, s)); + hasTerm = false; + } break; default: throw new RuntimeException("[rp-core] Shouldn't get in here: " + s); } @@ -182,17 +186,32 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + "}\n"; - - ... // TODO: foreach method + // Foreach method -- cf. RPCoreSTSessionApiBuilder, top-level Run + String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + RPCoreEState init = s.getNested(); + String initName = "Init_" + init.id; + String succName = s.isTerminal() ? "End" : getStateChanName(s); // FIXME: factor out + feach += "\n" + + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + + ") Foreach(f func(*" + initName + ") End) *End {\n" + + "for " + s.getParam() + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + + s.getParam() + " <= " + generateIndexExpr(s.getInterval().end) + "; " + s.getParam() + " = " + s.getParam() + " + 1 {\n" + + sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? + // Duplicated from RPCoreSTSessionApiBuilder // FIXME: factor out + + ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) + ? "f(newBranch" + initName + "(ini))\n" + : "f(&" + initName + "{ new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), s.Ept })\n") // cf. state chan builder // FIXME: chan struct reuse + + + "return " + getSuccStateChan(s, succName, sEp) + "\n" + + + "}\n" + + "}\n"; res.put(getFilePath(scTypeName), feach); - RPCoreEState init = s.getNested(); RPCoreEState term = (RPCoreEState) MState.getTerminal(init); res.putAll(new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, new EGraph(init, term)).build()); - /*String x = tmp.keySet().stream().filter(y -> y.endsWith("Init")).findAny().get(); - String removed = tmp.remove(x);*/ return res; } @@ -294,7 +313,11 @@ protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String name = ((RPCoreEState) succ).hasNested() ? getIntermediaryStateChanName(succ) : getStateChanName(succ); //ab.getReturnType(this, curr, succ) + return getSuccStateChan(succ, name, sEp); + } + protected String getSuccStateChan(EState succ, String name, String sEp) + { if (((GoJob) this.job).selectApi && getStateKind(succ) == RPCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { @@ -305,7 +328,7 @@ protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, else { String res = "&" + name + "{ " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; - if (!succ.isTerminal()) + if (!succ.isTerminal()) // FIXME: terminal foreach state { res += ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case From e73234993745bcd51a7449b1c951245f8d3ceae6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 29 Apr 2018 20:21:16 +0100 Subject: [PATCH 267/433] [rp-core] Continued adding foreach. --- .../core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 193bdf3e5..38e94fafb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -144,7 +144,7 @@ public Map build() // filepath -> source String end = "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) + "\n" + "\n" + "type End struct {\n" - + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + "}\n"; res.put(getFilePath("End"), end); @@ -203,9 +203,8 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) ? "f(newBranch" + initName + "(ini))\n" : "f(&" + initName + "{ new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), s.Ept })\n") // cf. state chan builder // FIXME: chan struct reuse - + "return " + getSuccStateChan(s, succName, sEp) + "\n" - + "}\n" + + "return " + getSuccStateChan(s, succName, sEp) + "\n" + "}\n"; res.put(getFilePath(scTypeName), feach); From d73e55a3fd17c67d2b70932337b02b2c4b72b38d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 30 Apr 2018 17:57:01 +0100 Subject: [PATCH 268/433] [rp-core] Distinguished RPForeachVar from RPIndexVar, but wasn't a good idea -- TODO: undo. --- .../org/scribble/ext/go/ast/RPAstFactory.java | 3 +- .../scribble/ext/go/ast/RPAstFactoryImpl.java | 5 +- .../org/scribble/ext/go/ast/RPForeach.java | 14 ++--- .../ext/go/ast/global/RPGForeach.java | 14 ++--- .../ext/go/core/ast/RPCoreAstFactory.java | 6 +- .../ext/go/core/ast/RPCoreForeach.java | 14 ++--- .../go/core/ast/global/RPCoreGForeach.java | 21 +++++-- .../global/RPCoreGProtocolDeclTranslator.java | 2 +- .../ext/go/core/ast/local/RPCoreLForeach.java | 19 ++++--- .../RPCoreSTReceiveActionBuilder.java | 4 +- .../RPCoreSTSelectActionBuilder.java | 8 +-- .../RPCoreSTSelectStateBuilder.java | 2 +- .../statetype3/RPCoreSTSendActionBuilder.java | 4 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 5 +- .../RPCoreSTStateChanApiBuilder.java | 57 +++++++++++++++---- .../model/endpoint/RPCoreEGraphBuilder.java | 2 +- .../model/endpoint/RPCoreEModelFactory.java | 4 +- .../endpoint/RPCoreEModelFactoryImpl.java | 4 +- .../go/core/model/endpoint/RPCoreEState.java | 10 ++-- .../ext/go/del/global/RPGForeachDel.java | 2 +- .../ast/global/RPCoreAntlrGForeach.java | 4 +- .../scribble/ast/index/RPAntlrIndexExpr.java | 8 +++ .../ext/go/type/index/RPForeachVar.java | 50 ++++++++++++++++ .../ext/go/type/index/RPIndexExpr.java | 2 +- .../ext/go/type/index/RPIndexFactory.java | 5 ++ 25 files changed, 194 insertions(+), 75 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java index 26dbeca08..90a1b45d8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java @@ -16,6 +16,7 @@ import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; import org.scribble.ext.go.ast.name.simple.RPIndexedRoleNode; import org.scribble.ext.go.core.ast.RPCoreDelegDecl; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; @@ -32,7 +33,7 @@ RPGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd); RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr, List blocks); - RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block); + RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block); RPIndexedRoleNode RPIndexedRoleNode(CommonTree source, String identifier, RPIndexExpr start, RPIndexExpr end); @Deprecated diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index e7dedda72..315823ea4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -20,6 +20,7 @@ import org.scribble.ext.go.del.global.RPGForeachDel; import org.scribble.ext.go.del.global.RPGMessageTransferDel; import org.scribble.ext.go.del.global.RPGMultiChoicesDel; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; @@ -93,9 +94,9 @@ public RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr } @Override - public RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block) + public RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block) { - RPGForeach gf = new RPGForeach(source, subj, var, start, end, block); + RPGForeach gf = new RPGForeach(source, subj, param, start, end, block); gf = del(gf, new RPGForeachDel()); return gf; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java index 29389077c..17f51f663 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java @@ -5,8 +5,8 @@ import org.scribble.ast.CompoundInteractionNode; import org.scribble.ast.ProtocolBlock; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.main.ScribbleException; import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.AstVisitor; @@ -14,22 +14,22 @@ public abstract class RPForeach extends CompoundInteractionNode { public final RoleNode subj; - public final RPIndexVar var; + public final RPForeachVar param; public final RPIndexExpr start; public final RPIndexExpr end; public final ProtocolBlock block; - protected RPForeach(CommonTree source, RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block) + protected RPForeach(CommonTree source, RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block) { super(source); this.subj = subj; - this.var = var; + this.param = param; this.start = start; this.end = end; this.block = block; } - public abstract RPForeach reconstruct(RoleNode subj, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block); + public abstract RPForeach reconstruct(RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block); @Override public abstract RPForeach clone(AstFactory af); @@ -39,7 +39,7 @@ public RPForeach visitChildren(AstVisitor nv) throws ScribbleException { RoleNode subj = (RoleNode) visitChild(this.subj, nv); ProtocolBlock block = visitChildWithClassEqualityCheck(this, this.block, nv); - return reconstruct(subj, var, start, end, block); + return reconstruct(subj, param, start, end, block); } public abstract ProtocolBlock getBlock(); @@ -47,6 +47,6 @@ public RPForeach visitChildren(AstVisitor nv) throws ScribbleException @Override public String toString() { - return "foreach " + this.subj + "[" + this.var + ":" + this.start + "," + this.end + "] " + this.block; + return "foreach " + this.subj + "[" + this.param + ":" + this.start + "," + this.end + "] " + this.block; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java index 70bf5c71f..ac91ec8d1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java @@ -14,17 +14,17 @@ import org.scribble.del.ScribDel; import org.scribble.ext.go.ast.RPAstFactory; import org.scribble.ext.go.ast.RPForeach; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; public class RPGForeach extends RPForeach implements GCompoundInteractionNode { - public RPGForeach(CommonTree source, RoleNode subj, RPIndexVar var, + public RPGForeach(CommonTree source, RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block) { - super(source, subj, var, start, end, block); + super(source, subj, param, start, end, block); } @Override @@ -43,7 +43,7 @@ public LCompoundInteractionNode project(AstFactory af, Role self, List block) + public RPGForeach reconstruct(RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block) { ScribDel del = del(); - RPGForeach gc = new RPGForeach(this.source, subj, var, start, end, (GProtocolBlock) block); + RPGForeach gc = new RPGForeach(this.source, subj, param, start, end, (GProtocolBlock) block); gc = (RPGForeach) gc.del(del); return gc; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java index 0e118cde3..c35936598 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java @@ -20,8 +20,8 @@ import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.Message; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -72,7 +72,7 @@ public RPCoreGEnd ParamCoreGEnd() return RPCoreGEnd.END; } - public RPCoreGForeach RPCoreGForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, RPCoreGType body, RPCoreGType seq) + public RPCoreGForeach RPCoreGForeach(Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, RPCoreGType body, RPCoreGType seq) { return new RPCoreGForeach(role, var, start, end, body, seq); } @@ -136,7 +136,7 @@ public RPCoreLEnd ParamCoreLEnd() return RPCoreLEnd.END; } - public RPCoreLForeach RPCoreLForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, RPCoreLType body, RPCoreLType seq) + public RPCoreLForeach RPCoreLForeach(Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, RPCoreLType body, RPCoreLType seq) { return new RPCoreLForeach(role, var, start, end, body, seq); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java index 563e8f1e6..cf82ed0bc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java @@ -1,14 +1,14 @@ package org.scribble.ext.go.core.ast; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; public abstract class RPCoreForeach, K extends ProtocolKind> implements RPCoreType { public final Role role; - public final RPIndexVar var; + public final RPForeachVar param; // FIXME: use RPInterval public final RPIndexExpr start; // Gives the Scribble choices-subj range // Cf. ParamCoreGChoice singleton src @@ -17,10 +17,10 @@ public abstract class RPCoreForeach, K extends ProtocolK public final B body; public final B seq; - public RPCoreForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, B body, B cont) + public RPCoreForeach(Role role, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, B body, B cont) { this.role = role; - this.var = var; + this.param = param; this.start = start; this.end = end; this.body = body; @@ -30,7 +30,7 @@ public RPCoreForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr e @Override public String toString() { - return "foreach " + this.role + "[" + var + ":" + this.start + "," + this.end + "] do " + this.body + " ; " + this.seq; + return "foreach " + this.role + "[" + param + ":" + this.start + "," + this.end + "] do " + this.body + " ; " + this.seq; } @Override @@ -46,7 +46,7 @@ public boolean equals(Object obj) } RPCoreForeach them = (RPCoreForeach) obj; return them.canEquals(this) && this.role.equals(them.role) - && this.var.equals(them.var) && this.start.equals(them.start) + && this.param.equals(them.param) && this.start.equals(them.start) && this.end.equals(them.end) && this.body.equals(them.body) && this.seq.equals(them.seq); // FIXME: check B kind is equal? } @@ -59,7 +59,7 @@ public int hashCode() final int prime = 4271; int result = 1; result = prime * result + this.role.hashCode(); - result = prime * result + this.var.hashCode(); + result = prime * result + this.param.hashCode(); result = prime * result + this.start.hashCode(); result = prime * result + this.end.hashCode(); result = prime * result + this.body.hashCode(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 96f485852..bfbf57d44 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -16,14 +16,16 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexFactory; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; public class RPCoreGForeach extends RPCoreForeach implements RPCoreGType { - public RPCoreGForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, RPCoreGType body, RPCoreGType seq) + public RPCoreGForeach(Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, RPCoreGType body, RPCoreGType seq) { super(role, var, start, end, body, seq); } @@ -37,7 +39,7 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } else { - return af.RPCoreGForeach(this.role, this.var, this.start, this.end, + return af.RPCoreGForeach(this.role, this.param, this.start, this.end, this.body.subs(af, old, neu), this.seq.subs(af, old, neu)); } } @@ -52,8 +54,13 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) @Override public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCollection (though not currently used) { + RPIndexVar tmp = RPIndexFactory.ParamIntVar(this.param.toString()); + // HACK FIXME: because RPIndexVar and RPForeachVar now distinguished + Set d = Stream.of(new RPInterval(this.start, this.end)).collect(Collectors.toSet()); - Set var = Stream.of(new RPInterval(this.var, this.var)).collect(Collectors.toSet()); + Set var = Stream.of(//new RPInterval(this.param, this.param) + new RPInterval(tmp, tmp) + ).collect(Collectors.toSet()); Set irs = this.body.getIndexedRoles() .stream().map( ir -> ir.intervals.equals(var) @@ -67,6 +74,9 @@ public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCo //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { + RPIndexVar tmp = RPIndexFactory.ParamIntVar(this.param.toString()); + // HACK FIXME: because RPIndexVar and RPForeachVar now distinguished + RPCoreLType seq = this.seq.project(af, subj); RPInterval v = new RPInterval(this.start, this.end); @@ -74,7 +84,8 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor // FIXME: factor out // cf. RPCoreGChoice#project { RPRoleVariant indexed = new RPRoleVariant(subj.getName().toString(), - Stream.of(new RPInterval(this.var, this.var)).collect(Collectors.toSet()), Collections.emptySet()); + Stream.of(//new RPInterval(this.param, this.param)) + new RPInterval(tmp, tmp)).collect(Collectors.toSet()), Collections.emptySet()); RPCoreLType body = this.body.project(af, indexed); return body.subs(af, RPCoreLEnd.END, seq); } @@ -85,7 +96,7 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor else { RPCoreLType body = this.body.project(af, subj); - return af.RPCoreLForeach(subj, this.var, this.start, this.end, body, seq); + return af.RPCoreLForeach(subj, this.param, this.start, this.end, body, seq); //throw new RuntimeException("[rp-core] TODO: " + this + " project onto " + subj); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index a95930f81..f87f5387b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -305,7 +305,7 @@ private RPCoreGType parseGContinue(Map rvs, boolean checkRecGuar private RPCoreGForeach parseRPGForeach(Map rvs, boolean checkRecGuard, RPGForeach gf, RPCoreGType seq) throws RPCoreSyntaxException { RPCoreGType body = parseSeq(gf.getBlock().getInteractionSeq().getInteractions(), Collections.emptyMap(), false, true); - return this.af.RPCoreGForeach(gf.subj.toName(), gf.var, gf.start, gf.end, body, seq); + return this.af.RPCoreGForeach(gf.subj.toName(), gf.param, gf.start, gf.end, body, seq); } // Parses message interactions as unary choices diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java index 577f274e4..6690037d1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java @@ -1,12 +1,13 @@ package org.scribble.ext.go.core.ast.local; +import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreForeach; import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; @@ -14,9 +15,9 @@ public class RPCoreLForeach extends RPCoreForeach implements RPCoreLType { - public RPCoreLForeach(Role role, RPIndexVar var, RPIndexExpr start, RPIndexExpr end, RPCoreLType body, RPCoreLType cont) + public RPCoreLForeach(Role role, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, RPCoreLType body, RPCoreLType cont) { - super(role, var, start, end, body, cont); + super(role, param, start, end, body, cont); } @Override @@ -28,7 +29,7 @@ public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType old, RPCoreType getIndexVars() { - Set ivars = Stream.of(this.var).collect(Collectors.toSet()); - // FIXME: shouldn't include bound foreach params (cf. RPCoreGForeach#getIndexVars) -- currently included for hacked Foreach method loop (RPCoreSTStateChanApiBuilder) + Set ivars = + //Stream.of(this.param).collect(Collectors.toSet()); + // FIXME: shouldn't include bound foreach params (cf. RPCoreGForeach#getIndexVars) -- currently included for hacked Foreach method loop (RPCoreSTStateChanApiBuilder) + new HashSet<>(); ivars.addAll(this.start.getVars()); ivars.addAll(this.end.getVars()); ivars.addAll(this.body.getIndexVars()); - return ivars; + return ivars.stream() + .filter(v -> !v.toString().equals(this.param.toString())) // HACK FIXME -- RPIndexVar distinguished from RPForeachVar (equals) + .collect(Collectors.toSet()); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index e2dfcc93a..1f0036749 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -82,10 +82,10 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } else { - String start = RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start); + String start = rpapi.generateIndexExpr(d.start); res += "var err error\n" + "for i := " + start + ";" - + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.end) + "; i++ {\n"; + + " i <= " + rpapi.generateIndexExpr(d.end) + "; i++ {\n"; // For payloads -- FIXME: currently hardcoded for exactly one payload Function f = extName -> diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index 868b2033b..f436a2220 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -61,7 +61,7 @@ public String buildArgs(STStateChanApiBuilder api, EAction a) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { - RPCoreSTStateChanApiBuilder apigen = (RPCoreSTStateChanApiBuilder) api; + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem @@ -103,13 +103,13 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat res += "if err := " + sEpRecv // + (((GoJob) api.job).noCopy ? "Raw" : ""); //+ "[" + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&arg0)" + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", " - + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + ", &tmp)" + + rpapi.generateIndexExpr(d.start) + ", &tmp)" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" + "*arg0 = tmp.(" + extName + ")\n" - + "ch := make(chan *" + apigen.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" - + "ch <- " + apigen.getSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; + + "ch := make(chan *" + rpapi.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" + + "ch <- " + rpapi.getSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index c8f7d03eb..536e392bd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -116,7 +116,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) "if err := " + sEpRecv + "." /*+ RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + peer.getName() + "\"][" + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&op)*/ + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", " - + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + ", &tmp)" + + rpapi.generateIndexExpr(d.start) + ", &tmp)" + "; err != nil {\n" // g.end = g.start -- CFSM only has ? for input + "log.Fatal(err)\n" + "}\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 1b90f7105..be5de050b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -74,8 +74,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //pet.isGDelegationType() // FIXME: currently deleg specified by ParamCoreDelegDecl, not GDelegationElem rpapi.isDelegType((DataType) pet)); - String res = "for i, j := " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + ", 0;" - + " i <= " + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.end)+"; i, j = i+1, j+1 {\n"; + String res = "for i, j := " + rpapi.generateIndexExpr(d.start) + ", 0;" + + " i <= " + rpapi.generateIndexExpr(d.end)+"; i, j = i+1, j+1 {\n"; if (a.mid.isOp()) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 406d77442..11cf0357c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -168,8 +168,8 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< + "Self int\n" + "*" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + " *" + RPCoreSTApiGenConstants.GO_MPCHAN_TYPE + "\n" - //+ "Params map[string]int\n" + ivars.stream().map(x -> x + " int\n").collect(Collectors.joining("")) + + "Params map[string]int\n" + "}\n" // Endpoint Kind type constructor -- makes connection maps @@ -184,7 +184,8 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< + "return &" + epkindTypeName + "{p, self, &" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "{}, " + RPCoreSTApiGenConstants.GO_MPCHAN_CONSTRUCTOR + "(self, "//conns)" //"params + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "})" - + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + ", " + + "make(map[string]int)" + "}\n" + "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 38e94fafb..82aaaf3f5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -1,7 +1,10 @@ package org.scribble.ext.go.core.codegen.statetype3; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -20,6 +23,7 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexVar; @@ -43,10 +47,19 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder private final Set msnds; private Map imedNames = new HashMap<>(); // Cf. STStateChanApiBuilder.names + + private final Set fvars = new HashSet<>(); // HACK FIXME: should make explicit RPIndexExprNode ast and name disamb endpoint vs. foreach vars + private final List todo = new LinkedList<>(); // HACK FIXME: to preserve "order" of state building -- cf. fvars hack for var scope // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) rp-core class later // Pre: variant.getName().equals(this.role) public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph) + { + this(apigen, variant, graph, Collections.emptySet()); + } + + private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph, + Set fvars) // HACK FIXME { super(apigen.job, apigen.proto, apigen.self, graph, new RPCoreSTOutputStateBuilder(new RPCoreSTSplitActionBuilder(), new RPCoreSTSendActionBuilder()), @@ -70,6 +83,8 @@ public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant va .filter(d -> (d instanceof DataTypeDecl)).map(d -> ((DataTypeDecl) d)).collect(Collectors.toSet()); this.msnds = mod.getNonProtocolDecls().stream() .filter(d -> (d instanceof MessageSigNameDecl)).map(d -> ((MessageSigNameDecl) d)).collect(Collectors.toSet()); + + this.fvars.addAll(fvars); } @Override @@ -149,6 +164,13 @@ public Map build() // filepath -> source + "}\n"; res.put(getFilePath("End"), end); } + + // FIXME HACK + for (EGraph g : this.todo) + { + res.putAll(new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, g, this.fvars).build()); + } + return res; } @@ -164,7 +186,7 @@ public String getFilePath(String filename) + "/" + filename + ".go"; } - // Pre: s.hasNested() + // Pre: s.hasNested() -- i.e., s is the "outer" state // FIXME: factor out with getStateChanPremable protected Map buildForeachIntermediaryState(RPCoreEState s) { @@ -191,17 +213,22 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) RPCoreEState init = s.getNested(); String initName = "Init_" + init.id; String succName = s.isTerminal() ? "End" : getStateChanName(s); // FIXME: factor out + RPForeachVar p = s.getParam(); + + this.fvars.add(p); // HACK FIXME: state visiting order not guaranteed (w.r.t. lexical var scope) + feach += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + ") Foreach(f func(*" + initName + ") End) *End {\n" - + "for " + s.getParam() + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions - + s.getParam() + " <= " + generateIndexExpr(s.getInterval().end) + "; " + s.getParam() + " = " + s.getParam() + " + 1 {\n" - + sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? + + "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + + p + " <= " + generateIndexExpr(s.getInterval().end) + "; " + p + " = " + p + " + 1 {\n" + //+ sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? + + sEp + ".Params[\"" + p + "\"] = " + p + "\n" // FIXME: nested Endpoint type/struct? // Duplicated from RPCoreSTSessionApiBuilder // FIXME: factor out + ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) ? "f(newBranch" + initName + "(ini))\n" - : "f(&" + initName + "{ new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), s.Ept })\n") // cf. state chan builder // FIXME: chan struct reuse + : "f(&" + initName + "{ new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")," + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse + "}\n" + "return " + getSuccStateChan(s, succName, sEp) + "\n" @@ -210,7 +237,8 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) res.put(getFilePath(scTypeName), feach); RPCoreEState term = (RPCoreEState) MState.getTerminal(init); - res.putAll(new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, new EGraph(init, term)).build()); + //res.putAll(new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, new EGraph(init, term)).build()); + this.todo.add(new EGraph(init, term)); return res; } @@ -401,7 +429,7 @@ public static String getGeneratedIndexedRoleName(RPIndexedRole r) return r.getName() + "_" + g.start + "to" + g.end; } - public static String generateIndexExpr(RPIndexExpr e) + public String generateIndexExpr(RPIndexExpr e) { if (e instanceof RPIndexInt) { @@ -409,9 +437,18 @@ public static String generateIndexExpr(RPIndexExpr e) } else if (e instanceof RPIndexVar) { - return RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT - //+ "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PARAMS + "[\"" + e + "\"]"; - + "." + e; + String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + if (e instanceof RPForeachVar + || this.fvars.stream().anyMatch(p -> p.toString().equals(e.toString()))) // FIXME HACK + { + return sEp + ".Params[\"" + e + "\"]"; + } + else + { + return sEp + //+ "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PARAMS + "[\"" + e + "\"]"; + + "." + e; + } } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java index 6791ccc66..1699ba586 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java @@ -82,7 +82,7 @@ private void build(RPCoreLType lt, RPCoreEState s1, RPCoreEState s2, Map labs); - RPCoreEState newRPCoreEState(Set labs, RPIndexVar param, RPInterval interval, RPCoreEState nested); + RPCoreEState newRPCoreEState(Set labs, RPForeachVar param, RPInterval interval, RPCoreEState nested); RPCoreECrossSend newParamCoreECrossSend(RPIndexedRole peer, MessageId mid, Payload payload); RPCoreECrossReceive newParamCoreECrossReceive(RPIndexedRole peer, MessageId mid, Payload payload); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java index e2ed85bf5..82ce05bb4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEModelFactoryImpl.java @@ -10,8 +10,8 @@ import org.scribble.ext.go.core.model.endpoint.action.RPCoreEMultiChoicesReceive; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EModelFactoryImpl; import org.scribble.model.endpoint.actions.EReceive; import org.scribble.model.endpoint.actions.ESend; @@ -31,7 +31,7 @@ public RPCoreEState newEState(Set labs) } @Override - public RPCoreEState newRPCoreEState(Set labs, RPIndexVar param, RPInterval interval, RPCoreEState nested) + public RPCoreEState newRPCoreEState(Set labs, RPForeachVar param, RPInterval interval, RPCoreEState nested) { return new RPCoreEState(labs, param, interval, nested); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java index e4fc94676..752f01d46 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java @@ -3,7 +3,7 @@ import java.util.Set; import org.scribble.ext.go.core.type.RPInterval; -import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.model.MState; import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.endpoint.EState; @@ -15,7 +15,7 @@ public class RPCoreEState extends EState { // Mutable -- not used in hashCode/equals (state ID only) -- cf. EState#hashCode/equals (and mutable label set) - private RPIndexVar param; + private RPForeachVar param; private RPInterval interval; private RPCoreEState nested; // null if no nested FSM (then above also null) @@ -24,7 +24,7 @@ protected RPCoreEState(Set labs) this(labs, null, null, null); } - protected RPCoreEState(Set labs, RPIndexVar param, RPInterval interval, RPCoreEState nested) + protected RPCoreEState(Set labs, RPForeachVar param, RPInterval interval, RPCoreEState nested) { super(labs); this.param = param; @@ -45,12 +45,12 @@ public boolean hasNested() // Mutable getters/setters -- cf. super label set - public RPIndexVar getParam() + public RPForeachVar getParam() { return this.param; } - public void setParam(RPIndexVar param) + public void setParam(RPForeachVar param) { this.param = param; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java index c22238454..80ab5d755 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java @@ -19,7 +19,7 @@ public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, Protoc RPGForeach fe = (RPGForeach) visited; RoleNode subj = fe.subj.clone(inlr.job.af); GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) fe.block.del().env()).getTranslation(); - RPGForeach inlined = ((RPAstFactory) inlr.job.af).RPGForeach(fe.getSource(), subj, fe.var, fe.start, fe.end, block); + RPGForeach inlined = ((RPAstFactory) inlr.job.af).RPGForeach(fe.getSource(), subj, fe.param, fe.start, fe.end, block); inlr.pushEnv(inlr.popEnv().setTranslation(inlined)); //return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); return ScribDelBase.popAndSetVisitorEnv(this, inlr, visited); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java index ba55565c7..6e54552d1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java @@ -6,8 +6,8 @@ import org.scribble.ext.go.ast.RPAstFactory; import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.parser.scribble.ast.index.RPAntlrIndexExpr; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; import org.scribble.util.ScribParserException; @@ -25,7 +25,7 @@ public class RPCoreAntlrGForeach public static RPGForeach parseRPGForeach(AntlrToScribParser parser, CommonTree root, RPAstFactory af) throws ScribParserException { RoleNode subj = AntlrSimpleName.toRoleNode(getSubjectChild(root), af); - RPIndexVar var = (RPIndexVar) RPAntlrIndexExpr.parseParamIndexExpr(getIndexVarChild(root), af); + RPForeachVar var = (RPForeachVar) RPAntlrIndexExpr.parseRPForeachVar(getIndexVarChild(root), af); RPIndexExpr start = RPAntlrIndexExpr.parseParamIndexExpr(getStartIndexExprChild(root), af); RPIndexExpr end = RPAntlrIndexExpr.parseParamIndexExpr(getEndIndexExprChild(root), af); GProtocolBlock block = (GProtocolBlock) parser.parse(getBlockChild(root), af); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java index a61c5b707..a3948557d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java @@ -3,6 +3,7 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ext.go.type.index.RPBinIndexExpr; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexFactory; @@ -40,6 +41,13 @@ public static RPIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) } } + public static RPForeachVar parseRPForeachVar(CommonTree ct, AstFactory af) + { + // Duplicated from above + String type = ct.getToken().getText(); // Parsed as simplename + return RPIndexFactory.RPForeachVar(type); + } + private static boolean isInteger(String s) { // return Arrays.stream(s.getBytes()).stream().allMatch(c -> // Character.digit((char) c,radix) < 0); // no Byte stream diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java new file mode 100644 index 000000000..996c67dce --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java @@ -0,0 +1,50 @@ +package org.scribble.ext.go.type.index; + +// Foreach index variable occurrence -- hacky? +// Currently only used for parsing foreach param decls -- occurrences of vars inside foreach not disambiguated between endpoint-vars and foreach-vars +// (Currently no actual RPIndexExprNode ast -- so no name disambiguation) + +// FIXME: deprecate? -- causes problems with checking equality between var occurrences, etc +public class RPForeachVar extends RPIndexVar +{ + protected RPForeachVar(String name) + { + super(name); + } + + /*@Override + public Set getVars() + { + return Collections.emptySet(); // No: still treat foreach vars as vars here -- scope managmenet should be handled by, e.g., RPCoreLForeach + }*/ + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPForeachVar)) + { + return false; + } + return super.equals(this) // Does canEqual + && this.name.equals(((RPForeachVar) o).name); + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof RPForeachVar; + } + + @Override + public int hashCode() + { + int hash = 2243; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.name.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java index 4c1b58dc5..764704c93 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java @@ -11,7 +11,7 @@ public boolean isConstant() public abstract String toGoString(); - public abstract Set getVars(); + public abstract Set getVars(); // Doesn't include foreach params public abstract String toSmt2Formula(); // Cf. toString -- but can be useful to separate, for debugging (and printing) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java index 776bd8c59..384b53292 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java @@ -26,4 +26,9 @@ public static RPIndexVar ParamIntVar(String text) }*/ return new RPIndexVar(text); } + + public static RPForeachVar RPForeachVar(String text) + { + return new RPForeachVar(text); + } } From a455fb0d22e0e0235ee17ae7296fd076ee4efe84 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 5 May 2018 21:09:20 +0100 Subject: [PATCH 269/433] Fix to scribble-go/pom.xml. --- scribble-go/pom.xml | 1 + .../main/java/org/scribble/ext/go/type/index/RPForeachVar.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scribble-go/pom.xml b/scribble-go/pom.xml index 79db846ab..adf011b0c 100644 --- a/scribble-go/pom.xml +++ b/scribble-go/pom.xml @@ -70,6 +70,7 @@ **/script.js **/package-list **/*.txt + **/*.go diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java index 996c67dce..efe837d79 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java @@ -4,7 +4,7 @@ // Currently only used for parsing foreach param decls -- occurrences of vars inside foreach not disambiguated between endpoint-vars and foreach-vars // (Currently no actual RPIndexExprNode ast -- so no name disambiguation) -// FIXME: deprecate? -- causes problems with checking equality between var occurrences, etc +// FIXME: @Deprecated -- causes problems with checking equality between var occurrences, etc. -- or use same equals/hash for both?... public class RPForeachVar extends RPIndexVar { protected RPForeachVar(String name) From a68ed2df035379b0c81611a60c86b6e8f1bffa77 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 5 May 2018 21:13:26 +0100 Subject: [PATCH 270/433] Minor fix re. Eclipse bug. --- .../java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scribble-core/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java b/scribble-core/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java index dd308b876..c93607716 100644 --- a/scribble-core/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java +++ b/scribble-core/src/main/java/org/scribble/visit/NoEnvInlinedProtocolVisitor.java @@ -15,6 +15,7 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.main.Job; +import org.scribble.type.kind.ProtocolKind; import org.scribble.visit.env.DummyEnv; public abstract class NoEnvInlinedProtocolVisitor extends InlinedProtocolVisitor @@ -25,7 +26,7 @@ public NoEnvInlinedProtocolVisitor(Job job) } @Override - protected final DummyEnv makeRootProtocolDeclEnv(ProtocolDecl pd) + protected final DummyEnv makeRootProtocolDeclEnv(ProtocolDecl pd) { return DummyEnv.DUMMY; } From 1f8d06a71650066e18a330652070b9ac9cf3c9df Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 7 May 2018 18:29:59 +0100 Subject: [PATCH 271/433] [rp-core] Fix to foreach projection. --- .../org/scribble/ext/go/core/ast/global/RPCoreGForeach.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index bfbf57d44..9e512aa9a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -96,7 +96,7 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor else { RPCoreLType body = this.body.project(af, subj); - return af.RPCoreLForeach(subj, this.param, this.start, this.end, body, seq); + return af.RPCoreLForeach(this.role, this.param, this.start, this.end, body, seq); //throw new RuntimeException("[rp-core] TODO: " + this + " project onto " + subj); } } From e67185e19d049dd9b15a66bae1767d140f0ecb93 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 8 May 2018 11:36:02 +0100 Subject: [PATCH 272/433] [rp-core] WIP -- fixing (nested) state namining. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 12 +++- .../RPCoreSTStateChanApiBuilder.java | 70 +++++++++++++------ 2 files changed, 56 insertions(+), 26 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 11cf0357c..1765c4fbe 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -9,8 +9,12 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; +import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.model.MState; +import org.scribble.model.endpoint.EGraph; +import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -239,11 +243,13 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< } // Top-level Run method // FIXME: add session completion check - /*EGraph g = this.apigen.variants.get(variant.getName()).get(variant); - String endName = g.init.isTerminal() ? "Init" : "End"; // FIXME: factor out -- cf. RPCoreSTStateChanApiBuilder#makeSTStateName(*/ + EGraph g = this.apigen.variants.get(variant.getName()).get(variant); + //String endName = g.init.isTerminal() ? "Init" : "End"; // FIXME: factor out -- cf. RPCoreSTStateChanApiBuilder#makeSTStateName(*/ + EState term = MState.getTerminal(g.init); + String endName = (g.init.id == term.id ? "Init" : "End") + ((term != null && ((RPCoreEState) term).hasNested()) ? "_" + term.id : ""); String init = "Init_" + this.apigen.variants.get(variant.getName()).get(variant).init; epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") Run(f func(*" + init + ") End) *End {\n" // f specifies non-pointer End + + "func (ini *" + epkindTypeName + ") Run(f func(*" + init + ") " + endName + ") *" + endName + " {\n" // f specifies non-pointer End + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".Close()\n" + "ini.Use()\n" // FIXME: int-counter linearity + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".CheckConnection()\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 82aaaf3f5..3f444573f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -46,7 +46,7 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder private final Set dtds; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams private final Set msnds; - private Map imedNames = new HashMap<>(); // Cf. STStateChanApiBuilder.names + private Map imedNames = new HashMap<>(); // "Original" state names -- FIXME: deprecate // Cf. STStateChanApiBuilder.names private final Set fvars = new HashSet<>(); // HACK FIXME: should make explicit RPIndexExprNode ast and name disamb endpoint vs. foreach vars private final List todo = new LinkedList<>(); // HACK FIXME: to preserve "order" of state building -- cf. fvars hack for var scope @@ -55,11 +55,11 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder // Pre: variant.getName().equals(this.role) public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph) { - this(apigen, variant, graph, Collections.emptySet()); + this(apigen, variant, graph, Collections.emptyMap(), Collections.emptyMap(), Collections.emptySet()); } - private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph, - Set fvars) // HACK FIXME + private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph, + Map names, Map imedNames, Set fvars) // HACK FIXME -- make a "nested builder" { super(apigen.job, apigen.proto, apigen.self, graph, new RPCoreSTOutputStateBuilder(new RPCoreSTSplitActionBuilder(), new RPCoreSTSendActionBuilder()), @@ -84,6 +84,8 @@ private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant v this.msnds = mod.getNonProtocolDecls().stream() .filter(d -> (d instanceof MessageSigNameDecl)).map(d -> ((MessageSigNameDecl) d)).collect(Collectors.toSet()); + this.names.putAll(names); + this.imedNames.putAll(imedNames); this.fvars.addAll(fvars); } @@ -136,8 +138,11 @@ public Map build() // filepath -> source String name = getStateChanName(s); // HACK FIXME: to generate names even if state not generated here if (s.id != this.graph.init.id) // "End" not built for for single (nested) state FSMs (will be "Init") { - res.put(getFilePath(name), this.eb.build(this, s)); - hasTerm = false; + if (!((RPCoreEState) s).hasNested()) + { + res.put(getFilePath(name), this.eb.build(this, s)); + hasTerm = true; + } } break; default: throw new RuntimeException("[rp-core] Shouldn't get in here: " + s); @@ -145,12 +150,17 @@ public Map build() // filepath -> source RPCoreEState s1 = (RPCoreEState) s; if (s1.hasNested()) { - res.putAll(buildForeachIntermediaryState(s1)); + Map tmp = buildForeachIntermediaryState(s1); + res.putAll(tmp); + if (s.isTerminal()) + { + hasTerm = true; + } } } - if (!hasTerm) + if (!hasTerm) //&& res.keySet().stream().noneMatch(k -> k.endsWith("End.go"))) // FIXME -- Need to distinguish "End" if nested -- only use "End" for non-nested? { - // Always make and "End" (including non-terminating FSMs) -- doesn't matter it's not the actual end state + // Always make an "End" (including non-terminating FSMs) -- doesn't matter it's not the actual end state //RPCoreEState end = ((RPCoreEModelFactory) this.job.ef).newEState(Collections.emptySet()); // FIXME: factor out with getStateChanPremable @@ -168,7 +178,8 @@ public Map build() // filepath -> source // FIXME HACK for (EGraph g : this.todo) { - res.putAll(new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, g, this.fvars).build()); + Map tmp = new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, g, this.names, this.imedNames, this.fvars).build(); + res.putAll(tmp); } return res; @@ -317,7 +328,9 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(this, a) - + ") *" + ab.getReturnType(this, curr, succ) + " {\n" + + ") *" //+ ab.getReturnType(this, curr, succ) + + getSuccStateChanName(succ) + + " {\n" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + ab.buildBody(this, curr, a, succ) + "\n" @@ -335,11 +348,18 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) return res; } + protected String getSuccStateChanName(EState succ) + { + RPCoreEState s = (RPCoreEState) succ; + String name = s.hasNested() + ? (s.isTerminal() ? getStateChanName(s) : getIntermediaryStateChanName(s)) // HACK FIXME -- first call to getStateChanName (intermed name not made yet) + : getStateChanName(s); //ab.getReturnType(this, curr, succ) + return name; + } + protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) { - String name = ((RPCoreEState) succ).hasNested() - ? getIntermediaryStateChanName(succ) - : getStateChanName(succ); //ab.getReturnType(this, curr, succ) + String name = getSuccStateChanName(succ); return getSuccStateChan(succ, name, sEp); } @@ -378,11 +398,11 @@ public String getStateChanName(EState s) String name = this.imedNames.get(s.id); if (name == null) { - RPCoreEState s1 = (RPCoreEState) s; - name = makeSTStateName(s1); - if (s1.hasNested()) + RPCoreEState rps = (RPCoreEState) s; + name = makeSTStateName(rps); + this.imedNames.put(rps.id, name); // The "original" name, now used for foreach -- doing this way round for convenience of original state channel naming + if (rps.hasNested() && !rps.isTerminal()) { - this.imedNames.put(s1.id, name); // The "original" name, now used for foreach -- doing this way round for convenience of original state channel naming name = name + "_"; // FIXME } this.names.put(s.id, name); @@ -394,7 +414,8 @@ public String getIntermediaryStateChanName(EState s) { if (!this.names.containsKey(s.id)) { - throw new RuntimeException("Shouldn't get in here: " + s.id); + throw new RuntimeException("Shouldn't get in here: " + s.id); + //getStateChanName(s); // HACK FIXME } return this.imedNames.get(s.id); } @@ -402,20 +423,23 @@ public String getIntermediaryStateChanName(EState s) @Override protected String makeSTStateName(EState s) { - return s.id == this.graph.init.id // Includes single (nested) state endpoint kinds (i.e, Init, not End) + RPCoreEState rps = (RPCoreEState) s; + String name = s.id == this.graph.init.id // Includes single (nested) state endpoint kinds (i.e, Init, not End) ? "Init_" + s.id // FIXME: factor out (makeInitStateName) : (s.isTerminal() - ? makeEndStateName(this.apigen.proto.getSimpleName(), this.variant) + ? //makeEndStateName(this.apigen.proto.getSimpleName(), this.variant) + "End" + (rps.hasNested() ? "_" + s.id : "") : //this.apigen.proto.getSimpleName() + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_" "State" + this.counter++); + return name; } - public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) + /*public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) { return //simpname + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(r) + "_" + RPCoreSTApiGenConstants.GO_SCHAN_END_TYPE; - } + }*/ // Not actual variants -- rather, indexed roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedRoleVariantName public static String getGeneratedIndexedRoleName(RPIndexedRole r) From f70a6aceb5430b214f6ae1c7c96efbd2b64e0396 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 8 May 2018 11:43:19 +0100 Subject: [PATCH 273/433] [rp-core] Continued. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 11 ++++------- .../statetype3/RPCoreSTStateChanApiBuilder.java | 12 ++++++++---- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 1765c4fbe..9a991a2b2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -9,12 +9,8 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; -import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexVar; -import org.scribble.model.MState; -import org.scribble.model.endpoint.EGraph; -import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -243,10 +239,11 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< } // Top-level Run method // FIXME: add session completion check - EGraph g = this.apigen.variants.get(variant.getName()).get(variant); - //String endName = g.init.isTerminal() ? "Init" : "End"; // FIXME: factor out -- cf. RPCoreSTStateChanApiBuilder#makeSTStateName(*/ + /*EGraph g = this.apigen.variants.get(variant.getName()).get(variant); + //String endName = g.init.isTerminal() ? "Init" : "End"; // FIXME: factor out -- cf. RPCoreSTStateChanApiBuilder#makeSTStateName( EState term = MState.getTerminal(g.init); - String endName = (g.init.id == term.id ? "Init" : "End") + ((term != null && ((RPCoreEState) term).hasNested()) ? "_" + term.id : ""); + String endName = (g.init.id == term.id ? "Init" : "End") + ((term != null && ((RPCoreEState) term).hasNested()) ? "_" + term.id : "");*/ + String endName = "End"; String init = "Init_" + this.apigen.variants.get(variant.getName()).get(variant).init; epkindFile += "\n" + "func (ini *" + epkindTypeName + ") Run(f func(*" + init + ") " + endName + ") *" + endName + " {\n" // f specifies non-pointer End diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 3f444573f..641aa4262 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -55,11 +55,13 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder // Pre: variant.getName().equals(this.role) public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph) { - this(apigen, variant, graph, Collections.emptyMap(), Collections.emptyMap(), Collections.emptySet()); + this(apigen, variant, graph, 2, Collections.emptyMap(), Collections.emptyMap(), Collections.emptySet()); } private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph, - Map names, Map imedNames, Set fvars) // HACK FIXME -- make a "nested builder" + int counter, Map names, Map imedNames, Set fvars) + // HACK FIXME -- make a "nested builder" -- problem is final this.graph + // FIXME: probably easier to to make a "nested" constructor { super(apigen.job, apigen.proto, apigen.self, graph, new RPCoreSTOutputStateBuilder(new RPCoreSTSplitActionBuilder(), new RPCoreSTSendActionBuilder()), @@ -84,6 +86,7 @@ private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant v this.msnds = mod.getNonProtocolDecls().stream() .filter(d -> (d instanceof MessageSigNameDecl)).map(d -> ((MessageSigNameDecl) d)).collect(Collectors.toSet()); + this.counter = counter; this.names.putAll(names); this.imedNames.putAll(imedNames); this.fvars.addAll(fvars); @@ -178,8 +181,9 @@ public Map build() // filepath -> source // FIXME HACK for (EGraph g : this.todo) { - Map tmp = new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, g, this.names, this.imedNames, this.fvars).build(); - res.putAll(tmp); + RPCoreSTStateChanApiBuilder nested = new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, g, + this.counter, this.names, this.imedNames, this.fvars); + res.putAll(nested.build()); } return res; From 81ceb9d05b899fe6488f0610461694d350741e97 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 8 May 2018 12:26:07 +0100 Subject: [PATCH 274/433] [rp-core] Continued. --- .../core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 641aa4262..bc2b7d8c1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -234,7 +234,7 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) feach += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName - + ") Foreach(f func(*" + initName + ") End) *End {\n" + + ") Foreach(f func(*" + initName + ") End) *" + succName + " {\n" + "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + p + " <= " + generateIndexExpr(s.getInterval().end) + "; " + p + " = " + p + " + 1 {\n" //+ sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? @@ -411,7 +411,7 @@ public String getStateChanName(EState s) } this.names.put(s.id, name); } - return name; + return this.names.get(s.id); } public String getIntermediaryStateChanName(EState s) From 215bf91848743d3b270201bcaf03a30dca19ee1d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 8 May 2018 12:32:29 +0100 Subject: [PATCH 275/433] [rp-core] Fixed foreach getIndexedRoles bug (forgot to add seq) -- used for computing variants. --- .../java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java | 1 + 1 file changed, 1 insertion(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 9e512aa9a..fa569ba3e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -67,6 +67,7 @@ public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCo ? new RPIndexedRole(ir.getName().toString(), d) : ir ).collect(Collectors.toSet()); + irs.addAll(this.seq.getIndexedRoles()); return irs; } From fe218e1fd64a26c908266b589ab7fc2bddb6494a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 8 May 2018 13:15:12 +0100 Subject: [PATCH 276/433] [rp-core] Continued. --- .../codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index bc2b7d8c1..f967cc861 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -356,7 +356,8 @@ protected String getSuccStateChanName(EState succ) { RPCoreEState s = (RPCoreEState) succ; String name = s.hasNested() - ? (s.isTerminal() ? getStateChanName(s) : getIntermediaryStateChanName(s)) // HACK FIXME -- first call to getStateChanName (intermed name not made yet) + //? (s.isTerminal() ? getStateChanName(s) : getIntermediaryStateChanName(s)) // HACK FIXME -- first call to getStateChanName (intermed name not made yet) + ? getIntermediaryStateChanName(s) : getStateChanName(s); //ab.getReturnType(this, curr, succ) return name; } @@ -418,8 +419,8 @@ public String getIntermediaryStateChanName(EState s) { if (!this.names.containsKey(s.id)) { - throw new RuntimeException("Shouldn't get in here: " + s.id); - //getStateChanName(s); // HACK FIXME + //throw new RuntimeException("Shouldn't get in here: " + s.id); // No: e.g., buildActionReturn, may refer to "ahead" state before that state is built + getStateChanName(s); // HACK FIXME } return this.imedNames.get(s.id); } From 35d2f11ef1435ecd21a33577fa59e29970889197 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 8 May 2018 16:39:53 +0100 Subject: [PATCH 277/433] [rp-core] Adding error handling to state chans. --- .../statetype3/RPCoreSTApiGenConstants.java | 2 ++ .../statetype3/RPCoreSTEndStateBuilder.java | 1 + .../RPCoreSTReceiveActionBuilder.java | 10 +++--- .../RPCoreSTSelectActionBuilder.java | 3 +- .../statetype3/RPCoreSTSendActionBuilder.java | 15 ++++++--- .../statetype3/RPCoreSTSessionApiBuilder.java | 2 +- .../RPCoreSTStateChanApiBuilder.java | 31 +++++++++++++------ 7 files changed, 43 insertions(+), 21 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index 414b1fae2..da1bac14f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -54,10 +54,12 @@ public class RPCoreSTApiGenConstants public static final String GO_SCHAN_ENDPOINT = "Ept"; // ep; public static final String GO_SCHAN_LINEARRESOURCE = "Res"; // state + public static final String GO_SCHAN_ERROR = "Err"; // error public static final String GO_SCHAN_END_TYPE = "End"; public static final String GO_IO_METHOD_RECEIVER = "s"; + public static final String GO_IO_METHOD_ERROR = "err"; public static final String GO_CROSS_SPLIT_FUN_PREFIX = "Split"; public static final String GO_CROSS_SEND_FUN_PREFIX = "Send"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java index 60a1fdb91..b7dead991 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java @@ -28,6 +28,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) //+ "import \"" + ParamCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + "\n" + "type " + scTypeName + " struct {\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(api.gpn.getSimpleName(), schangen.variant) + "\n" // FIXME: factor out + "}"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 1f0036749..b0b44a242 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -83,8 +83,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat else { String start = rpapi.generateIndexExpr(d.start); - res += "var err error\n" - + "for i := " + start + ";" + res += //"var err error\n" + "for i := " + start + ";" + " i <= " + rpapi.generateIndexExpr(d.end) + "; i++ {\n"; // For payloads -- FIXME: currently hardcoded for exactly one payload @@ -97,7 +97,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &tmp)" + "; err != nil {\n" - + "log.Fatal(err)\n" + //+ "log.Fatal(err)\n" + + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + "}\n" //+ "arg0[i-" + start + "] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder + "arg0[i-" + start + "] = tmp.(" + extName + ")\n"; // FIXME: gob pointer decoding seems flattened? ("*" dropped) @@ -119,7 +120,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_STRING + "()"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &lab)" + "; err != nil {\n" - + "log.Fatal(err)\n" + //+ "log.Fatal(err)\n" + + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + "}\n"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index f436a2220..6a821567b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -109,7 +109,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "}\n" + "*arg0 = tmp.(" + extName + ")\n" + "ch := make(chan *" + rpapi.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" - + "ch <- " + rpapi.getSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; + //+ "ch <- " + rpapi.makeCreateSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; + + "ch <- " + rpapi.makeCreateSuccStateChan(curr.getSuccessor(a)) + "\n"; // FIXME: arg0 // FIXME: args depends on label // FIXME: store args in s.args } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index be5de050b..0d5e7679d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -82,13 +82,14 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // Write label if (!a.mid.toString().equals("")) { // HACK FIXME? res += "op := \"" + a.mid + "\"\n" // FIXME: API constant? - + "if err := " + sEpWrite /*+ "[i]" + + "if err = " + sEpWrite /*+ "[i]" + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_STRING + "(\"" + a.mid + "\"" + ")" */ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_ISEND + "(\"" + r.getName() + "\", i, &op)" + "; err != nil {\n" - + "log.Fatal(err)\n" // FIXME + //+ "log.Fatal(err)\n" // FIXME + + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + "}\n"; } } @@ -109,16 +110,20 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat throw new RuntimeException("[rp-core] [param-api] TODO: " + a); } - res += "if err := " + sEpWrite /*+ "[i]" + /*res += "if err := " + sEpWrite /*+ "[i]" + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_INT - + "(" + "arg0[j])" // FIXME: hardcoded arg0*/ + + "(" + "arg0[j])" // FIXME: hardcoded arg0* / + "." + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) + "(\"" + r.getName() + "\", i, &arg0[j])" + "; err != nil {\n" + "log.Fatal(err)\n" - + "}\n"; + + "}\n";*/ + res += "err = " + sEpWrite + + "." + + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) + + "(\"" + r.getName() + "\", i, &arg0[j])\n"; } res += "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 9a991a2b2..9f7dadba0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -255,7 +255,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) ? "end := f(newBranch" + init + "(ini))\n" - : "end := f(&" + init + "{ new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + : "end := f(&" + init + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + "return &end\n" + "}"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index f967cc861..2ca88bd10 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -172,6 +172,7 @@ public Map build() // filepath -> source String end = "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) + "\n" + "\n" + "type End struct {\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + "}\n"; @@ -219,6 +220,7 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) // State channel type feach += "\n" + "type " + scTypeName + " struct {\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + "}\n"; @@ -235,6 +237,7 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) feach += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + ") Foreach(f func(*" + initName + ") End) *" + succName + " {\n" + + "var " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + " error\n" + "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + p + " <= " + generateIndexExpr(s.getInterval().end) + "; " + p + " = " + p + " + 1 {\n" //+ sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? @@ -243,10 +246,10 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) // Duplicated from RPCoreSTSessionApiBuilder // FIXME: factor out + ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) ? "f(newBranch" + initName + "(ini))\n" - : "f(&" + initName + "{ new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")," + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse + : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")," + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse + "}\n" - + "return " + getSuccStateChan(s, succName, sEp) + "\n" + + "return " + makeCreateSuccStateChan(s, succName) + "\n" + "}\n"; res.put(getFilePath(scTypeName), feach); @@ -268,10 +271,10 @@ protected String getStateChanPremable(EState s) String res = "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) + "\n" + "\n" - + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" + + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; // FIXME: error handling via Err field -- fallback should be panic - + "import \"log\"\n"; + //+ "import \"log\"\n"; // Not needed by select-branch or Case objects // FIXME: refactor back into state-specific builders? if (s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT @@ -293,6 +296,7 @@ protected String getStateChanPremable(EState s) // State channel type res += "\n" + "type " + scTypeName + " struct {\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + "}\n"; @@ -335,8 +339,12 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) + ") *" //+ ab.getReturnType(this, curr, succ) + getSuccStateChanName(succ) + " {\n" + + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" + + "panic(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ")\n" + + "}\n" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + "var " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + " error\n" + ab.buildBody(this, curr, a, succ) + "\n" + "}"; } @@ -346,9 +354,9 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) @Override public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) { - String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; String res = ""; - res += "return " + getSuccStateChan(ab, curr, succ, sEp); + res += "return " + //makeCreateSuccStateChan(ab, curr, succ); + makeCreateSuccStateChan(succ); return res; } @@ -362,14 +370,16 @@ protected String getSuccStateChanName(EState succ) return name; } - protected String getSuccStateChan(STActionBuilder ab, EState curr, EState succ, String sEp) + //protected String makeCreateSuccStateChan(STActionBuilder ab, EState curr, EState succ) + protected String makeCreateSuccStateChan(EState succ) { String name = getSuccStateChanName(succ); - return getSuccStateChan(succ, name, sEp); + return makeCreateSuccStateChan(succ, name); } - protected String getSuccStateChan(EState succ, String name, String sEp) + protected String makeCreateSuccStateChan(EState succ, String name) { + String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; if (((GoJob) this.job).selectApi && getStateKind(succ) == RPCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) { @@ -379,7 +389,8 @@ protected String getSuccStateChan(EState succ, String name, String sEp) } else { - String res = "&" + name + "{ " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; + String res = "&" + name + "{ " + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ": " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + + ", " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; if (!succ.isTerminal()) // FIXME: terminal foreach state { res += ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE From aaa4491bce025fb5a6bfa5aea96ba065139dc95c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 8 May 2018 16:49:06 +0100 Subject: [PATCH 278/433] [rp-core] Continued. --- .../codegen/statetype3/RPCoreSTBranchActionBuilder.java | 6 +++++- .../ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java | 1 + .../codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index df51a4286..b6b323809 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -52,6 +52,8 @@ public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + List as = curr.getAllActions(); if (!as.stream().allMatch(x -> x.mid.isOp()) && !as.stream().allMatch(x -> x.mid.isMessageSigName())) { @@ -78,7 +80,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(" + "&lab" + ")"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", 1, &lab" + ")" + "; err != nil {\n" - + "log.Fatal(err)\n" + //+ "log.Fatal(err)\n" + //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + + "panic(err)\n" // FIXME: which case object to return for error? make "default" error case object? + "}\n"; // Switch and return Cases value diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java index dccad9add..6f6c56a25 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -56,6 +56,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) getOpTypeName(api, s, a.mid) : rpapi.getExtName((MessageSigName) a.mid); res += "\ntype " + getOpTypeName(api, s, a.mid) + " struct {\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(null, rpapi.variant) + "\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + (a.mid.isMessageSigName() ? "msg *" + extName + "\n" : "") diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 2ca88bd10..f5551c0b4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -246,7 +246,7 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) // Duplicated from RPCoreSTSessionApiBuilder // FIXME: factor out + ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) ? "f(newBranch" + initName + "(ini))\n" - : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")," + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse + : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse + "}\n" + "return " + makeCreateSuccStateChan(s, succName) + "\n" From b7a5e4729e05f68b119e62048d57c481958af629 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 8 May 2018 17:49:37 +0100 Subject: [PATCH 279/433] [rp-core] Fixed receive action API gen bug for message sig names. --- .../codegen/statetype3/RPCoreSTApiGenConstants.java | 1 + .../codegen/statetype3/RPCoreSTCaseActionBuilder.java | 4 ++-- .../statetype3/RPCoreSTReceiveActionBuilder.java | 11 ++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index da1bac14f..8f74a403e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -45,6 +45,7 @@ public class RPCoreSTApiGenConstants public static final String GO_PARAMROLE_TYPE = "session2.ParamRole"; public static final String GO_PROTOCOL_TYPE = "session2.Protocol"; + public static final String GO_SCRIBMESSAGE_TYPE = "session2.ScribMessage"; public static final String GO_FORMATTER_TYPE = "session2.ScribMessageFormatter"; public static final String GO_SCRIB_LISTENER_TYPE = "transport2.ScribListener"; public static final String GO_SCRIB_BINARY_CHAN_TYPE = "transport2.BinChannel"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index c20f04f4a..29d5c6d66 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -51,7 +51,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "[\"" + peer.getName() + "\"]";*/ // Duplicated from RPCoreSTReceiveActionBuilder - Function f = extName -> + Function makeCaseReceive = extName -> "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK: [] // N.B. *arg0 matches buildArgs + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval @@ -72,7 +72,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat throw new RuntimeException("[rp-core] [-param-api] TODO: " + a); } - res += f.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); + res += makeCaseReceive.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); } } else //if (a.mid.isMessageSigName()) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index b0b44a242..c2edcd13b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -88,13 +88,14 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + " i <= " + rpapi.generateIndexExpr(d.end) + "; i++ {\n"; // For payloads -- FIXME: currently hardcoded for exactly one payload - Function f = extName -> - "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? + Function makeReceiveExtName = extName -> + //"var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? + "var tmp " + RPCoreSTApiGenConstants.GO_SCRIBMESSAGE_TYPE + "\n" // var tmp needed for deserialization -- FIXME? //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? + "if err = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &tmp)" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", i, &tmp)" + "; err != nil {\n" //+ "log.Fatal(err)\n" @@ -125,12 +126,12 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "}\n"; } - res += f.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); + res += makeReceiveExtName.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); } } else //if (a.mid.isMessageSigName()) { - res += f.apply(rpapi.getExtName((MessageSigName) a.mid)); + res += makeReceiveExtName.apply(rpapi.getExtName((MessageSigName) a.mid)); } res += "}\n"; From bea4265474320a7bfacecd3757808d01de53ea49 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 8 May 2018 18:00:16 +0100 Subject: [PATCH 280/433] [rp-core] Continued updating error handling (message-sig branching). --- .../core/codegen/statetype3/RPCoreSTBranchActionBuilder.java | 5 +++-- .../core/codegen/statetype3/RPCoreSTCaseActionBuilder.java | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index b6b323809..b6a79d7a0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -52,7 +52,7 @@ public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { - RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + //RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; List as = curr.getAllActions(); if (!as.stream().allMatch(x -> x.mid.isOp()) && !as.stream().allMatch(x -> x.mid.isMessageSigName())) @@ -106,7 +106,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." //+ RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" + "&msg" + ")"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", 1, &msg" + ")" + "; err != nil {\n" - + "log.Fatal(err)\n" + //+ "log.Fatal(err)\n" + + "panic(err)\n" // FIXME: which case object to return for error? make "default" error case object? + "}\n"; res += "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index 29d5c6d66..104700ed8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -58,7 +58,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(&tmp)"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", 1, &tmp)" + "; err != nil {\n" - + "log.Fatal(err)\n" + //+ "log.Fatal(err)\n" + + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + "}\n" + "*arg0 = tmp.(" + extName + ")\n"; // N.B. *arg0 matches buildArgs From d5622c1e2e56fae3b437eb8c6a2250676509adde Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 9 May 2018 13:20:03 +0100 Subject: [PATCH 281/433] [rp-core] Fixed bug in receive action API gen for message-sigs. --- .../RPCoreSTBranchActionBuilder.java | 3 ++ .../statetype3/RPCoreSTCaseBuilder.java | 2 +- .../RPCoreSTReceiveActionBuilder.java | 43 ++++++++++++------- .../RPCoreSTStateChanApiBuilder.java | 3 ++ 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index b6a79d7a0..03cecf9be 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -24,6 +24,9 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + buildArgs(null, a) + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: return type is interface, so no need for *return (unlike other state chans) + + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" + + "panic(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ")\n" + + "}\n" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + buildBody(api, curr, a, succ) + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java index 6f6c56a25..72a78eb37 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -56,7 +56,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) getOpTypeName(api, s, a.mid) : rpapi.getExtName((MessageSigName) a.mid); res += "\ntype " + getOpTypeName(api, s, a.mid) + " struct {\n" - + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" // FIXME: never set -- branch action won't return an actual case object upon error + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(null, rpapi.variant) + "\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + (a.mid.isMessageSigName() ? "msg *" + extName + "\n" : "") diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index c2edcd13b..2b1def3cf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -88,21 +88,6 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + " i <= " + rpapi.generateIndexExpr(d.end) + "; i++ {\n"; // For payloads -- FIXME: currently hardcoded for exactly one payload - Function makeReceiveExtName = extName -> - //"var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? - "var tmp " + RPCoreSTApiGenConstants.GO_SCRIBMESSAGE_TYPE + "\n" // var tmp needed for deserialization -- FIXME? - //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? - + "if err = " + sEpRecv /*+ "[i]" // FIXME: use peer interval - + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" - + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", i, &tmp)" - - + "; err != nil {\n" - //+ "log.Fatal(err)\n" - + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? - + "}\n" - //+ "arg0[i-" + start + "] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder - + "arg0[i-" + start + "] = tmp.(" + extName + ")\n"; // FIXME: gob pointer decoding seems flattened? ("*" dropped) if (a.mid.isOp()) { @@ -126,11 +111,37 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "}\n"; } - res += makeReceiveExtName.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); + Function makeReceiveType = extName -> + "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? + //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? + + "if err = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &tmp)" + + + "; err != nil {\n" + //+ "log.Fatal(err)\n" + + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + + "}\n" + //+ "arg0[i-" + start + "] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder + + "arg0[i-" + start + "] = tmp.(" + extName + ")\n"; // FIXME: gob pointer decoding seems flattened? ("*" dropped) + res += makeReceiveType.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); } } else //if (a.mid.isMessageSigName()) { + Function makeReceiveExtName = extName -> + "var tmp " + RPCoreSTApiGenConstants.GO_SCRIBMESSAGE_TYPE + "\n" // var tmp needed for deserialization -- FIXME? + + "if err = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", i, &tmp)" + + + "; err != nil {\n" + //+ "log.Fatal(err)\n" + + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + + "}\n" + //+ "arg0[i-" + start + "] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder + + "arg0[i-" + start + "] = tmp.(" + extName + ")\n"; // FIXME: gob pointer decoding seems flattened? ("*" dropped) res += makeReceiveExtName.apply(rpapi.getExtName((MessageSigName) a.mid)); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index f5551c0b4..cef18d9ed 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -339,9 +339,12 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) + ") *" //+ ab.getReturnType(this, curr, succ) + getSuccStateChanName(succ) + " {\n" + + // FIXME: currently redundant for case objects (cf. branch action err handling) + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" + "panic(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ")\n" + "}\n" + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + "var " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + " error\n" From d7203d7d13b8e88cb9feeb13d54e3ef35f959dd6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 9 May 2018 18:20:35 +0100 Subject: [PATCH 282/433] [rp-core] Adding family inference. --- .../java/org/scribble/util/ScribUtil.java | 18 ++ .../ext/go/core/ast/global/RPCoreGChoice.java | 2 +- .../ext/go/core/cli/RPCoreCommandLine.java | 179 +++++++++++------- .../scribble/ext/go/core/type/RPInterval.java | 4 +- .../ext/go/core/type/RPRoleVariant.java | 6 +- 5 files changed, 138 insertions(+), 71 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/util/ScribUtil.java b/scribble-core/src/main/java/org/scribble/util/ScribUtil.java index ba0ed752b..9d74434d4 100644 --- a/scribble-core/src/main/java/org/scribble/util/ScribUtil.java +++ b/scribble-core/src/main/java/org/scribble/util/ScribUtil.java @@ -19,9 +19,12 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.Callable; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.AstFactory; import org.scribble.ast.ScribNode; @@ -121,4 +124,19 @@ public static void writeToFile(String path, String text) throws ScribbleExceptio throw new ScribbleException(e); } } + + public static Set> makePowerSet(Set ts) + { + Set> pset = new HashSet<>(); + for (T t : ts) + { + Set curr = Stream.of(t).collect(Collectors.toSet()); + Set> tmp = pset.stream() + .map(x -> Stream.concat(x.stream(), Stream.of(t)).collect(Collectors.toSet())) + .collect(Collectors.toSet()); + pset.add(curr); + pset.addAll(tmp); // tmp.equals(curr) for first t + } + return pset; + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index febbe1e08..406b8d990 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -67,7 +67,7 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) RPInterval srcRange = this.src.getParsedRange(); RPInterval destRange = this.dest.getParsedRange(); - Set vars = Stream.of(srcRange, destRange).flatMap(r -> r.getVars().stream()).collect(Collectors.toSet()); + Set vars = Stream.of(srcRange, destRange).flatMap(r -> r.getIndexVars().stream()).collect(Collectors.toSet()); /*// CHECKME: is range size>0 already ensured by syntax? Function foo1 = r -> diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 574ef3f22..f034b0287 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -5,13 +5,14 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.Module; import org.scribble.ast.global.GProtocolDecl; @@ -48,6 +49,7 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; import org.scribble.util.ScribParserException; +import org.scribble.util.ScribUtil; // N.B. this is the CL for both -goapi and rp-core extensions public class RPCoreCommandLine extends CommandLine @@ -238,15 +240,15 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws //Map>> Map> - protoRoles = getProtoRoles(job, gt); + variants = getVariants(job, gt); - job.debugPrintln("\n[rp-core] Computed roles: " + protoRoles); + job.debugPrintln("\n[rp-core] Computed roles: " + variants); this.L0 = new HashMap<>(); for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? { //for (Set ranges : protoRoles.get(r)) - for (RPRoleVariant ranges : protoRoles.get(r)) + for (RPRoleVariant ranges : variants.get(r)) { //ParamCoreLType lt = gt.project(af, r, ranges); RPCoreLType lt = gt.project(af, ranges); @@ -327,15 +329,63 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws //((ParamJob) job).runF17ProjectionPasses(); // projections not built on demand; cf. models //return gt; + + getFamilies(job); } // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? //..HERE FIXME ActualParam -- ParamRange is now already a Set + private Set> getFamilies(GoJob job) + { + job.debugPrintln("\n[rp-core] Computing families:"); + + Set> fams = new HashSet<>(); + + Set all = this.L0.values().stream() + .flatMap(m -> m.keySet().stream()).collect(Collectors.toSet()); + Set vars = all.stream() + .flatMap(v -> v.getIndexVars().stream()).collect(Collectors.toSet()); + Set> pset = ScribUtil.makePowerSet(all).stream() + .filter(x -> x.size() >= 2).collect(Collectors.toSet()); + + int size = pset.size(); + int i = 1; + for (Set cand : pset) + { + Set coset = all.stream() + .filter(x -> !cand.contains(x)).collect(Collectors.toSet()); + + String smt2 = "(assert "; + smt2 += "(exists (" + vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" ")) + ")\n"; // FIXME: factor up -- and factor out with getVariants + smt2 += "(and\n"; + smt2 += "(and " + cand.stream() + .map(v -> makePhiSmt2(v.intervals, v.cointervals)).collect(Collectors.joining(" ")) + ")\n"; + smt2 += (coset.size() > 0) + ? "(and " + coset.stream() + .map(v -> "(not " + makePhiSmt2(v.intervals, v.cointervals) + ")").collect(Collectors.joining(" ")) + ")\n" + : ""; + smt2 += ")))"; + + job.debugPrintln("\n[rp-core] Candidate (" + i++ + "/" + size + "): " + cand); + job.debugPrintln("[rp-core] Co-set: " + coset); + job.debugPrintln("[rp-core] Running Z3 on:\n" + smt2); + + boolean isSat = Z3Wrapper.checkSat(job, this.gpd, smt2); + if (isSat) + { + //variants.get(r).add(new RPRoleVariant(r.toString(), cand, coset)); + } + job.debugPrintln("[rp-core] Checked sat: " + isSat); + } + + return fams; + } + private //Map>> Map> - getProtoRoles(GoJob job, RPCoreGType gt) + getVariants(GoJob job, RPCoreGType gt) { Set prs = gt.getIndexedRoles(); @@ -348,32 +398,17 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws Map>> powersets = map.keySet().stream().collect(Collectors.toMap(k -> k, k -> new HashSet<>())); for (Role n : map.keySet()) { - Set> tmp = powersets.get(n); - Set todo = new HashSet<>(map.get(n)); - while (!todo.isEmpty()) + Set tmp = map.get(n); + Optional foo = tmp.stream().filter(x -> x.intervals.size() > 1).findAny(); + if (foo.isPresent()) { - Iterator i = todo.iterator(); - RPIndexedRole next = i.next(); - i.remove(); - Set range = new HashSet<>(); - //range.add(next.range); - range.add(next.intervals.iterator().next()); - if (!tmp.contains(next)) - { - tmp.addAll(tmp.stream().map(t -> - { - Set ggg = new HashSet<>(); - ggg.addAll(t); - ggg.add(range.iterator().next()); - return ggg; - }).collect(Collectors.toSet())); - tmp.add(range); - } + throw new RuntimeException("[rp-core] TODO: multi-dimension intervals: " + foo.get()); } + powersets.put(n, ScribUtil.makePowerSet(tmp.stream().flatMap(v -> v.intervals.stream()).collect(Collectors.toSet()))); } //Map>> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); - Map> protoRoles = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); + Map> variants = powersets.keySet().stream().collect(Collectors.toMap(x -> x, x -> new HashSet<>())); for (Role r : powersets.keySet()) { Set> powset = powersets.get(r); @@ -384,60 +419,72 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws for (Set cand : powset) { - Set coset = powset.stream().filter(f -> f.stream().noneMatch(g -> cand.contains(g))).flatMap(Collection::stream).collect(Collectors.toSet()); + Set coset = powset.stream() + .filter(f -> f.stream().noneMatch(g -> cand.contains(g))) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); - String z3 = ""; - - if (cand.size() > 0) - { - z3 += cand.stream().map(c -> "(and (>= id " + c.start.toSmt2Formula() + ") (<= id " + c.end.toSmt2Formula() + ")" - + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") - + ")") - .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); - } - - if (coset.size() > 0) + String z3 = makePhiSmt2(cand, coset); + Set vars = Stream.concat( + cand.stream().flatMap(c -> c.getIndexVars().stream()), + coset.stream().flatMap(c -> c.getIndexVars().stream()) + ).collect(Collectors.toSet()); + if (!vars.isEmpty()) { - if (cand.size() > 0) - { - z3 = "(and " + z3 + " "; - } - z3 += coset.stream().map(c -> "(and (not (and (>= id " + c.start.toSmt2Formula() + ") (<= id " + c.end.toSmt2Formula() + ")))" - + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") - + ")") - .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); - if (cand.size() > 0) - { - z3 += ")"; - } - } - - //Set actuals - Set actuals - = cand.stream().flatMap(c -> c.getVars().stream()).collect(Collectors.toSet()); - actuals.addAll(coset.stream().flatMap(c -> c.getVars().stream()).collect(Collectors.toSet())); - //if (!actuals.isEmpty()) - { - z3 = "(exists ((id Int) " - + actuals.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + z3 = "(exists (" + + vars.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + ") " + z3 + ")"; } - - z3 = //"(declare-const id Int)\n - "(assert " + z3 + ")"; + z3 = "(assert " + z3 + ")"; job.debugPrintln("\n[rp-core] Candidate (" + i++ + "/" + size + "): " + cand); job.debugPrintln("[rp-core] Co-set: " + coset); job.debugPrintln("[rp-core] Running Z3 on:\n" + z3); - if (Z3Wrapper.checkSat(job, this.gpd, z3)) + boolean isSat = Z3Wrapper.checkSat(job, this.gpd, z3); + if (isSat) { //protoRoles.get(r).add(cand); - protoRoles.get(r).add(new RPRoleVariant(r.toString(), cand, coset)); + variants.get(r).add(new RPRoleVariant(r.toString(), cand, coset)); } + job.debugPrintln("[rp-core] Checked sat: " + isSat); + } + } + return variants; + } + + // Doesn't include "assert", nor exists-bind index vars + private String makePhiSmt2(Set cand, Set coset) + { + String z3 = ""; + + if (cand.size() > 0) + { + z3 += cand.stream().map(c -> "(and (>= self " + c.start.toSmt2Formula() + ") (<= self " + c.end.toSmt2Formula() + ")" + + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") + + ")") + .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); + } + + if (coset.size() > 0) + { + if (cand.size() > 0) + { + z3 = "(and " + z3 + " "; + } + z3 += coset.stream().map(c -> "(and (not (and (>= self " + c.start.toSmt2Formula() + ") (<= self " + c.end.toSmt2Formula() + ")))" + + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") + + ")") + .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); + if (cand.size() > 0) + { + z3 += ")"; } } - return protoRoles; + + z3 = "(exists ((self Int))" + z3 + ")"; + + return z3; } // FIXME: factor out -- cf. super.doAttemptableOutputTasks diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java index 27008e875..f3cb19fb3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java @@ -23,7 +23,7 @@ public RPInterval(RPIndexExpr start, RPIndexExpr end) } //public Set getActualParams() // Hack - public Set getVars() + public Set getIndexVars() { //return Stream.of(this.start, this.end).filter(p -> !p.isConstant()).collect(Collectors.toSet()); return Stream.of(this.start, this.end).flatMap(p -> p.getVars().stream()).collect(Collectors.toSet()); @@ -32,7 +32,7 @@ public Set getVars() @Override public String toString() { - return "[" + this.start + ((this.start == this.end) ? "" : ".." + this.end) + "]"; + return "[" + this.start + ((this.start == this.end) ? "" : "," + this.end) + "]"; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java index d8e3810c6..62052d490 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java @@ -35,9 +35,11 @@ public Set getIndexVars() @Override public String toString() { - // Duplicated from super to make braces mandatory + // Duplicated from super to make rs1 braces mandatory String rs1 = "{" + this.intervals.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; - String rs2 = "{" + this.cointervals.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; + String rs2 = this.cointervals.isEmpty() + ? "" + : "{" + this.cointervals.stream().map(Object::toString).collect(Collectors.joining(", ")) + "}"; return super.getLastElement() + rs1 + rs2; } From 2ddef2db7d7d6105b6d59bf86ff93f31d3155285 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 9 May 2018 18:28:43 +0100 Subject: [PATCH 283/433] [rp-core] Updating API gen to use families. --- .../scribble/ext/go/core/cli/RPCoreCommandLine.java | 13 ++++++++----- .../codegen/statetype3/RPCoreSTApiGenerator.java | 8 +++++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index f034b0287..85bda2974 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -48,6 +48,7 @@ import org.scribble.model.endpoint.EGraph; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; +import org.scribble.util.Pair; import org.scribble.util.ScribParserException; import org.scribble.util.ScribUtil; @@ -61,6 +62,7 @@ public class RPCoreCommandLine extends CommandLine protected Map> L0; protected Map> E0; //protected ParamCoreSModel model; + protected Set, Set>> families; public RPCoreCommandLine(String... args) throws CommandLineException { @@ -159,7 +161,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co Map goClasses = new ParamCoreSTSessionApiBuilder((GoJob) job, fullname, this.E0).build();*/ //Map actuals = this.E0.get(role); - Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, this.L0, this.E0, impath, role).build(); + Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, this.L0, this.E0, this.families, impath, role).build(); outputClasses(goClasses); } } @@ -330,18 +332,19 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws //return gt; - getFamilies(job); + this.families = new HashSet<>(); + this.families.addAll(getFamilies(job)); } // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? //..HERE FIXME ActualParam -- ParamRange is now already a Set - private Set> getFamilies(GoJob job) + private Set, Set>> getFamilies(GoJob job) { job.debugPrintln("\n[rp-core] Computing families:"); - Set> fams = new HashSet<>(); + Set, Set>> fams = new HashSet<>(); Set all = this.L0.values().stream() .flatMap(m -> m.keySet().stream()).collect(Collectors.toSet()); @@ -375,7 +378,7 @@ private Set> getFamilies(GoJob job) boolean isSat = Z3Wrapper.checkSat(job, this.gpd, smt2); if (isSat) { - //variants.get(r).add(new RPRoleVariant(r.toString(), cand, coset)); + fams.add(new Pair<>(cand, coset)); } job.debugPrintln("[rp-core] Checked sat: " + isSat); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 05f0b54e7..90d08c7fd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -2,8 +2,10 @@ import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.stream.Collectors; import org.scribble.ast.Module; @@ -21,6 +23,7 @@ import org.scribble.type.name.GProtocolName; import org.scribble.type.name.MessageId; import org.scribble.type.name.Role; +import org.scribble.util.Pair; import org.scribble.visit.util.MessageIdCollector; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTEndpointApiGenerator @@ -32,6 +35,7 @@ public class RPCoreSTApiGenerator // FIXME: factor out an RPCoreJob(Context) public final Map> projections; public final Map> variants; + protected Set, Set>> families; public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module public final Role self; @@ -39,7 +43,8 @@ public class RPCoreSTApiGenerator // FIXME: any way to separate Session API (Protocol) from Endpoint/StateChan APIs? public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> projections, - Map> variants, String packpath, Role self) + Map> variants, Set, Set>> families, + String packpath, Role self) { this.job = job; this.proto = fullname; @@ -53,6 +58,7 @@ public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map e.getKey(), e -> Collections.unmodifiableMap(e.getValue()) ))); + this.families = new HashSet<>(families); this.packpath = packpath; this.self = self; } From 42ae597b1131587a33b774db244abab15d810bb7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 9 May 2018 21:21:54 +0100 Subject: [PATCH 284/433] [rp-core] Intermediate change to Session API gen w.r.t. CL role args. --- .../ext/go/core/cli/RPCoreCommandLine.java | 29 ++++++++-- .../statetype3/RPCoreSTApiGenerator.java | 57 +++++++++++++++---- .../statetype3/RPCoreSTSessionApiBuilder.java | 6 +- .../RPCoreSTStateChanApiBuilder.java | 4 +- 4 files changed, 75 insertions(+), 21 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 85bda2974..0c203e604 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -143,13 +144,26 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co if (this.rpArgs.containsKey(RPCoreCLArgFlag.RPCORE_API_GEN)) { JobContext jcontext = job.getContext(); + String simpname = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_PARAM)[0]; + GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); + String impath = null; String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_API_GEN); + List roles = new LinkedList<>(); for (int i = 0; i < args.length; i += 2) { - String simpname = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_PARAM)[0]; - GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); + if (impath == null) + { + impath = args[i+1]; + } + else + { + if (!impath.equals(args[i+1])) + { + throw new RuntimeException("[rp-core] Inconsistent Go API generation import paths: " + impath + ", " + args[i+1]); + } + } Role role = checkRoleArg(jcontext, fullname, args[i]); - String impath = args[i+1]; + roles.add(role); /*for (ParamActualRole ranges : this.P0.get(role).keySet()) { EGraph efsm = this.E0.get(role).get(ranges); @@ -159,11 +173,14 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co /*job.debugPrintln("\n[rp-core] Running " + ParamCoreSTSessionApiBuilder.class + " for " + fullname); - Map goClasses = new ParamCoreSTSessionApiBuilder((GoJob) job, fullname, this.E0).build();*/ + /*Map goClasses = new ParamCoreSTSessionApiBuilder((GoJob) job, fullname, this.E0).build();* / //Map actuals = this.E0.get(role); Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, this.L0, this.E0, this.families, impath, role).build(); - outputClasses(goClasses); + outputClasses(goClasses);*/ } + + Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, this.L0, this.E0, this.families, impath, roles).build(); + outputClasses(goClasses); } else { @@ -378,7 +395,7 @@ private Set, Set>> getFamilies(GoJob job) boolean isSat = Z3Wrapper.checkSat(job, this.gpd, smt2); if (isSat) { - fams.add(new Pair<>(cand, coset)); + fams.add(new Pair<>(Collections.unmodifiableSet(cand), Collections.unmodifiableSet(coset))); } job.debugPrintln("[rp-core] Checked sat: " + isSat); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 90d08c7fd..8bc4aa752 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -2,7 +2,7 @@ import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -35,16 +35,19 @@ public class RPCoreSTApiGenerator // FIXME: factor out an RPCoreJob(Context) public final Map> projections; public final Map> variants; - protected Set, Set>> families; + //public final Map, Set>>> families; + public final Map, Set>, Integer> families; public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module - public final Role self; + //public final Role self; + public final List selfs; // FIXME? just a role name -- cf. CL arg // FIXME: any way to separate Session API (Protocol) from Endpoint/StateChan APIs? public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> projections, Map> variants, Set, Set>> families, - String packpath, Role self) + String packpath, //Role self) + List selfs) { this.job = job; this.proto = fullname; @@ -58,9 +61,35 @@ public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map e.getKey(), e -> Collections.unmodifiableMap(e.getValue()) ))); - this.families = new HashSet<>(families); + + /*Map, Set>>> fs = new HashMap<>(); + for (Pair, Set> f : families) + { + for (RPRoleVariant v : f.left) + { + Set, Set>> tmp2 = fs.get(v); + if (tmp2 == null) + { + tmp2 = new HashSet<>(); + fs.put(v, tmp2); + } + tmp2.add(f); + } + } + this.families = Collections.unmodifiableMap( + fs.entrySet().stream().collect(Collectors.toMap( + e -> e.getKey(), + e -> Collections.unmodifiableSet(e.getValue()) + )));*/ + int[] i = { 1 }; + this.families = Collections.unmodifiableMap(families.stream().collect(Collectors.toMap( + f -> f, + f -> i[0]++) + )); + this.packpath = packpath; - this.self = self; + //this.self = self; + this.selfs = Collections.unmodifiableList(selfs); } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later @@ -105,11 +134,15 @@ public Map build() throws ScribbleException } } + // Build Session API (Protocol and Endpoint types) and State Channel API Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); - for (Entry variant : this.variants.get(this.self).entrySet()) + for (Role self : this.selfs) { - res.putAll(buildStateChannelApi(variant.getKey(), variant.getValue())); + for (Entry variant : this.variants.get(self).entrySet()) + { + res.putAll(buildStateChannelApi(variant.getKey(), variant.getValue())); + } } return res; } @@ -117,14 +150,14 @@ public Map build() throws ScribbleException //@Override public Map buildSessionApi() // FIXME: factor out { - this.job.debugPrintln("\n[rp-core] Running " + RPCoreSTSessionApiBuilder.class + " for " + this.proto + "@" + this.self); + this.job.debugPrintln("\n[rp-core] Running " + RPCoreSTSessionApiBuilder.class + " for " + this.proto + "@" + this.selfs); return new RPCoreSTSessionApiBuilder(this).build(); } - public Map buildStateChannelApi(RPRoleVariant actual, EGraph graph) // FIXME: factor out + public Map buildStateChannelApi(RPRoleVariant variant, EGraph graph) // FIXME: factor out { - this.job.debugPrintln("\n[rp-core] Running " + RPCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + this.self); - return new RPCoreSTStateChanApiBuilder(this, actual, graph).build(); + this.job.debugPrintln("\n[rp-core] Running " + RPCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + variant); + return new RPCoreSTStateChanApiBuilder(this, variant, graph).build(); } //@Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 9f7dadba0..cc1804118 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -51,7 +51,8 @@ public Map build() // FIXME: factor out private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map res) { GProtocolName simpname = this.apigen.proto.getSimpleName(); - List rolenames = gpd.header.roledecls.getRoles(); + List rolenames = //gpd.header.roledecls.getRoles(); + this.apigen.selfs; // roles String protoFile = @@ -133,7 +134,8 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map gpd, String basedir, Map res) { GProtocolName simpname = this.apigen.proto.getSimpleName(); - List roles = gpd.header.roledecls.getRoles(); + List roles = //gpd.header.roledecls.getRoles(); + this.apigen.selfs; String epkindImports = "\n" // Package decl done later (per variant) + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index cef18d9ed..a26d0e16e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -63,7 +63,9 @@ private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant v // HACK FIXME -- make a "nested builder" -- problem is final this.graph // FIXME: probably easier to to make a "nested" constructor { - super(apigen.job, apigen.proto, apigen.self, graph, + super(apigen.job, apigen.proto, //apigen.self, + variant.getName(), + graph, new RPCoreSTOutputStateBuilder(new RPCoreSTSplitActionBuilder(), new RPCoreSTSendActionBuilder()), new RPCoreSTReceiveStateBuilder(new RPCoreSTReduceActionBuilder(), new RPCoreSTReceiveActionBuilder()), From b20647866b4ac0dc532628626da2174f9340670b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 9 May 2018 22:17:00 +0100 Subject: [PATCH 285/433] [rp-core] Continued updating API gen for families. --- .../ext/go/core/cli/RPCoreCLArgParser.java | 21 +- .../ext/go/core/cli/RPCoreCommandLine.java | 15 +- .../statetype3/RPCoreSTApiGenerator.java | 20 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 265 ++++++++++-------- .../RPCoreSTStateChanApiBuilder.java | 15 +- 5 files changed, 188 insertions(+), 148 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java index 506e9e680..21f19c16c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java @@ -67,14 +67,14 @@ protected int parseFlag(int i) throws CommandLineException switch (flag) { // Unique flags - case RPCoreCLArgParser.RPCORE_PARAM_FLAG: return rpParseParam(i); + case RPCoreCLArgParser.RPCORE_PARAM_FLAG: return rpParsePackagePathAndParam(i); case RPCoreCLArgParser.RPCORE_SELECT_BRANCH_FLAG: return rpParseSelectBranch(i); case RPCoreCLArgParser.RPCORE_NOCOPY_FLAG: return rpParseNoCopy(i); // Non-unique flags case RPCoreCLArgParser.RPCORE_EFSM_FLAG: return rpParseRoleArg(flag, i); case RPCoreCLArgParser.RPCORE_EFSM_PNG_FLAG: return rpParseRoleAndFileArgs(flag, i); - case RPCoreCLArgParser.RPCORE_API_GEN_FLAG: return rpParsePackagePathAndRoleArgs(flag, i); + case RPCoreCLArgParser.RPCORE_API_GEN_FLAG: return rpParseRoleArg(flag, i); // Base CL default: @@ -84,14 +84,15 @@ protected int parseFlag(int i) throws CommandLineException } } - private int rpParseParam(int i) throws CommandLineException + private int rpParsePackagePathAndParam(int i) throws CommandLineException { - if ((i + 1) >= this.args.length) + if ((i + 2) >= this.args.length) { - throw new CommandLineException("Missing simple global protocol name argument."); + throw new CommandLineException("Missing simple global protocol name and/or Go API package path arguments."); } String proto = this.args[++i]; - rpCheckAndAddUniqueFlag(RPCoreCLArgParser.RPCORE_PARAM_FLAG, new String[] { proto }); + String packpath = this.args[++i]; + rpCheckAndAddUniqueFlag(RPCoreCLArgParser.RPCORE_PARAM_FLAG, new String[] { proto, packpath }); return i; } @@ -129,7 +130,7 @@ private int rpParseRoleArg(String f, int i) throws CommandLineException return i; } - protected int rpParseRoleAndFileArgs(String f, int i) throws CommandLineException + private int rpParseRoleAndFileArgs(String f, int i) throws CommandLineException { RPCoreCLArgFlag flag = RPCoreCLArgParser.RPCORE_NON_UNIQUE_FLAGS.get(f); if ((i + 2) >= this.args.length) @@ -142,8 +143,8 @@ protected int rpParseRoleAndFileArgs(String f, int i) throws CommandLineExceptio return i; } - // path is absolute package path prefix for API imports - protected int rpParsePackagePathAndRoleArgs(String f, int i) throws CommandLineException + /*// path is absolute package path prefix for API imports + private int rpParsePackagePathAndRoleArgs(String f, int i) throws CommandLineException { RPCoreCLArgFlag flag = RPCoreCLArgParser.RPCORE_NON_UNIQUE_FLAGS.get(f); if ((i + 2) >= this.args.length) @@ -154,7 +155,7 @@ protected int rpParsePackagePathAndRoleArgs(String f, int i) throws CommandLineE String role = this.args[++i]; goConcatArgs(flag, role, path); return i; - } + }*/ /*// FIXME: factor out with core arg parser -- issue is GoCLArgFlag is currently an unlreated type to CLArgFlag private int goParseProtoAndRoleArgs(String f, int i) throws CommandLineException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 0c203e604..e34fc70d8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -146,22 +146,11 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co JobContext jcontext = job.getContext(); String simpname = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_PARAM)[0]; GProtocolName fullname = checkGlobalProtocolArg(jcontext, simpname); - String impath = null; + String impath = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_PARAM)[1]; String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_API_GEN); List roles = new LinkedList<>(); - for (int i = 0; i < args.length; i += 2) + for (int i = 0; i < args.length; i += 1) { - if (impath == null) - { - impath = args[i+1]; - } - else - { - if (!impath.equals(args[i+1])) - { - throw new RuntimeException("[rp-core] Inconsistent Go API generation import paths: " + impath + ", " + args[i+1]); - } - } Role role = checkRoleArg(jcontext, fullname, args[i]); roles.add(role); /*for (ParamActualRole ranges : this.P0.get(role).keySet()) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 8bc4aa752..cd6275465 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -139,9 +139,15 @@ public Map build() throws ScribbleException res.putAll(buildSessionApi()); for (Role self : this.selfs) { - for (Entry variant : this.variants.get(self).entrySet()) + for (Entry e : this.variants.get(self).entrySet()) { - res.putAll(buildStateChannelApi(variant.getKey(), variant.getValue())); + RPRoleVariant variant = e.getKey(); + for (Pair, Set> family : + (Iterable, Set>>) + this.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) + { + res.putAll(buildStateChannelApi(family, variant, e.getValue())); + } } } return res; @@ -154,10 +160,11 @@ public Map buildSessionApi() // FIXME: factor out return new RPCoreSTSessionApiBuilder(this).build(); } - public Map buildStateChannelApi(RPRoleVariant variant, EGraph graph) // FIXME: factor out + public Map buildStateChannelApi( + Pair, Set> family, RPRoleVariant variant, EGraph graph) // FIXME: factor out { this.job.debugPrintln("\n[rp-core] Running " + RPCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + variant); - return new RPCoreSTStateChanApiBuilder(this, variant, graph).build(); + return new RPCoreSTStateChanApiBuilder(this, family, variant, graph).build(); } //@Override @@ -171,6 +178,11 @@ public String getApiRootPackageName() // Derives only from proto name return "package " + getApiRootPackageName(); }*/ + public String getFamilyPackageName(Pair, Set> family) + { + return "family_" + this.families.get(family); + } + public static String getEndpointKindPackageName(RPRoleVariant variant) { return getGeneratedRoleVariantName(variant); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index cc1804118..aeb216537 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -15,6 +15,7 @@ import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; +import org.scribble.util.Pair; // RP Session API = Protocol API + Endpoint Kind APIs // Cf. STStateChanApiBuilder @@ -67,8 +68,19 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map { String epkindPackName = RPCoreSTApiGenerator.getEndpointKindPackageName(v); - return "import _" + epkindPackName // FIXME: alias now redundant - + " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() + "/" + epkindPackName + "\"\n"; + + return + this.apigen.families.keySet().stream().filter(f -> f.left.contains(v)).map(f -> + { + + return "import " + this.apigen.getFamilyPackageName(f) + "_" + epkindPackName + + " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() + + "/" + this.apigen.getFamilyPackageName(f) + + "/" + epkindPackName + "\"\n"; + + }).collect(Collectors.joining("")); + + }).collect(Collectors.joining("")); }).collect(Collectors.joining("")) ); @@ -93,6 +105,10 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map, Set> family : + (Iterable, Set>>) + this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial + { /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); try { @@ -111,20 +127,27 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map v + " int, ").collect(Collectors.joining("")) + "self int" + ")" - + " *_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) + "." + epkindTypeName + " {\n" + + " *" + + this.apigen.getFamilyPackageName(family) + "_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) // FIXME: factor out (and separate type name from package name) + + "." + epkindTypeName + + " {\n" /*+ "params := make(map[string]int)\n" //+ decls.iterator().next().params + ivars .stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining(""))*/ - + "return _" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + ".New" + "(p" //", params" + + "return " + + this.apigen.getFamilyPackageName(family) + "_" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) // FIXME: factor out + + ".New" + "(p" //", params" + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + ", self)\n" + "}\n"; protoFile += "\n" + tmp; } + } } res.put(basedir + simpname + ".go", protoFile); @@ -146,124 +169,132 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< { for (RPRoleVariant variant : this.apigen.variants.get(rname).keySet()) { - /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); - try - { - gpd.accept(coll); // FIXME: should be lpd -- not currently used due to using RPCoreType - } - catch (ScribbleException e) - { - throw new RuntimeException("[rp-core] Shouldn't get in here: ", e); - } - List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList());*/ + for (Pair, Set> family : + (Iterable, Set>>) + this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial + { + /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); + try + { + gpd.accept(coll); // FIXME: should be lpd -- not currently used due to using RPCoreType + } + catch (ScribbleException e) + { + throw new RuntimeException("[rp-core] Shouldn't get in here: ", e); + } + List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList());*/ - List ivars = this.apigen.projections.get(rname).get(variant) - .getIndexVars().stream().sorted(IVAR_COMP).collect(Collectors.toList()); // N.B., params only from action subjects (not self) - ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) - String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); - - String epkindFile = epkindImports + "\n" - - // Endpoint Kind type - + "type " + epkindTypeName + " struct {\n" - + RPCoreSTApiGenConstants.GO_MPCHAN_PROTO + " " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + "\n" - + "Self int\n" - + "*" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" - + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + " *" + RPCoreSTApiGenConstants.GO_MPCHAN_TYPE + "\n" - + ivars.stream().map(x -> x + " int\n").collect(Collectors.joining("")) - + "Params map[string]int\n" - + "}\n" + List ivars = this.apigen.projections.get(rname).get(variant) + .getIndexVars().stream().sorted(IVAR_COMP).collect(Collectors.toList()); // N.B., params only from action subjects (not self) + ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); + + String epkindFile = epkindImports + "\n" + + // Endpoint Kind type + + "type " + epkindTypeName + " struct {\n" + + RPCoreSTApiGenConstants.GO_MPCHAN_PROTO + " " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + "\n" + + "Self int\n" + + "*" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + " *" + RPCoreSTApiGenConstants.GO_MPCHAN_TYPE + "\n" + + ivars.stream().map(x -> x + " int\n").collect(Collectors.joining("")) + + "Params map[string]int\n" + + "}\n" - // Endpoint Kind type constructor -- makes connection maps - + "\n" - + "func New(p " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + ", " //+"params map[string]int," - + ivars.stream().map(x -> x + " int, ").collect(Collectors.joining("")) - + "self int) *" + epkindTypeName + " {\n" - /*+ "conns := make(map[string]map[int]transport.Channel)\n" - + this.apigen.variants.entrySet().stream() - .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + "make(map[int]transport.Channel)\n") - .collect(Collectors.joining(""))*/ - + "return &" + epkindTypeName + "{p, self, &" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE - + "{}, " + RPCoreSTApiGenConstants.GO_MPCHAN_CONSTRUCTOR + "(self, "//conns)" //"params - + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "})" - + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + ", " - + "make(map[string]int)" - + "}\n" - + "}\n"; + // Endpoint Kind type constructor -- makes connection maps + + "\n" + + "func New(p " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + ", " //+"params map[string]int," + + ivars.stream().map(x -> x + " int, ").collect(Collectors.joining("")) + + "self int) *" + epkindTypeName + " {\n" + /*+ "conns := make(map[string]map[int]transport.Channel)\n" + + this.apigen.variants.entrySet().stream() + .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + "make(map[int]transport.Channel)\n") + .collect(Collectors.joining(""))*/ + + "return &" + epkindTypeName + "{p, self, &" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + + "{}, " + RPCoreSTApiGenConstants.GO_MPCHAN_CONSTRUCTOR + "(self, "//conns)" //"params + + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "})" + + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + ", " + + "make(map[string]int)" + + "}\n" + + "}\n"; - // Dial/Accept methdos -- FIXME: internalise peers - /*+ "\n" - + "func (ini *" + epkindTypeName + ") Accept(rolename string, id int, acc transport.Transport) error {\n" - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." - + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = acc.Accept()\n" - + "return nil\n" // FIXME: runtime currently does log.Fatal on error - + "}\n" - + "\n" - + "func (ini *" + epkindTypeName + ") Dial(rolename string, id int, req transport.Transport) error {\n" - + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." - + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = req.Connect()\n" - + "return nil\n" // FIXME: runtime currently does log.Fatal on error - + "}\n";*/ - for (RPRoleVariant v : (Iterable) - this.apigen.variants.values().stream() - .flatMap(m -> m.keySet().stream())::iterator) - { - if (!v.equals(variant)) // FIXME: endpoint families -- and id value checks + // Dial/Accept methdos -- FIXME: internalise peers + /*+ "\n" + + "func (ini *" + epkindTypeName + ") Accept(rolename string, id int, acc transport.Transport) error {\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = acc.Accept()\n" + + "return nil\n" // FIXME: runtime currently does log.Fatal on error + + "}\n" + + "\n" + + "func (ini *" + epkindTypeName + ") Dial(rolename string, id int, req transport.Transport) error {\n" + + "ini." + RPCoreSTApiGenConstants.GO_ENDPOINT_ENDPOINT + "." + + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = req.Connect()\n" + + "return nil\n" // FIXME: runtime currently does log.Fatal on error + + "}\n";*/ + for (RPRoleVariant v : (Iterable) + this.apigen.variants.values().stream() + .flatMap(m -> m.keySet().stream())::iterator) { - String r = v.getLastElement(); - String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(v); - epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int" - + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE - + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" - + "c, err := ss.Accept()\n" - + "sfmt.Wrap(c)\n" - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" - + "return err\n" // FIXME: runtime currently does log.Fatal on error - + "}\n" - + "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id int" - + ", host string, port int" - + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" - + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" - + "c, err := dialler(host, port)\n" - + "sfmt.Wrap(c)\n" - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept - + "return err\n" // FIXME: runtime currently does log.Fatal on error - + "}\n"; + if (!v.equals(variant)) // FIXME: endpoint families -- and id value checks + { + String r = v.getLastElement(); + String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(v); + epkindFile += "\n" + + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int" + + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE + + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + "c, err := ss.Accept()\n" + + "sfmt.Wrap(c)\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" + + "return err\n" // FIXME: runtime currently does log.Fatal on error + + "}\n" + + "\n" + + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id int" + + ", host string, port int" + + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" + + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + "c, err := dialler(host, port)\n" + + "sfmt.Wrap(c)\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept + + "return err\n" // FIXME: runtime currently does log.Fatal on error + + "}\n"; + } } - } - - // Top-level Run method // FIXME: add session completion check - /*EGraph g = this.apigen.variants.get(variant.getName()).get(variant); - //String endName = g.init.isTerminal() ? "Init" : "End"; // FIXME: factor out -- cf. RPCoreSTStateChanApiBuilder#makeSTStateName( - EState term = MState.getTerminal(g.init); - String endName = (g.init.id == term.id ? "Init" : "End") + ((term != null && ((RPCoreEState) term).hasNested()) ? "_" + term.id : "");*/ - String endName = "End"; - String init = "Init_" + this.apigen.variants.get(variant.getName()).get(variant).init; - epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") Run(f func(*" + init + ") " + endName + ") *" + endName + " {\n" // f specifies non-pointer End - + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".Close()\n" - + "ini.Use()\n" // FIXME: int-counter linearity - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".CheckConnection()\n" - - // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) - // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) - + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) - ? "end := f(newBranch" + init + "(ini))\n" - : "end := f(&" + init + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + + // Top-level Run method // FIXME: add session completion check + /*EGraph g = this.apigen.variants.get(variant.getName()).get(variant); + //String endName = g.init.isTerminal() ? "Init" : "End"; // FIXME: factor out -- cf. RPCoreSTStateChanApiBuilder#makeSTStateName( + EState term = MState.getTerminal(g.init); + String endName = (g.init.id == term.id ? "Init" : "End") + ((term != null && ((RPCoreEState) term).hasNested()) ? "_" + term.id : "");*/ + String endName = "End"; + String init = "Init_" + this.apigen.variants.get(variant.getName()).get(variant).init; + epkindFile += "\n" + + "func (ini *" + epkindTypeName + ") Run(f func(*" + init + ") " + endName + ") *" + endName + " {\n" // f specifies non-pointer End + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".Close()\n" + + "ini.Use()\n" // FIXME: int-counter linearity + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".CheckConnection()\n" + + // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) + // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) + + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) + ? "end := f(newBranch" + init + "(ini))\n" + : "end := f(&" + init + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse - + "return &end\n" - + "}"; - - res.put(basedir + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "/" + RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant) + ".go", - "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "\n" + epkindFile); + + "return &end\n" + + "}"; + + res.put(basedir + + "/" + this.apigen.getFamilyPackageName(family) + + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + + "/" + RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant) + ".go", + "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "\n" + epkindFile); + } } } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index a26d0e16e..6844be2c7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -35,11 +35,13 @@ import org.scribble.type.name.DataType; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.MessageSigName; +import org.scribble.util.Pair; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder { protected final RPCoreSTApiGenerator apigen; + public final Pair, Set> family; public final RPRoleVariant variant; // variant.getName().equals(this.role) private int counter = 2; // 1 named as Init @@ -53,12 +55,14 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) rp-core class later // Pre: variant.getName().equals(this.role) - public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph) + public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, + Pair, Set> family, RPRoleVariant variant, EGraph graph) { - this(apigen, variant, graph, 2, Collections.emptyMap(), Collections.emptyMap(), Collections.emptySet()); + this(apigen, family, variant, graph, 2, Collections.emptyMap(), Collections.emptyMap(), Collections.emptySet()); } - private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant variant, EGraph graph, + private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, + Pair, Set> family, RPRoleVariant variant, EGraph graph, int counter, Map names, Map imedNames, Set fvars) // HACK FIXME -- make a "nested builder" -- problem is final this.graph // FIXME: probably easier to to make a "nested" constructor @@ -80,6 +84,7 @@ private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, RPRoleVariant v new RPCoreSTEndStateBuilder()); this.apigen = apigen; + this.family = family; this.variant = variant; Module mod = apigen.job.getContext().getModule(this.apigen.proto.getPrefix()); @@ -184,7 +189,8 @@ public Map build() // filepath -> source // FIXME HACK for (EGraph g : this.todo) { - RPCoreSTStateChanApiBuilder nested = new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, g, + RPCoreSTStateChanApiBuilder nested = new RPCoreSTStateChanApiBuilder( + this.apigen, this.family, this.variant, g, this.counter, this.names, this.imedNames, this.fvars); res.putAll(nested.build()); } @@ -200,6 +206,7 @@ public String getFilePath(String filename) filename = "$" + filename.substring(1); } return this.gpn.toString().replaceAll("\\.", "/") + + "/" + this.apigen.getFamilyPackageName(family) + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) // State chans located with Endpoint Kind API + "/" + filename + ".go"; } From 847194c24ca3375107c4dea273f49b875c8a19d2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 13:21:36 +0100 Subject: [PATCH 286/433] [rp-core] Minor. --- .../statetype3/RPCoreSTApiGenerator.java | 2 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 22 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index cd6275465..11e6302f7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -168,7 +168,7 @@ public Map buildStateChannelApi( } //@Override - public String getApiRootPackageName() // Derives only from proto name + public String getApiRootPackageName() // Derives only from simple proto name { return this.proto.getSimpleName().toString(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index aeb216537..ae9f19c66 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -49,6 +49,8 @@ public Map build() // FIXME: factor out return res; } + // basedir is derived from protocol full name, and is used as offset to -d + // -- cf. packpath, "absolute" Go import path (github.com/...) -- would coincide if protocol full name (i.e., module) used "github.com/..." private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map res) { GProtocolName simpname = this.apigen.proto.getSimpleName(); @@ -74,7 +76,8 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map gpd, String basedir, Map gpd, String basedir, Map res) { GProtocolName simpname = this.apigen.proto.getSimpleName(); @@ -237,6 +242,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< { if (!v.equals(variant)) // FIXME: endpoint families -- and id value checks { + // Accept/Dial methods String r = v.getLastElement(); String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(v); epkindFile += "\n" @@ -289,13 +295,21 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< + "return &end\n" + "}"; - res.put(basedir - + "/" + this.apigen.getFamilyPackageName(family) - + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + res.put(getEndpointFilePath(basedir, family, variant) + "/" + RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant) + ".go", "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "\n" + epkindFile); } } } } + + // basedir is derived from protocol full name, and is used as offset to -d + // -- cf. packpath, "absolute" Go import path (github.com/...) -- would coincide if protocol full name (i.e., module) used "github.com/..." + protected String getEndpointFilePath(String basedir, + Pair, Set> family, RPRoleVariant variant) + { + return basedir + + "/" + this.apigen.getFamilyPackageName(family) + + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant); + } } From b650f468f186b9a834b273a646069de320333f7c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 13:53:08 +0100 Subject: [PATCH 287/433] [rp-core] Minor. --- .../statetype/STStateChanApiBuilder.java | 15 ++++---- .../statetype/go/GoSTStateChanApiBuilder.java | 2 +- .../ParamCoreSTStateChanApiBuilder.java | 10 +++--- .../ParamCoreSTStateChanApiBuilder.java | 10 +++--- .../statetype3/RPCoreSTSessionApiBuilder.java | 35 +++++++++++-------- .../RPCoreSTStateChanApiBuilder.java | 20 ++++++----- 6 files changed, 50 insertions(+), 42 deletions(-) diff --git a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java index 388fce37e..a48722701 100644 --- a/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java +++ b/scribble-codegen/src/main/java/org/scribble/codegen/statetype/STStateChanApiBuilder.java @@ -71,17 +71,17 @@ public Map build() // filepath -> source switch (s.getStateKind()) { case ACCEPT: throw new RuntimeException("[TODO]: " + s.getStateKind()); - case OUTPUT: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; + case OUTPUT: api.put(getStateChannelFilePath(getStateChanName(s)), this.ob.build(this, s)); break; case POLY_INPUT: { - api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); - api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out + api.put(getStateChannelFilePath(getStateChanName(s)), this.bb.build(this, s)); + api.put(getStateChannelFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out break; } - case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket + case TERMINAL: api.put(getStateChannelFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket case UNARY_INPUT: { - api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); + api.put(getStateChannelFilePath(getStateChanName(s)), this.rb.build(this, s)); //api.put(getFilePath(getStateChanName(s) + "_Cases"), this.cb.build(this, s)); // FIXME: factor out break; } @@ -91,8 +91,9 @@ public Map build() // filepath -> source } return api; } - - public abstract String getFilePath(String name); + + // Returns path to use as offset to -d + public abstract String getStateChannelFilePath(String name); //public abstract String getPackage(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java index eb48a02bb..4e84dedb2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/codegen/statetype/go/GoSTStateChanApiBuilder.java @@ -44,7 +44,7 @@ protected String makeSTStateName(EState s) } @Override - public String getFilePath(String filename) + public String getStateChannelFilePath(String filename) { if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java index bc9d85d13..27082571a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype/ParamCoreSTStateChanApiBuilder.java @@ -97,7 +97,7 @@ public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) } @Override - public String getFilePath(String filename) + public String getStateChannelFilePath(String filename) { //throw new RuntimeException("[param-core] TODO:"); if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go @@ -239,17 +239,17 @@ public Map build() // filepath -> source { switch (getStateKind(s)) { - case CROSS_SEND: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; + case CROSS_SEND: api.put(getStateChannelFilePath(getStateChanName(s)), this.ob.build(this, s)); break; case CROSS_RECEIVE: { if (s.getActions().size() > 1) { - api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + api.put(getStateChannelFilePath(getStateChanName(s)), this.bb.build(this, s)); //api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out } else { - api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); + api.put(getStateChannelFilePath(getStateChanName(s)), this.rb.build(this, s)); } break; } @@ -265,7 +265,7 @@ public Map build() // filepath -> source { throw new RuntimeException("[param-core] TODO: " + s); } - case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket + case TERMINAL: api.put(getStateChannelFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket default: throw new RuntimeException("[param-core] Shouldn't get in here: " + s); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java index 7c736a41d..5f8f967af 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype2/ParamCoreSTStateChanApiBuilder.java @@ -108,7 +108,7 @@ public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) } @Override - public String getFilePath(String filename) + public String getStateChannelFilePath(String filename) { //throw new RuntimeException("[param-core] TODO:"); if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go @@ -305,17 +305,17 @@ public Map build() // filepath -> source { switch (getStateKind(s)) { - case CROSS_SEND: api.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; + case CROSS_SEND: api.put(getStateChannelFilePath(getStateChanName(s)), this.ob.build(this, s)); break; case CROSS_RECEIVE: { if (s.getActions().size() > 1) { - api.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + api.put(getStateChannelFilePath(getStateChanName(s)), this.bb.build(this, s)); //api.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); // FIXME: factor out } else { - api.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); + api.put(getStateChannelFilePath(getStateChanName(s)), this.rb.build(this, s)); } break; } @@ -331,7 +331,7 @@ public Map build() // filepath -> source { throw new RuntimeException("[param-core] TODO: " + s); } - case TERMINAL: api.put(getFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket + case TERMINAL: api.put(getStateChannelFilePath(getStateChanName(s)), this.eb.build(this, s)); break; // FIXME: without subpackages, all roles share same EndSocket default: throw new RuntimeException("[param-core] Shouldn't get in here: " + s); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index ae9f19c66..2e538c529 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -42,16 +42,13 @@ public Map build() // FIXME: factor out { Module mod = this.apigen.job.getContext().getModule(this.apigen.proto.getPrefix()); ProtocolDecl gpd = mod.getProtocolDecl(this.apigen.proto.getSimpleName()); - String basedir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; // Full name Map res = new HashMap<>(); // filepath -> source - buildProtocolApi(gpd, basedir, res); - buildEndpointKindApi(gpd, basedir, res); + buildProtocolApi(gpd, res); + buildEndpointKindApi(gpd, res); return res; } - // basedir is derived from protocol full name, and is used as offset to -d - // -- cf. packpath, "absolute" Go import path (github.com/...) -- would coincide if protocol full name (i.e., module) used "github.com/..." - private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map res) + private void buildProtocolApi(ProtocolDecl gpd, Map res) { GProtocolName simpname = this.apigen.proto.getSimpleName(); List rolenames = //gpd.header.roledecls.getRoles(); @@ -76,7 +73,7 @@ private void buildProtocolApi(ProtocolDecl gpd, String basedir, Map gpd, String basedir, Map gpd, String basedir, Map res) + private void buildEndpointKindApi(ProtocolDecl gpd, Map res) { GProtocolName simpname = this.apigen.proto.getSimpleName(); List roles = //gpd.header.roledecls.getRoles(); @@ -295,7 +290,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< + "return &end\n" + "}"; - res.put(getEndpointFilePath(basedir, family, variant) + res.put(getEndpointFilePath(family, variant) + "/" + RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant) + ".go", "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "\n" + epkindFile); } @@ -303,11 +298,21 @@ private void buildEndpointKindApi(ProtocolDecl gpd, String basedir, Map< } } - // basedir is derived from protocol full name, and is used as offset to -d + // Returns path to use as offset to -d // -- cf. packpath, "absolute" Go import path (github.com/...) -- would coincide if protocol full name (i.e., module) used "github.com/..." - protected String getEndpointFilePath(String basedir, - Pair, Set> family, RPRoleVariant variant) + // FIXME: factor up to super -- cf. STStateChanApiBuilder#getStateChannelFilePath + public String getProtocolFilePath() { + String basedir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; // Full name + return basedir; + } + + // Returns path to use as offset to -d + // -- cf. packpath, "absolute" Go import path (github.com/...) -- would coincide if protocol full name (i.e., module) used "github.com/..." + // FIXME: factor up to super -- cf. STStateChanApiBuilder#getStateChannelFilePath + public String getEndpointFilePath(Pair, Set> family, RPRoleVariant variant) + { + String basedir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; // Full name return basedir + "/" + this.apigen.getFamilyPackageName(family) + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 6844be2c7..76434ef64 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -111,24 +111,24 @@ public Map build() // filepath -> source { switch (RPCoreSTStateChanApiBuilder.getStateKind(s)) { - case CROSS_SEND: res.put(getFilePath(getStateChanName(s)), this.ob.build(this, s)); break; + case CROSS_SEND: res.put(getStateChannelFilePath(getStateChanName(s)), this.ob.build(this, s)); break; case CROSS_RECEIVE: { if (s.getActions().size() > 1) { if (((GoJob) this.job).selectApi) // Select-based branch { - res.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); + res.put(getStateChannelFilePath(getStateChanName(s)), this.bb.build(this, s)); } else // Type switch -based branch { - res.put(getFilePath(getStateChanName(s)), this.bb.build(this, s)); - res.put(getFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); + res.put(getStateChannelFilePath(getStateChanName(s)), this.bb.build(this, s)); + res.put(getStateChannelFilePath(this.cb.getCaseStateChanName(this, s)), this.cb.build(this, s)); } } else { - res.put(getFilePath(getStateChanName(s)), this.rb.build(this, s)); + res.put(getStateChannelFilePath(getStateChanName(s)), this.rb.build(this, s)); } break; } @@ -150,7 +150,7 @@ public Map build() // filepath -> source { if (!((RPCoreEState) s).hasNested()) { - res.put(getFilePath(name), this.eb.build(this, s)); + res.put(getStateChannelFilePath(name), this.eb.build(this, s)); hasTerm = true; } } @@ -183,7 +183,7 @@ public Map build() // filepath -> source //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + "}\n"; - res.put(getFilePath("End"), end); + res.put(getStateChannelFilePath("End"), end); } // FIXME HACK @@ -198,8 +198,10 @@ public Map build() // filepath -> source return res; } + // Returns path to use as offset to -d + // -- cf. packpath, "absolute" Go import path (github.com/...) -- would coincide if protocol full name (i.e., module) used "github.com/..." @Override - public String getFilePath(String filename) + public String getStateChannelFilePath(String filename) { if (filename.startsWith("_")) // Cannot use "_" prefix, ignored by Go { @@ -261,7 +263,7 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) + "return " + makeCreateSuccStateChan(s, succName) + "\n" + "}\n"; - res.put(getFilePath(scTypeName), feach); + res.put(getStateChannelFilePath(scTypeName), feach); RPCoreEState term = (RPCoreEState) MState.getTerminal(init); //res.putAll(new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, new EGraph(init, term)).build()); From b38e3bb41c4c2735e37214e6673e0268db789ac6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 14:05:20 +0100 Subject: [PATCH 288/433] [rp-core] Default family numbering now by an ordering on families. --- .../src/main/java/org/scribble/util/Pair.java | 6 ++++++ .../codegen/statetype3/RPCoreSTApiGenerator.java | 14 ++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/util/Pair.java b/scribble-core/src/main/java/org/scribble/util/Pair.java index f6a3f2fc8..236fb469c 100644 --- a/scribble-core/src/main/java/org/scribble/util/Pair.java +++ b/scribble-core/src/main/java/org/scribble/util/Pair.java @@ -24,6 +24,12 @@ public Pair(T1 t1, T2 t2) this.right = t2; } + @Override + public String toString() + { + return "(" + this.left + ", " + this.right + ")"; + } + @Override public int hashCode() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 11e6302f7..ff4abd54b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.core.codegen.statetype3; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -82,10 +83,15 @@ public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map Collections.unmodifiableSet(e.getValue()) )));*/ int[] i = { 1 }; - this.families = Collections.unmodifiableMap(families.stream().collect(Collectors.toMap( - f -> f, - f -> i[0]++) - )); + this.families = Collections.unmodifiableMap(families.stream() + .sorted(new Comparator, Set>>() + { + @Override + public int compare(Pair, Set> f1, Pair, Set> f2) + { + return f1.toString().compareTo(f2.toString()); + }}) + .collect(Collectors.toMap(f -> f, f -> i[0]++))); this.packpath = packpath; //this.self = self; From e0a908cb417f84afa23b4e9620f9ac12f2b0534f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 14:16:53 +0100 Subject: [PATCH 289/433] [rp-core] API gen now factors endpoint kinds common to all families up to the protocol directory level. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 115 +++++++++--------- .../RPCoreSTStateChanApiBuilder.java | 4 +- 2 files changed, 58 insertions(+), 61 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 2e538c529..26427b847 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -64,26 +64,20 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) { Set variants = this.apigen.variants.get(rname).keySet(); return - variants.stream().map(v -> - { - String epkindPackName = RPCoreSTApiGenerator.getEndpointKindPackageName(v); - - return - this.apigen.families.keySet().stream().filter(f -> f.left.contains(v)).map(f -> - { - - return "import " + this.apigen.getFamilyPackageName(f) + "_" + epkindPackName - + " \"" + this.apigen.packpath // "Absolute" -- cf. getProtocol/EndpointFilePath, "relative" - + "/" + this.apigen.getApiRootPackageName() - + "/" + this.apigen.getFamilyPackageName(f) - + "/" + epkindPackName + "\"\n"; - - }).collect(Collectors.joining("")); - - - }).collect(Collectors.joining("")); - }).collect(Collectors.joining("")) - ); + variants.stream().map(v -> + { + String epkindPackName = RPCoreSTApiGenerator.getEndpointKindPackageName(v); + boolean isCommonEndpointKind = this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(v)); // Cf. getEndpointKindFilePath + return + this.apigen.families.keySet().stream().filter(f -> f.left.contains(v)).map(f -> + { + return "import " + this.apigen.getFamilyPackageName(f) + "_" + epkindPackName + + " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() // "Absolute" -- cf. getProtocol/EndpointKindFilePath, "relative" + + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(f)) + + "/" + epkindPackName + "\"\n"; + }).collect(Collectors.joining("")); + }).collect(Collectors.joining("")); + }).collect(Collectors.joining(""))); protoFile += "\n" // Protocol type @@ -109,44 +103,44 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) (Iterable, Set>>) this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial { - /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); - try - { - gpd.accept(coll); // FIXME: should be lpd -- not currently used due to using RPCoreType - } - catch (ScribbleException e) - { - throw new RuntimeException("[rp-core] Shouldn't get in here: ", e); + /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); + try + { + gpd.accept(coll); // FIXME: should be lpd -- not currently used due to using RPCoreType + } + catch (ScribbleException e) + { + throw new RuntimeException("[rp-core] Shouldn't get in here: ", e); + } + List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList());*/ + + List ivars = this.apigen.projections.get(rname).get(variant) + .getIndexVars().stream().sorted(IVAR_COMP) + .collect(Collectors.toList()); // N.B., params only from action subjects (not self) + ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); + + // Endpoint Kind constructor -- makes index var value maps + String tmp = "func (p *" + simpname + ") New" + + "_" + this.apigen.getFamilyPackageName(family) + "_" + epkindTypeName // FIXME: factor out common variants between families + + "(" + ivars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" + + " *" + + this.apigen.getFamilyPackageName(family) + "_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) // FIXME: factor out (and separate type name from package name) + + "." + epkindTypeName + + " {\n" + /*+ "params := make(map[string]int)\n" + //+ decls.iterator().next().params + + ivars + .stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining(""))*/ + + "return " + + this.apigen.getFamilyPackageName(family) + "_" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) // FIXME: factor out + + ".New" + "(p" //", params" + + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + + ", self)\n" + + "}\n"; + + protoFile += "\n" + tmp; } - List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList());*/ - - List ivars = this.apigen.projections.get(rname).get(variant) - .getIndexVars().stream().sorted(IVAR_COMP) - .collect(Collectors.toList()); // N.B., params only from action subjects (not self) - ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) - String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); - - // Endpoint Kind constructor -- makes index var value maps - String tmp = "func (p *" + simpname + ") New" - + "_" + this.apigen.getFamilyPackageName(family) + "_" + epkindTypeName // FIXME: factor out common variants between families - + "(" + ivars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" - + " *" - + this.apigen.getFamilyPackageName(family) + "_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) // FIXME: factor out (and separate type name from package name) - + "." + epkindTypeName - + " {\n" - /*+ "params := make(map[string]int)\n" - //+ decls.iterator().next().params - + ivars - .stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining(""))*/ - + "return " - + this.apigen.getFamilyPackageName(family) + "_" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) // FIXME: factor out - + ".New" + "(p" //", params" - + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) - + ", self)\n" - + "}\n"; - - protoFile += "\n" + tmp; - } } } @@ -290,7 +284,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + "return &end\n" + "}"; - res.put(getEndpointFilePath(family, variant) + res.put(getEndpointKindFilePath(family, variant) + "/" + RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant) + ".go", "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "\n" + epkindFile); } @@ -310,11 +304,12 @@ public String getProtocolFilePath() // Returns path to use as offset to -d // -- cf. packpath, "absolute" Go import path (github.com/...) -- would coincide if protocol full name (i.e., module) used "github.com/..." // FIXME: factor up to super -- cf. STStateChanApiBuilder#getStateChannelFilePath - public String getEndpointFilePath(Pair, Set> family, RPRoleVariant variant) + public String getEndpointKindFilePath(Pair, Set> family, RPRoleVariant variant) { + boolean isCommonEndpointKind = this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(variant)); String basedir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; // Full name return basedir - + "/" + this.apigen.getFamilyPackageName(family) + + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(family)) + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 76434ef64..3746662ee 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -207,8 +207,10 @@ public String getStateChannelFilePath(String filename) { filename = "$" + filename.substring(1); } + // Duplicated from RPCoreSTSessionApiBuilder#getEndpointKindFilePath + boolean isCommonEndpointKind = this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(this.variant)); return this.gpn.toString().replaceAll("\\.", "/") - + "/" + this.apigen.getFamilyPackageName(family) + + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(family)) + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) // State chans located with Endpoint Kind API + "/" + filename + ".go"; } From 508a9d038348577b88462d282e06d0a748d9ef28 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 16:51:12 +0100 Subject: [PATCH 290/433] [rp-core] Continued updating API gen for families. --- .../ext/go/core/cli/RPCoreCommandLine.java | 2 +- .../statetype3/RPCoreSTApiGenerator.java | 73 +++++++++++++++++++ .../statetype3/RPCoreSTSessionApiBuilder.java | 22 ++++-- .../RPCoreSTStateChanApiBuilder.java | 5 +- .../org/scribble/ext/go/util/Z3Wrapper.java | 5 +- 5 files changed, 98 insertions(+), 9 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index e34fc70d8..d1befb379 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -463,7 +463,7 @@ private Set, Set>> getFamilies(GoJob job) } // Doesn't include "assert", nor exists-bind index vars - private String makePhiSmt2(Set cand, Set coset) + private static String makePhiSmt2(Set cand, Set coset) { String z3 = ""; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index ff4abd54b..48fb5d689 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -3,22 +3,29 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.del.ModuleDel; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.cli.RPCoreCLArgParser; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.main.ScribbleException; +import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -38,6 +45,7 @@ public class RPCoreSTApiGenerator public final Map> variants; //public final Map, Set>>> families; public final Map, Set>, Integer> families; + public final Map> peers; public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module //public final Role self; @@ -96,6 +104,71 @@ public int compare(Pair, Set> f1, Pair> foo = new HashMap<>(); + Module mod = job.getContext().getModule(this.proto.getPrefix()); + ProtocolDecl gpd = mod.getProtocolDecl(this.proto.getSimpleName()); + for (Role rname : selfs) + { + for (RPRoleVariant variant : variants.get(rname).keySet()) + { + /*for (Pair, Set> family : + (Iterable, Set>>) + this.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial + {*/ + Set irs = MState.getReachableActions(variants.get(rname).get(variant).init).stream() + .map(a -> ((RPCoreEAction) a).getPeer()).collect(Collectors.toSet()); + Set bar = new HashSet<>(); + next: for (RPRoleVariant v : (Iterable) + variants.values().stream() + .flatMap(m -> m.keySet().stream())::iterator) + { + if (!v.equals(variant) && !bar.contains(v)) + { + for (RPIndexedRole ir : irs) + { + if (ir.getName().equals(v.getName())) + { + if (ir.intervals.size() > 1) + { + throw new RuntimeException("[rp-core] TODO: multi-dimension intervals: " + ir); + } + RPInterval d = ir.intervals.stream().findAny().get(); + + Set vars = Stream.concat(v.intervals.stream().flatMap(x -> x.getIndexVars().stream()), v.cointervals.stream().flatMap(x -> x.getIndexVars().stream())) + .collect(Collectors.toSet()); + vars.addAll(ir.getIndexVars()); + + String smt2 = "(assert "; + smt2 += "(exists ((self Int) " + + (vars.isEmpty() ? "" : vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" "))) + ")\n"; + smt2 += "(and \n"; + smt2 += v.intervals.stream().map(x -> "(>= self " + x.start + ") (<= self " + x.end + ")").collect(Collectors.joining(" ")) + "\n"; + smt2 += v.cointervals.isEmpty() + ? "" + : "(or " + v.cointervals.stream().map(x -> "(< self " + x.start + ") (> self " + x.end + ")").collect(Collectors.joining(" ")) + ")\n"; + smt2 += "(>= self " + d.start + ") (<= self " + d.end + ")\n"; + smt2 += ")"; + smt2 += ")"; + smt2 += ")"; + boolean isSat = Z3Wrapper.checkSat(job, gpd, smt2); + //System.out.println("bbb smt2: " + variant + ",, " + v + ",, " + ir + "\n" + smt2); + //System.out.println("ccc checked sat: " + isSat + "\n"); + if (isSat) + { + bar.add(v); + continue next; + } + } + } + } + } + foo.put(variant, Collections.unmodifiableSet(bar)); + //} + } + } + this.peers = Collections.unmodifiableMap(foo); + //System.out.println("aaa: " + peers); } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 26427b847..96cdebee8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -67,13 +67,18 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) variants.stream().map(v -> { String epkindPackName = RPCoreSTApiGenerator.getEndpointKindPackageName(v); - boolean isCommonEndpointKind = this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(v)); // Cf. getEndpointKindFilePath + // Cf. getEndpointKindFilePath + boolean isCommonEndpointKind = //this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(v)); // No: doesn't consider dial/accept + //this.apigen.families.keySet().stream().filter(f -> f.left.contains(v)).distinct().count() == 1; // No: too conservative -- should be about required peer endpoint kinds (to dial/accept with) + this.apigen.peers.get(v).size() == 1; + return this.apigen.families.keySet().stream().filter(f -> f.left.contains(v)).map(f -> { return "import " + this.apigen.getFamilyPackageName(f) + "_" + epkindPackName - + " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() // "Absolute" -- cf. getProtocol/EndpointKindFilePath, "relative" + //+ " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() // "Absolute" -- cf. getProtocol/EndpointKindFilePath, "relative" + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(f)) + + "/" + this.apigen.getFamilyPackageName(f) + "/" + epkindPackName + "\"\n"; }).collect(Collectors.joining("")); }).collect(Collectors.joining("")); @@ -225,9 +230,13 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + RPCoreSTApiGenConstants.GO_CONNECTION_MAP + "[rolename][id] = req.Connect()\n" + "return nil\n" // FIXME: runtime currently does log.Fatal on error + "}\n";*/ - for (RPRoleVariant v : (Iterable) + + //Map map = this.apigen.variants.get(rname); + + /*for (RPRoleVariant v : (Iterable) this.apigen.variants.values().stream() - .flatMap(m -> m.keySet().stream())::iterator) + .flatMap(m -> m.keySet().stream())::iterator)*/ + for (RPRoleVariant v : this.apigen.peers.get(variant)) { if (!v.equals(variant)) // FIXME: endpoint families -- and id value checks { @@ -306,9 +315,12 @@ public String getProtocolFilePath() // FIXME: factor up to super -- cf. STStateChanApiBuilder#getStateChannelFilePath public String getEndpointKindFilePath(Pair, Set> family, RPRoleVariant variant) { - boolean isCommonEndpointKind = this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(variant)); + boolean isCommonEndpointKind = //this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(variant)); // No: doesn't consider dial/accept + //this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant)).distinct().count() == 1; + this.apigen.peers.get(variant).size() == 1; String basedir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; // Full name return basedir + //+ "/" + this.apigen.getFamilyPackageName(family) + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(family)) + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 3746662ee..e819cf702 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -208,8 +208,11 @@ public String getStateChannelFilePath(String filename) filename = "$" + filename.substring(1); } // Duplicated from RPCoreSTSessionApiBuilder#getEndpointKindFilePath - boolean isCommonEndpointKind = this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(this.variant)); + boolean isCommonEndpointKind = //this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(this.variant)); // No: doesn't consider dial/accept + //this.apigen.families.keySet().stream().filter(f -> f.left.contains(this.variant)).distinct().count() == 1; // No: too conservative -- should be about required peer endpoint kinds (to dial/accept with) + this.apigen.peers.get(this.variant).size() == 1; return this.gpn.toString().replaceAll("\\.", "/") + //+ "/" + this.apigen.getFamilyPackageName(family) + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(family)) + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) // State chans located with Endpoint Kind API + "/" + filename + ".go"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index a7970fe6d..ddf6cf41f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -3,9 +3,10 @@ import java.io.File; import java.util.Arrays; -import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.ProtocolDecl; import org.scribble.ext.go.main.GoJob; import org.scribble.main.ScribbleException; +import org.scribble.type.kind.Global; import org.scribble.util.ScribUtil; // "Native" Z3 -- not Z3 Java API @@ -13,7 +14,7 @@ public class Z3Wrapper { // Based on CommandLine::runDot, JobContext::runAut, etc - public static boolean checkSat(GoJob job, GProtocolDecl gpd, String smt2) //throws ScribbleException + public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) //throws ScribbleException { String tmpName = gpd.header.name + ".smt2.tmp"; File tmp = new File(tmpName); From faaef1468f58399364a9027fd01f479e3895dc52 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 16:55:44 +0100 Subject: [PATCH 291/433] [rp-core] Fixed family-specific Dial/Accept. --- .../go/core/codegen/statetype3/RPCoreSTApiGenerator.java | 1 + .../core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 48fb5d689..0c11a1a4e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -105,6 +105,7 @@ public int compare(Pair, Set> f1, Pair> foo = new HashMap<>(); Module mod = job.getContext().getModule(this.proto.getPrefix()); ProtocolDecl gpd = mod.getProtocolDecl(this.proto.getSimpleName()); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 96cdebee8..26941b98b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -76,9 +76,9 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) this.apigen.families.keySet().stream().filter(f -> f.left.contains(v)).map(f -> { return "import " + this.apigen.getFamilyPackageName(f) + "_" + epkindPackName - //+ " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() // "Absolute" -- cf. getProtocol/EndpointKindFilePath, "relative" + + " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() // "Absolute" -- cf. getProtocol/EndpointKindFilePath, "relative" + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(f)) - + "/" + this.apigen.getFamilyPackageName(f) + //+ "/" + this.apigen.getFamilyPackageName(f) + "/" + epkindPackName + "\"\n"; }).collect(Collectors.joining("")); }).collect(Collectors.joining("")); @@ -238,7 +238,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map .flatMap(m -> m.keySet().stream())::iterator)*/ for (RPRoleVariant v : this.apigen.peers.get(variant)) { - if (!v.equals(variant)) // FIXME: endpoint families -- and id value checks + if (!v.equals(variant) && family.left.contains(v)) // FIXME: endpoint families -- and id value checks { // Accept/Dial methods String r = v.getLastElement(); From 8cdd209721632a9e07ce404eeac4cd7296ad4164 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 17:25:19 +0100 Subject: [PATCH 292/433] [rp-core] Moved peer computation into RPCoreCommandLine. --- .../ext/go/core/cli/RPCoreCommandLine.java | 92 ++++++++++++++++++- .../statetype3/RPCoreSTApiGenerator.java | 78 ++-------------- 2 files changed, 93 insertions(+), 77 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index d1befb379..2bee05197 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.core.cli; import java.nio.file.Path; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -32,6 +33,7 @@ import org.scribble.ext.go.core.main.RPCoreMainContext; import org.scribble.ext.go.core.model.endpoint.RPCoreEGraphBuilder; import org.scribble.ext.go.core.model.endpoint.RPCoreEState; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; @@ -59,11 +61,12 @@ public class RPCoreCommandLine extends CommandLine protected final Map rpArgs; // Maps each flag to list of associated argument values // HACK: store in (Core) Job/JobContext? - protected GProtocolDecl gpd; - protected Map> L0; - protected Map> E0; + private GProtocolDecl gpd; + private Map> L0; + private Map> E0; //protected ParamCoreSModel model; - protected Set, Set>> families; + private Set, Set>> families; + private Map> peers; public RPCoreCommandLine(String... args) throws CommandLineException { @@ -168,7 +171,8 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co outputClasses(goClasses);*/ } - Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, this.L0, this.E0, this.families, impath, roles).build(); + Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, + this.L0, this.E0, this.families, this.peers, impath, roles).build(); outputClasses(goClasses); } else @@ -340,12 +344,90 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws this.families = new HashSet<>(); this.families.addAll(getFamilies(job)); + this.peers = new HashMap<>(); + this.peers.putAll(getPeers(job)); } // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? //..HERE FIXME ActualParam -- ParamRange is now already a Set + + // Compute variant peers of each variant + private Map> getPeers(GoJob job) + { + job.debugPrintln("\n[rp-core] Computing peers:"); + + Map> foo = new HashMap<>(); + + String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_API_GEN); + for (Role rname : (Iterable) Arrays.asList(args).stream().map(r -> new Role(r))::iterator) + { + for (RPRoleVariant variant : this.E0.get(rname).keySet()) + { + /*for (Pair, Set> family : + (Iterable, Set>>) + this.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial + {*/ + Set irs = MState.getReachableActions(this.E0.get(rname).get(variant).init).stream() + .map(a -> ((RPCoreEAction) a).getPeer()).collect(Collectors.toSet()); + Set bar = new HashSet<>(); + next: for (RPRoleVariant v : (Iterable) + this.E0.values().stream() + .flatMap(m -> m.keySet().stream())::iterator) + { + if (!v.equals(variant) && !bar.contains(v)) + { + job.debugPrintln("\n[rp-core] For " + variant + ", checking potential peer: " + v); + + for (RPIndexedRole ir : irs) + { + if (ir.getName().equals(v.getName())) + { + if (ir.intervals.size() > 1) + { + throw new RuntimeException("[rp-core] TODO: multi-dimension intervals: " + ir); + } + RPInterval d = ir.intervals.stream().findAny().get(); + + Set vars = Stream.concat(v.intervals.stream().flatMap(x -> x.getIndexVars().stream()), v.cointervals.stream().flatMap(x -> x.getIndexVars().stream())) + .collect(Collectors.toSet()); + vars.addAll(ir.getIndexVars()); + + String smt2 = "(assert "; + smt2 += "(exists ((self Int) " + + (vars.isEmpty() ? "" : vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" "))) + ")\n"; + smt2 += "(and \n"; + smt2 += v.intervals.stream().map(x -> "(>= self " + x.start + ") (<= self " + x.end + ")").collect(Collectors.joining(" ")) + "\n"; + smt2 += v.cointervals.isEmpty() + ? "" + : "(or " + v.cointervals.stream().map(x -> "(< self " + x.start + ") (> self " + x.end + ")").collect(Collectors.joining(" ")) + ")\n"; + smt2 += "(>= self " + d.start + ") (<= self " + d.end + ")\n"; + smt2 += ")"; + smt2 += ")"; + smt2 += ")"; + + job.debugPrintln("[rp-core] Running Z3 on:\n" + smt2); + + boolean isSat = Z3Wrapper.checkSat(job, gpd, smt2); + job.debugPrintln("[rp-core] Checked sat: " + isSat); + if (isSat) + { + bar.add(v); + continue next; + } + } + } + } + } + foo.put(variant, bar); + //} + } + } + return foo; + } + + private Set, Set>> getFamilies(GoJob job) { job.debugPrintln("\n[rp-core] Computing families:"); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 0c11a1a4e..45094e61d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -3,29 +3,22 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.del.ModuleDel; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.cli.RPCoreCLArgParser; -import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; -import org.scribble.ext.go.core.type.RPIndexedRole; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexVar; -import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.main.ScribbleException; -import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; @@ -55,6 +48,7 @@ public class RPCoreSTApiGenerator public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> projections, Map> variants, Set, Set>> families, + Map> peers, String packpath, //Role self) List selfs) { @@ -105,71 +99,11 @@ public int compare(Pair, Set> f1, Pair> foo = new HashMap<>(); - Module mod = job.getContext().getModule(this.proto.getPrefix()); - ProtocolDecl gpd = mod.getProtocolDecl(this.proto.getSimpleName()); - for (Role rname : selfs) - { - for (RPRoleVariant variant : variants.get(rname).keySet()) - { - /*for (Pair, Set> family : - (Iterable, Set>>) - this.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial - {*/ - Set irs = MState.getReachableActions(variants.get(rname).get(variant).init).stream() - .map(a -> ((RPCoreEAction) a).getPeer()).collect(Collectors.toSet()); - Set bar = new HashSet<>(); - next: for (RPRoleVariant v : (Iterable) - variants.values().stream() - .flatMap(m -> m.keySet().stream())::iterator) - { - if (!v.equals(variant) && !bar.contains(v)) - { - for (RPIndexedRole ir : irs) - { - if (ir.getName().equals(v.getName())) - { - if (ir.intervals.size() > 1) - { - throw new RuntimeException("[rp-core] TODO: multi-dimension intervals: " + ir); - } - RPInterval d = ir.intervals.stream().findAny().get(); - - Set vars = Stream.concat(v.intervals.stream().flatMap(x -> x.getIndexVars().stream()), v.cointervals.stream().flatMap(x -> x.getIndexVars().stream())) - .collect(Collectors.toSet()); - vars.addAll(ir.getIndexVars()); - - String smt2 = "(assert "; - smt2 += "(exists ((self Int) " - + (vars.isEmpty() ? "" : vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" "))) + ")\n"; - smt2 += "(and \n"; - smt2 += v.intervals.stream().map(x -> "(>= self " + x.start + ") (<= self " + x.end + ")").collect(Collectors.joining(" ")) + "\n"; - smt2 += v.cointervals.isEmpty() - ? "" - : "(or " + v.cointervals.stream().map(x -> "(< self " + x.start + ") (> self " + x.end + ")").collect(Collectors.joining(" ")) + ")\n"; - smt2 += "(>= self " + d.start + ") (<= self " + d.end + ")\n"; - smt2 += ")"; - smt2 += ")"; - smt2 += ")"; - boolean isSat = Z3Wrapper.checkSat(job, gpd, smt2); - //System.out.println("bbb smt2: " + variant + ",, " + v + ",, " + ir + "\n" + smt2); - //System.out.println("ccc checked sat: " + isSat + "\n"); - if (isSat) - { - bar.add(v); - continue next; - } - } - } - } - } - foo.put(variant, Collections.unmodifiableSet(bar)); - //} - } - } - this.peers = Collections.unmodifiableMap(foo); - //System.out.println("aaa: " + peers); + this.peers = Collections.unmodifiableMap( + peers.entrySet().stream().collect(Collectors.toMap( + e -> e.getKey(), + e -> Collections.unmodifiableSet(e.getValue()) + ))); } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later From aa1077ad0a869c6ac4fc1ce3d35ff8083189d00e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 17:26:35 +0100 Subject: [PATCH 293/433] [rp-core] Minor. --- .../ext/go/core/cli/RPCoreCommandLine.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 2bee05197..79670f4e4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -358,7 +358,7 @@ private Map> getPeers(GoJob job) { job.debugPrintln("\n[rp-core] Computing peers:"); - Map> foo = new HashMap<>(); + Map> map = new HashMap<>(); String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_API_GEN); for (Role rname : (Iterable) Arrays.asList(args).stream().map(r -> new Role(r))::iterator) @@ -371,12 +371,12 @@ private Map> getPeers(GoJob job) {*/ Set irs = MState.getReachableActions(this.E0.get(rname).get(variant).init).stream() .map(a -> ((RPCoreEAction) a).getPeer()).collect(Collectors.toSet()); - Set bar = new HashSet<>(); + Set peers = new HashSet<>(); next: for (RPRoleVariant v : (Iterable) this.E0.values().stream() .flatMap(m -> m.keySet().stream())::iterator) { - if (!v.equals(variant) && !bar.contains(v)) + if (!v.equals(variant) && !peers.contains(v)) { job.debugPrintln("\n[rp-core] For " + variant + ", checking potential peer: " + v); @@ -409,22 +409,22 @@ private Map> getPeers(GoJob job) job.debugPrintln("[rp-core] Running Z3 on:\n" + smt2); - boolean isSat = Z3Wrapper.checkSat(job, gpd, smt2); + boolean isSat = Z3Wrapper.checkSat(job, this.gpd, smt2); job.debugPrintln("[rp-core] Checked sat: " + isSat); if (isSat) { - bar.add(v); + peers.add(v); continue next; } } } } } - foo.put(variant, bar); + map.put(variant, peers); //} } } - return foo; + return map; } From 3c1abfe042a9a3c1d25b22f64bc451154760ee2f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 18:36:31 +0100 Subject: [PATCH 294/433] [rp-core] Continued updating API gen for families. --- .../ext/go/core/cli/RPCoreCommandLine.java | 28 +++++++------ .../statetype3/RPCoreSTApiGenerator.java | 13 +++++- .../statetype3/RPCoreSTSessionApiBuilder.java | 41 +++++++++++-------- .../go/core/model/endpoint/RPCoreEState.java | 28 +++++++++++++ 4 files changed, 80 insertions(+), 30 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 79670f4e4..db933b5ba 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -369,20 +369,22 @@ private Map> getPeers(GoJob job) (Iterable, Set>>) this.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial {*/ - Set irs = MState.getReachableActions(this.E0.get(rname).get(variant).init).stream() + Set irs = //MState.getReachableActions + RPCoreEState.getReachableActions + ((RPCoreEState) this.E0.get(rname).get(variant).init).stream() // FIXME: cast needed to select correct static .map(a -> ((RPCoreEAction) a).getPeer()).collect(Collectors.toSet()); Set peers = new HashSet<>(); - next: for (RPRoleVariant v : (Iterable) + next: for (RPRoleVariant peer : (Iterable) // Candidate this.E0.values().stream() .flatMap(m -> m.keySet().stream())::iterator) { - if (!v.equals(variant) && !peers.contains(v)) + if (!peer.equals(variant) && !peers.contains(peer)) { - job.debugPrintln("\n[rp-core] For " + variant + ", checking potential peer: " + v); - + job.debugPrintln("\n[rp-core] For " + variant + ", checking potential peer: " + peer); + for (RPIndexedRole ir : irs) { - if (ir.getName().equals(v.getName())) + if (ir.getName().equals(peer.getName())) { if (ir.intervals.size() > 1) { @@ -390,19 +392,19 @@ private Map> getPeers(GoJob job) } RPInterval d = ir.intervals.stream().findAny().get(); - Set vars = Stream.concat(v.intervals.stream().flatMap(x -> x.getIndexVars().stream()), v.cointervals.stream().flatMap(x -> x.getIndexVars().stream())) + Set vars = Stream.concat(peer.intervals.stream().flatMap(x -> x.getIndexVars().stream()), peer.cointervals.stream().flatMap(x -> x.getIndexVars().stream())) .collect(Collectors.toSet()); vars.addAll(ir.getIndexVars()); String smt2 = "(assert "; - smt2 += "(exists ((self Int) " + smt2 += "(exists ((peer Int) " + (vars.isEmpty() ? "" : vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" "))) + ")\n"; smt2 += "(and \n"; - smt2 += v.intervals.stream().map(x -> "(>= self " + x.start + ") (<= self " + x.end + ")").collect(Collectors.joining(" ")) + "\n"; - smt2 += v.cointervals.isEmpty() + smt2 += peer.intervals.stream().map(x -> "(>= peer " + x.start + ") (<= peer " + x.end + ")").collect(Collectors.joining(" ")) + "\n"; + smt2 += peer.cointervals.isEmpty() ? "" - : "(or " + v.cointervals.stream().map(x -> "(< self " + x.start + ") (> self " + x.end + ")").collect(Collectors.joining(" ")) + ")\n"; - smt2 += "(>= self " + d.start + ") (<= self " + d.end + ")\n"; + : "(or " + peer.cointervals.stream().map(x -> "(< peer " + x.start + ") (> peer " + x.end + ")").collect(Collectors.joining(" ")) + ")\n"; + smt2 += "(>= peer " + d.start + ") (<= peer " + d.end + ")\n"; smt2 += ")"; smt2 += ")"; smt2 += ")"; @@ -413,7 +415,7 @@ private Map> getPeers(GoJob job) job.debugPrintln("[rp-core] Checked sat: " + isSat); if (isSat) { - peers.add(v); + peers.add(peer); continue next; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 45094e61d..c33c768db 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -85,13 +85,24 @@ public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map Collections.unmodifiableSet(e.getValue()) )));*/ int[] i = { 1 }; + Comparator variantComp = new Comparator() // FIXME: factor out + { + @Override + public int compare(RPRoleVariant i1, RPRoleVariant i2) + { + return i1.toString().compareTo(i2.toString()); + } + }; this.families = Collections.unmodifiableMap(families.stream() .sorted(new Comparator, Set>>() { + // FIXME refactor properly @Override public int compare(Pair, Set> f1, Pair, Set> f2) { - return f1.toString().compareTo(f2.toString()); + //return f1.toString().compareTo(f2.toString()); // No: Set elements + return (f1.left.stream().sorted(variantComp).map(x -> x.toString()).collect(Collectors.joining("_")) + "_not_" + f1.right.stream().sorted(variantComp).map(x -> x.toString()).collect(Collectors.joining("_"))) + .compareTo(f2.left.stream().sorted(variantComp).map(x -> x.toString()).collect(Collectors.joining("_")) + "_not_" + f2.right.stream().sorted(variantComp).map(x -> x.toString()).collect(Collectors.joining("_"))); }}) .collect(Collectors.toMap(f -> f, f -> i[0]++))); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 26941b98b..dadac1e88 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; @@ -72,15 +73,17 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) //this.apigen.families.keySet().stream().filter(f -> f.left.contains(v)).distinct().count() == 1; // No: too conservative -- should be about required peer endpoint kinds (to dial/accept with) this.apigen.peers.get(v).size() == 1; - return - this.apigen.families.keySet().stream().filter(f -> f.left.contains(v)).map(f -> - { - return "import " + this.apigen.getFamilyPackageName(f) + "_" + epkindPackName - + " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() // "Absolute" -- cf. getProtocol/EndpointKindFilePath, "relative" - + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(f)) - //+ "/" + this.apigen.getFamilyPackageName(f) - + "/" + epkindPackName + "\"\n"; - }).collect(Collectors.joining("")); + return isCommonEndpointKind + ? "import " + epkindPackName + + " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() // "Absolute" -- cf. getProtocol/EndpointKindFilePath, "relative" + + "/" + epkindPackName + "\"\n" + : this.apigen.families.keySet().stream().filter(f -> f.left.contains(v)).map(f -> + { + return "import " + this.apigen.getFamilyPackageName(f) + "_" + epkindPackName + + " \"" + this.apigen.packpath + "/" + this.apigen.getApiRootPackageName() // "Absolute" -- cf. getProtocol/EndpointKindFilePath, "relative" + + "/" + this.apigen.getFamilyPackageName(f) + + "/" + epkindPackName + "\"\n"; + }).collect(Collectors.joining("")); }).collect(Collectors.joining("")); }).collect(Collectors.joining(""))); @@ -104,9 +107,12 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) { for (RPRoleVariant variant : this.apigen.variants.get(rname).keySet()) { + boolean isCommonEndpointKind = this.apigen.peers.get(variant).size() == 1; + Set, Set>> families = isCommonEndpointKind + ? Stream.of((Pair, Set>) null).collect(Collectors.toSet()) // FIXME HACK: when isCommonEndpointKind, just loop once (to make one New) + : this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant)).collect(Collectors.toSet()); for (Pair, Set> family : - (Iterable, Set>>) - this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial + families) // FIXME: use family to make accept/dial { /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); try @@ -124,13 +130,15 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) .collect(Collectors.toList()); // N.B., params only from action subjects (not self) ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); - + // Endpoint Kind constructor -- makes index var value maps - String tmp = "func (p *" + simpname + ") New" - + "_" + this.apigen.getFamilyPackageName(family) + "_" + epkindTypeName // FIXME: factor out common variants between families + String tmp = "func (p *" + simpname + ") New" + "_" + + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") + + epkindTypeName // FIXME: factor out common variants between families + "(" + ivars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" + " *" - + this.apigen.getFamilyPackageName(family) + "_" + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) // FIXME: factor out (and separate type name from package name) + + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") + + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) // FIXME: factor out (and separate type name from package name) + "." + epkindTypeName + " {\n" /*+ "params := make(map[string]int)\n" @@ -138,7 +146,8 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) + ivars .stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining(""))*/ + "return " - + this.apigen.getFamilyPackageName(family) + "_" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) // FIXME: factor out + + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") + + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) // FIXME: factor out + ".New" + "(p" //", params" + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + ", self)\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java index 752f01d46..c22e19baa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java @@ -1,7 +1,10 @@ package org.scribble.ext.go.core.model.endpoint; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.model.MState; @@ -128,4 +131,29 @@ protected boolean canEquals(MState s) { return s instanceof RPCoreEState; } + + // FIXME: make not static -- otherwise choosing statics (cf. MState) by overloading, error prone + public static Set getReachableStates(RPCoreEState start) + { + Set res = MState.getReachableStates(start).stream() + .map(s -> (RPCoreEState) s).collect(Collectors.toSet()); + Set nested = res.stream() + .flatMap(s -> s.hasNested() ? Stream.concat(Stream.of(s.nested), getReachableStates(s.nested).stream()) : Stream.of()).collect(Collectors.toSet()); + res.addAll(nested); + if (start.hasNested()) // N.B. start itself is not considered reachable -- correct? + { + res.addAll(getReachableStates(start.nested)); + } + return res; + } + + // FIXME: make not static -- otherwise choosing statics (cf. MState) by overloading, error prone + public static Set getReachableActions(RPCoreEState start) + { + Set rs = getReachableStates(start); + rs.add(start); + Set tmp = rs.stream() + .flatMap(s -> s.getAllActions().stream().map(a -> (RPCoreEAction) a)).collect(Collectors.toSet()); + return tmp; + } } From dee2b266deac18d8df8bb7429e867bbb450746ab Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 18:48:01 +0100 Subject: [PATCH 295/433] [rp-core] Continued updating API gen for families. --- .../org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 2 ++ .../scribble/ext/go/core/model/endpoint/RPCoreEState.java | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index db933b5ba..384138f39 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -382,6 +382,8 @@ private Map> getPeers(GoJob job) { job.debugPrintln("\n[rp-core] For " + variant + ", checking potential peer: " + peer); + //System.out.println("aaa: " + irs + ",, " + peer); + for (RPIndexedRole ir : irs) { if (ir.getName().equals(peer.getName())) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java index c22e19baa..a9701e33a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java @@ -137,11 +137,15 @@ public static Set getReachableStates(RPCoreEState start) { Set res = MState.getReachableStates(start).stream() .map(s -> (RPCoreEState) s).collect(Collectors.toSet()); + + //System.out.println("ccc: " + start.id + ",, " + res); + Set nested = res.stream() .flatMap(s -> s.hasNested() ? Stream.concat(Stream.of(s.nested), getReachableStates(s.nested).stream()) : Stream.of()).collect(Collectors.toSet()); res.addAll(nested); if (start.hasNested()) // N.B. start itself is not considered reachable -- correct? { + res.add(start.nested); res.addAll(getReachableStates(start.nested)); } return res; @@ -154,6 +158,9 @@ public static Set getReachableActions(RPCoreEState start) rs.add(start); Set tmp = rs.stream() .flatMap(s -> s.getAllActions().stream().map(a -> (RPCoreEAction) a)).collect(Collectors.toSet()); + + //System.out.println("bbb: " + start.id + ",, " + rs + ",, " + tmp); + return tmp; } } From 01242b4333291f38d2ca2aae35611e114a856e1c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 20:17:51 +0100 Subject: [PATCH 296/433] [rp-core] Fixed nested EFSM state/action collection. --- .../ext/go/core/cli/RPCoreCommandLine.java | 16 +++--- .../go/core/model/endpoint/RPCoreEState.java | 52 ++++++++++++++++++- .../ext/go/core/type/RPIndexedRole.java | 4 +- 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 384138f39..1714dabb0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -32,6 +32,7 @@ import org.scribble.ext.go.core.main.RPCoreException; import org.scribble.ext.go.core.main.RPCoreMainContext; import org.scribble.ext.go.core.model.endpoint.RPCoreEGraphBuilder; +import org.scribble.ext.go.core.model.endpoint.RPCoreEModelFactory; import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; import org.scribble.ext.go.core.type.RPIndexedRole; @@ -363,26 +364,27 @@ private Map> getPeers(GoJob job) String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_API_GEN); for (Role rname : (Iterable) Arrays.asList(args).stream().map(r -> new Role(r))::iterator) { - for (RPRoleVariant variant : this.E0.get(rname).keySet()) + for (RPRoleVariant self : this.E0.get(rname).keySet()) { /*for (Pair, Set> family : (Iterable, Set>>) this.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial {*/ + // CHECKME: use local types instead of FSMs? (RPCoreGForeach#getIndexedRoles) Set irs = //MState.getReachableActions - RPCoreEState.getReachableActions - ((RPCoreEState) this.E0.get(rname).get(variant).init).stream() // FIXME: cast needed to select correct static + RPCoreEState.getReachableActions((RPCoreEModelFactory) job.ef, + (RPCoreEState) this.E0.get(rname).get(self).init).stream() // FIXME: static "overloading" (cf. MState) error prone .map(a -> ((RPCoreEAction) a).getPeer()).collect(Collectors.toSet()); Set peers = new HashSet<>(); next: for (RPRoleVariant peer : (Iterable) // Candidate this.E0.values().stream() .flatMap(m -> m.keySet().stream())::iterator) { - if (!peer.equals(variant) && !peers.contains(peer)) + if (!peer.equals(self) && !peers.contains(peer)) { - job.debugPrintln("\n[rp-core] For " + variant + ", checking potential peer: " + peer); + job.debugPrintln("\n[rp-core] For " + self + ", checking potential peer: " + peer); - //System.out.println("aaa: " + irs + ",, " + peer); + //System.out.println("aaa: " + self + ",, "+ peer + ",, " + irs); for (RPIndexedRole ir : irs) { @@ -424,7 +426,7 @@ private Map> getPeers(GoJob job) } } } - map.put(variant, peers); + map.put(self, peers); //} } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java index a9701e33a..dadfe3625 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java @@ -1,16 +1,22 @@ package org.scribble.ext.go.core.model.endpoint; +import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; +import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.model.MState; import org.scribble.model.endpoint.EModelFactory; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.model.endpoint.actions.EReceive; +import org.scribble.model.endpoint.actions.ESend; import org.scribble.type.name.RecVar; // Cf. AssrtEState @@ -152,13 +158,57 @@ public static Set getReachableStates(RPCoreEState start) } // FIXME: make not static -- otherwise choosing statics (cf. MState) by overloading, error prone - public static Set getReachableActions(RPCoreEState start) + // cf. RPCoreGForeach#getIndexedRoles + public static Set getReachableActions(RPCoreEModelFactory ef, RPCoreEState start) { Set rs = getReachableStates(start); rs.add(start); Set tmp = rs.stream() .flatMap(s -> s.getAllActions().stream().map(a -> (RPCoreEAction) a)).collect(Collectors.toSet()); + if (start.hasNested()) + { + Set tmp2 = new HashSet<>(); + for (RPCoreEAction a : tmp) + { + if (a.getPeer().intervals.stream().flatMap(d -> d.getIndexVars().stream()).anyMatch(x -> x.toString().equals(start.param.toString()))) + { + Set blah = new HashSet<>(); + for (RPInterval d : a.getPeer().intervals) + { + // FIXME: current assuming if any I occurrence, then interval is be [I,I] + if (d.getIndexVars().stream().anyMatch(x -> x.toString().equals(start.param.toString()))) + { + blah.add(start.interval); + } + else + { + blah.add(d); + } + } + RPIndexedRole b = new RPIndexedRole(a.getPeer().getName().toString(), blah); + + if (a instanceof RPCoreECrossSend) + { + tmp2.add(ef.newParamCoreECrossSend(b, ((ESend) a).mid, ((ESend) a).payload)); + } + else if (a instanceof RPCoreECrossReceive) + { + tmp2.add(ef.newParamCoreECrossReceive(b, ((EReceive) a).mid, ((EReceive) a).payload)); + } + else + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + a); + } + } + else + { + tmp2.add(a); + } + } + tmp = tmp2; + } + //System.out.println("bbb: " + start.id + ",, " + rs + ",, " + tmp); return tmp; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java index f11116ad9..edfffeb81 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java @@ -19,10 +19,10 @@ public class RPIndexedRole extends Role //public final ParamRange range; public final Set intervals; // size >= 1 -- size == 1 for parsed syntax - public RPIndexedRole(String name, Set ranges) + public RPIndexedRole(String name, Set intervals) { super(name); - this.intervals = Collections.unmodifiableSet(ranges); + this.intervals = Collections.unmodifiableSet(intervals); } public Set getIndexVars() From 4cc4f8cfdffa5383ebe9891edc88b0c35e9ca1e4 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 20:26:51 +0100 Subject: [PATCH 297/433] [rp-core] Minor. --- .../scribble/ext/go/core/cli/RPCoreCommandLine.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 1714dabb0..9f9dd855a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -455,15 +455,22 @@ private Set, Set>> getFamilies(GoJob job) .filter(x -> !cand.contains(x)).collect(Collectors.toSet()); String smt2 = "(assert "; - smt2 += "(exists (" + vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" ")) + ")\n"; // FIXME: factor up -- and factor out with getVariants - smt2 += "(and\n"; + if (!vars.isEmpty()) + { + smt2 += "(exists (" + vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" ")) + ")\n"; // FIXME: factor up -- and factor out with getVariants + smt2 += "(and\n"; + } smt2 += "(and " + cand.stream() .map(v -> makePhiSmt2(v.intervals, v.cointervals)).collect(Collectors.joining(" ")) + ")\n"; smt2 += (coset.size() > 0) ? "(and " + coset.stream() .map(v -> "(not " + makePhiSmt2(v.intervals, v.cointervals) + ")").collect(Collectors.joining(" ")) + ")\n" : ""; - smt2 += ")))"; + if (!vars.isEmpty()) + { + smt2 += "))"; + } + smt2 += ")"; job.debugPrintln("\n[rp-core] Candidate (" + i++ + "/" + size + "): " + cand); job.debugPrintln("[rp-core] Co-set: " + coset); From 9359cd97eb74a5dcfb8a9379f3e1a942896c22fb Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 10 May 2018 22:33:29 +0100 Subject: [PATCH 298/433] [rp-core] Fixed peer computation to use roledecls, not CL args. --- .../src/main/java/org/scribble/cli/CommandLine.java | 2 +- .../org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java index 6ec79586c..9a86b3022 100644 --- a/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java +++ b/scribble-cli/src/main/java/org/scribble/cli/CommandLine.java @@ -468,7 +468,7 @@ protected static Path parseMainPath(String path) protected static List parseImportPaths(String paths) { - return Arrays.stream(paths.split(File.pathSeparator)).map((s) -> Paths.get(s)).collect(Collectors.toList()); + return Arrays.stream(paths.split(File.pathSeparator)).map(s -> Paths.get(s)).collect(Collectors.toList()); } protected static GProtocolName checkGlobalProtocolArg(JobContext jcontext, String simpname) throws CommandLineException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 9f9dd855a..3d4cb770e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -1,7 +1,6 @@ package org.scribble.ext.go.core.cli; import java.nio.file.Path; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -361,8 +360,9 @@ private Map> getPeers(GoJob job) Map> map = new HashMap<>(); - String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_API_GEN); - for (Role rname : (Iterable) Arrays.asList(args).stream().map(r -> new Role(r))::iterator) + /*String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_API_GEN); + for (Role rname : (Iterable) Arrays.asList(args).stream().map(r -> new Role(r))::iterator)*/ + for (Role rname : this.gpd.header.roledecls.getRoles()) { for (RPRoleVariant self : this.E0.get(rname).keySet()) { From b3b0b219bb9e3a482e7d88cc2ed23ec8cfcb1406 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 11 May 2018 15:02:33 +0100 Subject: [PATCH 299/433] [rp-core] Revised Init/End state naming in API gen. --- .../go/ast/name/simple/RPIndexedRoleNode.java | 4 +- .../statetype3/RPCoreSTApiGenerator.java | 63 +++++++++++++++- .../statetype3/RPCoreSTSessionApiBuilder.java | 9 ++- .../RPCoreSTStateChanApiBuilder.java | 75 +++++++++++++------ .../ext/go/type/name/RPIndexedRole.java | 1 + 5 files changed, 123 insertions(+), 29 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java index 6fb54a4fc..3bb19ba8a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/name/simple/RPIndexedRoleNode.java @@ -9,8 +9,8 @@ import org.scribble.ext.go.type.name.RPIndexedRole; -// FIXME: not currently used, but should use in, e.g., RPGCrossMessageTransfer -// Currently used for both "actual params" and int literals +// FIXME: not currently used, but should use in, e.g., RPGCrossMessageTransfer -- use for both "actual params" and int literals +@Deprecated public class RPIndexedRoleNode extends SimpleNameNode // Not RoleNode, for distinct Kind -- (though distinction maybe unecessary) { public final RPIndexExpr start; // Use "types" directly -- source syntax parsed directly to types (cf. scrib-assrt, AssrtAntlrToFormulaParser) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index c33c768db..0a6675f98 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -3,6 +3,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -14,6 +15,7 @@ import org.scribble.del.ModuleDel; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.cli.RPCoreCLArgParser; +import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.ext.go.main.GoJob; @@ -40,6 +42,9 @@ public class RPCoreSTApiGenerator public final Map, Set>, Integer> families; public final Map> peers; + public final Map> stateChanNames; // State2 + //private Map> foreachNames = new HashMap<>(); // State2_ intermediary name (N.B. RPCoreSTStateChanApiBuilder swaps them around for convenience) + public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module //public final Role self; public final List selfs; @@ -115,6 +120,12 @@ public int compare(Pair, Set> f1, Pair e.getKey(), e -> Collections.unmodifiableSet(e.getValue()) ))); + + this.stateChanNames = Collections.unmodifiableMap(makeStateChanNames() + .entrySet().stream().collect(Collectors.toMap( + e -> e.getKey(), + e -> Collections.unmodifiableMap(e.getValue()))) + ); } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later @@ -160,6 +171,7 @@ public Map build() throws ScribbleException } // Build Session API (Protocol and Endpoint types) and State Channel API + makeStateChanNames(); Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); for (Role self : this.selfs) @@ -189,7 +201,56 @@ public Map buildStateChannelApi( Pair, Set> family, RPRoleVariant variant, EGraph graph) // FIXME: factor out { this.job.debugPrintln("\n[rp-core] Running " + RPCoreSTStateChanApiBuilder.class + " for " + this.proto + "@" + variant); - return new RPCoreSTStateChanApiBuilder(this, family, variant, graph).build(); + return new RPCoreSTStateChanApiBuilder(this, family, variant, graph, this.stateChanNames.get(variant)).build(); + } + + private Map> makeStateChanNames() + { + Map> names = new HashMap<>(); + for (Entry e : (Iterable>) + this.variants.values().stream().flatMap(v -> v.entrySet().stream())::iterator) + { + int[] counter = {2}; + RPRoleVariant v = e.getKey(); + EGraph g = e.getValue(); + + Map curr = new HashMap<>(); + //Map inames = new HashMap<>(); + names.put(v, curr); + //this.foreachNames.put(v, inames); + Set rs = RPCoreEState.getReachableStates((RPCoreEState) g.init); // FIXME: cast needed to select correct static + rs.add((RPCoreEState) g.init); // Adding for following loop; removed again later + for (RPCoreEState s : new HashSet<>(rs)) + { + if (s.hasNested()) // Nested inits + { + RPCoreEState nested = s.getNested(); + curr.put(nested.id, "Init_" + nested.id); + rs.remove(nested); + } + } + // Handling top-level init/end must come after handling nested + curr.put(g.init.id, "Init"); + rs.remove(g.init); + if (g.term != null && g.term.id != g.init.id) + { + rs.remove(g.term); // Remove top-level term from rs + curr.put(g.term.id, "End"); + } + rs.forEach(s -> + { + String n = s.isTerminal() + ? (s.hasNested() ? "End_" + s.id : "End") // Nested or "regular" term + : "State" + counter[0]++; + /*if (s.hasNested()) + { + inames.put(s.id, n); + n = n + "_"; + }*/ + curr.put(s.id, n); + }); + } + return names; } //@Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index dadac1e88..4615d5e3d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -206,7 +206,11 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + "*" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + " *" + RPCoreSTApiGenConstants.GO_MPCHAN_TYPE + "\n" + ivars.stream().map(x -> x + " int\n").collect(Collectors.joining("")) - + "Params map[string]int\n" + + + "Params map[string]int\n" // FIXME: currently used to record foreach params (and provide access to user) + + //+ ...TODO: pre-create state chans + + "}\n" // Endpoint Kind type constructor -- makes connection maps @@ -286,7 +290,8 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map EState term = MState.getTerminal(g.init); String endName = (g.init.id == term.id ? "Init" : "End") + ((term != null && ((RPCoreEState) term).hasNested()) ? "_" + term.id : "");*/ String endName = "End"; - String init = "Init_" + this.apigen.variants.get(variant.getName()).get(variant).init; + String init = //"Init_" + this.apigen.variants.get(variant.getName()).get(variant).init; + "Init"; epkindFile += "\n" + "func (ini *" + epkindTypeName + ") Run(f func(*" + init + ") " + endName + ") *" + endName + " {\n" // f specifies non-pointer End + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".Close()\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index e819cf702..f469cc362 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -44,11 +44,11 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder public final Pair, Set> family; public final RPRoleVariant variant; // variant.getName().equals(this.role) - private int counter = 2; // 1 named as Init + //private int counter = 2; // 1 named as Init private final Set dtds; // FIXME: use "main.getDataTypeDecl((DataType) pt);" instead -- cf. OutputSocketGenerator#addSendOpParams private final Set msnds; - private Map imedNames = new HashMap<>(); // "Original" state names -- FIXME: deprecate // Cf. STStateChanApiBuilder.names + //private Map imedNames = new HashMap<>(); // "Original" state names -- FIXME: deprecate // Cf. STStateChanApiBuilder.names private final Set fvars = new HashSet<>(); // HACK FIXME: should make explicit RPIndexExprNode ast and name disamb endpoint vs. foreach vars private final List todo = new LinkedList<>(); // HACK FIXME: to preserve "order" of state building -- cf. fvars hack for var scope @@ -56,14 +56,19 @@ public class RPCoreSTStateChanApiBuilder extends STStateChanApiBuilder // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) rp-core class later // Pre: variant.getName().equals(this.role) public RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, - Pair, Set> family, RPRoleVariant variant, EGraph graph) + Pair, Set> family, RPRoleVariant variant, EGraph graph, Map names) { - this(apigen, family, variant, graph, 2, Collections.emptyMap(), Collections.emptyMap(), Collections.emptySet()); + this(apigen, family, variant, graph, //2, + names, //Collections.emptyMap(), + Collections.emptySet()); } private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, Pair, Set> family, RPRoleVariant variant, EGraph graph, - int counter, Map names, Map imedNames, Set fvars) + //int counter, + Map names, + //Map imedNames, + Set fvars) // HACK FIXME -- make a "nested builder" -- problem is final this.graph // FIXME: probably easier to to make a "nested" constructor { @@ -93,9 +98,9 @@ private RPCoreSTStateChanApiBuilder(RPCoreSTApiGenerator apigen, this.msnds = mod.getNonProtocolDecls().stream() .filter(d -> (d instanceof MessageSigNameDecl)).map(d -> ((MessageSigNameDecl) d)).collect(Collectors.toSet()); - this.counter = counter; + //this.counter = counter; this.names.putAll(names); - this.imedNames.putAll(imedNames); + //this.imedNames.putAll(imedNames); this.fvars.addAll(fvars); } @@ -191,7 +196,9 @@ public Map build() // filepath -> source { RPCoreSTStateChanApiBuilder nested = new RPCoreSTStateChanApiBuilder( this.apigen, this.family, this.variant, g, - this.counter, this.names, this.imedNames, this.fvars); + //this.counter, + this.names, //this.imedNames, + this.fvars); res.putAll(nested.build()); } @@ -223,7 +230,7 @@ public String getStateChannelFilePath(String filename) protected Map buildForeachIntermediaryState(RPCoreEState s) { GProtocolName simpname = this.apigen.proto.getSimpleName(); - String scTypeName = this.getIntermediaryStateChanName(s); + String scTypeName = this.names.get(s.id); //this.getStateChanName(s); //this.getIntermediaryStateChanName(s); String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, this.variant); Map res = new HashMap<>(); @@ -244,15 +251,18 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) // Foreach method -- cf. RPCoreSTSessionApiBuilder, top-level Run String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; RPCoreEState init = s.getNested(); - String initName = "Init_" + init.id; + RPCoreEState term = (RPCoreEState) MState.getTerminal(init); + String initName = this.names.get(init.id); //"Init_" + init.id; + String termName = (term == null) ? "End" : this.names.get(term.id); String succName = s.isTerminal() ? "End" : getStateChanName(s); // FIXME: factor out + //getIntermediaryStateChanName(s); // Functionality subsumed by getStateChanName RPForeachVar p = s.getParam(); this.fvars.add(p); // HACK FIXME: state visiting order not guaranteed (w.r.t. lexical var scope) feach += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName - + ") Foreach(f func(*" + initName + ") End) *" + succName + " {\n" + + ") Foreach(f func(*" + initName + ") " + termName + ") *" + succName + " {\n" + "var " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + " error\n" + "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + p + " <= " + generateIndexExpr(s.getInterval().end) + "; " + p + " = " + p + " + 1 {\n" @@ -270,9 +280,12 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) res.put(getStateChannelFilePath(scTypeName), feach); - RPCoreEState term = (RPCoreEState) MState.getTerminal(init); + //RPCoreEState term = (RPCoreEState) MState.getTerminal(init); //res.putAll(new RPCoreSTStateChanApiBuilder(this.apigen, this.variant, new EGraph(init, term)).build()); - this.todo.add(new EGraph(init, term)); + if (term != null) + { + this.todo.add(new EGraph(init, term)); + } return res; } @@ -352,7 +365,7 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(this, a) - + ") *" //+ ab.getReturnType(this, curr, succ) + + ") *" //+ ab.getReturnType(this, curr, succ) // No: uses getStateChanName, which returns intermed name for nested states + getSuccStateChanName(succ) + " {\n" @@ -381,12 +394,13 @@ public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) protected String getSuccStateChanName(EState succ) { - RPCoreEState s = (RPCoreEState) succ; + /*RPCoreEState s = (RPCoreEState) succ; String name = s.hasNested() //? (s.isTerminal() ? getStateChanName(s) : getIntermediaryStateChanName(s)) // HACK FIXME -- first call to getStateChanName (intermed name not made yet) ? getIntermediaryStateChanName(s) : getStateChanName(s); //ab.getReturnType(this, curr, succ) - return name; + return name;*/ + return this.names.get(succ.id); } //protected String makeCreateSuccStateChan(STActionBuilder ab, EState curr, EState succ) @@ -427,10 +441,12 @@ public String getChannelName(STStateChanApiBuilder api, EAction a) // Not used? //return "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; } + // Super is used for both state chan type name (type decl and method receivers), and return type of actions + // Now, only using for state chan type name -- return type hardcoded to "base" name (via this.names) of successor @Override public String getStateChanName(EState s) { - String name = this.imedNames.get(s.id); + /*String name = this.imedNames.get(s.id); if (name == null) { RPCoreEState rps = (RPCoreEState) s; @@ -441,24 +457,34 @@ public String getStateChanName(EState s) name = name + "_"; // FIXME } this.names.put(s.id, name); + }*/ + if (!this.names.containsKey(s.id)) // Should not be needed, but do for debugging + { + throw new RuntimeException("[rp-core] Shouldn't get here: " + s); } - return this.names.get(s.id); + String n = this.names.get(s.id); + /*if (n.equals("Init")) + { + return n; + }*/ + return ((RPCoreEState) s).hasNested() ? n + "_" : n; } - public String getIntermediaryStateChanName(EState s) + /*public String getIntermediaryStateChanName(EState s) { - if (!this.names.containsKey(s.id)) + /*if (!this.names.containsKey(s.id)) { //throw new RuntimeException("Shouldn't get in here: " + s.id); // No: e.g., buildActionReturn, may refer to "ahead" state before that state is built getStateChanName(s); // HACK FIXME } - return this.imedNames.get(s.id); - } + return this.imedNames.get(s.id);* / + return getStateChanName(s) + "_"; + }*/ @Override protected String makeSTStateName(EState s) { - RPCoreEState rps = (RPCoreEState) s; + /*RPCoreEState rps = (RPCoreEState) s; String name = s.id == this.graph.init.id // Includes single (nested) state endpoint kinds (i.e, Init, not End) ? "Init_" + s.id // FIXME: factor out (makeInitStateName) : (s.isTerminal() @@ -467,7 +493,8 @@ protected String makeSTStateName(EState s) : //this.apigen.proto.getSimpleName() + "_" + ParamCoreSTEndpointApiGenerator.getGeneratedActualRoleName(this.actual) + "_" "State" + this.counter++); - return name; + return name;*/ + throw new RuntimeException("[rp-core] Shouldn't get in here: " + s); } /*public static String makeEndStateName(GProtocolName simpname, RPRoleVariant r) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPIndexedRole.java index 735fee001..a412b7e7c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPIndexedRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/name/RPIndexedRole.java @@ -5,6 +5,7 @@ import org.scribble.type.name.AbstractName; // Currently used for both "actual params" and int literals -- cf. ParamRoleParamRoleNode, and isConstant +@Deprecated // Not currently used -- FIXME: name clash with org.scribble.ext.go.core.type.RPIndexedRole public class RPIndexedRole extends AbstractName { public final RPIndexExpr start; From c79a18b5dffbd2ca4d386cb1c61ec098e716564f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 11 May 2018 18:56:26 +0100 Subject: [PATCH 300/433] [rp-core] Fixing tcp/shm transparency. --- .../ext/go/core/cli/RPCoreCLArgParser.java | 26 +++++++++++++++++-- .../statetype3/RPCoreSTApiGenerator.java | 6 +++-- .../RPCoreSTReceiveActionBuilder.java | 11 ++++---- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java index 21f19c16c..7584b3de4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java @@ -67,7 +67,18 @@ protected int parseFlag(int i) throws CommandLineException switch (flag) { // Unique flags - case RPCoreCLArgParser.RPCORE_PARAM_FLAG: return rpParsePackagePathAndParam(i); + case RPCoreCLArgParser.RPCORE_PARAM_FLAG: + { + if (this.rpParsed.containsKey(RPCoreCLArgFlag.RPCORE_API_GEN) + || Arrays.asList(this.args).stream().anyMatch(a -> a.equals(RPCoreCLArgParser.RPCORE_API_GEN_FLAG)) ) // HACK FIXME -- also subsumes above condition + { + return rpParseParamAndPackagePath(i); + } + else + { + return rpParseParam(i); + } + } case RPCoreCLArgParser.RPCORE_SELECT_BRANCH_FLAG: return rpParseSelectBranch(i); case RPCoreCLArgParser.RPCORE_NOCOPY_FLAG: return rpParseNoCopy(i); @@ -84,7 +95,18 @@ protected int parseFlag(int i) throws CommandLineException } } - private int rpParsePackagePathAndParam(int i) throws CommandLineException + private int rpParseParam(int i) throws CommandLineException + { + if ((i + 1) >= this.args.length) + { + throw new CommandLineException("Missing simple global protocol name argument."); + } + String proto = this.args[++i]; + rpCheckAndAddUniqueFlag(RPCoreCLArgParser.RPCORE_PARAM_FLAG, new String[] { proto }); + return i; + } + + private int rpParseParamAndPackagePath(int i) throws CommandLineException { if ((i + 2) >= this.args.length) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 0a6675f98..b118bed43 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -121,6 +121,7 @@ public int compare(Pair, Set> f1, Pair Collections.unmodifiableSet(e.getValue()) ))); + // FIXME: move into RPCoreSTSessionApiBuilder to avoid redundant work this.stateChanNames = Collections.unmodifiableMap(makeStateChanNames() .entrySet().stream().collect(Collectors.toMap( e -> e.getKey(), @@ -145,8 +146,9 @@ public Map build() throws ScribbleException Module mod = this.job.getContext().getModule(this.proto.getPrefix()); MessageIdCollector midcol = new MessageIdCollector(this.job, ((ModuleDel) mod.del()).getModuleContext()); ProtocolDecl gpd = mod.getProtocolDecl(this.proto.getSimpleName()); + // Duplicated from. SessionApiGeneration#constructOpClasses - gpd.accept(midcol); + /*gpd.accept(midcol); for (MessageId mid : midcol.getNames()) { String mname = mid.toString(); @@ -156,7 +158,7 @@ public Map build() throws ScribbleException throw new ScribbleException("[rpcore] [" + RPCoreCLArgParser.RPCORE_API_GEN_FLAG + "]" + " Message identifiers must start uppercase for Go accessibility: " + mname); } - } + }*/ RPCoreIndexVarCollector ivarcol = new RPCoreIndexVarCollector(this.job); gpd.accept(ivarcol); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 2b1def3cf..be8e86caf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -111,7 +111,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "}\n"; } - Function makeReceiveType = extName -> + Function makeReceivePayType = pt -> "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? + "if err = " + sEpRecv /*+ "[i]" // FIXME: use peer interval @@ -123,9 +123,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //+ "log.Fatal(err)\n" + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + "}\n" - //+ "arg0[i-" + start + "] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder - + "arg0[i-" + start + "] = tmp.(" + extName + ")\n"; // FIXME: gob pointer decoding seems flattened? ("*" dropped) - res += makeReceiveType.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); + + "arg0[i-" + start + "] = *(tmp.(*" + pt + "))\n"; // FIXME: doesn't work for gob, pointer decoding seems flattened? ("*" dropped) ... // Cf. ISend in RPCoreSTSendActionBuilder + //+ "arg0[i-" + start + "] = tmp.(" + pt + ")\n"; // FIXME: ... but doesn't work for shm + res += makeReceivePayType.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); } } else //if (a.mid.isMessageSigName()) @@ -140,8 +140,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //+ "log.Fatal(err)\n" + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + "}\n" - //+ "arg0[i-" + start + "] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder - + "arg0[i-" + start + "] = tmp.(" + extName + ")\n"; // FIXME: gob pointer decoding seems flattened? ("*" dropped) + + "arg0[i-" + start + "] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder res += makeReceiveExtName.apply(rpapi.getExtName((MessageSigName) a.mid)); } From cace503b39d458b9f7bbe1b6b168db75a12f6b55 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 12 May 2018 12:27:39 +0100 Subject: [PATCH 301/433] [rp-core] Added import exceptions to API gen for primitive pointer payloads. --- .../core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index f469cc362..62e2004d9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -340,7 +340,8 @@ public String makeMessageImports(EState s) s.getAllActions().stream() .filter(a -> a.mid.isOp()) .flatMap(a -> a.payload.elems.stream() - .filter(p -> !getExtName((DataType) p).matches("(\\[\\])*(int|string|byte)"))) + .filter(p -> !getExtName((DataType) p).matches("(\\[\\])*(int|string|byte)")) + .filter(p -> !getExtName((DataType) p).matches("(\\*)*(int|string|byte)"))) .map(p -> getExtSource((DataType) p)) .distinct()::iterator) { From dad007963e900f518d6df270b01ffa97065d3f37 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 12 May 2018 14:56:05 +0100 Subject: [PATCH 302/433] [rp-core] Adding state chan struct pre-creation/reuse optimisation. --- .../statetype3/RPCoreSTCaseActionBuilder.java | 3 +- .../RPCoreSTReceiveActionBuilder.java | 9 ++-- .../statetype3/RPCoreSTSendActionBuilder.java | 3 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 39 +++++++++++--- .../RPCoreSTStateChanApiBuilder.java | 53 +++++++++++++++++-- 5 files changed, 89 insertions(+), 18 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index 104700ed8..49edaa197 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -59,7 +59,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", 1, &tmp)" + "; err != nil {\n" //+ "log.Fatal(err)\n" - + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + + rpapi.makeReturnSuccStateChan(succ) + "\n" + "}\n" + "*arg0 = tmp.(" + extName + ")\n"; // N.B. *arg0 matches buildArgs diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index be8e86caf..3712a27e5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -107,7 +107,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &lab)" + "; err != nil {\n" //+ "log.Fatal(err)\n" - + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + + rpapi.makeReturnSuccStateChan(succ) + "\n" + "}\n"; } @@ -121,7 +122,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "; err != nil {\n" //+ "log.Fatal(err)\n" - + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + + rpapi.makeReturnSuccStateChan(succ) + "\n" + "}\n" + "arg0[i-" + start + "] = *(tmp.(*" + pt + "))\n"; // FIXME: doesn't work for gob, pointer decoding seems flattened? ("*" dropped) ... // Cf. ISend in RPCoreSTSendActionBuilder //+ "arg0[i-" + start + "] = tmp.(" + pt + ")\n"; // FIXME: ... but doesn't work for shm @@ -138,7 +140,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "; err != nil {\n" //+ "log.Fatal(err)\n" - + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + + rpapi.makeReturnSuccStateChan(succ) + "\n" + "}\n" + "arg0[i-" + start + "] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder res += makeReceiveExtName.apply(rpapi.getExtName((MessageSigName) a.mid)); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 0d5e7679d..2a590cae7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -89,7 +89,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "." + RPCoreSTApiGenConstants.GO_MPCHAN_ISEND + "(\"" + r.getName() + "\", i, &op)" + "; err != nil {\n" //+ "log.Fatal(err)\n" // FIXME - + "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + + rpapi.makeReturnSuccStateChan(succ) + "\n" + "}\n"; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 4615d5e3d..209a7440d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -209,7 +209,12 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + "Params map[string]int\n" // FIXME: currently used to record foreach params (and provide access to user) - //+ ...TODO: pre-create state chans + + this.apigen.stateChanNames.get(variant).keySet().stream().sorted().map(k -> + { + // FIXME TODO: case objects? + String n = this.apigen.stateChanNames.get(variant).get(k); + return "_" + n + " *" + n + "\n"; + }).collect(Collectors.joining()) + "}\n" @@ -222,13 +227,29 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + this.apigen.variants.entrySet().stream() .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + "make(map[int]transport.Channel)\n") .collect(Collectors.joining(""))*/ - + "return &" + epkindTypeName + "{p, self, &" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE - + "{}, " + RPCoreSTApiGenConstants.GO_MPCHAN_CONSTRUCTOR + "(self, "//conns)" //"params - + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "})" - + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + ", " - + "make(map[string]int)" + + "ep := &" + epkindTypeName + "{\n" + + "p,\n" + + "self,\n" + + "&" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "{},\n" + + RPCoreSTApiGenConstants.GO_MPCHAN_CONSTRUCTOR + "(self, "//conns)" //"params + + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "}),\n" + + ivars.stream().map(x -> x + ",\n").collect(Collectors.joining("")) + + "make(map[string]int),\n" // Trailing comma needed + + this.apigen.stateChanNames.get(variant).keySet().stream().map(k -> "nil,\n").collect(Collectors.joining()) + "}\n" - + "}\n"; + + this.apigen.stateChanNames.get(variant).keySet().stream().sorted().map(k -> + { + // FIXME TODO: case objects? + String n = this.apigen.stateChanNames.get(variant).get(k); + return (n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly + ? "ep._End = &End{ nil, ep }\n" + : "ep._" + n + " = &" + n + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ep }\n"; + // cf. state chan builder // CHECKME: reusing pre-created chan structs OK for Err handling? + } + ).collect(Collectors.joining()) + + "return ep\n"; + + epkindFile += "}\n"; // Dial/Accept methdos -- FIXME: internalise peers /*+ "\n" @@ -302,7 +323,9 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) ? "end := f(newBranch" + init + "(ini))\n" - : "end := f(&" + init + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse + : //"end := f(&" + init + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") + // cf. state chan builder // FIXME: chan struct reuse + "end := f(ini._" + init + ")\n") + "return &end\n" + "}"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 62e2004d9..567f66fc2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -275,7 +275,8 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse + "}\n" - + "return " + makeCreateSuccStateChan(s, succName) + "\n" + //+ "return " + makeCreateSuccStateChan(s, succName) + "\n" + + makeReturnSuccStateChan(s, succName) + "\n" + "}\n"; res.put(getStateChannelFilePath(scTypeName), feach); @@ -388,8 +389,9 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) public String buildActionReturn(STActionBuilder ab, EState curr, EState succ) { String res = ""; - res += "return " + //makeCreateSuccStateChan(ab, curr, succ); - makeCreateSuccStateChan(succ); + res += /*"return " + //makeCreateSuccStateChan(ab, curr, succ); + makeCreateSuccStateChan(succ);*/ + makeReturnSuccStateChan(succ); return res; } @@ -405,12 +407,14 @@ protected String getSuccStateChanName(EState succ) } //protected String makeCreateSuccStateChan(STActionBuilder ab, EState curr, EState succ) + @Deprecated protected String makeCreateSuccStateChan(EState succ) { String name = getSuccStateChanName(succ); return makeCreateSuccStateChan(succ, name); } + @Deprecated protected String makeCreateSuccStateChan(EState succ, String name) { String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; @@ -423,14 +427,53 @@ protected String makeCreateSuccStateChan(EState succ, String name) } else { - String res = "&" + name + "{ " + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ": " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + /*String res = "&" + name + "{ " + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ": " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + ", " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; if (!succ.isTerminal()) // FIXME: terminal foreach state { res += ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case } - res += " }"; + res += " }";*/ + String res = + /*"succ := " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "._" + name + "\n" + + "succ." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + RPCoreSTApiGenConstants.GO_MPCHAN_ERR + " = err\n" + + "return succ\n"*/ + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "._" + name; + return res; + } + } + + protected String makeReturnSuccStateChan(EState succ) + { + String name = getSuccStateChanName(succ); + return makeReturnSuccStateChan(succ, name); + } + + protected String makeReturnSuccStateChan(EState succ, String name) + { + String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; + if (((GoJob) this.job).selectApi && + getStateKind(succ) == RPCoreEStateKind.CROSS_RECEIVE && succ.getActions().size() > 1) + { + // Needs to be here (not in action builder) -- build (hacked) return for all state kinds + // FIXME: factor out with RPCoreSTSessionApiBuilder and RPCoreSTSelectStateBuilder#getPreamble + return "return newBranch" + name + "(" + sEp + ")"; + } + else + { + /*String res = "&" + name + "{ " + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ": " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + + ", " + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + sEp; + if (!succ.isTerminal()) // FIXME: terminal foreach state + { + res += ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case + } + res += " }";*/ + String res = + "succ := " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + name + "\n" + + "succ." + RPCoreSTApiGenConstants.GO_MPCHAN_ERR + " = err\n" + + "return succ"; return res; } } From 3a30982e16f6b13219e6d7e3766a8217ee278887 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 12 May 2018 15:05:36 +0100 Subject: [PATCH 303/433] [rp-core] Fixed branch/case action API gen bug for "type" payloads. --- .../codegen/statetype3/RPCoreSTBranchActionBuilder.java | 5 +++-- .../core/codegen/statetype3/RPCoreSTCaseActionBuilder.java | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 03cecf9be..74f6ad167 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -90,13 +90,14 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // Switch and return Cases value res += "\n" - + "switch lab {\n" + + "cast := *(lab.(*string))\n" + + "switch cast {\n" + as.stream().map(x -> "case \"" + x.mid + "\":\n" + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) //+ "{ Ept: s.Ept, Res: new(session.LinearResource) }\n" + "{" + ret + "}\n" ).collect(Collectors.joining("")) - + "default: panic(\"Shouldn't get in here: \" + lab.(string))\n" + + "default: panic(\"Shouldn't get in here: \" + cast)\n" + "}\n" + "return nil\n"; // FIXME: panic instead } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index 49edaa197..3494ae0da 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -51,7 +51,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "[\"" + peer.getName() + "\"]";*/ // Duplicated from RPCoreSTReceiveActionBuilder - Function makeCaseReceive = extName -> + Function makeCaseReceive = pt -> "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK: [] // N.B. *arg0 matches buildArgs + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval @@ -62,7 +62,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + rpapi.makeReturnSuccStateChan(succ) + "\n" + "}\n" - + "*arg0 = tmp.(" + extName + ")\n"; // N.B. *arg0 matches buildArgs + //+ "*arg0 = tmp.(" + extName + ")\n"; // N.B. *arg0 matches buildArgs + + "*arg0 = *(tmp.(*" + pt + "))\n"; // Cf. RPCoreSTReceiveActionBuilder // N.B. *arg0 matches buildArgs String res = ""; if (a.mid.isOp()) @@ -74,7 +75,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat throw new RuntimeException("[rp-core] [-param-api] TODO: " + a); } - res += makeCaseReceive.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); + res += makeCaseReceive.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); // Payload "type" } } else //if (a.mid.isMessageSigName()) From bdfb6f948ed8c381ca83435ebfcd06b94d2ef104 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 12 May 2018 15:33:31 +0100 Subject: [PATCH 304/433] [rp-core] Fixed state chan struct pre-creation on distinct chan types. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 51 ++++++++++++++----- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 209a7440d..92f01a93a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -209,10 +210,21 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + "Params map[string]int\n" // FIXME: currently used to record foreach params (and provide access to user) - + this.apigen.stateChanNames.get(variant).keySet().stream().sorted().map(k -> + // FIXME TODO: case objects? + + this.apigen.stateChanNames.get(variant).entrySet().stream().sorted( + new Comparator>() + { + @Override + public int compare(Entry o1, Entry o2) + { + return o1.getKey().compareTo(o2.getKey()); + } + } + ) + .map(e -> e.getValue()) + .distinct() + .map(n -> { - // FIXME TODO: case objects? - String n = this.apigen.stateChanNames.get(variant).get(k); return "_" + n + " *" + n + "\n"; }).collect(Collectors.joining()) @@ -235,18 +247,29 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "}),\n" + ivars.stream().map(x -> x + ",\n").collect(Collectors.joining("")) + "make(map[string]int),\n" // Trailing comma needed - + this.apigen.stateChanNames.get(variant).keySet().stream().map(k -> "nil,\n").collect(Collectors.joining()) + + this.apigen.stateChanNames.get(variant).values().stream().distinct().map(k -> "nil,\n").collect(Collectors.joining()) + "}\n" - + this.apigen.stateChanNames.get(variant).keySet().stream().sorted().map(k -> - { - // FIXME TODO: case objects? - String n = this.apigen.stateChanNames.get(variant).get(k); - return (n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly - ? "ep._End = &End{ nil, ep }\n" - : "ep._" + n + " = &" + n + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ep }\n"; - // cf. state chan builder // CHECKME: reusing pre-created chan structs OK for Err handling? - } - ).collect(Collectors.joining()) + + this.apigen.stateChanNames.get(variant).entrySet().stream().sorted( + new Comparator>() + { + @Override + public int compare(Entry o1, Entry o2) + { + return o1.getKey().compareTo(o2.getKey()); + } + } + ) + .map(e -> e.getValue()) + .distinct() + .map(n -> + { + // FIXME TODO: case objects? + return (n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly + ? "ep._End = &End{ nil, ep }\n" + : "ep._" + n + " = &" + n + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ep }\n"; + // cf. state chan builder // CHECKME: reusing pre-created chan structs OK for Err handling? + } + ).collect(Collectors.joining()) + "return ep\n"; epkindFile += "}\n"; From e4317a0121c0a4dc530f26164275a576af334a11 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 12 May 2018 20:36:21 +0100 Subject: [PATCH 305/433] [rp-core] Fixed state chan struct pre-creation for foreach intermed states. --- .../statetype3/RPCoreSTApiGenerator.java | 73 ++-------- .../statetype3/RPCoreSTSessionApiBuilder.java | 135 +++++++++++++++--- 2 files changed, 127 insertions(+), 81 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index b118bed43..751fee95b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -3,7 +3,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -15,7 +14,6 @@ import org.scribble.del.ModuleDel; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.cli.RPCoreCLArgParser; -import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.ext.go.main.GoJob; @@ -42,9 +40,6 @@ public class RPCoreSTApiGenerator public final Map, Set>, Integer> families; public final Map> peers; - public final Map> stateChanNames; // State2 - //private Map> foreachNames = new HashMap<>(); // State2_ intermediary name (N.B. RPCoreSTStateChanApiBuilder swaps them around for convenience) - public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module //public final Role self; public final List selfs; @@ -120,13 +115,6 @@ public int compare(Pair, Set> f1, Pair e.getKey(), e -> Collections.unmodifiableSet(e.getValue()) ))); - - // FIXME: move into RPCoreSTSessionApiBuilder to avoid redundant work - this.stateChanNames = Collections.unmodifiableMap(makeStateChanNames() - .entrySet().stream().collect(Collectors.toMap( - e -> e.getKey(), - e -> Collections.unmodifiableMap(e.getValue()))) - ); } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later @@ -148,7 +136,7 @@ public Map build() throws ScribbleException ProtocolDecl gpd = mod.getProtocolDecl(this.proto.getSimpleName()); // Duplicated from. SessionApiGeneration#constructOpClasses - /*gpd.accept(midcol); + gpd.accept(midcol); for (MessageId mid : midcol.getNames()) { String mname = mid.toString(); @@ -158,7 +146,7 @@ public Map build() throws ScribbleException throw new ScribbleException("[rpcore] [" + RPCoreCLArgParser.RPCORE_API_GEN_FLAG + "]" + " Message identifiers must start uppercase for Go accessibility: " + mname); } - }*/ + } RPCoreIndexVarCollector ivarcol = new RPCoreIndexVarCollector(this.job); gpd.accept(ivarcol); @@ -173,7 +161,7 @@ public Map build() throws ScribbleException } // Build Session API (Protocol and Endpoint types) and State Channel API - makeStateChanNames(); + //makeStateChanNames(); Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); for (Role self : this.selfs) @@ -191,12 +179,16 @@ public Map build() throws ScribbleException } return res; } + + private Map> stateChanNames = new HashMap<>(); //@Override public Map buildSessionApi() // FIXME: factor out { this.job.debugPrintln("\n[rp-core] Running " + RPCoreSTSessionApiBuilder.class + " for " + this.proto + "@" + this.selfs); - return new RPCoreSTSessionApiBuilder(this).build(); + RPCoreSTSessionApiBuilder b = new RPCoreSTSessionApiBuilder(this); + this.stateChanNames.putAll(b.stateChanNames); + return b.build(); } public Map buildStateChannelApi( @@ -206,55 +198,6 @@ public Map buildStateChannelApi( return new RPCoreSTStateChanApiBuilder(this, family, variant, graph, this.stateChanNames.get(variant)).build(); } - private Map> makeStateChanNames() - { - Map> names = new HashMap<>(); - for (Entry e : (Iterable>) - this.variants.values().stream().flatMap(v -> v.entrySet().stream())::iterator) - { - int[] counter = {2}; - RPRoleVariant v = e.getKey(); - EGraph g = e.getValue(); - - Map curr = new HashMap<>(); - //Map inames = new HashMap<>(); - names.put(v, curr); - //this.foreachNames.put(v, inames); - Set rs = RPCoreEState.getReachableStates((RPCoreEState) g.init); // FIXME: cast needed to select correct static - rs.add((RPCoreEState) g.init); // Adding for following loop; removed again later - for (RPCoreEState s : new HashSet<>(rs)) - { - if (s.hasNested()) // Nested inits - { - RPCoreEState nested = s.getNested(); - curr.put(nested.id, "Init_" + nested.id); - rs.remove(nested); - } - } - // Handling top-level init/end must come after handling nested - curr.put(g.init.id, "Init"); - rs.remove(g.init); - if (g.term != null && g.term.id != g.init.id) - { - rs.remove(g.term); // Remove top-level term from rs - curr.put(g.term.id, "End"); - } - rs.forEach(s -> - { - String n = s.isTerminal() - ? (s.hasNested() ? "End_" + s.id : "End") // Nested or "regular" term - : "State" + counter[0]++; - /*if (s.hasNested()) - { - inames.put(s.id, n); - n = n + "_"; - }*/ - curr.put(s.id, n); - }); - } - return names; - } - //@Override public String getApiRootPackageName() // Derives only from simple proto name { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 92f01a93a..24a3a5078 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -1,7 +1,9 @@ package org.scribble.ext.go.core.codegen.statetype3; +import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -11,21 +13,32 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; +import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; import org.scribble.util.Pair; +// Build Session API for this.apigen.selfs // RP Session API = Protocol API + Endpoint Kind APIs // Cf. STStateChanApiBuilder public class RPCoreSTSessionApiBuilder { + /*... move stateChanNames (and peers?) here + ... cache reachable states, use for state chan pre-creation (to include intermed states -- and case objects?) + ... do "global" linearity counter*/ + + protected final Map> reachable = new HashMap<>(); + protected final Map> stateChanNames; // State2 + //private Map> foreachNames = new HashMap<>(); // State2_ intermediary name (N.B. RPCoreSTStateChanApiBuilder swaps them around for convenience) + private RPCoreSTApiGenerator apigen; - public static final Comparator IVAR_COMP = new Comparator() + private static final Comparator IVAR_COMP = new Comparator() { @Override public int compare(RPIndexVar i1, RPIndexVar i2) @@ -33,10 +46,79 @@ public int compare(RPIndexVar i1, RPIndexVar i2) return i1.toString().compareTo(i2.toString()); } }; + + private static final Comparator ESTATE_COMP = new Comparator() + { + @Override + public int compare(RPCoreEState o1, RPCoreEState o2) + { + return new Integer(o1.id).compareTo(o2.id); + } + }; - public RPCoreSTSessionApiBuilder(RPCoreSTApiGenerator apigen) +public RPCoreSTSessionApiBuilder(RPCoreSTApiGenerator apigen) { this.apigen = apigen; + + this.stateChanNames = Collections.unmodifiableMap(makeStateChanNames() + .entrySet().stream().collect(Collectors.toMap( + e -> e.getKey(), + e -> Collections.unmodifiableMap(e.getValue()))) + ); + } + + private Map> makeStateChanNames() + { + Map> names = new HashMap<>(); + for (Entry e : (Iterable>) + this.apigen.selfs.stream() + .map(r -> this.apigen.variants.get(r)) + .flatMap(v -> v.entrySet().stream())::iterator) + { + int[] counter = {2}; + RPRoleVariant v = e.getKey(); + EGraph g = e.getValue(); + + Map curr = new HashMap<>(); + //Map inames = new HashMap<>(); + names.put(v, curr); + //this.foreachNames.put(v, inames); + Set rs = RPCoreEState.getReachableStates((RPCoreEState) g.init); // FIXME: cast needed to select correct static + rs.add((RPCoreEState) g.init); // Adding for following loop; removed again later + + this.reachable.put(v, Collections.unmodifiableSet(new HashSet<>(rs))); + + for (RPCoreEState s : new HashSet<>(rs)) + { + if (s.hasNested()) // Nested inits + { + RPCoreEState nested = s.getNested(); + curr.put(nested.id, "Init_" + nested.id); + rs.remove(nested); + } + } + // Handling top-level init/end must come after handling nested + curr.put(g.init.id, "Init"); + rs.remove(g.init); + if (g.term != null && g.term.id != g.init.id) + { + rs.remove(g.term); // Remove top-level term from rs + curr.put(g.term.id, "End"); + } + rs.forEach(s -> + { + String n = s.isTerminal() + ? (s.hasNested() ? "End_" + s.id : "End") // Nested or "regular" term + : "State" + counter[0]++; + /*if (s.hasNested()) + { + inames.put(s.id, n); + n = n + "_"; + }*/ + curr.put(s.id, n); + }); + } + return names; } //@Override @@ -210,8 +292,9 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + "Params map[string]int\n" // FIXME: currently used to record foreach params (and provide access to user) + // FIXME TODO: foreach intermed states // FIXME TODO: case objects? - + this.apigen.stateChanNames.get(variant).entrySet().stream().sorted( + /*+ this.apigen.stateChanNames.get(variant).entrySet().stream().sorted( new Comparator>() { @Override @@ -220,8 +303,16 @@ public int compare(Entry o1, Entry o2) return o1.getKey().compareTo(o2.getKey()); } } - ) - .map(e -> e.getValue()) + )*/ + + this.reachable.get(variant).stream().sorted(ESTATE_COMP) + //.map(s -> this.stateChanNames.get(s.id)) + .flatMap(s -> + { + String n = this.stateChanNames.get(variant).get(s.id); + return s.hasNested() + ? Stream.of(n, s.isTerminal() ? "End" : n + "_") // FIXME: factor out with RPCoreSTStateChanApiBuilder#getStateChanName + : Stream.of(n); + }) .distinct() .map(n -> { @@ -247,22 +338,33 @@ public int compare(Entry o1, Entry o2) + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "}),\n" + ivars.stream().map(x -> x + ",\n").collect(Collectors.joining("")) + "make(map[string]int),\n" // Trailing comma needed - + this.apigen.stateChanNames.get(variant).values().stream().distinct().map(k -> "nil,\n").collect(Collectors.joining()) + + //+ this.apigen.stateChanNames.get(variant).values().stream().distinct().map(k -> "nil,\n").collect(Collectors.joining()) + + this.reachable.get(variant).stream().sorted(ESTATE_COMP) + .flatMap(s -> + { + String n = this.stateChanNames.get(variant).get(s.id); + return s.hasNested() + ? Stream.of(n, s.isTerminal() ? "End" : n + "_") // FIXME: factor out with RPCoreSTStateChanApiBuilder#getStateChanName + : Stream.of(n); + }) + .distinct() + .map(k -> "nil,\n").collect(Collectors.joining()) + + "}\n" - + this.apigen.stateChanNames.get(variant).entrySet().stream().sorted( - new Comparator>() - { - @Override - public int compare(Entry o1, Entry o2) + + + this.reachable.get(variant).stream().sorted(ESTATE_COMP) + .flatMap(s -> { - return o1.getKey().compareTo(o2.getKey()); - } - } - ) - .map(e -> e.getValue()) + String n = this.stateChanNames.get(variant).get(s.id); + return s.hasNested() + ? Stream.of(n, s.isTerminal() ? "End" : n + "_") // FIXME: factor out with RPCoreSTStateChanApiBuilder#getStateChanName + : Stream.of(n); + }) .distinct() .map(n -> { + // FIXME TODO: foreach intermed states // FIXME TODO: case objects? return (n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly ? "ep._End = &End{ nil, ep }\n" @@ -270,6 +372,7 @@ public int compare(Entry o1, Entry o2) // cf. state chan builder // CHECKME: reusing pre-created chan structs OK for Err handling? } ).collect(Collectors.joining()) + + "return ep\n"; epkindFile += "}\n"; From 9dd6c537d3b34ee20bbbdd7b7780c4932648ec8a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 12 May 2018 21:08:16 +0100 Subject: [PATCH 306/433] [rp-core] Fixed branch action API gen for "sig" messages. --- .../codegen/statetype3/RPCoreSTBranchActionBuilder.java | 4 ++-- .../core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 74f6ad167..734e51787 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -117,9 +117,9 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat res += "\n" + "switch x := msg.(type) {\n" + as.stream().map(x -> - "case " + ((RPCoreSTStateChanApiBuilder) api).getExtName((MessageSigName) x.mid) + ":\n" + "case *" + ((RPCoreSTStateChanApiBuilder) api).getExtName((MessageSigName) x.mid) + ":\n" + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) + " { " - + ret + ", msg: &x }\n" + + ret + ", msg: x }\n" ).collect(Collectors.joining("")) + "default: panic(\"Shouldn't get in here: \" + reflect.TypeOf(msg).String())\n" + "}\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 24a3a5078..78acfd721 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -292,8 +292,6 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + "Params map[string]int\n" // FIXME: currently used to record foreach params (and provide access to user) - // FIXME TODO: foreach intermed states - // FIXME TODO: case objects? /*+ this.apigen.stateChanNames.get(variant).entrySet().stream().sorted( new Comparator>() { @@ -304,6 +302,7 @@ public int compare(Entry o1, Entry o2) } } )*/ + // FIXME TODO: case objects? + this.reachable.get(variant).stream().sorted(ESTATE_COMP) //.map(s -> this.stateChanNames.get(s.id)) .flatMap(s -> @@ -340,6 +339,7 @@ public int compare(Entry o1, Entry o2) + "make(map[string]int),\n" // Trailing comma needed //+ this.apigen.stateChanNames.get(variant).values().stream().distinct().map(k -> "nil,\n").collect(Collectors.joining()) + // FIXME: factor out with above + this.reachable.get(variant).stream().sorted(ESTATE_COMP) .flatMap(s -> { @@ -353,6 +353,7 @@ public int compare(Entry o1, Entry o2) + "}\n" + // FIXME: factor out with above + this.reachable.get(variant).stream().sorted(ESTATE_COMP) .flatMap(s -> { @@ -364,7 +365,6 @@ public int compare(Entry o1, Entry o2) .distinct() .map(n -> { - // FIXME TODO: foreach intermed states // FIXME TODO: case objects? return (n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly ? "ep._End = &End{ nil, ep }\n" From c35e60c5f48ee818c3f2159fae6fa7075a77a455 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 12 May 2018 22:39:58 +0100 Subject: [PATCH 307/433] [rp-core] Partly updated API gen to "global" counter linearity -- TODO: case objects (in conjunction with pre-creation). --- .../RPCoreSTBranchActionBuilder.java | 12 +++- .../statetype3/RPCoreSTEndStateBuilder.java | 3 + .../statetype3/RPCoreSTSessionApiBuilder.java | 20 +++++-- .../RPCoreSTStateChanApiBuilder.java | 60 +++++++++++++++---- 4 files changed, 75 insertions(+), 20 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 734e51787..8d3af3f7c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -27,8 +27,16 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" + "panic(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ")\n" + "}\n" - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE - + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + + /*+ RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"*/ + + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + "id != " // Not using atomic.LoadUint64 on id for now + //+ "atomic.LoadUint64(&" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin)" + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin" + + " {\n" + + "panic(\"Linear resource already used\")\n" // + reflect.TypeOf(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "))\n" + + "}\n" + + buildBody(api, curr, a, succ) + "\n" + "}"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java index b7dead991..dd14df5c0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java @@ -29,6 +29,9 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + "\n" + "type " + scTypeName + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" + + + "id uint64\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(api.gpn.getSimpleName(), schangen.variant) + "\n" // FIXME: factor out + "}"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 78acfd721..ecb914991 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -286,7 +286,10 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + "type " + epkindTypeName + " struct {\n" + RPCoreSTApiGenConstants.GO_MPCHAN_PROTO + " " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + "\n" + "Self int\n" - + "*" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + + + "*" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" // This is for the Endpoint itself + + "lin uint64\n" + + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + " *" + RPCoreSTApiGenConstants.GO_MPCHAN_TYPE + "\n" + ivars.stream().map(x -> x + " int\n").collect(Collectors.joining("")) @@ -332,7 +335,10 @@ public int compare(Entry o1, Entry o2) + "ep := &" + epkindTypeName + "{\n" + "p,\n" + "self,\n" - + "&" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "{},\n" + + + "&" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "{},\n" // For Endpoint itself + + "1,\n" + + RPCoreSTApiGenConstants.GO_MPCHAN_CONSTRUCTOR + "(self, "//conns)" //"params + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "}),\n" + ivars.stream().map(x -> x + ",\n").collect(Collectors.joining("")) @@ -367,8 +373,11 @@ public int compare(Entry o1, Entry o2) { // FIXME TODO: case objects? return (n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly - ? "ep._End = &End{ nil, ep }\n" - : "ep._" + n + " = &" + n + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ep }\n"; + ? "ep._End = &End{ nil, 0, ep }\n" // Now same as below? + : "ep._" + n + " = &" + n + "{ nil," + //+ " new(RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE)," + + (n.equals("Init") ? " 1," : " 0,") + + " ep }\n"; // cf. state chan builder // CHECKME: reusing pre-created chan structs OK for Err handling? } ).collect(Collectors.joining()) @@ -451,7 +460,8 @@ public int compare(Entry o1, Entry o2) ? "end := f(newBranch" + init + "(ini))\n" : //"end := f(&" + init + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse - "end := f(ini._" + init + ")\n") + //"ini._" + init + ".id = 1\n" + + "end := f(ini._" + init + ")\n") + "return &end\n" + "}"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 567f66fc2..22aefe629 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -237,14 +237,17 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) String feach = "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) + "\n" - + "\n" - + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; + + "\n"; + //+ "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; // State channel type feach += "\n" + "type " + scTypeName + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" - + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + "id uint64\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + "}\n"; @@ -269,10 +272,16 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) //+ sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? + sEp + ".Params[\"" + p + "\"] = " + p + "\n" // FIXME: nested Endpoint type/struct? - // Duplicated from RPCoreSTSessionApiBuilder // FIXME: factor out - + ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) + // Duplicated from RPCoreSTSessionApiBuilder // FIXME: factor out with makeReturnSuccStateChan + /*+ ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) ? "f(newBranch" + initName + "(ini))\n" - : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse + : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse*/ + + "succ := " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + initName + "\n" + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + + "succ.id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" + + "succ." + RPCoreSTApiGenConstants.GO_MPCHAN_ERR + " = err\n" + + "f(succ)\n" + "}\n" //+ "return " + makeCreateSuccStateChan(s, succName) + "\n" @@ -300,8 +309,8 @@ protected String getStateChanPremable(EState s) String res = "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) + "\n" - + "\n" - + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; + + "\n"; + //+ "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; // FIXME: error handling via Err field -- fallback should be panic //+ "import \"log\"\n"; @@ -316,18 +325,28 @@ protected String getStateChanPremable(EState s) // FIXME: still needed? -- refactor back into state-specific builders? if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) { - res += "import \"sort\"\n"; + res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; + + res += "import \"sync/atomic\"\n"; res += "import \"reflect\"\n"; + res += "import \"sort\"\n"; res += "\n"; - res += "var _ = sort.Sort\n"; + + res += "var _ = session2.NewMPChan\n"; + + res += "var _ = atomic.AddUint64\n"; res += "var _ = reflect.TypeOf\n"; + res += "var _ = sort.Sort\n"; } // State channel type res += "\n" + "type " + scTypeName + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" - + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + "id uint64\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + "}\n"; @@ -376,8 +395,20 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) + "panic(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ")\n" + "}\n" - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE - + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + // HACK FIXME: pre-create case objects + + ((ab instanceof RPCoreSTCaseActionBuilder) + ? RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" + : "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + "id != " // Not using atomic.LoadUint64 on id for now + //+ "atomic.LoadUint64(&" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin)" + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin" + + " {\n" + + "panic(\"Linear resource already used\")\n" // + reflect.TypeOf(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "))\n" + + "}\n" + ) + /*+ "atomic.AddUint64(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + + "." + "lin" + ")\n"*/ + + "var " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + " error\n" + ab.buildBody(this, curr, a, succ) + "\n" + "}"; @@ -472,6 +503,9 @@ protected String makeReturnSuccStateChan(EState succ, String name) res += " }";*/ String res = "succ := " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + name + "\n" + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + + "succ.id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" + "succ." + RPCoreSTApiGenConstants.GO_MPCHAN_ERR + " = err\n" + "return succ"; return res; From 0d3d7d2294059af18c5d9e7a2b47eec552a2c25d Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Tue, 5 Jun 2018 23:58:09 +0100 Subject: [PATCH 308/433] Use error field directly instead of local err var. --- .../statetype3/RPCoreSTApiGenConstants.java | 3 +-- .../RPCoreSTReceiveActionBuilder.java | 17 ++++++++++------ .../statetype3/RPCoreSTSendActionBuilder.java | 20 ++++++++++++------- .../RPCoreSTStateChanApiBuilder.java | 2 -- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index 8f74a403e..26c8c7dac 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -60,8 +60,7 @@ public class RPCoreSTApiGenConstants public static final String GO_SCHAN_END_TYPE = "End"; public static final String GO_IO_METHOD_RECEIVER = "s"; - public static final String GO_IO_METHOD_ERROR = "err"; - + public static final String GO_CROSS_SPLIT_FUN_PREFIX = "Split"; public static final String GO_CROSS_SEND_FUN_PREFIX = "Send"; public static final String GO_CROSS_SEND_METHOD_ARG = "arg"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 3712a27e5..7dfe19b98 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -89,6 +89,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // For payloads -- FIXME: currently hardcoded for exactly one payload + String errorField = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + + "_" + rpapi.getSuccStateChanName(succ) + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_ERR; + if (a.mid.isOp()) { if (!a.payload.elems.isEmpty()) @@ -101,11 +106,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //if (!a.mid.toString().equals("")) // HACK FIXME? // Now redundant, -param-api checks mid starts uppercase { res += "var lab interface{}\n" // string // var decl needed for deserialization -- FIXME? - + "if err = " + sEpRecv /*+ "[i]" + + "if " + errorField + " = " + sEpRecv /*+ "[i]" + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&lab" + ")" + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_STRING + "()"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &lab)" - + "; err != nil {\n" + + "; " + errorField + " != nil {\n" //+ "log.Fatal(err)\n" //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + rpapi.makeReturnSuccStateChan(succ) + "\n" @@ -115,12 +120,12 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat Function makeReceivePayType = pt -> "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? - + "if err = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + + "if " + errorField + " = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &tmp)" - + "; err != nil {\n" + + "; " + errorField + " != nil {\n" //+ "log.Fatal(err)\n" //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + rpapi.makeReturnSuccStateChan(succ) + "\n" @@ -134,11 +139,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { Function makeReceiveExtName = extName -> "var tmp " + RPCoreSTApiGenConstants.GO_SCRIBMESSAGE_TYPE + "\n" // var tmp needed for deserialization -- FIXME? - + "if err = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + + "if " + errorField + " = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", i, &tmp)" - + "; err != nil {\n" + + "; " + errorField + " != nil {\n" //+ "log.Fatal(err)\n" //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + rpapi.makeReturnSuccStateChan(succ) + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 2a590cae7..5c565a5bb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -77,17 +77,22 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat String res = "for i, j := " + rpapi.generateIndexExpr(d.start) + ", 0;" + " i <= " + rpapi.generateIndexExpr(d.end)+"; i, j = i+1, j+1 {\n"; + String errorField = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + + "_" + rpapi.getSuccStateChanName(succ) + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_ERR; + if (a.mid.isOp()) { // Write label if (!a.mid.toString().equals("")) { // HACK FIXME? res += "op := \"" + a.mid + "\"\n" // FIXME: API constant? - + "if err = " + sEpWrite /*+ "[i]" + + "if " + errorField + " = " + sEpWrite /*+ "[i]" + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_STRING + "(\"" + a.mid + "\"" + ")" */ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_ISEND + "(\"" + r.getName() + "\", i, &op)" - + "; err != nil {\n" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_ISEND + "(\"" + r.getName() + "\", i, &op)" + + "; " + errorField + " != nil {\n" //+ "log.Fatal(err)\n" // FIXME //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + rpapi.makeReturnSuccStateChan(succ) + "\n" @@ -121,10 +126,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n";*/ - res += "err = " + sEpWrite - + "." - + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) - + "(\"" + r.getName() + "\", i, &arg0[j])\n"; + res += errorField + " = " + + sEpWrite + + "." + + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) + + "(\"" + r.getName() + "\", i, &arg0[j])\n"; } res += "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 22aefe629..139ccd63f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -266,7 +266,6 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) feach += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + ") Foreach(f func(*" + initName + ") " + termName + ") *" + succName + " {\n" - + "var " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + " error\n" + "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + p + " <= " + generateIndexExpr(s.getInterval().end) + "; " + p + " = " + p + " + 1 {\n" //+ sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? @@ -409,7 +408,6 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) /*+ "atomic.AddUint64(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin" + ")\n"*/ - + "var " + RPCoreSTApiGenConstants.GO_IO_METHOD_ERROR + " error\n" + ab.buildBody(this, curr, a, succ) + "\n" + "}"; } From cdbd3bf1cd1b7a36972928b4aca7a646ab115f3b Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Tue, 5 Jun 2018 23:59:50 +0100 Subject: [PATCH 309/433] Use state field directly instead of 'succ'. --- .../RPCoreSTStateChanApiBuilder.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 139ccd63f..9bd1381dc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -260,9 +260,10 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) String succName = s.isTerminal() ? "End" : getStateChanName(s); // FIXME: factor out //getIntermediaryStateChanName(s); // Functionality subsumed by getStateChanName RPForeachVar p = s.getParam(); - + this.fvars.add(p); // HACK FIXME: state visiting order not guaranteed (w.r.t. lexical var scope) - + + String initState = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + initName; feach += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + ") Foreach(f func(*" + initName + ") " + termName + ") *" + succName + " {\n" @@ -275,11 +276,9 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) /*+ ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) ? "f(newBranch" + initName + "(ini))\n" : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse*/ - + "succ := " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + initName + "\n" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" - + "succ.id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" - + "succ." + RPCoreSTApiGenConstants.GO_MPCHAN_ERR + " = err\n" + + initState +".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" + "f(succ)\n" + "}\n" @@ -499,24 +498,22 @@ protected String makeReturnSuccStateChan(EState succ, String name) + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case } res += " }";*/ - String res = - "succ := " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + name + "\n" - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" - + "succ.id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" - + "succ." + RPCoreSTApiGenConstants.GO_MPCHAN_ERR + " = err\n" - + "return succ"; + String nextState = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + name; + String res = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + + nextState + ".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" + + "return "+ nextState + "\n"; return res; } } - + @Override public String getChannelName(STStateChanApiBuilder api, EAction a) // Not used? { throw new RuntimeException("[rp-core] Shouldn't get in here: " + a); //return "s.ep.GetChan(s.ep.Proto.(*" + api.gpn.getSimpleName() + ")." + a.peer + ")"; } - + // Super is used for both state chan type name (type decl and method receivers), and return type of actions // Now, only using for state chan type name -- return type hardcoded to "base" name (via this.names) of successor @Override From c2b7c90ef5e499078c9e9d2d228718507b252629 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Wed, 6 Jun 2018 00:13:28 +0100 Subject: [PATCH 310/433] Fix foreach body function parameter - The parameter should be the state field not 'succ' --- .../go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 9bd1381dc..39549187b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -279,7 +279,7 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + initState +".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" - + "f(succ)\n" + + "f(" + initState + ")\n" + "}\n" //+ "return " + makeCreateSuccStateChan(s, succName) + "\n" From 92724dbc309fc99e9b08db1a093819377455a5d9 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Wed, 6 Jun 2018 00:14:44 +0100 Subject: [PATCH 311/433] minor: source code align --- .../go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 39549187b..59ac4aead 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -277,7 +277,7 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) ? "f(newBranch" + initName + "(ini))\n" : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse*/ + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + initState +".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" + "f(" + initState + ")\n" From d9f4d7fca28cab64f30b6d586a2b100bd1c6d006 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Mon, 9 Jul 2018 22:35:02 +0100 Subject: [PATCH 312/433] Change End state to return value not pointer. This reduces unnecessary allocation for the end state. --- .../core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index ecb914991..33d93aee6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -449,7 +449,7 @@ public int compare(Entry o1, Entry o2) String init = //"Init_" + this.apigen.variants.get(variant.getName()).get(variant).init; "Init"; epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") Run(f func(*" + init + ") " + endName + ") *" + endName + " {\n" // f specifies non-pointer End + + "func (ini *" + epkindTypeName + ") Run(f func(*" + init + ") " + endName + ") " + endName + " {\n" // f specifies non-pointer End + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".Close()\n" + "ini.Use()\n" // FIXME: int-counter linearity + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".CheckConnection()\n" @@ -457,13 +457,12 @@ public int compare(Entry o1, Entry o2) // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) - ? "end := f(newBranch" + init + "(ini))\n" + ? "return f(newBranch" + init + "(ini))\n" : //"end := f(&" + init + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse //"ini._" + init + ".id = 1\n" + - "end := f(ini._" + init + ")\n") + "return f(ini._" + init + ")\n") - + "return &end\n" + "}"; res.put(getEndpointKindFilePath(family, variant) From 65b3d615ea5d487c6ee7d44b0e0d0fe3e26a6fca Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Mon, 9 Jul 2018 22:46:53 +0100 Subject: [PATCH 313/433] Adds connection counting for Dial/Accept function. Connection counting is used to ensure connection initiated are established before they are being used, and works as a synchronisation between (locally initiated) goroutines. --- .../core/codegen/statetype3/RPCoreSTApiGenConstants.java | 1 + .../codegen/statetype3/RPCoreSTSessionApiBuilder.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index 26c8c7dac..f1f6eb5ce 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -18,6 +18,7 @@ public class RPCoreSTApiGenConstants public static final String GO_MPCHAN_FINALISE = "Finalise"; public static final String GO_MPCHAN_SESSCHAN = "MPChan"; public static final String GO_MPCHAN_PARAMS = "Params"; + public static final String GO_MPCHAN_CONN_WG = "ConnWg"; // Counts initiated but unestablished connection public static final String GO_MPCHAN_CONN_MAP = "Conns"; public static final String GO_MPCHAN_FORMATTER_MAP = "Fmts"; public static final String GO_MPCHAN_MSEND = "MSend"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index ecb914991..af577e67a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -416,6 +416,10 @@ public int compare(Entry o1, Entry o2) + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int" + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" + "c, err := ss.Accept()\n" + "sfmt.Wrap(c)\n" + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." @@ -429,6 +433,10 @@ public int compare(Entry o1, Entry o2) + ", host string, port int" + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" + "c, err := dialler(host, port)\n" + "sfmt.Wrap(c)\n" + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." From 78c12192532e9e49e99248c4475a1a502d942d14 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 10 Sep 2018 15:27:47 +0100 Subject: [PATCH 314/433] Adding rp-core variant delegation. --- .../del/global/GDelegationElemDel.java | 8 +- .../scribble/type/name/GDelegationType.java | 10 +- .../org/scribble/parser/antlr/ParamScribble.g | 17 ++-- .../org/scribble/ext/go/ast/RPAstFactory.java | 11 ++- .../scribble/ext/go/ast/RPAstFactoryImpl.java | 29 +++++- .../ext/go/ast/global/RPGDelegationElem.java | 99 +++++++++++++++++++ .../ext/go/core/ast/RPCoreAstFactory.java | 1 + .../ext/go/core/ast/RPCoreDelegDecl.java | 6 +- .../global/RPCoreGProtocolDeclTranslator.java | 9 ++ .../ext/go/core/cli/RPCoreCommandLine.java | 3 + .../RPCoreSTStateChanApiBuilder.java | 2 +- .../core/type/name/RPCoreGDelegationType.java | 61 ++++++++++++ .../parser/scribble/RPAntlrToScribParser.java | 14 ++- .../scribble/ast/RPAntlrPayloadElemList.java | 64 ++++++++++++ .../scribble/ast/RPCoreAntlrDelegDecl.java | 5 +- .../src/test/scrib/param/tmp/ParamTest.scr | 17 +++- 16 files changed, 327 insertions(+), 29 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java diff --git a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java index ba9656a43..e3094f7d3 100644 --- a/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java +++ b/scribble-core/src/main/java/org/scribble/del/global/GDelegationElemDel.java @@ -95,7 +95,7 @@ public void leaveMessageTransferInProtocolDeclContextBuilding(MessageTransfer { GProtocolName gpn = de.proto.toName(); // leaveDisambiguation has fully qualified the target name builder.addGlobalProtocolDependency(mt.src.toName(), gpn, de.role.toName()); // FIXME: does it make sense to use projection role as dependency target role? (seems to be used for Job.getProjections) - mt.getDestinationRoles().forEach((r) -> builder.addGlobalProtocolDependency(r, gpn, de.role.toName())); + mt.getDestinationRoles().forEach(r -> builder.addGlobalProtocolDependency(r, gpn, de.role.toName())); } @Override @@ -115,7 +115,7 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, D // FIXME: does this already contain transitive do-dependencies? But doesn't contain transitive delegation-dependencies..? Set init = ((GProtocolDeclDel) targetgpd.del()).getProtocolDeclContext().getDependencyMap().getDependencies() - .values().stream().flatMap((v) -> v.keySet().stream()).collect(Collectors.toSet()); + .values().stream().flatMap(v -> v.keySet().stream()).collect(Collectors.toSet()); todo.addAll(init); Set seen = new HashSet<>(); @@ -134,8 +134,8 @@ public void enterDelegationProtocolRefCheck(ScribNode parent, ScribNode child, D ProtocolDecl nextgpd = checker.job.getContext().getModule(targetfullname.getPrefix()).getProtocolDecl(nextfullname.getSimpleName()); Set tmp = ((GProtocolDeclDel) nextgpd.del()).getProtocolDeclContext().getDependencyMap().getDependencies() - .values().stream().flatMap((v) -> v.keySet().stream()) - .filter((n) -> !seen.contains(n)) + .values().stream().flatMap(v -> v.keySet().stream()) + .filter(n -> !seen.contains(n)) .collect(Collectors.toSet()); todo.addAll(tmp); } diff --git a/scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java b/scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java index 64a9dfd8d..05258ab4a 100644 --- a/scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java +++ b/scribble-core/src/main/java/org/scribble/type/name/GDelegationType.java @@ -23,14 +23,20 @@ public class GDelegationType implements PayloadElemType, Serializable { private static final long serialVersionUID = 1L; - private GProtocolName proto; // Cannot be final, for Serializable - private Role role; + protected GProtocolName proto; // Cannot be final, for Serializable + protected Role role; public GDelegationType(GProtocolName proto, Role role) { this.proto = proto; this.role = role; } + + @Override + public String toString() + { + return this.proto + "@" + this.role; + } @Override public boolean isGDelegationType() diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index c9af250ae..bf750c664 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -106,7 +106,8 @@ tokens //QUALIFIEDMEMBERNAME = 'qualified-member-name'; MESSAGESIGNATURE = 'MESSAGESIGNATURE'; - DELEGATION = 'DELEGATION'; + //DELEGATION = 'DELEGATION'; + PARAM_DELEGATION = 'PARAM_DELEGATION'; // Parsed "directly" by AntlrToScribParser @@ -378,6 +379,8 @@ recursionvarname: simplename; rolename: simplename; scopename: simplename; +variantname: simplename; + ambiguousname: simplename -> @@ -480,11 +483,11 @@ payloadtypedecl: // param-core -delegdecl: +/*delegdecl: PARAM_DELEG_KW '<' IDENTIFIER '>' EXTIDENTIFIER FROM_KW EXTIDENTIFIER AS_KW simplepayloadtypename ';' -> ^(PARAM_DELEGDECL IDENTIFIER EXTIDENTIFIER EXTIDENTIFIER simplepayloadtypename) -; +;*/ messagesignaturedecl: @@ -532,12 +535,12 @@ payloadelement: |*/ qualifiedname // This case subsumes simple names // FIXME: ambiguousqualifiedname (or ambiguousname should just be qualified) | - protocolname '@' rolename + protocolname '@' variantname -> - ^(DELEGATION rolename protocolname) - + //^(DELEGATION rolename protocolname) + ^(PARAM_DELEGATION variantname protocolname) /*| - protocolname '@' rolename '[' paramindexexpr ']' + protocolname '@' rolename '[' paramindexexpr ']' // FIXME: should be @variant -- need user syntax for variant -> ^(PARAM_DELEGATION rolename protocolname) paramindexexpr)*/ ; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java index 90a1b45d8..f08bb8357 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java @@ -6,16 +6,16 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.ext.go.ast.global.RPGChoice; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; +import org.scribble.ext.go.ast.global.RPGDelegationElem; import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.ast.global.RPGMultiChoices; import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; import org.scribble.ext.go.ast.name.simple.RPIndexedRoleNode; -import org.scribble.ext.go.core.ast.RPCoreDelegDecl; import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; @@ -44,7 +44,10 @@ RPGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode s RPIndexVar var, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd); - // param-core + // param-core -- RPCoreAstFactory is for core subset, "full" AST (Antlr) stuff still here - RPCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name); + //RPCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name); + + RPGDelegationElem RPGDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role); + //RPLDelegationElem RPLDelegationElem(CommonTree source, LProtocolNameNode proto); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index 315823ea4..830036e7d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -6,16 +6,19 @@ import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.MessageNode; import org.scribble.ast.global.GProtocolBlock; -import org.scribble.ast.name.qualified.DataTypeNode; +import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.global.GDelegationElemDel; import org.scribble.ext.go.ast.global.RPGChoice; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; +import org.scribble.ext.go.ast.global.RPGDelegationElem; import org.scribble.ext.go.ast.global.RPGDotMessageTransfer; import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.ast.global.RPGMultiChoices; import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; import org.scribble.ext.go.ast.name.simple.RPIndexedRoleNode; -import org.scribble.ext.go.core.ast.RPCoreDelegDecl; +import org.scribble.ext.go.core.ast.local.RPCoreLDelegationElem; import org.scribble.ext.go.del.global.RPGChoiceDel; import org.scribble.ext.go.del.global.RPGForeachDel; import org.scribble.ext.go.del.global.RPGMessageTransferDel; @@ -153,13 +156,33 @@ public NameNode SimpleNameNode(CommonTree source, K kind, St // Explicitly creating new Assrt nodes - public RPCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) + /*public RPCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) { RPCoreDelegDecl dtd = new RPCoreDelegDecl(source, schema, extName, extSource, name); dtd = del(dtd, createDefaultDelegate()); return dtd; + }*/ + + @Override + public RPGDelegationElem RPGDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) + { + RPGDelegationElem de = new RPGDelegationElem(source, proto, role); + de = del(de, new GDelegationElemDel()); // FIXME CHECKME + return de; } + /*@Override + public RPCoreLDelegationElem RPCoreLDelegationElem(CommonTree source, LProtocolNameNode proto) + { + RPCoreLDelegationElem de = new RPCoreLDelegationElem(source, proto); + de = del(de, createDefaultDelegate()); + return de; + }*/ + + + + + @Override protected RPDel createDefaultDelegate() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java new file mode 100644 index 000000000..5070a784c --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java @@ -0,0 +1,99 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ext.go.ast.global; + +import java.util.Collections; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.global.GDelegationElem; +import org.scribble.ast.local.LDelegationElem; +import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.name.RPCoreGDelegationType; +import org.scribble.ext.go.type.index.RPIndexFactory; +import org.scribble.type.kind.Local; +import org.scribble.type.name.PayloadElemType; + +public class RPGDelegationElem extends GDelegationElem +{ + // FIXME: RoleNode used for variant name -- cf. toPayloadType, RPRoleVariant construction + public RPGDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) + { + super(source, proto, role); + } + + @Override + public LDelegationElem project(AstFactory af) + { + //return af.RPCoreLDelegationElem(this.source, Projector.makeProjectedFullNameNode(af, this.source, this.proto.toName(), this.role.toName())); + throw new RuntimeException("[rp-core] Shouldn't here: " + this); + } + + @Override + protected RPGDelegationElem copy() + { + return new RPGDelegationElem(this.source, this.proto, this.role); + } + + @Override + public RPGDelegationElem clone(AstFactory af) + { + GProtocolNameNode name = (GProtocolNameNode) this.proto.clone(af); + RoleNode role = (RoleNode) this.role.clone(af); + return ((RPAstFactory) af).RPGDelegationElem(this.source, name, role); + } + + public RPGDelegationElem reconstruct(GProtocolNameNode proto, RoleNode role) + { + ScribDel del = del(); + RPGDelegationElem elem = new RPGDelegationElem(this.source, proto, role); + elem = (RPGDelegationElem) elem.del(del); + return elem; + } + + @Override + public PayloadElemType toPayloadType() + { + // FIXME all HACK + String tmp = this.role.toString(); + int i = tmp.indexOf("_"); // Cf. RPCoreSTStateChanApiBuilder#getGeneratedIndexedRoleName + String name; + int start; + int end; + if (i == -1) + { + name = tmp; + start = 1; + end = 1; + } + else + { + name = tmp.substring(0, i); + int j = tmp.indexOf("_", i+1); + start = Integer.parseInt(tmp.substring(i, j)); + end = Integer.parseInt(tmp.substring(j)); + } + RPRoleVariant variant = new RPRoleVariant(name, + Stream.of(new RPInterval(RPIndexFactory.ParamIntVal(start), RPIndexFactory.ParamIntVal(end))).collect(Collectors.toSet()), + Collections.emptySet()); + return new RPCoreGDelegationType(this.proto.toName(), variant); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java index c35936598..77bbe0c99 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java @@ -27,6 +27,7 @@ import org.scribble.type.name.Role; +// For "core" stuff -- not "full" AF (Antlr) AST public class RPCoreAstFactory { public RPCoreAstFactory() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreDelegDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreDelegDecl.java index f19aa1d91..556dc9a5a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreDelegDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreDelegDecl.java @@ -8,10 +8,11 @@ import org.scribble.ast.name.qualified.DataTypeNode; import org.scribble.ast.name.qualified.MemberNameNode; import org.scribble.del.ScribDel; -import org.scribble.ext.go.ast.RPAstFactory; import org.scribble.type.kind.DataTypeKind; +// CHECKME: for declaring "deleg ..." declaration type imports? (variant types from external packages?) // HACK -- extending P@r[e] syntax is not clear yet +@Deprecated public class RPCoreDelegDecl extends DataTypeDecl { public RPCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name) @@ -29,7 +30,8 @@ protected ScribNodeBase copy() public RPCoreDelegDecl clone(AstFactory af) { DataTypeNode name = (DataTypeNode) this.name.clone(af); - return ((RPAstFactory) af).ParamCoreDelegDecl(this.source, this.schema, this.extName, this.extSource, name); + //return ((RPAstFactory) af).ParamCoreDelegDecl(this.source, this.schema, this.extName, this.extSource, name); + throw new RuntimeException("TODO"); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index f87f5387b..657b32d5b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -30,8 +30,10 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.main.Job; import org.scribble.type.Message; +import org.scribble.type.MessageSig; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.DataType; +import org.scribble.type.name.GDelegationType; import org.scribble.type.name.RecVar; public class RPCoreGProtocolDeclTranslator @@ -313,6 +315,13 @@ private RPCoreGChoice parseGMessageTransfer(List is, Map pt instanceof GDelegationType)) // OK: main work is in API gen + { + throw new RuntimeException("[rp-core] TODO: delegation: " + a); + }*/ + } String srcName = parseSourceRole(gmt); String destName = parseDestinationRole(gmt); RPCoreGActionKind kind; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 3d4cb770e..cabd8b669 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -284,6 +284,9 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws //for (Set ranges : this.P0.get(r).keySet()) for (RPRoleVariant ranges : this.L0.get(r).keySet()) { + + System.out.println("aaa: " + r + ", " + this.L0.get(r).get(ranges)); + EGraph g = builder.build(this.L0.get(r).get(ranges)); //Map, EGraph> tmp = this.E0.get(r); Map tmp = this.E0.get(r); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 59ac4aead..357a13c2a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -576,7 +576,7 @@ protected String makeSTStateName(EState s) RPCoreSTApiGenConstants.GO_SCHAN_END_TYPE; }*/ - // Not actual variants -- rather, indexed roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator.getGeneratedRoleVariantName + // Not actual variants -- rather, indexed roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator#getGeneratedRoleVariantName public static String getGeneratedIndexedRoleName(RPIndexedRole r) { //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java new file mode 100644 index 000000000..92a0119f0 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java @@ -0,0 +1,61 @@ +package org.scribble.ext.go.core.type.name; + +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.type.name.GDelegationType; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; + +public class RPCoreGDelegationType extends GDelegationType +{ + private static final long serialVersionUID = 1L; + + public RPCoreGDelegationType(GProtocolName proto, RPRoleVariant v) + { + super(proto, v); + } + + public Role getVariant() + { + return (RPRoleVariant) this.role; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPCoreGDelegationType)) + { + return false; + } + RPCoreGDelegationType them = (RPCoreGDelegationType) o; + return them.canEqual(this) && super.equals(o); + } + + public boolean canEqual(Object o) + { + return o instanceof RPCoreGDelegationType; + } + + @Override + public int hashCode() + { + int hash = 6673; + hash = 31 * super.hashCode(); + return hash; + } + + /*private void writeObject(java.io.ObjectOutputStream out) throws IOException + { + out.writeObject(this.proto); + out.writeObject(this.role); + } + + private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException + { + this.proto = (GProtocolName) in.readObject(); + this.role = (Role) in.readObject(); + }*/ +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java index de2b27155..a4a2a8472 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java @@ -4,7 +4,7 @@ import org.scribble.ast.AstFactory; import org.scribble.ast.ScribNode; import org.scribble.ext.go.ast.RPAstFactory; -import org.scribble.ext.go.parser.scribble.ast.RPCoreAntlrDelegDecl; +import org.scribble.ext.go.parser.scribble.ast.RPAntlrPayloadElemList; import org.scribble.ext.go.parser.scribble.ast.RPCoreAntlrModule; import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGChoice; import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGCrossMessageTransfer; @@ -25,6 +25,8 @@ public class RPAntlrToScribParser extends AntlrToScribParser public static final String PARAM_GLOBALMULTICHOICESTRANSFER_NODE_TYPE = "PARAM_GLOBALMULTICHOICESTRANSFER";*/ public static final String PARAM_DELEGDECL_NODE_TYPE = "PARAM_DELEGDECL"; public static final String PARAM_GLOBALFOREACH = "PARAM_GLOBALFOREACH"; + + public static final String PARAM_DELEGATION = "PARAM_DELEGATION"; public RPAntlrToScribParser() { @@ -40,9 +42,14 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException String type = ct.getToken().getText(); // Duplicated from ScribParserUtil.getAntlrNodeType // FIXME: factor out with ParamAntlrPayloadElemList.parsePayloadElem switch (type) { + // "Overrides" case ScribbleAntlrConstants.MODULE_NODE_TYPE: return RPCoreAntlrModule.parseModule(this, ct, af); + case ScribbleAntlrConstants.PAYLOAD_NODE_TYPE: + return RPAntlrPayloadElemList.parsePayloadElemList(this, ct, af); + + // "Extensions" //case PARAM_ROLEDECL_NODE_TYPE: return RPAntlrRoleDecl.parseParamRoleDecl(this, ct, aaf); case PARAM_GLOBALCROSSMESSAGETRANSFER_NODE_TYPE: return RPAntlrGCrossMessageTransfer.parseParamGCrossMessageTransfer(this, ct, aaf); @@ -56,8 +63,9 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException return RPAntlrGMultiChoicesTransfer.parseParamGMultiChoicesTransfer(this, ct, aaf);*/ case PARAM_GLOBALFOREACH: return RPCoreAntlrGForeach.parseRPGForeach(this, ct, aaf); - case PARAM_DELEGDECL_NODE_TYPE: - return RPCoreAntlrDelegDecl.parseDelegDecl(this, ct, aaf); + /*case PARAM_DELEGDECL_NODE_TYPE: // FIXME: deprecate + return RPCoreAntlrDelegDecl.parseDelegDecl(this, ct, aaf);*/ + default: return super.parse(ct, af); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java new file mode 100644 index 000000000..b29b226a4 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java @@ -0,0 +1,64 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ext.go.parser.scribble.ast; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.PayloadElem; +import org.scribble.ast.PayloadElemList; +import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.simple.RoleNode; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.AntlrToScribParserUtil; +import org.scribble.parser.scribble.ast.AntlrPayloadElemList; +import org.scribble.parser.scribble.ast.name.AntlrQualifiedName; +import org.scribble.parser.scribble.ast.name.AntlrSimpleName; + +// Duplicated from AntlrPayloadElemList +public class RPAntlrPayloadElemList +{ + // Cf. AntlrNonRoleArgList + public static PayloadElemList parsePayloadElemList(AntlrToScribParser parser, CommonTree ct, AstFactory af) + { + List> pes = getPayloadElements(ct).stream().map(pe -> parsePayloadElem(pe, af)).collect(Collectors.toList()); + return af.PayloadElemList(ct, pes); + } + + //private static PayloadElem parsePayloadElem(CommonTree ct) + public static PayloadElem parsePayloadElem(CommonTree ct, AstFactory af) + { + String type = ct.getToken().getText(); // FIXME from AntlrToScribParser#getAntlrNodeType + switch (type) + { + case "PARAM_DELEGATION": + // Duplicated from AntlrPayloadElemList.parsePayloadElem + RoleNode rn = AntlrSimpleName.toRoleNode((CommonTree) ct.getChild(0), af); + GProtocolNameNode gpnn = AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1), af); + return af.GDelegationElem(ct, gpnn, rn); + + default: return AntlrPayloadElemList.parsePayloadElem(ct, af); + } + } + + public static final List getPayloadElements(CommonTree ct) + { + return (ct.getChildCount() == 0) + ? Collections.emptyList() + : AntlrToScribParserUtil.toCommonTreeList(ct.getChildren()); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPCoreAntlrDelegDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPCoreAntlrDelegDecl.java index a48e3e03b..fdeb05e47 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPCoreAntlrDelegDecl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPCoreAntlrDelegDecl.java @@ -3,13 +3,13 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.name.qualified.DataTypeNode; -import org.scribble.ext.go.ast.RPAstFactory; import org.scribble.ext.go.core.ast.RPCoreDelegDecl; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ast.AntlrDataTypeDecl; import org.scribble.parser.scribble.ast.AntlrExtIdentifier; import org.scribble.parser.scribble.ast.name.AntlrSimpleName; +// FIXME: should be RPDelegDecl (not Core, a "full" AST (Antlr) node) // Duplicated from AntlrDataTypeDecl public class RPCoreAntlrDelegDecl { @@ -27,6 +27,7 @@ public static RPCoreDelegDecl parseDelegDecl(AntlrToScribParser parser, CommonTr CommonTree tmp3 = AntlrDataTypeDecl.getSourceChild(ct); String source = AntlrExtIdentifier.getName(tmp3); DataTypeNode alias = AntlrSimpleName.toDataTypeNameNode(AntlrDataTypeDecl.getAliasChild(ct), af); // FIXME: EMTPY_ALIAS? - return ((RPAstFactory) af).ParamCoreDelegDecl(ct, schema, extName, source, alias); + //return ((RPAstFactory) af).ParamCoreDelegDecl(ct, schema, extName, source, alias); + throw new RuntimeException("Shouldn't get here: " + ct); } } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 409f39807..1d7bfc8c3 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -13,6 +13,9 @@ type "string" from "..." as string; type "TwoBuyer.Address" from "scrib/twobuyer/TwoBuyer/TwoBuyer/types.go" as Address; type "TwoBuyer.Date" from "scrib/twobuyer/TwoBuyer/TwoBuyer/types.go" as Date; +sig "..." + from "..." + as Data; /* @@ -47,16 +50,28 @@ message passing // paramterisation subsumes multicast +global protocol Proto1(role A, role B) { + foreach A[I:1,K], B[J:2,KK] + { + Data from A[I,I] to B[J,J]; + } +} + +/*global protocol ScatterGather(role M, role S) { + (int) from M[1,1] to S[1,N]; +}*/ +/* global protocol Proto1(role A(n)) { /*a() from A[n-1..n-1] to A[n..n]; b() from A[n-2..n-2] to A[n..n]; - do Proto1(A(n-1)); // FIXME?*/ + do Proto1(A(n-1)); // FIXME? * / a() dot A[1..1] to A[n..n]; } +//*/ From dbd6e4a38b5ee83f6a418ef83e829db0314f89cd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 10 Sep 2018 18:14:59 +0100 Subject: [PATCH 315/433] Continued. --- .../org/scribble/ast/PayloadElemList.java | 2 +- .../org/scribble/parser/antlr/ParamScribble.g | 2 +- .../org/scribble/ext/go/ast/RPAstFactory.java | 2 +- .../ext/go/ast/global/RPGDelegationElem.java | 2 +- .../ext/go/core/ast/global/RPCoreGChoice.java | 9 +++- .../ext/go/core/cli/RPCoreCommandLine.java | 2 +- .../RPCoreSTOutputStateBuilder.java | 6 +-- .../RPCoreSTReceiveActionBuilder.java | 5 +-- .../RPCoreSTReceiveStateBuilder.java | 5 ++- .../RPCoreSTReduceActionBuilder.java | 18 ++++---- .../RPCoreSTSelectActionBuilder.java | 3 +- .../statetype3/RPCoreSTSendActionBuilder.java | 9 ++-- .../statetype3/RPCoreSTSessionApiBuilder.java | 2 +- .../RPCoreSTSplitActionBuilder.java | 19 +++++---- .../RPCoreSTStateChanApiBuilder.java | 42 ++++++++++++++++--- .../core/type/name/RPCoreGDelegationType.java | 3 +- .../parser/scribble/RPAntlrToScribParser.java | 3 ++ .../scribble/ast/RPAntlrPayloadElemList.java | 8 +++- 18 files changed, 98 insertions(+), 44 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java index 60ade39d1..c3f642629 100644 --- a/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java +++ b/scribble-core/src/main/java/org/scribble/ast/PayloadElemList.java @@ -96,6 +96,6 @@ public boolean isEmpty() @Override public String toString() { - return "(" + this.elems.stream().map((pe) -> pe.toString()).collect(Collectors.joining(", " )) + ")"; + return "(" + this.elems.stream().map(pe -> pe.toString()).collect(Collectors.joining(", " )) + ")"; } } diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index bf750c664..7587e4e38 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -184,7 +184,7 @@ tokens PARAM_GLOBALMULTICHOICESTRANSFER = 'PARAM_GLOBALMULTICHOICESTRANSFER';*/ //PARAM_DELEGATION = 'PARAM_DELEGATION'; PARAM_DELEGDECL = 'PARAM_DELEGDECL'; - PARAM_GLOBALFOREACH = 'PARAM_GLOBALFOREACH'; + PARAM_GLOBALFOREACH = 'PARAM_GLOBALFOREACH'; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java index f08bb8357..f0baf2f5b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java @@ -49,5 +49,5 @@ RPGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode s //RPCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name); RPGDelegationElem RPGDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role); - //RPLDelegationElem RPLDelegationElem(CommonTree source, LProtocolNameNode proto); + //RPLDelegationElem RPLDelegationElem(CommonTree source, LProtocolNameNode proto); // Delegation currently supported only by core, and just uses RPCoreGDelegationType } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java index 5070a784c..113990101 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java @@ -74,7 +74,7 @@ public PayloadElemType toPayloadType() { // FIXME all HACK String tmp = this.role.toString(); - int i = tmp.indexOf("_"); // Cf. RPCoreSTStateChanApiBuilder#getGeneratedIndexedRoleName + int i = tmp.indexOf("_"); // Cf. RPCoreSTApiGenerator#getEndpointKindTypeName String name; int start; int end; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 406b8d990..6b1f70676 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -20,6 +20,7 @@ import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.name.RPCoreGDelegationType; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.ext.go.util.Z3Wrapper; @@ -212,9 +213,13 @@ public RPCoreLType project(RPCoreAstFactory af, //Role r, Set ranges { if (pet instanceof GDelegationType) { - GDelegationType gdt = (GDelegationType) pet; // Payload types come from ParamCoreGProtocolDeclTranslator#parsePayload (toMessage) + if (!(pet instanceof RPCoreGDelegationType)) + { + throw new RuntimeException("[rp-core] TODO: " + pet); + } + RPCoreGDelegationType gdt = (RPCoreGDelegationType) pet; // Payload types come from ParamCoreGProtocolDeclTranslator#parsePayload (toMessage) - System.out.println("aaa: " + this + ", " + gdt.getGlobalProtocol() + ", " + gdt.getRole()); + System.out.println("CCC: " + this + ", " + gdt.getGlobalProtocol() + ", " + gdt.getRole()); // cf. GDelegationElem#project diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index cabd8b669..480e4660e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -285,7 +285,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws for (RPRoleVariant ranges : this.L0.get(r).keySet()) { - System.out.println("aaa: " + r + ", " + this.L0.get(r).get(ranges)); + System.out.println("111: " + r + ", " + this.L0.get(r).get(ranges)); EGraph g = builder.build(this.L0.get(r).get(ranges)); //Map, EGraph> tmp = this.E0.get(r); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTOutputStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTOutputStateBuilder.java index bcce5f893..9e2328d1d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTOutputStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTOutputStateBuilder.java @@ -8,7 +8,6 @@ import org.scribble.model.endpoint.actions.EDisconnect; import org.scribble.model.endpoint.actions.ERequest; import org.scribble.model.endpoint.actions.ESend; -import org.scribble.type.name.DataType; public class RPCoreSTOutputStateBuilder extends STOutputStateBuilder { @@ -39,9 +38,10 @@ public String build(STStateChanApiBuilder api, EState s) { //out += this.sb.build(api, s, a); - // FIXME: delegation + /*// FIXME: delegation if (!a.payload.elems.stream() - .anyMatch(pet -> ((RPCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet))) + .anyMatch(pet -> ((RPCoreSTStateChanApiBuilder) api)//.isDelegType((DataType) pet))) + .isDelegType(pet)))*/ { out += "\n\n"; out += this.nb.build(api, s, a); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 7dfe19b98..7457573e8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -12,7 +12,6 @@ import org.scribble.ext.go.main.GoJob; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; import org.scribble.type.name.MessageSigName; public class RPCoreSTReceiveActionBuilder extends STReceiveActionBuilder @@ -34,7 +33,7 @@ public String buildArgs(STStateChanApiBuilder api, EAction a) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG + i + " []" - + rpapi.getExtName((DataType) a.payload.elems.get(i))) + + rpapi.getPayloadElemTypeName(a.payload.elems.get(i))) .collect(Collectors.joining(", ")); } else //if (a.mid.isMessageSigName()) @@ -132,7 +131,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "}\n" + "arg0[i-" + start + "] = *(tmp.(*" + pt + "))\n"; // FIXME: doesn't work for gob, pointer decoding seems flattened? ("*" dropped) ... // Cf. ISend in RPCoreSTSendActionBuilder //+ "arg0[i-" + start + "] = tmp.(" + pt + ")\n"; // FIXME: ... but doesn't work for shm - res += makeReceivePayType.apply(rpapi.getExtName((DataType) a.payload.elems.get(0))); + res += makeReceivePayType.apply(rpapi.getPayloadElemTypeName(a.payload.elems.get(0))); } } else //if (a.mid.isMessageSigName()) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveStateBuilder.java index d7131766d..b944184c8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveStateBuilder.java @@ -41,9 +41,10 @@ public String build(STStateChanApiBuilder api, EState s) /*out += "\n\n"; out += this.rb.build(api, s, a);*/ - // FIXME: delegation + /*// FIXME: delegation if (!a.payload.elems.stream() - .anyMatch(pet -> ((RPCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet))) + .anyMatch(pet -> ((RPCoreSTStateChanApiBuilder) api)//.isDelegType((DataType) pet))) + .isDelegType(pet)))*/ { out += "\n\n"; out += this.vb.build(api, s, a); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java index 8f9d6e270..7b804ca44 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReduceActionBuilder.java @@ -7,8 +7,8 @@ import org.scribble.codegen.statetype.STReceiveActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexInt; @@ -16,6 +16,7 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; +import org.scribble.type.name.PayloadElemType; public class RPCoreSTReduceActionBuilder extends STReceiveActionBuilder { @@ -32,22 +33,24 @@ public String getActionName(STStateChanApiBuilder api, EAction a) @Override public String buildArgs(STStateChanApiBuilder apigen, EAction a) { - DataType[] pet = new DataType[1]; + RPCoreSTStateChanApiBuilder api = (RPCoreSTStateChanApiBuilder) apigen; + //DataType[] pet = new DataType[1]; + PayloadElemType[] pet = new PayloadElemType[1]; return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_RECEIVE_METHOD_ARG - + i + " *" + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0] = (DataType) a.payload.elems.get(i)) //a.payload.elems.get(i) + + i + " *" + api.getPayloadElemTypeName(pet[0] = a.payload.elems.get(i)) //a.payload.elems.get(i) // HACK - + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "" : + + (api.isDelegType(pet[0]) ? "" : ", reduceFn" + i + " func(" + RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i //+ " []" + a.payload.elems.get(i) + ") " + a.payload.elems.get(i) + " []" - + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0]) + + api.getPayloadElemTypeName(pet[0]) + ") " - + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0]) + + api.getPayloadElemTypeName(pet[0]) ) ).collect(Collectors.joining(", ")); @@ -119,7 +122,8 @@ else if (e instanceof RPIndexVar) // FIXME: single arg // Currently never true because of ParamCoreSTOutputStateBuilder boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem - ((RPCoreSTStateChanApiBuilder) apigen).isDelegType((DataType) pet)); + ((RPCoreSTStateChanApiBuilder) apigen)//.isDelegType((DataType) pet)); + .isDelegType(pet)); /*String res = sEpRecv + (((GoJob) api.job).noCopy ? "Raw" : "") diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index 6a821567b..092c2db24 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -65,7 +65,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParmaCoreDelegDecl, not GDelegationElem - ((RPCoreSTStateChanApiBuilder) api).isDelegType((DataType) pet)); + ((RPCoreSTStateChanApiBuilder) api)//.isDelegType((DataType) pet)); + .isDelegType(pet)); if (isDeleg) { throw new RuntimeException("[rp-core] TODO: " + a); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 5c565a5bb..4aa89055e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -11,7 +11,6 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.name.DataType; import org.scribble.type.name.MessageSigName; public class RPCoreSTSendActionBuilder extends STSendActionBuilder @@ -28,17 +27,18 @@ public String getActionName(STStateChanApiBuilder api, EAction a) @Override public String buildArgs(STStateChanApiBuilder api, EAction a) { + RPCoreSTStateChanApiBuilder apigen = (RPCoreSTStateChanApiBuilder) api; if (a.mid.isOp()) { return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i + " []" - + ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) a.payload.elems.get(i))) //a.payload.elems.get(i) + + apigen.getPayloadElemTypeName(a.payload.elems.get(i))) //a.payload.elems.get(i) .collect(Collectors.joining(", ")); } else //if (a.mid.isMessageSigName()) { return RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + "0 []" - + ((RPCoreSTStateChanApiBuilder) api).getExtName((MessageSigName) a.mid); + + apigen.getExtName((MessageSigName) a.mid); } } @@ -72,7 +72,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // FIXME: single arg // Currently never true because of RPCoreSTOutputStateBuilder boolean isDeleg = a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParamCoreDelegDecl, not GDelegationElem - rpapi.isDelegType((DataType) pet)); + rpapi//.isDelegType((DataType) pet)); + .isDelegType(pet)); String res = "for i, j := " + rpapi.generateIndexExpr(d.start) + ", 0;" + " i <= " + rpapi.generateIndexExpr(d.end)+"; i, j = i+1, j+1 {\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index d9aa0a61d..ad4cc9425 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -56,7 +56,7 @@ public int compare(RPCoreEState o1, RPCoreEState o2) } }; -public RPCoreSTSessionApiBuilder(RPCoreSTApiGenerator apigen) + public RPCoreSTSessionApiBuilder(RPCoreSTApiGenerator apigen) { this.apigen = apigen; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java index ca1c0b078..2d7f86dd7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSplitActionBuilder.java @@ -8,14 +8,15 @@ import org.scribble.codegen.statetype.STSendActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.model.endpoint.action.RPCoreEAction; -import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; +import org.scribble.type.name.PayloadElemType; public class RPCoreSTSplitActionBuilder extends STSendActionBuilder { @@ -31,25 +32,27 @@ public String getActionName(STStateChanApiBuilder api, EAction a) @Override public String buildArgs(STStateChanApiBuilder apigen, EAction a) { - DataType[] pet = new DataType[1]; + RPCoreSTStateChanApiBuilder api = (RPCoreSTStateChanApiBuilder) apigen; + //DataType[] pet = new DataType[1]; + PayloadElemType[] pet = new PayloadElemType[1]; return IntStream.range(0, a.payload.elems.size()) .mapToObj(i -> RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i + " " // HACK - + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0] = ((DataType) a.payload.elems.get(i)))) ? "*" : "") - + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0]) //a.payload.elems.get(i) + + ((api.isDelegType(pet[0] = a.payload.elems.get(i))) ? "*" : "") + + api.getPayloadElemTypeName(pet[0]) //a.payload.elems.get(i) + ", splitFn" + i + " func(" + RPCoreSTApiGenConstants.GO_CROSS_SEND_METHOD_ARG + i + " " // HACK - + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") - + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0]) + + (api.isDelegType(pet[0]) ? "*" : "") + + api.getPayloadElemTypeName(pet[0]) + ", i" + i + " int) " - + ((((RPCoreSTStateChanApiBuilder) apigen).isDelegType(pet[0])) ? "*" : "") - + ((RPCoreSTStateChanApiBuilder) apigen).getExtName(pet[0]) + + (api.isDelegType(pet[0]) ? "*" : "") + + api.getPayloadElemTypeName(pet[0]) ).collect(Collectors.joining(", ")); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 357a13c2a..4cb681e94 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -15,13 +15,13 @@ import org.scribble.ast.Module; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; -import org.scribble.ext.go.core.ast.RPCoreDelegDecl; import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.core.type.name.RPCoreGDelegationType; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; @@ -32,9 +32,12 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; +import org.scribble.type.kind.PayloadTypeKind; import org.scribble.type.name.DataType; +import org.scribble.type.name.GDelegationType; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.MessageSigName; +import org.scribble.type.name.PayloadElemType; import org.scribble.util.Pair; // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTStateChanAPIBuilder @@ -357,7 +360,7 @@ public String makeMessageImports(EState s) for (String extSource : (Iterable) s.getAllActions().stream() .filter(a -> a.mid.isOp()) - .flatMap(a -> a.payload.elems.stream() + .flatMap(a -> a.payload.elems.stream().filter(p -> !(p instanceof GDelegationType)) // FIXME: delegation // HERE .filter(p -> !getExtName((DataType) p).matches("(\\[\\])*(int|string|byte)")) .filter(p -> !getExtName((DataType) p).matches("(\\*)*(int|string|byte)"))) .map(p -> getExtSource((DataType) p)) @@ -576,7 +579,7 @@ protected String makeSTStateName(EState s) RPCoreSTApiGenConstants.GO_SCHAN_END_TYPE; }*/ - // Not actual variants -- rather, indexed roles in EFSM actions -- cf. ParamCoreSTEndpointApiGenerator#getGeneratedRoleVariantName + // Not variants -- just indexed roles (in EFSM actions) -- cf. ParamCoreSTEndpointApiGenerator#getGeneratedRoleVariantName public static String getGeneratedIndexedRoleName(RPIndexedRole r) { //return r.toString().replaceAll("\\[", "_").replaceAll("\\]", "_").replaceAll("\\.", "_"); @@ -626,10 +629,39 @@ else if (e instanceof RPIndexVar) - protected boolean isDelegType(DataType t) + protected boolean isDelegType(PayloadElemType t) { - return this.dtds.stream().filter(x -> x.getDeclName().equals(t)).findAny().get() instanceof RPCoreDelegDecl; // FIXME: make a map + //return this.dtds.stream().filter(x -> x.getDeclName().equals(t)).findAny().get() instanceof RPCoreDelegDecl; // FIXME: make a map + // "Old style", when deleg state chan types were directly imported by user as regular Go types + return t.isGDelegationType(); // CHECKME: distinguish RPCoreGDelegationType? } + + // Cf. getExtName + protected String getPayloadElemTypeName(PayloadElemType pet) + { + if (pet instanceof RPCoreGDelegationType) + { + //return ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) pet); + RPCoreGDelegationType gdt = (RPCoreGDelegationType) pet; + GProtocolName proto = gdt.getGlobalProtocol(); + RPRoleVariant variant = gdt.getVariant(); + String tmp = RPCoreSTApiGenerator.getEndpointKindTypeName(proto.getSimpleName(), variant) + ".Init"; + // FIXME factor out + + System.out.println("DDD: " + tmp); + + return tmp; + } + else if (pet instanceof DataType) + { + return getExtName((DataType) pet); + } + else + { + throw new RuntimeException("[rp-core] TODO: " + pet); + } + } + /*protected String getExtName(AbstractName n) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java index 92a0119f0..1ab55841f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java @@ -3,7 +3,6 @@ import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.type.name.GDelegationType; import org.scribble.type.name.GProtocolName; -import org.scribble.type.name.Role; public class RPCoreGDelegationType extends GDelegationType { @@ -14,7 +13,7 @@ public RPCoreGDelegationType(GProtocolName proto, RPRoleVariant v) super(proto, v); } - public Role getVariant() + public RPRoleVariant getVariant() { return (RPRoleVariant) this.role; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java index a4a2a8472..79632ad2e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java @@ -46,7 +46,10 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException case ScribbleAntlrConstants.MODULE_NODE_TYPE: return RPCoreAntlrModule.parseModule(this, ct, af); case ScribbleAntlrConstants.PAYLOAD_NODE_TYPE: + { + System.out.println("AAA: " + ct); return RPAntlrPayloadElemList.parsePayloadElemList(this, ct, af); + } // "Extensions" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java index b29b226a4..c1a7ef78f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java @@ -23,6 +23,7 @@ import org.scribble.ast.PayloadElemList; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; +import org.scribble.ext.go.ast.RPAstFactory; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.AntlrToScribParserUtil; import org.scribble.parser.scribble.ast.AntlrPayloadElemList; @@ -43,13 +44,18 @@ public static PayloadElemList parsePayloadElemList(AntlrToScribParser parser, Co public static PayloadElem parsePayloadElem(CommonTree ct, AstFactory af) { String type = ct.getToken().getText(); // FIXME from AntlrToScribParser#getAntlrNodeType + + System.out.println("BBB: " + type); + switch (type) { case "PARAM_DELEGATION": + { // Duplicated from AntlrPayloadElemList.parsePayloadElem RoleNode rn = AntlrSimpleName.toRoleNode((CommonTree) ct.getChild(0), af); GProtocolNameNode gpnn = AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1), af); - return af.GDelegationElem(ct, gpnn, rn); + return ((RPAstFactory) af).RPGDelegationElem(ct, gpnn, rn); + } default: return AntlrPayloadElemList.parsePayloadElem(ct, af); } From e0f6445121f34a5ef2df85d39c3a712ce0205d18 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 13 Sep 2018 19:44:41 +0100 Subject: [PATCH 316/433] Continued. --- .../scribble/ext/go/ast/RPAstFactoryImpl.java | 6 +-- .../ext/go/ast/global/RPGDelegationElem.java | 23 +++++---- .../statetype3/RPCoreSTApiGenerator.java | 3 +- .../statetype3/RPCoreSTSendActionBuilder.java | 4 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 34 +++++++++++-- .../RPCoreSTStateChanApiBuilder.java | 50 ++++++++++++------- 6 files changed, 81 insertions(+), 39 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index 830036e7d..a6158d98d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -7,9 +7,7 @@ import org.scribble.ast.MessageNode; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.qualified.LProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; -import org.scribble.del.global.GDelegationElemDel; import org.scribble.ext.go.ast.global.RPGChoice; import org.scribble.ext.go.ast.global.RPGCrossMessageTransfer; import org.scribble.ext.go.ast.global.RPGDelegationElem; @@ -18,8 +16,8 @@ import org.scribble.ext.go.ast.global.RPGMultiChoices; import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; import org.scribble.ext.go.ast.name.simple.RPIndexedRoleNode; -import org.scribble.ext.go.core.ast.local.RPCoreLDelegationElem; import org.scribble.ext.go.del.global.RPGChoiceDel; +import org.scribble.ext.go.del.global.RPGDelegationElemDel; import org.scribble.ext.go.del.global.RPGForeachDel; import org.scribble.ext.go.del.global.RPGMessageTransferDel; import org.scribble.ext.go.del.global.RPGMultiChoicesDel; @@ -167,7 +165,7 @@ public NameNode SimpleNameNode(CommonTree source, K kind, St public RPGDelegationElem RPGDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) { RPGDelegationElem de = new RPGDelegationElem(source, proto, role); - de = del(de, new GDelegationElemDel()); // FIXME CHECKME + de = del(de, new RPGDelegationElemDel()); return de; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java index 113990101..6b7a15fc7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java @@ -28,13 +28,14 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.type.name.RPCoreGDelegationType; +import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexFactory; import org.scribble.type.kind.Local; import org.scribble.type.name.PayloadElemType; public class RPGDelegationElem extends GDelegationElem { - // FIXME: RoleNode used for variant name -- cf. toPayloadType, RPRoleVariant construction + // FIXME: RoleNode (its String value) is used for *variant name* -- cf. toPayloadType, RPRoleVariant construction public RPGDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) { super(source, proto, role); @@ -76,24 +77,26 @@ public PayloadElemType toPayloadType() String tmp = this.role.toString(); int i = tmp.indexOf("_"); // Cf. RPCoreSTApiGenerator#getEndpointKindTypeName String name; - int start; - int end; + RPIndexExpr start; + RPIndexExpr end; if (i == -1) { name = tmp; - start = 1; - end = 1; + start = RPIndexFactory.ParamIntVal(1); + end = RPIndexFactory.ParamIntVal(1); } else { + System.out.println("111: " + tmp); name = tmp.substring(0, i); - int j = tmp.indexOf("_", i+1); - start = Integer.parseInt(tmp.substring(i, j)); - end = Integer.parseInt(tmp.substring(j)); + int j = tmp.indexOf("t", i+1); // "to" // HACK FIXME + String s = tmp.substring(i+1, j); + String e = tmp.substring(j+2); + start = (s.charAt(0) >= '0' && s.charAt(0) <= '9') ? RPIndexFactory.ParamIntVal(Integer.parseInt(s)) : RPIndexFactory.ParamIntVar(s); + end = (e.charAt(0) >= '0' && e.charAt(0) <= '9') ? RPIndexFactory.ParamIntVal(Integer.parseInt(e)) : RPIndexFactory.ParamIntVar(e); } RPRoleVariant variant = new RPRoleVariant(name, - Stream.of(new RPInterval(RPIndexFactory.ParamIntVal(start), RPIndexFactory.ParamIntVal(end))).collect(Collectors.toSet()), - Collections.emptySet()); + Stream.of(new RPInterval(start, end)).collect(Collectors.toSet()), Collections.emptySet()); return new RPCoreGDelegationType(this.proto.toName(), variant); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 751fee95b..dddb0b025 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -40,7 +40,8 @@ public class RPCoreSTApiGenerator public final Map, Set>, Integer> families; public final Map> peers; - public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module + public final String packpath; + // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module //public final Role self; public final List selfs; // FIXME? just a role name -- cf. CL arg diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 4aa89055e..e7e19ff91 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -102,11 +102,11 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } // Write message sig or payload - if (isDeleg) //... FIXME: delegation: take pointer? send underlying ept? -- don't do (multi)"send"? + /*if (isDeleg) //... FIXME: delegation: take pointer? send underlying ept? -- don't do (multi)"send"? { res += "log.Fatal(\"TODO\")\n"; } - else + else*/ { if (a.mid.isOp() && a.payload.elems.size() < 1) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index ad4cc9425..dad5ad3fe 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -421,6 +421,10 @@ public int compare(Entry o1, Entry o2) + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" + "c, err := ss.Accept()\n" + + "if err != nil {\n" + + "return err\n" + + "}\n" + + "\n" + "sfmt.Wrap(c)\n" + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) @@ -438,6 +442,10 @@ public int compare(Entry o1, Entry o2) + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" + "c, err := dialler(host, port)\n" + + "if err != nil {\n" + + "return err\n" + + "}\n" + + "\n" + "sfmt.Wrap(c)\n" + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) @@ -458,19 +466,37 @@ public int compare(Entry o1, Entry o2) "Init"; epkindFile += "\n" + "func (ini *" + epkindTypeName + ") Run(f func(*" + init + ") " + endName + ") " + endName + " {\n" // f specifies non-pointer End - + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".Close()\n" + /*+ "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".Close()\n" + "ini.Use()\n" // FIXME: int-counter linearity - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".CheckConnection()\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".CheckConnection()\n"*/ + + "defer ini.Close()\n" + //+ "ini.Init()\n" // FIXME: factor out with RPCoreSTStateChanApiBuilder#buildActionReturn (i.e., returning initial state) // (FIXME: factor out with RPCoreSTSessionApiBuilder#getSuccStateChan and RPCoreSTSelectStateBuilder#getPreamble) - + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) + /*+ ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) ? "return f(newBranch" + init + "(ini))\n" : //"end := f(&" + init + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), ini })\n") // cf. state chan builder // FIXME: chan struct reuse //"ini._" + init + ".id = 1\n" + - "return f(ini._" + init + ")\n") + "return f(ini._" + init + ")\n")*/ + + "return f(ini.Init())\n" + + + "}"; + + epkindFile += "\n\n" + + "func (ini *" + epkindTypeName + ") Init() *Init {\n" + + "ini.Use()\n" // FIXME: int-counter linearity + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".CheckConnection()\n" + + "return " + + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) + ? "newBranch" + init + "(ini)" + : "ini._" + init) + "\n" + + "}"; + epkindFile += "\n\n" + + "func (ini *" + epkindTypeName + ") Close() {\n" + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".Close()\n" + "}"; res.put(getEndpointKindFilePath(family, variant) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 4cb681e94..c1e817d55 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -32,7 +32,6 @@ import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.EStateKind; import org.scribble.model.endpoint.actions.EAction; -import org.scribble.type.kind.PayloadTypeKind; import org.scribble.type.name.DataType; import org.scribble.type.name.GDelegationType; import org.scribble.type.name.GProtocolName; @@ -217,13 +216,14 @@ public String getStateChannelFilePath(String filename) { filename = "$" + filename.substring(1); } - // Duplicated from RPCoreSTSessionApiBuilder#getEndpointKindFilePath boolean isCommonEndpointKind = //this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(this.variant)); // No: doesn't consider dial/accept //this.apigen.families.keySet().stream().filter(f -> f.left.contains(this.variant)).distinct().count() == 1; // No: too conservative -- should be about required peer endpoint kinds (to dial/accept with) this.apigen.peers.get(this.variant).size() == 1; - return this.gpn.toString().replaceAll("\\.", "/") - //+ "/" + this.apigen.getFamilyPackageName(family) - + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(family)) + return //getStateChannelPackagePathPrefix() + // Duplicated from RPCoreSTSessionApiBuilder#getEndpointKindFilePath + this.gpn.toString().replaceAll("\\.", "/") + //+ "/" + this.apigen.getFamilyPackageName(family) + + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(this.family)) + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) // State chans located with Endpoint Kind API + "/" + filename + ".go"; } @@ -357,20 +357,30 @@ protected String getStateChanPremable(EState s) public String makeMessageImports(EState s) { String res = ""; - for (String extSource : (Iterable) - s.getAllActions().stream() - .filter(a -> a.mid.isOp()) - .flatMap(a -> a.payload.elems.stream().filter(p -> !(p instanceof GDelegationType)) // FIXME: delegation // HERE + for (String extSource : (Iterable) s.getAllActions().stream() + .filter(a -> a.mid.isOp()) + .flatMap(a -> a.payload.elems.stream().filter(p -> !(p instanceof GDelegationType)) .filter(p -> !getExtName((DataType) p).matches("(\\[\\])*(int|string|byte)")) .filter(p -> !getExtName((DataType) p).matches("(\\*)*(int|string|byte)"))) - .map(p -> getExtSource((DataType) p)) - .distinct()::iterator) + .map(p -> getExtSource((DataType) p)) + .distinct()::iterator) { res += "import \"" + extSource + "\"\n"; } - for (String extSource : (Iterable) - s.getAllActions().stream().filter(a -> a.mid.isMessageSigName()) - .map(a -> getExtSource((MessageSigName) a.mid)).distinct()::iterator) + for (PayloadElemType pet : (Iterable>) s.getAllActions().stream() + .filter(a -> a.mid.isOp()) + .flatMap(a -> a.payload.elems.stream().filter(p -> (p instanceof RPCoreGDelegationType)) + //.map(p -> getDelegatedChanPackageName((RPCoreGDelegationType) p)) + ) + .distinct()::iterator) + { + res += "import \"" + this.apigen.packpath + "/" + ((RPCoreGDelegationType) pet).getGlobalProtocol().getSimpleName() + // *pet* gpn name (i.e., for state chan type being delegated) -- cf. *this*.gpn.toString() in getStateChannelFilePath + + "/" + getDelegatedChanPackageName((RPCoreGDelegationType) pet) + "\"\n"; + } + for (String extSource : (Iterable) s.getAllActions().stream() + .filter(a -> a.mid.isMessageSigName()) + .map(a -> getExtSource((MessageSigName) a.mid)).distinct()::iterator) { res += "import \"" + extSource + "\"\n"; } @@ -643,10 +653,7 @@ protected String getPayloadElemTypeName(PayloadElemType pet) { //return ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) pet); RPCoreGDelegationType gdt = (RPCoreGDelegationType) pet; - GProtocolName proto = gdt.getGlobalProtocol(); - RPRoleVariant variant = gdt.getVariant(); - String tmp = RPCoreSTApiGenerator.getEndpointKindTypeName(proto.getSimpleName(), variant) + ".Init"; - // FIXME factor out + String tmp = "*" + getDelegatedChanPackageName(gdt) + ".Init"; // FIXME: not necessarily Init System.out.println("DDD: " + tmp); @@ -661,6 +668,13 @@ else if (pet instanceof DataType) throw new RuntimeException("[rp-core] TODO: " + pet); } } + + protected static String getDelegatedChanPackageName(RPCoreGDelegationType gdt) + { + GProtocolName proto = gdt.getGlobalProtocol(); + RPRoleVariant variant = gdt.getVariant(); + return RPCoreSTApiGenerator.getEndpointKindTypeName(proto.getSimpleName(), variant); + } /*protected String getExtName(AbstractName n) From 9487aa28d3bf7405a6860ade2ace72d4ce1a61ba Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 13 Sep 2018 19:45:12 +0100 Subject: [PATCH 317/433] Continued. --- .../go/del/global/RPGDelegationElemDel.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java new file mode 100644 index 000000000..aa2367f4f --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java @@ -0,0 +1,56 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ext.go.del.global; + +import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.context.ModuleContext; +import org.scribble.ast.global.GDelegationElem; +import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.del.global.GDelegationElemDel; +import org.scribble.ext.go.ast.global.RPGDelegationElem; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.Global; +import org.scribble.type.name.GProtocolName; +import org.scribble.type.name.Role; +import org.scribble.visit.wf.NameDisambiguator; + +public class RPGDelegationElemDel extends GDelegationElemDel +{ + public RPGDelegationElemDel() + { + + } + + // Duplicated from super + @Override + public RPGDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, GDelegationElem de) throws ScribbleException + { + ModuleContext mc = disamb.getModuleContext(); + GProtocolName fullname = (GProtocolName) mc.getVisibleProtocolDeclFullName(de.proto.toName()); + + Role rn = de.role.toName(); + ProtocolDecl gpd = disamb.job.getContext().getModule(fullname.getPrefix()).getProtocolDecl(fullname.getSimpleName()); + if (!gpd.header.roledecls.getRoles().contains(rn)) + { + String tmp = rn.toString(); // FIXME HACK (currently rely on checking valid variant later) + if (tmp.indexOf("_") == -1) + { + throw new ScribbleException(de.role.getSource(), "Invalid delegation role: " + de); + } + } + + GProtocolNameNode pnn = (GProtocolNameNode) disamb.job.af.QualifiedNameNode(de.proto.getSource(), fullname.getKind(), fullname.getElements()); // Not keeping original namenode del + return (RPGDelegationElem) de.reconstruct(pnn, de.role); + } +} From 531b7f5c14059ad902e38d6d446c6d7404c6524a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 14 Sep 2018 14:37:18 +0100 Subject: [PATCH 318/433] Minor. --- .../main/antlr3/org/scribble/parser/antlr/ParamScribble.g | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 7587e4e38..5266b9081 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -417,11 +417,11 @@ messagesignaturename: membername; * Section 3.2.2 Top-level Module Structure */ module: - //moduledecl importdecl* datatypedecl* protocoldecl* EOF - moduledecl importdecl* datatypedecl* delegdecl* protocoldecl* EOF + moduledecl importdecl* datatypedecl* protocoldecl* EOF + //moduledecl importdecl* datatypedecl* delegdecl* protocoldecl* EOF -> - //^(MODULE moduledecl importdecl* datatypedecl* protocoldecl*) - ^(MODULE moduledecl importdecl* datatypedecl* delegdecl* protocoldecl*) + ^(MODULE moduledecl importdecl* datatypedecl* protocoldecl*) + //^(MODULE moduledecl importdecl* datatypedecl* delegdecl* protocoldecl*) ; From ff78ad65f1b5330883a0ef00ed35c102e537828a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 14 Sep 2018 18:53:10 +0100 Subject: [PATCH 319/433] Generalising variant delegation syntax for non-root states. --- .../org/scribble/parser/antlr/ParamScribble.g | 4 ++ .../org/scribble/ext/go/ast/RPAstFactory.java | 2 +- .../scribble/ext/go/ast/RPAstFactoryImpl.java | 4 +- .../ext/go/ast/global/RPGDelegationElem.java | 39 +++++++++++++++---- .../statetype3/RPCoreSTApiGenerator.java | 1 + .../RPCoreSTStateChanApiBuilder.java | 2 +- .../core/type/name/RPCoreGDelegationType.java | 17 ++++++-- .../go/del/global/RPGDelegationElemDel.java | 10 +++-- .../scribble/ast/RPAntlrPayloadElemList.java | 10 +++-- 9 files changed, 68 insertions(+), 21 deletions(-) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 5266b9081..a0ca703c2 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -543,6 +543,10 @@ payloadelement: protocolname '@' rolename '[' paramindexexpr ']' // FIXME: should be @variant -- need user syntax for variant -> ^(PARAM_DELEGATION rolename protocolname) paramindexexpr)*/ +| + protocolname ':' protocolname '@' variantname +-> + ^(PARAM_DELEGATION variantname protocolname protocolname) ; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java index f0baf2f5b..6a93e97d6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java @@ -48,6 +48,6 @@ RPGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode s //RPCoreDelegDecl ParamCoreDelegDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name); - RPGDelegationElem RPGDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role); + RPGDelegationElem RPGDelegationElem(CommonTree source, GProtocolNameNode root, GProtocolNameNode state, RoleNode role); //RPLDelegationElem RPLDelegationElem(CommonTree source, LProtocolNameNode proto); // Delegation currently supported only by core, and just uses RPCoreGDelegationType } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index a6158d98d..c31a6427f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -162,9 +162,9 @@ public NameNode SimpleNameNode(CommonTree source, K kind, St }*/ @Override - public RPGDelegationElem RPGDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) + public RPGDelegationElem RPGDelegationElem(CommonTree source, GProtocolNameNode root, GProtocolNameNode state, RoleNode role) { - RPGDelegationElem de = new RPGDelegationElem(source, proto, role); + RPGDelegationElem de = new RPGDelegationElem(source, root, state, role); de = del(de, new RPGDelegationElemDel()); return de; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java index 6b7a15fc7..8c28481b6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java @@ -30,15 +30,21 @@ import org.scribble.ext.go.core.type.name.RPCoreGDelegationType; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexFactory; +import org.scribble.main.ScribbleException; import org.scribble.type.kind.Local; import org.scribble.type.name.PayloadElemType; +import org.scribble.visit.AstVisitor; public class RPGDelegationElem extends GDelegationElem { + public final GProtocolNameNode state; + + // super.proto used for root // FIXME: RoleNode (its String value) is used for *variant name* -- cf. toPayloadType, RPRoleVariant construction - public RPGDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) + public RPGDelegationElem(CommonTree source, GProtocolNameNode root, GProtocolNameNode state, RoleNode role) { - super(source, proto, role); + super(source, root, role); + this.state = state; } @Override @@ -51,31 +57,48 @@ public LDelegationElem project(AstFactory af) @Override protected RPGDelegationElem copy() { - return new RPGDelegationElem(this.source, this.proto, this.role); + return new RPGDelegationElem(this.source, this.proto, this.state, this.role); } @Override public RPGDelegationElem clone(AstFactory af) { - GProtocolNameNode name = (GProtocolNameNode) this.proto.clone(af); + GProtocolNameNode root = (GProtocolNameNode) this.proto.clone(af); + GProtocolNameNode state = (GProtocolNameNode) this.state.clone(af); RoleNode role = (RoleNode) this.role.clone(af); - return ((RPAstFactory) af).RPGDelegationElem(this.source, name, role); + return ((RPAstFactory) af).RPGDelegationElem(this.source, root, state, role); + } + + @Override + public RPGDelegationElem reconstruct(GProtocolNameNode root, RoleNode role) + { + throw new RuntimeException("Shouldn't get in here: " + this); } - public RPGDelegationElem reconstruct(GProtocolNameNode proto, RoleNode role) + public RPGDelegationElem reconstruct(GProtocolNameNode root, GProtocolNameNode state, RoleNode role) { ScribDel del = del(); - RPGDelegationElem elem = new RPGDelegationElem(this.source, proto, role); + RPGDelegationElem elem = new RPGDelegationElem(this.source, root, state, role); elem = (RPGDelegationElem) elem.del(del); return elem; } + @Override + public RPGDelegationElem visitChildren(AstVisitor nv) throws ScribbleException + { + GProtocolNameNode root = (GProtocolNameNode) visitChild(this.proto, nv); + GProtocolNameNode state = (GProtocolNameNode) visitChild(this.state, nv); + RoleNode role = (RoleNode) visitChild(this.role, nv); + return reconstruct(root, state, role); + } + @Override public PayloadElemType toPayloadType() { // FIXME all HACK String tmp = this.role.toString(); int i = tmp.indexOf("_"); // Cf. RPCoreSTApiGenerator#getEndpointKindTypeName + // Treating singleton variant as special case (although not done elsewhere, e.g., A[1,1]) String name; RPIndexExpr start; RPIndexExpr end; @@ -97,6 +120,6 @@ public PayloadElemType toPayloadType() } RPRoleVariant variant = new RPRoleVariant(name, Stream.of(new RPInterval(start, end)).collect(Collectors.toSet()), Collections.emptySet()); - return new RPCoreGDelegationType(this.proto.toName(), variant); + return new RPCoreGDelegationType(this.proto.toName(), this.state.toName(), variant); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index dddb0b025..f68f9857c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -220,6 +220,7 @@ public static String getEndpointKindPackageName(RPRoleVariant variant) return getGeneratedRoleVariantName(variant); } + // FIXME: doesn't need simpname // Role variant = Endpoint kind -- e.g., S_1To1, W_1Ton public static String getEndpointKindTypeName(GProtocolName simpname, RPRoleVariant variant) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index c1e817d55..58851c7fd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -673,7 +673,7 @@ protected static String getDelegatedChanPackageName(RPCoreGDelegationType gdt) { GProtocolName proto = gdt.getGlobalProtocol(); RPRoleVariant variant = gdt.getVariant(); - return RPCoreSTApiGenerator.getEndpointKindTypeName(proto.getSimpleName(), variant); + return RPCoreSTApiGenerator.getEndpointKindTypeName(proto.getSimpleName(), variant); // N.B. doesn't use proto } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java index 1ab55841f..7e47da0b2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java @@ -7,16 +7,26 @@ public class RPCoreGDelegationType extends GDelegationType { private static final long serialVersionUID = 1L; + + protected GProtocolName state; // Cf. RPGDelegationElem - public RPCoreGDelegationType(GProtocolName proto, RPRoleVariant v) + // super.proto used for root + public RPCoreGDelegationType(GProtocolName root, GProtocolName state, RPRoleVariant v) { - super(proto, v); + super(root, v); + this.state = state; } public RPRoleVariant getVariant() { return (RPRoleVariant) this.role; } + + @Override + public String toString() + { + return this.proto + ":" + this.state + "@" + this.role; + } @Override public boolean equals(Object o) @@ -30,7 +40,7 @@ public boolean equals(Object o) return false; } RPCoreGDelegationType them = (RPCoreGDelegationType) o; - return them.canEqual(this) && super.equals(o); + return them.canEqual(this) && super.equals(o) && this.state.equals(them.state); } public boolean canEqual(Object o) @@ -43,6 +53,7 @@ public int hashCode() { int hash = 6673; hash = 31 * super.hashCode(); + hash = 31 * this.state.hashCode(); return hash; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java index aa2367f4f..68806ab86 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java @@ -17,12 +17,14 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.global.GDelegationElemDel; import org.scribble.ext.go.ast.global.RPGDelegationElem; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; +import org.scribble.visit.AstVisitor; import org.scribble.visit.wf.NameDisambiguator; public class RPGDelegationElemDel extends GDelegationElemDel @@ -31,7 +33,7 @@ public RPGDelegationElemDel() { } - + // Duplicated from super @Override public RPGDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, GDelegationElem de) throws ScribbleException @@ -50,7 +52,9 @@ public RPGDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, GD } } - GProtocolNameNode pnn = (GProtocolNameNode) disamb.job.af.QualifiedNameNode(de.proto.getSource(), fullname.getKind(), fullname.getElements()); // Not keeping original namenode del - return (RPGDelegationElem) de.reconstruct(pnn, de.role); + RPGDelegationElem rpde = (RPGDelegationElem) de; + GProtocolNameNode root = (GProtocolNameNode) disamb.job.af.QualifiedNameNode(rpde.proto.getSource(), fullname.getKind(), fullname.getElements()); // Not keeping original namenode del + GProtocolNameNode state = (GProtocolNameNode) disamb.job.af.QualifiedNameNode(rpde.state.getSource(), fullname.getKind(), fullname.getElements()); // Not keeping original namenode del + return (RPGDelegationElem) rpde.reconstruct(root, state, de.role); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java index c1a7ef78f..eecf483d8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java @@ -52,9 +52,13 @@ public static PayloadElem parsePayloadElem(CommonTree ct, AstFactory af) case "PARAM_DELEGATION": { // Duplicated from AntlrPayloadElemList.parsePayloadElem - RoleNode rn = AntlrSimpleName.toRoleNode((CommonTree) ct.getChild(0), af); - GProtocolNameNode gpnn = AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1), af); - return ((RPAstFactory) af).RPGDelegationElem(ct, gpnn, rn); + RoleNode rn = AntlrSimpleName.toRoleNode((CommonTree) ct.getChild(0), af); // FIXME: factor out constants + GProtocolNameNode root = AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1), af); + CommonTree tmp = (CommonTree) ct.getChild(2); + GProtocolNameNode state = (tmp != null) + ? AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1), af) + : root; + return ((RPAstFactory) af).RPGDelegationElem(ct, root, state, rn); } default: return AntlrPayloadElemList.parsePayloadElem(ct, af); From b4858ace4ca0dce8aa9695a9705cbb291dd6f47d Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Tue, 18 Sep 2018 14:40:09 +0100 Subject: [PATCH 320/433] Change arguments of IRecv to use destination addr. Instead of using interface{} to store the received value temporarily then type cast (e.g. value = (*tmp.(*T))), use pointer to destination variable directly, i.e. &value. This patch removes declaration of var tmp interface{} and the casts and replace them with the corresponding arg0/arg0[i-start]/lab. --- .../statetype3/RPCoreSTBranchActionBuilder.java | 7 +++---- .../codegen/statetype3/RPCoreSTCaseActionBuilder.java | 11 +++++------ .../statetype3/RPCoreSTReceiveActionBuilder.java | 11 +++++------ .../statetype3/RPCoreSTSelectActionBuilder.java | 5 ++--- .../statetype3/RPCoreSTSelectStateBuilder.java | 8 +++----- 5 files changed, 18 insertions(+), 24 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 8d3af3f7c..f2280a46d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -86,7 +86,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat if (a.mid.isOp()) // Currently, assuming all mids are Ops; else all mids are sig names { // Duplicated from RPCoreSTReceiveActionBuilder - res += "var lab interface{}\n" // string // cf. RPCoreSTReceiveActionBuilder // var decl needed for deserializatoin -- FIXME? + res += "var lab string\n" // cf. RPCoreSTReceiveActionBuilder + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(" + "&lab" + ")"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", 1, &lab" + ")" @@ -98,14 +98,13 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // Switch and return Cases value res += "\n" - + "cast := *(lab.(*string))\n" - + "switch cast {\n" + + "switch lab {\n" + as.stream().map(x -> "case \"" + x.mid + "\":\n" + "return &" + RPCoreSTCaseBuilder.getOpTypeName(api, curr, x.mid) //+ "{ Ept: s.Ept, Res: new(session.LinearResource) }\n" + "{" + ret + "}\n" ).collect(Collectors.joining("")) - + "default: panic(\"Shouldn't get in here: \" + cast)\n" + + "default: panic(\"Shouldn't get in here: \" + lab)\n" + "}\n" + "return nil\n"; // FIXME: panic instead } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index 3494ae0da..490286f6c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -52,19 +52,18 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // Duplicated from RPCoreSTReceiveActionBuilder Function makeCaseReceive = pt -> - "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK: [] // N.B. *arg0 matches buildArgs - + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(&tmp)"*/ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", 1, &tmp)" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", 1, &arg0)" + "; err != nil {\n" //+ "log.Fatal(err)\n" //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + rpapi.makeReturnSuccStateChan(succ) + "\n" - + "}\n" + + "}\n"; //+ "*arg0 = tmp.(" + extName + ")\n"; // N.B. *arg0 matches buildArgs - + "*arg0 = *(tmp.(*" + pt + "))\n"; // Cf. RPCoreSTReceiveActionBuilder // N.B. *arg0 matches buildArgs - + //+ "*arg0 = *(tmp.(*" + pt + "))\n"; // Cf. RPCoreSTReceiveActionBuilder // N.B. *arg0 matches buildArgs + String res = ""; if (a.mid.isOp()) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 7457573e8..ab29c9b08 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -104,7 +104,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //if (!a.mid.toString().equals("")) // HACK FIXME? // Now redundant, -param-api checks mid starts uppercase { - res += "var lab interface{}\n" // string // var decl needed for deserialization -- FIXME? + res += "var lab string\n" + "if " + errorField + " = " + sEpRecv /*+ "[i]" + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&lab" + ")" + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_STRING + "()"*/ @@ -117,19 +117,18 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } Function makeReceivePayType = pt -> - "var tmp interface{}\n" // var tmp needed for deserialization -- FIXME? //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? - + "if " + errorField + " = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + "if " + errorField + " = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &tmp)" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &arg0[i-" + start + "])" + "; " + errorField + " != nil {\n" //+ "log.Fatal(err)\n" //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + rpapi.makeReturnSuccStateChan(succ) + "\n" - + "}\n" - + "arg0[i-" + start + "] = *(tmp.(*" + pt + "))\n"; // FIXME: doesn't work for gob, pointer decoding seems flattened? ("*" dropped) ... // Cf. ISend in RPCoreSTSendActionBuilder + + "}\n"; + // + "arg0[i-" + start + "] = *(tmp.(*" + pt + "))\n"; // FIXME: doesn't work for gob, pointer decoding seems flattened? ("*" dropped) ... // Cf. ISend in RPCoreSTSendActionBuilder //+ "arg0[i-" + start + "] = tmp.(" + pt + ")\n"; // FIXME: ... but doesn't work for shm res += makeReceivePayType.apply(rpapi.getPayloadElemTypeName(a.payload.elems.get(0))); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java index 092c2db24..2932b949a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectActionBuilder.java @@ -100,15 +100,14 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat throw new RuntimeException("[rp-core] TODO: -nocopy: " + a); } - res += "var tmp interface{}\n"; res += "if err := " + sEpRecv // + (((GoJob) api.job).noCopy ? "Raw" : ""); //+ "[" + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&arg0)" + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", " - + rpapi.generateIndexExpr(d.start) + ", &tmp)" + + rpapi.generateIndexExpr(d.start) + ", &arg0)" + "; err != nil {\n" + "log.Fatal(err)\n" + "}\n" - + "*arg0 = tmp.(" + extName + ")\n" + //+ "*arg0 = tmp.(" + extName + ")\n" + "ch := make(chan *" + rpapi.getStateChanName(curr.getSuccessor(a)) + ", 1)\n" //+ "ch <- " + rpapi.makeCreateSuccStateChan(this, curr, curr.getSuccessor(a), sEp) + "\n"; + "ch <- " + rpapi.makeCreateSuccStateChan(curr.getSuccessor(a)) + "\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java index 536e392bd..647e6c71b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSelectStateBuilder.java @@ -100,8 +100,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) res += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + ") branch() {\n" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE - + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" - + "var tmp interface{}\n"; + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"; if (((GoJob) rpapi.job).noCopy) { /*res += @@ -116,11 +115,10 @@ public String getPreamble(STStateChanApiBuilder api, EState s) "if err := " + sEpRecv + "." /*+ RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + peer.getName() + "\"][" + RPCoreSTStateChanApiBuilder.generateIndexExpr(d.start) + "].Recv(&op)*/ + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", " - + rpapi.generateIndexExpr(d.start) + ", &tmp)" + + rpapi.generateIndexExpr(d.start) + ", &op)" + "; err != nil {\n" // g.end = g.start -- CFSM only has ? for input + "log.Fatal(err)\n" - + "}\n" - + "op := tmp.(string)\n"; + + "}\n"; } res+= "if " + s.getActions().stream().map(a -> { From bbfbf460347a0293a4480e7e1c2c0fa3a4d924bd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 25 Sep 2018 17:29:36 +0100 Subject: [PATCH 321/433] Continued. --- .../ext/go/ast/global/RPGDelegationElem.java | 8 +++- .../ext/go/core/ast/global/RPCoreGChoice.java | 2 - .../global/RPCoreGProtocolDeclTranslator.java | 7 ++-- .../ext/go/core/cli/RPCoreCommandLine.java | 4 +- .../RPCoreSTStateChanApiBuilder.java | 40 +++++++++++++++++-- .../core/type/name/RPCoreGDelegationType.java | 10 +++++ .../go/del/global/RPGDelegationElemDel.java | 12 +++--- .../parser/scribble/RPAntlrToScribParser.java | 1 - .../scribble/ast/RPAntlrPayloadElemList.java | 5 +-- 9 files changed, 67 insertions(+), 22 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java index 8c28481b6..a01f68a4b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java @@ -47,6 +47,12 @@ public RPGDelegationElem(CommonTree source, GProtocolNameNode root, GProtocolNam this.state = state; } + @Override + public String toString() + { + return this.proto + ":" + this.state + "@" + this.role; + } + @Override public LDelegationElem project(AstFactory af) { @@ -110,7 +116,6 @@ public PayloadElemType toPayloadType() } else { - System.out.println("111: " + tmp); name = tmp.substring(0, i); int j = tmp.indexOf("t", i+1); // "to" // HACK FIXME String s = tmp.substring(i+1, j); @@ -120,6 +125,7 @@ public PayloadElemType toPayloadType() } RPRoleVariant variant = new RPRoleVariant(name, Stream.of(new RPInterval(start, end)).collect(Collectors.toSet()), Collections.emptySet()); + return new RPCoreGDelegationType(this.proto.toName(), this.state.toName(), variant); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 6b1f70676..f543b078b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -218,8 +218,6 @@ public RPCoreLType project(RPCoreAstFactory af, //Role r, Set ranges throw new RuntimeException("[rp-core] TODO: " + pet); } RPCoreGDelegationType gdt = (RPCoreGDelegationType) pet; // Payload types come from ParamCoreGProtocolDeclTranslator#parsePayload (toMessage) - - System.out.println("CCC: " + this + ", " + gdt.getGlobalProtocol() + ", " + gdt.getRole()); // cf. GDelegationElem#project diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index 657b32d5b..f2e66933a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -30,10 +30,8 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.main.Job; import org.scribble.type.Message; -import org.scribble.type.MessageSig; import org.scribble.type.kind.RecVarKind; import org.scribble.type.name.DataType; -import org.scribble.type.name.GDelegationType; import org.scribble.type.name.RecVar; public class RPCoreGProtocolDeclTranslator @@ -45,6 +43,7 @@ public class RPCoreGProtocolDeclTranslator private static int recCounter = 1; + @SuppressWarnings("unused") // Disabling this would make finding target state chan name of P1:P2@v easier (but not actually currently done) private static String makeFreshRecVarName() { return "_X" + RPCoreGProtocolDeclTranslator.recCounter++; @@ -279,7 +278,9 @@ private RPCoreGType parseGRecursion(Map rvs, RecVar recvar = gr.recvar.toName(); if (recvar.toString().contains("__")) // HACK: "inlined proto rec var" { - RecVarNode rvn = (RecVarNode) ((RPAstFactory) this.job.af).SimpleNameNode(null, RecVarKind.KIND, makeFreshRecVarName()); + String name = //makeFreshRecVarName(); + recvar.toString(); // FIXME HACK to support state lookup for delegation via inlined protocol name -- cf. RPCoreSTStateChanApiBuilder#getPayloadElemTypeName + RecVarNode rvn = (RecVarNode) ((RPAstFactory) this.job.af).SimpleNameNode(null, RecVarKind.KIND, name); rvs.put(recvar, rvn.toName()); recvar = rvn.toName(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 480e4660e..a6be2f02b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -603,7 +603,7 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_EFSM); for (int i = 0; i < args.length; i += 1) { - Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); + Role role = CommandLine.checkRoleArg(job.getContext(), this.gpd.getHeader().getDeclName(), args[i]); this.E0.get(role).entrySet().forEach(e -> { String out = e.getValue().toDot(); @@ -616,7 +616,7 @@ protected void tryOutputTasks(Job job) throws CommandLineException, ScribbleExce String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_EFSM_PNG); for (int i = 0; i < args.length; i += 2) { - Role role = CommandLine.checkRoleArg(job.getContext(), gpd.getHeader().getDeclName(), args[i]); + Role role = CommandLine.checkRoleArg(job.getContext(), this.gpd.getHeader().getDeclName(), args[i]); String png = args[i+1]; //for (Entry, EGraph> e : this.E0.get(role).entrySet()) for (Entry e : this.E0.get(role).entrySet()) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 58851c7fd..c77697077 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -13,8 +13,14 @@ import org.scribble.ast.DataTypeDecl; import org.scribble.ast.MessageSigNameDecl; import org.scribble.ast.Module; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.codegen.statetype.STActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.global.RPCoreGProtocolDeclTranslator; +import org.scribble.ext.go.core.ast.global.RPCoreGType; +import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; @@ -653,11 +659,39 @@ protected String getPayloadElemTypeName(PayloadElemType pet) { //return ((RPCoreSTStateChanApiBuilder) api).getExtName((DataType) pet); RPCoreGDelegationType gdt = (RPCoreGDelegationType) pet; - String tmp = "*" + getDelegatedChanPackageName(gdt) + ".Init"; // FIXME: not necessarily Init + String name; - System.out.println("DDD: " + tmp); + GProtocolName root = gdt.getRoot(); + GProtocolName state = gdt.getState(); + RPRoleVariant v = gdt.getVariant(); + RPCoreAstFactory af = new RPCoreAstFactory(); - return tmp; + // Based on RPCoreCommandLine.paramCoreParseAndCheckWF // FIXME: integrate? (e.g., process all protocols, not just target main -- then won't need to separately run CL first on delegated proto) + GProtocolDecl gpd = (GProtocolDecl) this.job.getContext().getMainModule() + .getProtocolDecl(root.getSimpleName()); // FIXME: delegated protocol may not be in main module + try + { + RPCoreGType gt = new RPCoreGProtocolDeclTranslator(this.job, af).translate(gpd); + RPCoreLType lt = gt.project(af, v); + + /* // FIXME: currently cannot determine state chan name of target state in delegated protocol because of decoupled state numbering + // If we rebuild the target endpoint graph here, the state numbering won't match + RPCoreEGraphBuilder builder = new RPCoreEGraphBuilder(job); + EGraph g = builder.build(this.L0.get(r).get(ranges));*/ + } + catch (RPCoreSyntaxException e) + { + throw new RuntimeException("Shouldn't get in here: ", e); + } + + // FIXME: hardcoded to Init because of above FIXME + if (!root.equals(state)) + { + throw new RuntimeException("[rp-core] TODO: delegation of non-initial state of target protocol: " + state); + } + name = "Init"; + + return "*" + getDelegatedChanPackageName(gdt) + "." + name; } else if (pet instanceof DataType) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java index 7e47da0b2..ab43d18eb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/name/RPCoreGDelegationType.java @@ -16,6 +16,16 @@ public RPCoreGDelegationType(GProtocolName root, GProtocolName state, RPRoleVari super(root, v); this.state = state; } + + public GProtocolName getRoot() + { + return getGlobalProtocol(); + } + + public GProtocolName getState() + { + return this.state; + } public RPRoleVariant getVariant() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java index 68806ab86..21e7e251c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGDelegationElemDel.java @@ -17,14 +17,12 @@ import org.scribble.ast.context.ModuleContext; import org.scribble.ast.global.GDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; -import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.global.GDelegationElemDel; import org.scribble.ext.go.ast.global.RPGDelegationElem; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.type.name.GProtocolName; import org.scribble.type.name.Role; -import org.scribble.visit.AstVisitor; import org.scribble.visit.wf.NameDisambiguator; public class RPGDelegationElemDel extends GDelegationElemDel @@ -39,10 +37,10 @@ public RPGDelegationElemDel() public RPGDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, GDelegationElem de) throws ScribbleException { ModuleContext mc = disamb.getModuleContext(); - GProtocolName fullname = (GProtocolName) mc.getVisibleProtocolDeclFullName(de.proto.toName()); + GProtocolName rootfullname = (GProtocolName) mc.getVisibleProtocolDeclFullName(de.proto.toName()); Role rn = de.role.toName(); - ProtocolDecl gpd = disamb.job.getContext().getModule(fullname.getPrefix()).getProtocolDecl(fullname.getSimpleName()); + ProtocolDecl gpd = disamb.job.getContext().getModule(rootfullname.getPrefix()).getProtocolDecl(rootfullname.getSimpleName()); if (!gpd.header.roledecls.getRoles().contains(rn)) { String tmp = rn.toString(); // FIXME HACK (currently rely on checking valid variant later) @@ -53,8 +51,10 @@ public RPGDelegationElem visitForNameDisambiguation(NameDisambiguator disamb, GD } RPGDelegationElem rpde = (RPGDelegationElem) de; - GProtocolNameNode root = (GProtocolNameNode) disamb.job.af.QualifiedNameNode(rpde.proto.getSource(), fullname.getKind(), fullname.getElements()); // Not keeping original namenode del - GProtocolNameNode state = (GProtocolNameNode) disamb.job.af.QualifiedNameNode(rpde.state.getSource(), fullname.getKind(), fullname.getElements()); // Not keeping original namenode del + GProtocolName statefullname = (GProtocolName) mc.getVisibleProtocolDeclFullName(rpde.state.toName()); + GProtocolNameNode root = (GProtocolNameNode) disamb.job.af.QualifiedNameNode(rpde.proto.getSource(), rootfullname.getKind(), rootfullname.getElements()); // Not keeping original namenode del + GProtocolNameNode state = (GProtocolNameNode) disamb.job.af.QualifiedNameNode(rpde.state.getSource(), statefullname.getKind(), statefullname.getElements()); // Not keeping original namenode del + return (RPGDelegationElem) rpde.reconstruct(root, state, de.role); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java index 79632ad2e..a4d4c2833 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java @@ -47,7 +47,6 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException return RPCoreAntlrModule.parseModule(this, ct, af); case ScribbleAntlrConstants.PAYLOAD_NODE_TYPE: { - System.out.println("AAA: " + ct); return RPAntlrPayloadElemList.parsePayloadElemList(this, ct, af); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java index eecf483d8..98185602a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/RPAntlrPayloadElemList.java @@ -44,9 +44,6 @@ public static PayloadElemList parsePayloadElemList(AntlrToScribParser parser, Co public static PayloadElem parsePayloadElem(CommonTree ct, AstFactory af) { String type = ct.getToken().getText(); // FIXME from AntlrToScribParser#getAntlrNodeType - - System.out.println("BBB: " + type); - switch (type) { case "PARAM_DELEGATION": @@ -56,7 +53,7 @@ public static PayloadElem parsePayloadElem(CommonTree ct, AstFactory af) GProtocolNameNode root = AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1), af); CommonTree tmp = (CommonTree) ct.getChild(2); GProtocolNameNode state = (tmp != null) - ? AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1), af) + ? AntlrQualifiedName.toGProtocolNameNode(tmp, af) : root; return ((RPAstFactory) af).RPGDelegationElem(ct, root, state, rn); } From dec34d1e102c17749e2d1cc513a7d17973a145fe Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 26 Sep 2018 22:10:08 +0100 Subject: [PATCH 322/433] Patch to rp-core foreach projection. --- .../go/core/ast/global/RPCoreGForeach.java | 9 ++++- .../src/test/scrib/param/tmp/ParamTest.scr | 40 +++++++++++++++---- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index fa569ba3e..c1eab1960 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -97,7 +97,14 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor else { RPCoreLType body = this.body.project(af, subj); - return af.RPCoreLForeach(this.role, this.param, this.start, this.end, body, seq); + if (body instanceof RPCoreLEnd) + { + return seq; + } + else + { + return af.RPCoreLForeach(this.role, this.param, this.start, this.end, body, seq); + } //throw new RuntimeException("[rp-core] TODO: " + this + " project onto " + subj); } } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 1d7bfc8c3..1077ce88c 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,14 +8,26 @@ module param.tmp.ParamTest; -type "int" from "..." as int; -type "string" from "..." as string; -type "TwoBuyer.Address" from "scrib/twobuyer/TwoBuyer/TwoBuyer/types.go" as Address; -type "TwoBuyer.Date" from "scrib/twobuyer/TwoBuyer/TwoBuyer/types.go" as Date; +//* +type "int" from "builtin" as int; +type "string" from "builtin" as string; +sig "msgsig.Request" from "github.com/nickng/httpget/msgsig" as Request; +sig "msgsig.Response" from "github.com/nickng/httpget/msgsig" as Response; + +global protocol Proto1(role Master, role Fetcher, role Server) { + URL(int) from Master[1,1] to Fetcher[1,N]; + + foreach Fetcher[I:1,N] { + Request from Fetcher[I,I] to Server[1,1]; + Response from Server[1,1] to Fetcher[I,I]; + //tmp() from Server[1,1] to Master[1,1]; // FIXME: projection + } + + Done(string) from Fetcher[1,N] to Master[1,1]; +} +//*/ + -sig "..." - from "..." - as Data; /* @@ -50,12 +62,26 @@ message passing // paramterisation subsumes multicast + +/* +type "int" from "..." as int; +type "string" from "..." as string; +type "TwoBuyer.Address" from "scrib/twobuyer/TwoBuyer/TwoBuyer/types.go" as Address; +type "TwoBuyer.Date" from "scrib/twobuyer/TwoBuyer/TwoBuyer/types.go" as Date; + +sig "..." + from "..." + as Data; + global protocol Proto1(role A, role B) { foreach A[I:1,K], B[J:2,KK] { Data from A[I,I] to B[J,J]; } } +//*/ + + /*global protocol ScatterGather(role M, role S) { (int) from M[1,1] to S[1,N]; From 835cbbe5e9fcdb1bbe7bcc887ae4eb86bda3cdb2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 27 Sep 2018 11:05:43 +0100 Subject: [PATCH 323/433] Minor. --- .../go/core/ast/global/RPCoreGForeach.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index c1eab1960..6eadf9535 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -81,19 +81,22 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor RPCoreLType seq = this.seq.project(af, subj); RPInterval v = new RPInterval(this.start, this.end); - if (subj.getName().equals(this.role) && subj.intervals.contains(v)) // FIXME: proper interval inclusion? -- also RPCoreGChoice#project? - // FIXME: factor out // cf. RPCoreGChoice#project + if (subj.getName().equals(this.role)) // FIXME: factor out // cf. RPCoreGChoice#project { - RPRoleVariant indexed = new RPRoleVariant(subj.getName().toString(), - Stream.of(//new RPInterval(this.param, this.param)) - new RPInterval(tmp, tmp)).collect(Collectors.toSet()), Collections.emptySet()); - RPCoreLType body = this.body.project(af, indexed); - return body.subs(af, RPCoreLEnd.END, seq); + if (subj.intervals.contains(v)) // FIXME: proper interval inclusion? -- also RPCoreGChoice#project? + { + RPRoleVariant indexed = new RPRoleVariant(subj.getName().toString(), + Stream.of(//new RPInterval(this.param, this.param)) + new RPInterval(tmp, tmp)).collect(Collectors.toSet()), Collections.emptySet()); + RPCoreLType body = this.body.project(af, indexed); + return body.subs(af, RPCoreLEnd.END, seq); + } + else + { + // ...else substitute cont for end in body ? + throw new RuntimeException("Shouldn't get in here? " + this + ", " + subj); + } } - /*else if () - { - // ...else substitute cont for end in body - }*/ else { RPCoreLType body = this.body.project(af, subj); From 8eabb0b09ff70a4f5d4d447abb628cb7eb858dc1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 27 Sep 2018 17:14:40 +0100 Subject: [PATCH 324/433] Refactoring multi-clause foreach sigs and foreach projection. --- .../ext/go/core/ast/RPCoreAstFactory.java | 18 ++- .../ext/go/core/ast/RPCoreForeach.java | 42 ++++-- .../ext/go/core/ast/global/RPCoreGChoice.java | 38 ++++++ .../ext/go/core/ast/global/RPCoreGEnd.java | 10 ++ .../go/core/ast/global/RPCoreGForeach.java | 124 ++++++++++++++---- .../core/ast/global/RPCoreGMultiChoices.java | 9 ++ .../global/RPCoreGProtocolDeclTranslator.java | 8 +- .../ext/go/core/ast/global/RPCoreGRec.java | 9 ++ .../ext/go/core/ast/global/RPCoreGRecVar.java | 9 ++ .../ext/go/core/ast/global/RPCoreGType.java | 5 +- .../ext/go/core/ast/local/RPCoreLForeach.java | 34 +++-- .../model/endpoint/RPCoreEGraphBuilder.java | 11 +- .../ext/go/core/type/RPIndexedRole.java | 7 +- .../scribble/ext/go/core/type/RPInterval.java | 13 +- .../ext/go/type/index/RPForeachVar.java | 2 +- 15 files changed, 273 insertions(+), 66 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java index 77bbe0c99..6835bb506 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.core.ast; import java.util.LinkedHashMap; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -18,6 +19,7 @@ import org.scribble.ext.go.core.ast.local.RPCoreLRec; import org.scribble.ext.go.core.ast.local.RPCoreLRecVar; import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.type.index.RPForeachVar; @@ -73,9 +75,13 @@ public RPCoreGEnd ParamCoreGEnd() return RPCoreGEnd.END; } - public RPCoreGForeach RPCoreGForeach(Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, RPCoreGType body, RPCoreGType seq) + public RPCoreGForeach RPCoreGForeach(//Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, + Set roles, Set ivals, + RPCoreGType body, RPCoreGType seq) { - return new RPCoreGForeach(role, var, start, end, body, seq); + return new RPCoreGForeach(//role, var, start, end, + roles, ivals, + body, seq); } public RPCoreLCrossChoice ParamCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, @@ -137,8 +143,12 @@ public RPCoreLEnd ParamCoreLEnd() return RPCoreLEnd.END; } - public RPCoreLForeach RPCoreLForeach(Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, RPCoreLType body, RPCoreLType seq) + public RPCoreLForeach RPCoreLForeach(//Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, + Set roles, Set ivals, + RPCoreLType body, RPCoreLType seq) { - return new RPCoreLForeach(role, var, start, end, body, seq); + return new RPCoreLForeach(//role, var, start, end, + roles, ivals, + body, seq); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java index cf82ed0bc..3df412f98 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java @@ -1,28 +1,37 @@ package org.scribble.ext.go.core.ast; -import org.scribble.ext.go.type.index.RPForeachVar; -import org.scribble.ext.go.type.index.RPIndexExpr; +import java.util.HashSet; +import java.util.Set; + +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.type.kind.ProtocolKind; import org.scribble.type.name.Role; public abstract class RPCoreForeach, K extends ProtocolKind> implements RPCoreType { - public final Role role; + /*public final Role role; public final RPForeachVar param; - // FIXME: use RPInterval public final RPIndexExpr start; // Gives the Scribble choices-subj range // Cf. ParamCoreGChoice singleton src - public final RPIndexExpr end; // this.dest == super.role -- arbitrary? + public final RPIndexExpr end; // this.dest == super.role -- arbitrary?*/ + + public final Set roles; + public final Set ivals; // FIXME: co-intervals? public final B body; public final B seq; - public RPCoreForeach(Role role, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, B body, B cont) + // Pre: ivals vars are distinct + public RPCoreForeach(//Role role, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, + Set roles, Set ivals, + B body, B cont) { - this.role = role; + /*this.role = role; this.param = param; this.start = start; - this.end = end; + this.end = end;*/ + this.roles = new HashSet<>(roles); + this.ivals = new HashSet<>(ivals); this.body = body; this.seq = cont; } @@ -30,7 +39,9 @@ public RPCoreForeach(Role role, RPForeachVar param, RPIndexExpr start, RPIndexEx @Override public String toString() { - return "foreach " + this.role + "[" + param + ":" + this.start + "," + this.end + "] do " + this.body + " ; " + this.seq; + return "foreach " //+ this.role + "[" + param + ":" + this.start + "," + this.end + "] do " + + this.roles + "[" + this.ivals + "] do " + + this.body + " ; " + this.seq; } @Override @@ -45,9 +56,10 @@ public boolean equals(Object obj) return false; } RPCoreForeach them = (RPCoreForeach) obj; - return them.canEquals(this) && this.role.equals(them.role) - && this.param.equals(them.param) && this.start.equals(them.start) - && this.end.equals(them.end) && this.body.equals(them.body) && this.seq.equals(them.seq); // FIXME: check B kind is equal? + return them.canEquals(this) && this.roles.equals(them.roles) + //&& this.param.equals(them.param) && this.start.equals(them.start) && this.end.equals(them.end) + && this.ivals.equals(them.ivals) + && this.body.equals(them.body) && this.seq.equals(them.seq); // FIXME: check B kind is equal? } @Override @@ -58,10 +70,12 @@ public int hashCode() { final int prime = 4271; int result = 1; - result = prime * result + this.role.hashCode(); + /*result = prime * result + this.role.hashCode(); result = prime * result + this.param.hashCode(); result = prime * result + this.start.hashCode(); - result = prime * result + this.end.hashCode(); + result = prime * result + this.end.hashCode();*/ + result = prime * result + this.roles.hashCode(); + result = prime * result + this.ivals.hashCode(); result = prime * result + this.body.hashCode(); result = prime * result + this.seq.hashCode(); return result; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index f543b078b..ea8b3f1ff 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -298,6 +298,44 @@ else if (destName.equals(subjName) && subj.intervals.contains(destRange)) //return merge(af, r, ranges, projs); return merge(af, subj, projs); } + + // Duplicated from project above + @Override + public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ivals, RPIndexedRole subj) throws RPCoreSyntaxException + { + LinkedHashMap projs = new LinkedHashMap<>(); + for (Entry e : this.cases.entrySet()) + { + Message a = e.getKey(); + projs.put(a, e.getValue().project3(af, roles, ivals, subj)); + } + + Role srcName = this.src.getName(); + Role destName = this.dest.getName(); + Role subjName = subj.getName(); + RPInterval srcRange = this.src.getParsedRange(); + RPInterval destRange = this.dest.getParsedRange(); + if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) + { + if //(srcName.equals(subjName) && subj.intervals.contains(srcRange)) + (this.src.equals(subj)) // N.B. subj uses RPIndexVar (not RPForeachVar) -- cf. the invocation of project3 in RPCoreGForeach#project2 + { + //return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); + } + else if //(destName.equals(subjName) && subj.intervals.contains(destRange)) + ... HERE + { + //return af.ParamCoreLCrossChoice(this.src, RPCoreLActionKind.CROSS_RECEIVE, projs); + } + } + else + { + throw new RuntimeException("[param-core] TODO: " + this); + } + + // Not CROSS_TRANSFER, or subj is not sender nor receiver + return merge(af, subj, projs); + } //private ParamCoreLType merge(ParamCoreAstFactory af, Role r, Set ranges, Map projs) throws ParamCoreSyntaxException private RPCoreLType merge(RPCoreAstFactory af, RPRoleVariant r, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java index 9a3ac7190..2cdd3718d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java @@ -8,11 +8,14 @@ import org.scribble.ext.go.core.ast.RPCoreEnd; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; public class RPCoreGEnd extends RPCoreEnd implements RPCoreGType @@ -53,6 +56,13 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor return af.ParamCoreLEnd(); } + // G proj R \vec{C} r[z] + @Override + public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ivals, RPIndexedRole subj) throws RPCoreSyntaxException + { + return RPCoreLEnd.END; + } + @Override public boolean equals(Object obj) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 6eadf9535..df72c8019 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -1,6 +1,6 @@ package org.scribble.ext.go.core.ast.global; -import java.util.Collections; +import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -12,22 +12,25 @@ import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.RPForeachVar; -import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexFactory; +import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; public class RPCoreGForeach extends RPCoreForeach implements RPCoreGType { - public RPCoreGForeach(Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, RPCoreGType body, RPCoreGType seq) + public RPCoreGForeach(//Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, + Set roles, Set ivals, + RPCoreGType body, RPCoreGType seq) { - super(role, var, start, end, body, seq); + //super(role, var, start, end, body, seq); + super(roles, ivals, body, seq); } @Override @@ -39,7 +42,8 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } else { - return af.RPCoreGForeach(this.role, this.param, this.start, this.end, + return af.RPCoreGForeach(//this.role, this.param, this.start, this.end, + this.roles, this.ivals, this.body.subs(af, old, neu), this.seq.subs(af, old, neu)); } } @@ -54,7 +58,7 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) @Override public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCollection (though not currently used) { - RPIndexVar tmp = RPIndexFactory.ParamIntVar(this.param.toString()); + /*RPIndexVar tmp = RPIndexFactory.ParamIntVar(this.param.toString()); // HACK FIXME: because RPIndexVar and RPForeachVar now distinguished Set d = Stream.of(new RPInterval(this.start, this.end)).collect(Collectors.toSet()); @@ -67,35 +71,57 @@ public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCo ? new RPIndexedRole(ir.getName().toString(), d) : ir ).collect(Collectors.toSet()); - irs.addAll(this.seq.getIndexedRoles()); - return irs; + irs.addAll(this.seq.getIndexedRoles());*/ + + Set found = this.body.getIndexedRoles(); + Set done = new HashSet<>(); + Set res = new HashSet<>(); + for (RPAnnotatedInterval ival : this.ivals) + { + RPIndexVar tmp = RPIndexFactory.ParamIntVar(ival.var.toString()); + // HACK FIXME: because RPIndexVar and RPForeachVar now distinguished -- unify? + + Set d = Stream.of(new RPInterval(ival.start, ival.end)).collect(Collectors.toSet()); + // TODO: multidim intervals (currently singleton set for onedim) + Set var = Stream.of(new RPInterval(tmp, tmp)).collect(Collectors.toSet()); + for (RPIndexedRole ir : found) + { + if (ir.intervals.equals(var)) + { + done.add(ir); + res.add(new RPIndexedRole(ir.getName().toString(), d)); + } + } + } + + found.removeAll(done); + res.addAll(found); + res.addAll(this.seq.getIndexedRoles()); + return res; } + // G proj r \vec{D} @Override //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { - RPIndexVar tmp = RPIndexFactory.ParamIntVar(this.param.toString()); - // HACK FIXME: because RPIndexVar and RPForeachVar now distinguished - RPCoreLType seq = this.seq.project(af, subj); - - RPInterval v = new RPInterval(this.start, this.end); - if (subj.getName().equals(this.role)) // FIXME: factor out // cf. RPCoreGChoice#project + if (this.roles.contains(subj.getName())) // FIXME: factor out -- cf. RPCoreGChoice#project { - if (subj.intervals.contains(v)) // FIXME: proper interval inclusion? -- also RPCoreGChoice#project? - { - RPRoleVariant indexed = new RPRoleVariant(subj.getName().toString(), - Stream.of(//new RPInterval(this.param, this.param)) - new RPInterval(tmp, tmp)).collect(Collectors.toSet()), Collections.emptySet()); - RPCoreLType body = this.body.project(af, indexed); - return body.subs(af, RPCoreLEnd.END, seq); - } - else + /*RPIndexVar tmp = RPIndexFactory.ParamIntVar(this.param.toString()); + // HACK FIXME: because RPIndexVar and RPForeachVar now distinguished*/ + + /* // FIXME: subj.intervals was meant for multidim nat intervals, but that should be refactored inside (a single) RPInterval + if (subj.intervals.size() != 1) { - // ...else substitute cont for end in body ? - throw new RuntimeException("Shouldn't get in here? " + this + ", " + subj); - } + throw new RuntimeException("TODO: " + ) + }*/ + Set filtered = this.ivals.stream().filter(iv -> subj.intervals.stream().anyMatch(x -> iv.isSame(x))).collect(Collectors.toSet()); + // CHECKME: actual interval inclusion? (vs. isSame) -- also RPCoreGChoice#project? + //RPIndexedRole tmp = new RPIndexedRole(subj.getName().toString(), filtered); // FIXME: should be this, but currently RPIndexedRole interval set for multidim nat intervals (but with >1 TODO exception) + RPCoreGForeach tmp = af.RPCoreGForeach(this.roles, this.ivals, body, af.ParamCoreGEnd()); // FIXME: "cont", not "end"? + RPCoreLType proj = tmp.project2(af, subj.getName(), filtered); + return proj.subs(af, RPCoreLEnd.END, seq); } else { @@ -106,12 +132,52 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor } else { - return af.RPCoreLForeach(this.role, this.param, this.start, this.end, body, seq); + return af.RPCoreLForeach(this.roles, this.ivals, body, seq); } - //throw new RuntimeException("[rp-core] TODO: " + this + " project onto " + subj); } } + // G proj r \vec{C} + private RPCoreLType project2(RPCoreAstFactory af, Role name, Set ivals) throws RPCoreSyntaxException + { + /*RPInterval v = new RPInterval(this.start, this.end); + if (subj.intervals.contains(v)) + { + RPRoleVariant indexed = new RPRoleVariant(subj.getName().toString(), + Stream.of(//new RPInterval(this.param, this.param)) + new RPInterval(tmp, tmp)).collect(Collectors.toSet()), Collections.emptySet()); + RPCoreLType body = proj.project(af, indexed); + return body.subs(af, RPCoreLEnd.END, seq); + } + else + { + // ...else substitute cont for end in body ? + throw new RuntimeException("Shouldn't get in here? " + this + ", " + subj); + }*/ + + if (ivals.isEmpty()) + { + return RPCoreLEnd.END; + } + RPAnnotatedInterval max = ivals.stream() + .filter(x -> ivals.stream().filter(y -> !x.equals(y)).allMatch(y -> ((RPIndexInt) x.start).val > ((RPIndexInt) y.start).val)) + .findFirst().get(); + // FIXME: non-RPIndexInt start exprs for nat intervals -- FIXME: generalised interval comparison (multidim) + RPIndexVar var = RPIndexFactory.ParamIntVar(max.var.toString()); // N.B. not RPForeachVar -- occurrences in body are parsed as RPIndexVar, not RPForeachVar + RPCoreLType proj = this.body.project3(af, this.roles, this.ivals, + new RPIndexedRole(name.toString(), Stream.of(new RPInterval(var, var)).collect(Collectors.toSet()))); + Set tmp = new HashSet<>(ivals); + tmp.remove(max); + return proj.subs(af, RPCoreLEnd.END, project2(af, name, tmp)); + } + + // G proj R \vec{C} r[z] + @Override + public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ivals, RPIndexedRole subj) throws RPCoreSyntaxException + { + return af.RPCoreLForeach(this.roles, this.ivals, this.body.project3(af, roles, ivals, subj), this.seq.project3(af, roles, ivals, subj)); + } + @Override public boolean equals(Object obj) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java index b89faf81b..1d44cb804 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java @@ -16,6 +16,7 @@ import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; @@ -23,6 +24,7 @@ import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.Message; import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; @Deprecated public class RPCoreGMultiChoices extends RPCoreChoice implements RPCoreGType @@ -210,6 +212,13 @@ else if (this.dest.getName().equals(subj.getName()) && subj.intervals.contains(t //return merge(af, r, ranges, projs); return merge(af, subj, projs); } + + // G proj R \vec{C} r[z] + @Override + public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ivals, RPIndexedRole subj) throws RPCoreSyntaxException + { + throw new RuntimeException("Shouldn't get in here: " + this); + } //private ParamCoreLType merge(ParamCoreAstFactory af, Role r, Set ranges, Map projs) throws ParamCoreSyntaxException private RPCoreLType merge(RPCoreAstFactory af, RPRoleVariant r, //Map projs) throws RPCoreSyntaxException diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index f2e66933a..5b72f9bb4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -7,6 +7,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GContinue; @@ -26,6 +28,7 @@ import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.main.Job; @@ -308,7 +311,10 @@ private RPCoreGType parseGContinue(Map rvs, boolean checkRecGuar private RPCoreGForeach parseRPGForeach(Map rvs, boolean checkRecGuard, RPGForeach gf, RPCoreGType seq) throws RPCoreSyntaxException { RPCoreGType body = parseSeq(gf.getBlock().getInteractionSeq().getInteractions(), Collections.emptyMap(), false, true); - return this.af.RPCoreGForeach(gf.subj.toName(), gf.param, gf.start, gf.end, body, seq); + return this.af.RPCoreGForeach(//gf.subj.toName(), gf.param, gf.start, gf.end, + Stream.of(gf.subj.toName()).collect(Collectors.toSet()), Stream.of(new RPAnnotatedInterval(gf.param, gf.start, gf.end)).collect(Collectors.toSet()), + // FIXME: generalised foreach sig in source AST + body, seq); } // Parses message interactions as unary choices diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java index 5b2fd058a..f3d3f1d5b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java @@ -10,11 +10,13 @@ import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.ast.local.RPCoreLRecVar; import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; public class RPCoreGRec extends RPCoreRec implements RPCoreGType { @@ -64,6 +66,13 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor return af.ParamCoreLRec(this.recvar, proj); } } + + // G proj R \vec{C} r[z] + @Override + public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ivals, RPIndexedRole subj) throws RPCoreSyntaxException + { + return af.ParamCoreLRec(this.recvar, this.body.project3(af, roles, ivals, subj)); + } @Override public boolean equals(Object obj) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java index 593e404f7..d47e44c1e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java @@ -9,11 +9,13 @@ import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; +import org.scribble.type.name.Role; public class RPCoreGRecVar extends RPCoreRecVar implements RPCoreGType @@ -51,6 +53,13 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor { return af.ParamCoreLRecVar(this.recvar); } + + // G proj R \vec{C} r[z] + @Override + public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ivals, RPIndexedRole subj) throws RPCoreSyntaxException + { + return af.ParamCoreLRecVar(this.recvar); + } @Override public boolean equals(Object obj) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java index 6153fe3a7..180f48938 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java @@ -7,10 +7,12 @@ import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; public interface RPCoreGType extends RPCoreType @@ -20,7 +22,8 @@ public interface RPCoreGType extends RPCoreType // FIXME: clarify, Role subj is used as "role name" //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; - RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException; + RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException; // G proj r \vec{D} + RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ivals, RPIndexedRole subj) throws RPCoreSyntaxException; // G proj R \vec{C} r[z] Set getIndexedRoles(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java index 6690037d1..8640538f7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java @@ -7,17 +7,20 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreForeach; import org.scribble.ext.go.core.ast.RPCoreType; -import org.scribble.ext.go.type.index.RPForeachVar; -import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; public class RPCoreLForeach extends RPCoreForeach implements RPCoreLType { - public RPCoreLForeach(Role role, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, RPCoreLType body, RPCoreLType cont) + public RPCoreLForeach(//Role role, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, + Set roles, Set ivals, + RPCoreLType body, RPCoreLType cont) { - super(role, param, start, end, body, cont); + super(//role, param, start, end, + roles, ivals, + body, cont); } @Override @@ -29,7 +32,8 @@ public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType old, RPCoreType getIndexVars() { - Set ivars = + Set res = //Stream.of(this.param).collect(Collectors.toSet()); // FIXME: shouldn't include bound foreach params (cf. RPCoreGForeach#getIndexVars) -- currently included for hacked Foreach method loop (RPCoreSTStateChanApiBuilder) new HashSet<>(); - ivars.addAll(this.start.getVars()); - ivars.addAll(this.end.getVars()); - ivars.addAll(this.body.getIndexVars()); - return ivars.stream() - .filter(v -> !v.toString().equals(this.param.toString())) // HACK FIXME -- RPIndexVar distinguished from RPForeachVar (equals) - .collect(Collectors.toSet()); + for (RPAnnotatedInterval iv : this.ivals) + { + Set tmp = new HashSet<>(); + tmp.addAll(iv.start.getVars()); + tmp.addAll(iv.end.getVars()); + tmp = tmp.stream() + .filter(v -> !v.toString().equals(iv.var.toString())) // HACK FIXME -- RPIndexVar distinguished from RPForeachVar (equals) + .collect(Collectors.toSet()); + res.addAll(tmp); + } + res.addAll(this.body.getIndexVars()); + return res; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java index 1699ba586..40006350d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java @@ -3,6 +3,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import org.scribble.ext.go.core.ast.RPCoreForeach; import org.scribble.ext.go.core.ast.RPCoreRecVar; @@ -12,6 +13,7 @@ import org.scribble.ext.go.core.ast.local.RPCoreLForeach; import org.scribble.ext.go.core.ast.local.RPCoreLRec; import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.main.GoJob; @@ -82,8 +84,13 @@ private void build(RPCoreLType lt, RPCoreEState s1, RPCoreEState s2, Map 1) + { + throw new RuntimeException("[rp-core] TODO: " + fe.ivals); + } + RPAnnotatedInterval iv = fe.ivals.stream().findFirst().get(); + s.setParam(iv.var); + s.setInterval(new RPInterval(iv.start, iv.end)); RPCoreEGraphBuilder nested = new RPCoreEGraphBuilder(this.job); s.setNested((RPCoreEState) nested.build(fe.body).init); if (fe.seq instanceof RPCoreForeach) // FIXME: consecutive foreach ("tau" action) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java index edfffeb81..7e7636384 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java @@ -18,10 +18,15 @@ public class RPIndexedRole extends Role //public final ParamRange range; public final Set intervals; // size >= 1 -- size == 1 for parsed syntax + // FIXME: this set was meant for multidim nat intervals, but multidim should be factored into the RPInterval itself - public RPIndexedRole(String name, Set intervals) + public RPIndexedRole(String name, Set intervals) { super(name); + if (intervals.size() != 1) // FIXME: this set was meant for multidim nat intervals, but multidim should be factored into the RPInterval itself + { + throw new RuntimeException("TODO: " + intervals); + } this.intervals = Collections.unmodifiableSet(intervals); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java index f3cb19fb3..e1a146305 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java @@ -28,6 +28,12 @@ public Set getIndexVars() //return Stream.of(this.start, this.end).filter(p -> !p.isConstant()).collect(Collectors.toSet()); return Stream.of(this.start, this.end).flatMap(p -> p.getVars().stream()).collect(Collectors.toSet()); } + + // Cf. equals -- also cf. "contains" + public boolean isSame(RPInterval i) + { + return this.start == i.start && this.end == i.end; + } @Override public String toString() @@ -56,6 +62,11 @@ public boolean equals(Object obj) return false; } RPInterval them = (RPInterval) obj; - return this.start.equals(them.start) && this.end.equals(them.end); + return them.canEqual(this) && this.start.equals(them.start) && this.end.equals(them.end); + } + + public boolean canEqual(RPInterval o) + { + return o instanceof RPInterval; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java index efe837d79..52d6e3a02 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPForeachVar.java @@ -1,6 +1,6 @@ package org.scribble.ext.go.type.index; -// Foreach index variable occurrence -- hacky? +// Foreach index variable occurrence -- hacky? -- CHECKME: why distinguish from RPIndexVar? // Currently only used for parsing foreach param decls -- occurrences of vars inside foreach not disambiguated between endpoint-vars and foreach-vars // (Currently no actual RPIndexExprNode ast -- so no name disambiguation) From ea3a2cc7e1ae218a84c82fb2624c693af605da4b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 27 Sep 2018 23:17:16 +0100 Subject: [PATCH 325/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 68 +++++++++++++++++-- .../ext/go/core/type/RPAnnotatedInterval.java | 52 ++++++++++++++ .../ext/go/core/type/RPIndexedRole.java | 6 +- .../ext/go/type/index/RPIndexFactory.java | 5 ++ .../ext/go/type/index/RPIndexSelf.java | 52 ++++++++++++++ 5 files changed, 175 insertions(+), 8 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/type/RPAnnotatedInterval.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index ea8b3f1ff..cddac2973 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -17,11 +17,17 @@ import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.type.name.RPCoreGDelegationType; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPBinIndexExpr.Op; +import org.scribble.ext.go.type.index.RPForeachVar; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexFactory; +import org.scribble.ext.go.type.index.RPIndexSelf; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.type.Message; @@ -315,17 +321,49 @@ public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set fvars = ivals.stream().map(x -> x.var.toString()).collect(Collectors.toSet()); if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) { - if //(srcName.equals(subjName) && subj.intervals.contains(srcRange)) - (this.src.equals(subj)) // N.B. subj uses RPIndexVar (not RPForeachVar) -- cf. the invocation of project3 in RPCoreGForeach#project2 + if (this.src.equals(subj)) // N.B. subj uses RPIndexVar (not RPForeachVar) -- cf. the invocation of project3 in RPCoreGForeach#project2 { //return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); + if (srcRange.start.equals(srcRange.end) && srcRange.start instanceof RPIndexVar + && destRange.start.equals(destRange.end) && destRange.start instanceof RPIndexVar) + { + RPIndexVar srcVar = (RPIndexVar) srcRange.start; + RPIndexVar destVar = (RPIndexVar) destRange.start; + if (roles.contains(destName) && fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + { + RPIndexExpr destExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, destVar, srcVar)); + RPIndexedRole dest = new RPIndexedRole(destName.toString(), Stream.of(new RPInterval(destExpr, destExpr)).collect(Collectors.toSet())); + return af.ParamCoreLCrossChoice(dest, RPCoreLActionKind.CROSS_SEND, projs); + } + else if (!roles.contains(destName) || !(fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString()))) + { + return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); + } + } + // Otherwise try merge (if neither src/dest are subj) } - else if //(destName.equals(subjName) && subj.intervals.contains(destRange)) - ... HERE + else if (this.dest.equals(subj)) { - //return af.ParamCoreLCrossChoice(this.src, RPCoreLActionKind.CROSS_RECEIVE, projs); + if (srcRange.start.equals(srcRange.end) && srcRange.start instanceof RPIndexVar + && destRange.start.equals(destRange.end) && destRange.start instanceof RPIndexVar) + { + RPIndexVar srcVar = (RPIndexVar) srcRange.start; + RPIndexVar destVar = (RPIndexVar) destRange.start; + if (roles.contains(destName) && fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + { + RPIndexExpr srcExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, srcVar, destVar)); + RPIndexedRole src = new RPIndexedRole(destName.toString(), Stream.of(new RPInterval(srcExpr, srcExpr)).collect(Collectors.toSet())); + return af.ParamCoreLCrossChoice(src, RPCoreLActionKind.CROSS_SEND, projs); + } + else + { + return af.ParamCoreLCrossChoice(this.src, RPCoreLActionKind.CROSS_RECEIVE, projs); + } + } + // Otherwise merge (if neither src/dest are subj) } } else @@ -334,7 +372,14 @@ public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ranges, Map projs) throws ParamCoreSyntaxException @@ -353,6 +398,17 @@ private RPCoreLType merge(RPCoreAstFactory af, RPRoleVariant r, return values.iterator().next(); } + + // Cf. merge above + private RPCoreLType merge3(RPCoreAstFactory af, RPIndexedRole r, Map projs) throws RPCoreSyntaxException + { + Set values = new HashSet<>(projs.values()); + if (values.size() > 1) + { + throw new RPCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge for: " + projs.keySet()); + } + return values.iterator().next(); + } @Override public int hashCode() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPAnnotatedInterval.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPAnnotatedInterval.java new file mode 100644 index 000000000..7a7eb2269 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPAnnotatedInterval.java @@ -0,0 +1,52 @@ +package org.scribble.ext.go.core.type; + +import org.scribble.ext.go.type.index.RPForeachVar; +import org.scribble.ext.go.type.index.RPIndexExpr; + +public class RPAnnotatedInterval extends RPInterval +{ + public final RPForeachVar var; // FIXME: generally deprecate RPForeachVar for RPIndexVar? + + public RPAnnotatedInterval(RPForeachVar var, RPIndexExpr start, RPIndexExpr end) + { + super(start, end); + this.var = var; + } + + @Override + public String toString() + { + return "[" + this.var + ":" + this.start + ((this.start == this.end) ? "" : "," + this.end) + "]"; + } + + @Override + public int hashCode() + { + int hash = 3119; + hash = 31 * hash + this.var.hashCode(); + hash = 31 * hash + super.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (!(obj instanceof RPAnnotatedInterval)) + { + return false; + } + RPAnnotatedInterval them = (RPAnnotatedInterval) obj; + return super.equals(them) // Does canEqual + && this.var.equals(them.var); + } + + @Override + public boolean canEqual(RPInterval o) + { + return o instanceof RPAnnotatedInterval; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java index 7e7636384..dbbaa8438 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java @@ -23,10 +23,12 @@ public class RPIndexedRole extends Role public RPIndexedRole(String name, Set intervals) { super(name); - if (intervals.size() != 1) // FIXME: this set was meant for multidim nat intervals, but multidim should be factored into the RPInterval itself + /*if (intervals.size() != 1) + // FIXME: this set was meant for multidim nat intervals, but multidim should be factored into the RPInterval itself + // No: above is incorrect { throw new RuntimeException("TODO: " + intervals); - } + }*/ this.intervals = Collections.unmodifiableSet(intervals); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java index 384b53292..83d038451 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java @@ -31,4 +31,9 @@ public static RPForeachVar RPForeachVar(String text) { return new RPForeachVar(text); } + + public static RPIndexSelf RPIndexSelf() + { + return RPIndexSelf.SELF; + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java new file mode 100644 index 000000000..84bcb0aab --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java @@ -0,0 +1,52 @@ +package org.scribble.ext.go.type.index; + +public class RPIndexSelf extends RPIndexVar +{ + public static final RPIndexSelf SELF = new RPIndexSelf(); + + private RPIndexSelf() + { + super("self"); + } + + @Override + public String toSmt2Formula() + { + throw new RuntimeException("Shouldn't get in here: "); + } + + @Override + public String toString() + { + return this.name; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPIndexSelf)) + { + return false; + } + return super.equals(this); + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof RPIndexSelf; + } + + @Override + public int hashCode() + { + int hash = 2099; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.name.hashCode(); + return hash; + } +} From 77a7045fc4fe31c8f4c6dbfe280ca46e0629abb1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 28 Sep 2018 18:35:44 +0100 Subject: [PATCH 326/433] Contined. --- .../ext/go/core/ast/RPCoreAstFactory.java | 14 ++- .../scribble/ext/go/core/ast/RPCoreCont.java | 30 +++++++ .../ext/go/core/ast/RPCoreForeach.java | 4 +- .../ext/go/core/ast/global/RPCoreGChoice.java | 46 +++++++--- .../ext/go/core/ast/global/RPCoreGCont.java | 86 +++++++++++++++++++ .../go/core/ast/global/RPCoreGForeach.java | 20 ++++- .../global/RPCoreGProtocolDeclTranslator.java | 3 + .../ext/go/core/ast/local/RPCoreLCont.java | 59 +++++++++++++ .../ext/go/core/cli/RPCoreCommandLine.java | 12 +-- .../model/endpoint/RPCoreEGraphBuilder.java | 6 +- .../ext/go/core/type/RPIndexedRole.java | 2 +- .../scribble/ext/go/core/type/RPInterval.java | 2 +- 12 files changed, 255 insertions(+), 29 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreCont.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCont.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java index 6835bb506..c4c9fef71 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreAstFactory.java @@ -7,12 +7,14 @@ import org.scribble.ext.go.core.ast.global.RPCoreGActionKind; import org.scribble.ext.go.core.ast.global.RPCoreGChoice; +import org.scribble.ext.go.core.ast.global.RPCoreGCont; import org.scribble.ext.go.core.ast.global.RPCoreGEnd; import org.scribble.ext.go.core.ast.global.RPCoreGForeach; import org.scribble.ext.go.core.ast.global.RPCoreGRec; import org.scribble.ext.go.core.ast.global.RPCoreGRecVar; import org.scribble.ext.go.core.ast.global.RPCoreGType; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; +import org.scribble.ext.go.core.ast.local.RPCoreLCont; import org.scribble.ext.go.core.ast.local.RPCoreLCrossChoice; import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.ast.local.RPCoreLForeach; @@ -22,8 +24,6 @@ import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; -import org.scribble.ext.go.type.index.RPForeachVar; -import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.type.Message; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -75,6 +75,11 @@ public RPCoreGEnd ParamCoreGEnd() return RPCoreGEnd.END; } + public RPCoreGCont ParamCoreGCont() + { + return RPCoreGCont.CONT; + } + public RPCoreGForeach RPCoreGForeach(//Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, Set roles, Set ivals, RPCoreGType body, RPCoreGType seq) @@ -143,6 +148,11 @@ public RPCoreLEnd ParamCoreLEnd() return RPCoreLEnd.END; } + public RPCoreLCont ParamCoreLCont() + { + return RPCoreLCont.CONT; + } + public RPCoreLForeach RPCoreLForeach(//Role role, RPForeachVar var, RPIndexExpr start, RPIndexExpr end, Set roles, Set ivals, RPCoreLType body, RPCoreLType seq) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreCont.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreCont.java new file mode 100644 index 000000000..6430e4df0 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreCont.java @@ -0,0 +1,30 @@ +package org.scribble.ext.go.core.ast; + +import org.scribble.type.kind.ProtocolKind; + +public abstract class RPCoreCont implements RPCoreType +{ + @Override + public String toString() + { + return "cont"; + } + + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof RPCoreCont)) + { + return false; + } + return ((RPCoreCont) obj).canEquals(this); + } + + public abstract boolean canEquals(Object o); + + @Override + public int hashCode() + { + return 31*2777; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java index 3df412f98..522f1713f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java @@ -2,6 +2,7 @@ import java.util.HashSet; import java.util.Set; +import java.util.stream.Collectors; import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.type.kind.ProtocolKind; @@ -40,7 +41,8 @@ public RPCoreForeach(//Role role, RPForeachVar param, RPIndexExpr start, RPIndex public String toString() { return "foreach " //+ this.role + "[" + param + ":" + this.start + "," + this.end + "] do " - + this.roles + "[" + this.ivals + "] do " + + "{" + this.roles.stream().map(r -> r.toString()).collect(Collectors.joining(", ")) + "}" + + "{" + this.ivals.stream().map(x -> x.var + ":" + x.start + ".." + x.end).collect(Collectors.joining(", ")) + "} do " + this.body + " ; " + this.seq; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index cddac2973..cab2ab9f3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -24,7 +24,6 @@ import org.scribble.ext.go.core.type.name.RPCoreGDelegationType; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPBinIndexExpr.Op; -import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexFactory; import org.scribble.ext.go.type.index.RPIndexSelf; @@ -242,6 +241,9 @@ public RPCoreLType project(RPCoreAstFactory af, //Role r, Set ranges RPInterval destRange = this.dest.getParsedRange(); if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) { + System.out.println("CCC1: " + this + ", " + subj); + System.out.println("CCC2: " + srcName + ", " + destName + ", " + subjName); + //if (this.src.getName().equals(r)) if (srcName.equals(subjName) && subj.intervals.contains(srcRange)) // FIXME: factor out? { @@ -324,21 +326,28 @@ public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set fvars = ivals.stream().map(x -> x.var.toString()).collect(Collectors.toSet()); if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) { + + System.out.println("DDD4: " + this.src + " ,, " + this.dest + " ,, " + subj); + System.out.println("DDD5: " + this.dest.equals(subj)); + if (this.src.equals(subj)) // N.B. subj uses RPIndexVar (not RPForeachVar) -- cf. the invocation of project3 in RPCoreGForeach#project2 { //return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); - if (srcRange.start.equals(srcRange.end) && srcRange.start instanceof RPIndexVar - && destRange.start.equals(destRange.end) && destRange.start instanceof RPIndexVar) + if (srcRange.start.equals(srcRange.end) //&& srcRange.start instanceof RPIndexVar + && destRange.start.equals(destRange.end) //&& destRange.start instanceof RPIndexVar + ) { - RPIndexVar srcVar = (RPIndexVar) srcRange.start; - RPIndexVar destVar = (RPIndexVar) destRange.start; - if (roles.contains(destName) && fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + RPIndexExpr srcStart = srcRange.start; + RPIndexExpr destStart = destRange.start; + Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> (RPIndexVar) x).collect(Collectors.toSet()); + if (roles.contains(destName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + fvars.containsAll(tmp)) { - RPIndexExpr destExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, destVar, srcVar)); + RPIndexExpr destExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, destStart, srcStart)); RPIndexedRole dest = new RPIndexedRole(destName.toString(), Stream.of(new RPInterval(destExpr, destExpr)).collect(Collectors.toSet())); return af.ParamCoreLCrossChoice(dest, RPCoreLActionKind.CROSS_SEND, projs); } - else if (!roles.contains(destName) || !(fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString()))) + else if (!roles.contains(destName) || !(fvars.contains(srcStart.toString()) && fvars.contains(destStart.toString()))) { return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); } @@ -347,14 +356,23 @@ else if (!roles.contains(destName) || !(fvars.contains(srcVar.toString()) && fva } else if (this.dest.equals(subj)) { - if (srcRange.start.equals(srcRange.end) && srcRange.start instanceof RPIndexVar - && destRange.start.equals(destRange.end) && destRange.start instanceof RPIndexVar) + + System.out.println("DDD6: " + " " + srcRange.start + " ,, " + srcRange.end + " ,, " + srcRange.start.equals(srcRange.end) + " ,, " + srcRange.start.getClass()); + + if (srcRange.start.equals(srcRange.end) //&& srcRange.start instanceof RPIndexVar + && destRange.start.equals(destRange.end) //&& destRange.start instanceof RPIndexVar) + ) { - RPIndexVar srcVar = (RPIndexVar) srcRange.start; - RPIndexVar destVar = (RPIndexVar) destRange.start; - if (roles.contains(destName) && fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + RPIndexExpr srcStart = srcRange.start; + RPIndexExpr destStart = destRange.start; + Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> (RPIndexVar) x).collect(Collectors.toSet()); + + System.out.println("DDD7: " + " ,, " + fvars + " ,, " + srcStart + " ,, " + destStart); + + if (roles.contains(destName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + fvars.containsAll(tmp)) { - RPIndexExpr srcExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, srcVar, destVar)); + RPIndexExpr srcExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, srcStart, destStart)); RPIndexedRole src = new RPIndexedRole(destName.toString(), Stream.of(new RPInterval(srcExpr, srcExpr)).collect(Collectors.toSet())); return af.ParamCoreLCrossChoice(src, RPCoreLActionKind.CROSS_SEND, projs); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java new file mode 100644 index 000000000..257479c4d --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java @@ -0,0 +1,86 @@ +package org.scribble.ext.go.core.ast.global; + +import java.util.Collections; +import java.util.Set; + +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreCont; +import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.core.ast.local.RPCoreLCont; +import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.type.RPAnnotatedInterval; +import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.main.GoJob; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; + + +public class RPCoreGCont extends RPCoreCont implements RPCoreGType +{ + public static final RPCoreGCont CONT = new RPCoreGCont(); + + private RPCoreGCont() + { + + } + + @Override + public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreGType) neu; + } + return this; + } + + @Override + public boolean isWellFormed(GoJob job, GProtocolDecl gpd) + { + return true; + } + + @Override + public Set getIndexedRoles() + { + return Collections.emptySet(); + } + + @Override + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException + { + return af.ParamCoreLCont(); + } + + // G proj R \vec{C} r[z] + @Override + public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ivals, RPIndexedRole subj) throws RPCoreSyntaxException + { + return RPCoreLCont.CONT; + } + + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof RPCoreGCont)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof RPCoreGCont; + } + + @Override + public int hashCode() + { + return 31*2789; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index df72c8019..271d4dc66 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -10,6 +10,7 @@ import org.scribble.ext.go.core.ast.RPCoreForeach; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.core.ast.local.RPCoreLCont; import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPAnnotatedInterval; @@ -106,6 +107,9 @@ public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCo public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { RPCoreLType seq = this.seq.project(af, subj); + + System.out.println("DDD1:" + this + " ,, " + subj); + if (this.roles.contains(subj.getName())) // FIXME: factor out -- cf. RPCoreGChoice#project { /*RPIndexVar tmp = RPIndexFactory.ParamIntVar(this.param.toString()); @@ -119,9 +123,14 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor Set filtered = this.ivals.stream().filter(iv -> subj.intervals.stream().anyMatch(x -> iv.isSame(x))).collect(Collectors.toSet()); // CHECKME: actual interval inclusion? (vs. isSame) -- also RPCoreGChoice#project? //RPIndexedRole tmp = new RPIndexedRole(subj.getName().toString(), filtered); // FIXME: should be this, but currently RPIndexedRole interval set for multidim nat intervals (but with >1 TODO exception) - RPCoreGForeach tmp = af.RPCoreGForeach(this.roles, this.ivals, body, af.ParamCoreGEnd()); // FIXME: "cont", not "end"? + RPCoreGForeach tmp = af.RPCoreGForeach(this.roles, this.ivals, body, af.ParamCoreGEnd()); + // CHECKME: should be "end" so that it will be discarded? seq will be substituted for cont in the final "unrolling" of foreach + RPCoreLType proj = tmp.project2(af, subj.getName(), filtered); - return proj.subs(af, RPCoreLEnd.END, seq); + + System.out.println("DDD2:" + tmp + " ,, " + filtered + " ,, " + proj); + + return proj.subs(af, RPCoreLCont.CONT, seq); } else { @@ -157,7 +166,7 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set ivals.stream().filter(y -> !x.equals(y)).allMatch(y -> ((RPIndexInt) x.start).val > ((RPIndexInt) y.start).val)) @@ -166,9 +175,12 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set tmp = new HashSet<>(ivals); tmp.remove(max); - return proj.subs(af, RPCoreLEnd.END, project2(af, name, tmp)); + return proj.subs(af, RPCoreLCont.CONT, project2(af, name, tmp)); } // G proj R \vec{C} r[z] diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index 5b72f9bb4..b5c9dcfa0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -28,6 +28,8 @@ import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; +import org.scribble.ext.go.core.ast.local.RPCoreLCont; +import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; @@ -311,6 +313,7 @@ private RPCoreGType parseGContinue(Map rvs, boolean checkRecGuar private RPCoreGForeach parseRPGForeach(Map rvs, boolean checkRecGuard, RPGForeach gf, RPCoreGType seq) throws RPCoreSyntaxException { RPCoreGType body = parseSeq(gf.getBlock().getInteractionSeq().getInteractions(), Collections.emptyMap(), false, true); + body = body.subs(af, RPCoreGEnd.END, RPCoreGCont.CONT); return this.af.RPCoreGForeach(//gf.subj.toName(), gf.param, gf.start, gf.end, Stream.of(gf.subj.toName()).collect(Collectors.toSet()), Stream.of(new RPAnnotatedInterval(gf.param, gf.start, gf.end)).collect(Collectors.toSet()), // FIXME: generalised foreach sig in source AST diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCont.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCont.java new file mode 100644 index 000000000..d0dd4a6fb --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCont.java @@ -0,0 +1,59 @@ +package org.scribble.ext.go.core.ast.local; + +import java.util.Collections; +import java.util.Set; + +import org.scribble.ext.go.core.ast.RPCoreAstFactory; +import org.scribble.ext.go.core.ast.RPCoreCont; +import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.type.kind.Local; + + +public class RPCoreLCont extends RPCoreCont implements RPCoreLType +{ + public static final RPCoreLCont CONT = new RPCoreLCont(); + + private RPCoreLCont() + { + + } + + @Override + public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) + { + if (this.equals(old)) + { + return (RPCoreLType) neu; + } + return this; + } + + @Override + public Set getIndexVars() + { + return Collections.emptySet(); + } + + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof RPCoreLCont)) + { + return false; + } + return super.equals(obj); // Does canEquals + } + + @Override + public boolean canEquals(Object o) + { + return o instanceof RPCoreLCont; + } + + @Override + public int hashCode() + { + return 31*2791; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index a6be2f02b..6b88d3222 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -260,10 +260,10 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws for (Role r : gpd.header.roledecls.getRoles()) // getRoles gives decl names // CHECKME: can ignore params? { //for (Set ranges : protoRoles.get(r)) - for (RPRoleVariant ranges : variants.get(r)) + for (RPRoleVariant variant : variants.get(r)) { //ParamCoreLType lt = gt.project(af, r, ranges); - RPCoreLType lt = gt.project(af, ranges); + RPCoreLType lt = gt.project(af, variant); //Map, ParamCoreLType> tmp = P0.get(r); Map tmp = L0.get(r); if (tmp == null) @@ -271,9 +271,9 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws tmp = new HashMap<>(); L0.put(r, tmp); } - tmp.put(ranges, lt); + tmp.put(variant, lt); - job.debugPrintln("\n[rp-core] Projected onto " + r + " for " + ranges + ":\n " + lt); + job.debugPrintln("\n[rp-core] Projected onto " + variant + ":\n " + lt); } } @@ -349,6 +349,8 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws this.families.addAll(getFamilies(job)); this.peers = new HashMap<>(); this.peers.putAll(getPeers(job)); + + System.out.println("AAA: " + this.peers); } // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? @@ -387,7 +389,7 @@ private Map> getPeers(GoJob job) { job.debugPrintln("\n[rp-core] For " + self + ", checking potential peer: " + peer); - //System.out.println("aaa: " + self + ",, "+ peer + ",, " + irs); + System.out.println("bbb: " + self + ",, "+ peer + ",, " + irs); for (RPIndexedRole ir : irs) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java index 40006350d..23e2b0f88 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java @@ -3,12 +3,12 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Optional; import org.scribble.ext.go.core.ast.RPCoreForeach; import org.scribble.ext.go.core.ast.RPCoreRecVar; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; import org.scribble.ext.go.core.ast.local.RPCoreLChoice; +import org.scribble.ext.go.core.ast.local.RPCoreLCont; import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.ast.local.RPCoreLForeach; import org.scribble.ext.go.core.ast.local.RPCoreLRec; @@ -130,6 +130,10 @@ else if (lt instanceof RPCoreLRec) tmp.put(lr.recvar, s1); build(lr.body, s1, s2, tmp); } + else if (lt instanceof RPCoreLCont) + { + // skip + } else { throw new RuntimeException("[rp-core] Shouldn't get in here: " + lt); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java index dbbaa8438..30e3a0a74 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java @@ -25,7 +25,7 @@ public RPIndexedRole(String name, Set intervals) super(name); /*if (intervals.size() != 1) // FIXME: this set was meant for multidim nat intervals, but multidim should be factored into the RPInterval itself - // No: above is incorrect + // No: above is true for parsed globals, but Set needed for variants (subclass of this) { throw new RuntimeException("TODO: " + intervals); }*/ diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java index e1a146305..f45484d67 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java @@ -38,7 +38,7 @@ public boolean isSame(RPInterval i) @Override public String toString() { - return "[" + this.start + ((this.start == this.end) ? "" : "," + this.end) + "]"; + return "[" + this.start + ((this.start.equals(this.end)) ? "" : "," + this.end) + "]"; } @Override From 427237bd1c1c0041381e00449d557327c0b9e783 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 29 Sep 2018 11:35:56 +0100 Subject: [PATCH 327/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 19 +++---------------- .../go/core/ast/global/RPCoreGForeach.java | 9 --------- .../ext/go/core/ast/local/RPCoreLForeach.java | 13 ++++++------- .../ext/go/core/cli/RPCoreCommandLine.java | 15 +++++---------- .../src/test/scrib/param/tmp/ParamTest.scr | 16 ++++++++-------- 5 files changed, 22 insertions(+), 50 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index cab2ab9f3..f53461853 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -241,9 +241,6 @@ public RPCoreLType project(RPCoreAstFactory af, //Role r, Set ranges RPInterval destRange = this.dest.getParsedRange(); if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) { - System.out.println("CCC1: " + this + ", " + subj); - System.out.println("CCC2: " + srcName + ", " + destName + ", " + subjName); - //if (this.src.getName().equals(r)) if (srcName.equals(subjName) && subj.intervals.contains(srcRange)) // FIXME: factor out? { @@ -320,16 +317,12 @@ public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set fvars = ivals.stream().map(x -> x.var.toString()).collect(Collectors.toSet()); if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) { - - System.out.println("DDD4: " + this.src + " ,, " + this.dest + " ,, " + subj); - System.out.println("DDD5: " + this.dest.equals(subj)); - if (this.src.equals(subj)) // N.B. subj uses RPIndexVar (not RPForeachVar) -- cf. the invocation of project3 in RPCoreGForeach#project2 { //return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); @@ -356,9 +349,6 @@ else if (!roles.contains(destName) || !(fvars.contains(srcStart.toString()) && f } else if (this.dest.equals(subj)) { - - System.out.println("DDD6: " + " " + srcRange.start + " ,, " + srcRange.end + " ,, " + srcRange.start.equals(srcRange.end) + " ,, " + srcRange.start.getClass()); - if (srcRange.start.equals(srcRange.end) //&& srcRange.start instanceof RPIndexVar && destRange.start.equals(destRange.end) //&& destRange.start instanceof RPIndexVar) ) @@ -366,15 +356,12 @@ else if (this.dest.equals(subj)) RPIndexExpr srcStart = srcRange.start; RPIndexExpr destStart = destRange.start; Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> (RPIndexVar) x).collect(Collectors.toSet()); - - System.out.println("DDD7: " + " ,, " + fvars + " ,, " + srcStart + " ,, " + destStart); - - if (roles.contains(destName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + if (roles.contains(srcName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) fvars.containsAll(tmp)) { RPIndexExpr srcExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, srcStart, destStart)); RPIndexedRole src = new RPIndexedRole(destName.toString(), Stream.of(new RPInterval(srcExpr, srcExpr)).collect(Collectors.toSet())); - return af.ParamCoreLCrossChoice(src, RPCoreLActionKind.CROSS_SEND, projs); + return af.ParamCoreLCrossChoice(src, RPCoreLActionKind.CROSS_RECEIVE, projs); } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 271d4dc66..d293d0ce2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -107,9 +107,6 @@ public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCo public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException { RPCoreLType seq = this.seq.project(af, subj); - - System.out.println("DDD1:" + this + " ,, " + subj); - if (this.roles.contains(subj.getName())) // FIXME: factor out -- cf. RPCoreGChoice#project { /*RPIndexVar tmp = RPIndexFactory.ParamIntVar(this.param.toString()); @@ -127,9 +124,6 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor // CHECKME: should be "end" so that it will be discarded? seq will be substituted for cont in the final "unrolling" of foreach RPCoreLType proj = tmp.project2(af, subj.getName(), filtered); - - System.out.println("DDD2:" + tmp + " ,, " + filtered + " ,, " + proj); - return proj.subs(af, RPCoreLCont.CONT, seq); } else @@ -175,9 +169,6 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set tmp = new HashSet<>(ivals); tmp.remove(max); return proj.subs(af, RPCoreLCont.CONT, project2(af, name, tmp)); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java index 8640538f7..cbfc114ea 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java @@ -39,23 +39,22 @@ public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType getIndexVars() + public Set getIndexVars() // For user-supplied params to endpoint kind constructor, i.e., excluding RPForeachVar { Set res = //Stream.of(this.param).collect(Collectors.toSet()); // FIXME: shouldn't include bound foreach params (cf. RPCoreGForeach#getIndexVars) -- currently included for hacked Foreach method loop (RPCoreSTStateChanApiBuilder) new HashSet<>(); + res.addAll(this.body.getIndexVars()); for (RPAnnotatedInterval iv : this.ivals) { - Set tmp = new HashSet<>(); - tmp.addAll(iv.start.getVars()); - tmp.addAll(iv.end.getVars()); - tmp = tmp.stream() + //Set tmp = new HashSet<>(); + res = res.stream() .filter(v -> !v.toString().equals(iv.var.toString())) // HACK FIXME -- RPIndexVar distinguished from RPForeachVar (equals) .collect(Collectors.toSet()); - res.addAll(tmp); + res.addAll(iv.start.getVars()); // CHECKME: already checked iv.var not in here? + res.addAll(iv.end.getVars()); } - res.addAll(this.body.getIndexVars()); return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 6b88d3222..f698a0126 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -282,12 +282,12 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws for (Role r : L0.keySet()) { //for (Set ranges : this.P0.get(r).keySet()) - for (RPRoleVariant ranges : this.L0.get(r).keySet()) + for (RPRoleVariant variant : this.L0.get(r).keySet()) { - System.out.println("111: " + r + ", " + this.L0.get(r).get(ranges)); + System.out.println("Projection onto " + variant + ": " + this.L0.get(r).get(variant)); - EGraph g = builder.build(this.L0.get(r).get(ranges)); + EGraph g = builder.build(this.L0.get(r).get(variant)); //Map, EGraph> tmp = this.E0.get(r); Map tmp = this.E0.get(r); if (tmp == null) @@ -295,11 +295,11 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws tmp = new HashMap<>(); this.E0.put(r, tmp); } - tmp.put(ranges, g); + tmp.put(variant, g); job.debugPrintln("\n[rp-core] Built endpoint graph for " //+ r + " for " - + ranges + ":\n" + g.toDot()); + + variant + ":\n" + g.toDot()); RecursiveFunctionalInterface>> getNestedInits = new RecursiveFunctionalInterface<>(); @@ -349,8 +349,6 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws this.families.addAll(getFamilies(job)); this.peers = new HashMap<>(); this.peers.putAll(getPeers(job)); - - System.out.println("AAA: " + this.peers); } // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? @@ -388,9 +386,6 @@ private Map> getPeers(GoJob job) if (!peer.equals(self) && !peers.contains(peer)) { job.debugPrintln("\n[rp-core] For " + self + ", checking potential peer: " + peer); - - System.out.println("bbb: " + self + ",, "+ peer + ",, " + irs); - for (RPIndexedRole ir : irs) { if (ir.getName().equals(peer.getName())) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 1077ce88c..abbb56166 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -1,6 +1,6 @@ //Raymond@HZHL3 ~/code/eclipse/scribble/github.com/rhu1-go/scribble-java //$ bin/scribblec-param.sh -ip scribble-go/src/test/scrib/ -d scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/tmp/ParamTest.scr -V -param Proto1 - +//$ bin/scribblec-param.sh -ip scribble-go/src/test/scrib/ scribble-go/src/test/scrib/param/tmp/ParamTest.scr -V -param Proto1 github.com/rhu1-go/scribble-java/src/test/scrib/param/tmp/ParamTest -param-api S // http://sandbox.kidstrythisathome.com/erdos/ @@ -14,16 +14,16 @@ type "string" from "builtin" as string; sig "msgsig.Request" from "github.com/nickng/httpget/msgsig" as Request; sig "msgsig.Response" from "github.com/nickng/httpget/msgsig" as Response; -global protocol Proto1(role Master, role Fetcher, role Server) { - URL(int) from Master[1,1] to Fetcher[1,N]; +global protocol Proto1(role M, role F, role S) { + URL(int) from M[1,1] to F[1,N]; - foreach Fetcher[I:1,N] { - Request from Fetcher[I,I] to Server[1,1]; - Response from Server[1,1] to Fetcher[I,I]; - //tmp() from Server[1,1] to Master[1,1]; // FIXME: projection + foreach F[I:1,N] { + Request from F[I,I] to S[1,1]; + Response from S[1,1] to F[I,I]; + //tmp() from S[1,1] to M[1,1]; // FIXME: projection } - Done(string) from Fetcher[1,N] to Master[1,1]; + Done(string) from F[1,N] to M[1,1]; } //*/ From e79b2b8656c48a89a9425f13188e236707b68296 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 29 Sep 2018 14:24:31 +0100 Subject: [PATCH 328/433] Refactoring indexed role parsing. --- .../org/scribble/parser/antlr/ParamScribble.g | 29 +++++++---- .../ast/global/RPGCrossMessageTransfer.java | 2 +- .../global/RPAntlrGCrossMessageTransfer.java | 52 ++++++++----------- 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index a0ca703c2..4f3b7716f 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -177,6 +177,7 @@ tokens PARAM_BININDEXEXPR = 'PARAM_BININDEXEXPR'; // FIXME: rename bin part //PARAM_ROLEDECL = 'PARAM_ROLEDECL'; + PARAM_INDEXEDROLE = 'PARAM_INDEXEDROLE'; PARAM_GLOBALCROSSMESSAGETRANSFER = 'PARAM_GLOBALCROSSMESSAGETRANSFER'; PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; PARAM_GLOBALCHOICE = 'PARAM_GLOBALCHOICE'; @@ -688,13 +689,6 @@ globalinteraction: globalparallel | globalinterruptible*/ - - -globalforeach: - PARAM_FOREACH_KW rolename '[' simplename ':' paramindexexpr ',' paramindexexpr ']' globalprotocolblock // TODO: generalise --> - ^(PARAM_GLOBALFOREACH rolename simplename paramindexexpr paramindexexpr globalprotocolblock) -; @@ -708,15 +702,21 @@ globalmessagetransfer: | // For now require all "singleton indexed roles" to be written as singleton intervals (including foreach-indexed roles) - message FROM_KW rolename '[' paramindexexpr ',' paramindexexpr ']' TO_KW rolename '[' paramindexexpr ',' paramindexexpr ']' ';' + message FROM_KW paramindexedrole TO_KW paramindexedrole ';' -> - ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr) + ^(PARAM_GLOBALCROSSMESSAGETRANSFER message paramindexedrole paramindexedrole) /*| message DOT_KW rolename '[' paramindexexpr '..' paramindexexpr ']' TO_KW rolename '[' paramindexexpr '..' paramindexexpr ']' ';' -> ^(PARAM_GLOBALDOTMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr)*/ ; +paramindexedrole: + rolename '[' paramindexexpr ',' paramindexexpr ']' +-> + ^(PARAM_INDEXEDROLE rolename paramindexexpr paramindexexpr) +; + /*rpindex: rpsingletonindex | @@ -914,6 +914,17 @@ argumentinstantiation: qualifiedname ; + + +globalforeach: + PARAM_FOREACH_KW rolename '[' simplename ':' paramindexexpr ',' paramindexexpr ']' globalprotocolblock // TODO: generalise +-> + ^(PARAM_GLOBALFOREACH rolename simplename paramindexexpr paramindexexpr globalprotocolblock) +; + + + + /* * Section 3.8 Local Protocol Declarations diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java index 07209311b..a7406fa36 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGCrossMessageTransfer.java @@ -11,7 +11,7 @@ import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.type.name.Role; -// FIXME: rename, and use RPIndexedRoleNode +// FIXME: rename -- use RPIndexedRoleNode? (currently deprecated) // Subsumes scatter/gather, src/dest range length one public class RPGCrossMessageTransfer extends RPGMessageTransfer { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java index 40c0f4705..26871f5bf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java @@ -18,28 +18,21 @@ public class RPAntlrGCrossMessageTransfer public static final int MESSAGE_CHILD_INDEX = 0; public static final int SOURCE_CHILD_INDEX = 1; public static final int DESTINATION_CHILD_INDEX = 2; - - // New - public static final int SOURCE_START_CHILD_INDEX = 3; - public static final int SOURCE_END_CHILD_INDEX = 4; - public static final int DEST_START_CHILD_INDEX = 5; - public static final int DEST_END_CHILD_INDEX = 6; public static RPGCrossMessageTransfer parseParamGCrossMessageTransfer(AntlrToScribParser parser, CommonTree root, RPAstFactory af) throws ScribParserException { - RoleNode src = AntlrSimpleName.toRoleNode(getSourceChild(root), af); MessageNode msg = AntlrGMessageTransfer.parseMessage(parser, getMessageChild(root), af); - RoleNode dest = AntlrSimpleName.toRoleNode(getDestChild(root), af); - /*ParamRoleParamNode sourceStart = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeStartChild(root), af); - ParamRoleParamNode sourceEnd = ParamAntlrSimpleName.toParamRoleParamNode(getSourceRangeEndChild(root), af); - ParamRoleParamNode destStart = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeStartChild(root), af); - ParamRoleParamNode destEnd = ParamAntlrSimpleName.toParamRoleParamNode(getDestRangeEndChild(root), af);*/ - RPIndexExpr sourceStart = RPAntlrIndexExpr.parseParamIndexExpr(getSourceRangeStartChild(root), af); - RPIndexExpr sourceEnd = RPAntlrIndexExpr.parseParamIndexExpr(getSourceRangeEndChild(root), af); - RPIndexExpr destStart = RPAntlrIndexExpr.parseParamIndexExpr(getDestRangeStartChild(root), af); - RPIndexExpr destEnd = RPAntlrIndexExpr.parseParamIndexExpr(getDestRangeEndChild(root), af); - return af.ParamGCrossMessageTransfer(root, src, msg, dest, sourceStart, sourceEnd, destStart, destEnd); + CommonTree src = getSourceChild(root); + CommonTree dest = getDestChild(root); + + RoleNode srcName = AntlrSimpleName.toRoleNode(getParamIndexedRoleNameChild(src), af); + RPIndexExpr srcStart = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleStartChild(src), af); + RPIndexExpr srcEnd = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleEndChild(src), af); + RoleNode destName = AntlrSimpleName.toRoleNode(getParamIndexedRoleNameChild(dest), af); + RPIndexExpr destStart = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleStartChild(dest), af); + RPIndexExpr destEnd = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleEndChild(dest), af); + return af.ParamGCrossMessageTransfer(root, srcName, msg, destName, srcStart, srcEnd, destStart, destEnd); } public static CommonTree getMessageChild(CommonTree root) @@ -56,24 +49,25 @@ public static CommonTree getDestChild(CommonTree root) { return (CommonTree) root.getChild(DESTINATION_CHILD_INDEX); } - - public static CommonTree getSourceRangeStartChild(CommonTree root) - { - return (CommonTree) root.getChild(SOURCE_START_CHILD_INDEX); - } - public static CommonTree getSourceRangeEndChild(CommonTree root) + + // "ParamIndexedRole" -- factor out? + public static final int PARAMINDEXEDROLE_NAME_CHILD_INDEX = 0; + public static final int PARAMINDEXEDROLE_START_CHILD_INDEX = 1; + public static final int PARAMINDEXEDROLE_END_CHILD_INDEX = 2; + + public static CommonTree getParamIndexedRoleNameChild(CommonTree root) { - return (CommonTree) root.getChild(SOURCE_END_CHILD_INDEX); + return (CommonTree) root.getChild(PARAMINDEXEDROLE_NAME_CHILD_INDEX); } - - public static CommonTree getDestRangeStartChild(CommonTree root) + + public static CommonTree getParamIndexedRoleStartChild(CommonTree root) { - return (CommonTree) root.getChild(DEST_START_CHILD_INDEX); + return (CommonTree) root.getChild(PARAMINDEXEDROLE_START_CHILD_INDEX); } - public static CommonTree getDestRangeEndChild(CommonTree root) + public static CommonTree getParamIndexedRoleEndChild(CommonTree root) { - return (CommonTree) root.getChild(DEST_END_CHILD_INDEX); + return (CommonTree) root.getChild(PARAMINDEXEDROLE_END_CHILD_INDEX); } } From 3d8aa8fa4181b09a568c29e93825e7755c2a3947 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 29 Sep 2018 14:45:53 +0100 Subject: [PATCH 329/433] Continued. --- .../org/scribble/parser/antlr/ParamScribble.g | 17 +++--- .../global/RPAntlrGCrossMessageTransfer.java | 52 +++++++++++-------- 2 files changed, 41 insertions(+), 28 deletions(-) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 4f3b7716f..8764529c7 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -177,7 +177,6 @@ tokens PARAM_BININDEXEXPR = 'PARAM_BININDEXEXPR'; // FIXME: rename bin part //PARAM_ROLEDECL = 'PARAM_ROLEDECL'; - PARAM_INDEXEDROLE = 'PARAM_INDEXEDROLE'; PARAM_GLOBALCROSSMESSAGETRANSFER = 'PARAM_GLOBALCROSSMESSAGETRANSFER'; PARAM_GLOBALDOTMESSAGETRANSFER = 'PARAM_GLOBALDOTMESSAGETRANSFER'; PARAM_GLOBALCHOICE = 'PARAM_GLOBALCHOICE'; @@ -186,6 +185,8 @@ tokens //PARAM_DELEGATION = 'PARAM_DELEGATION'; PARAM_DELEGDECL = 'PARAM_DELEGDECL'; PARAM_GLOBALFOREACH = 'PARAM_GLOBALFOREACH'; + + PARAM_INDEXINTERVAL = 'PARAM_INDEXINTERVAL'; } @@ -702,19 +703,23 @@ globalmessagetransfer: | // For now require all "singleton indexed roles" to be written as singleton intervals (including foreach-indexed roles) - message FROM_KW paramindexedrole TO_KW paramindexedrole ';' + message FROM_KW rolename paramindexinterval TO_KW rolename paramindexinterval ';' -> - ^(PARAM_GLOBALCROSSMESSAGETRANSFER message paramindexedrole paramindexedrole) + ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename paramindexinterval paramindexinterval) /*| message DOT_KW rolename '[' paramindexexpr '..' paramindexexpr ']' TO_KW rolename '[' paramindexexpr '..' paramindexexpr ']' ';' -> ^(PARAM_GLOBALDOTMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr)*/ ; -paramindexedrole: - rolename '[' paramindexexpr ',' paramindexexpr ']' +paramindexinterval: + ('[' paramindexexpr? ',' paramindexexpr ']')=> '[' paramindexexpr? ',' paramindexexpr ']' +-> + ^(PARAM_INDEXINTERVAL paramindexexpr paramindexexpr) +| + '[' paramindexexpr ']' -> - ^(PARAM_INDEXEDROLE rolename paramindexexpr paramindexexpr) + ^(PARAM_INDEXINTERVAL paramindexexpr paramindexexpr) ; /*rpindex: diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java index 26871f5bf..dd59c791c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGCrossMessageTransfer.java @@ -16,22 +16,26 @@ public class RPAntlrGCrossMessageTransfer { // Same as original public static final int MESSAGE_CHILD_INDEX = 0; - public static final int SOURCE_CHILD_INDEX = 1; - public static final int DESTINATION_CHILD_INDEX = 2; + public static final int SOURCE_NAME_CHILD_INDEX = 1; + public static final int DESTINATION_NAME_CHILD_INDEX = 2; + + // New + public static final int SOURCE_INDEXINTERVAL_CHILD_INDEX = 3; + public static final int DESTINATION_INDEXINTERVAL_CHILD_INDEX = 4; public static RPGCrossMessageTransfer parseParamGCrossMessageTransfer(AntlrToScribParser parser, CommonTree root, RPAstFactory af) throws ScribParserException { MessageNode msg = AntlrGMessageTransfer.parseMessage(parser, getMessageChild(root), af); - CommonTree src = getSourceChild(root); - CommonTree dest = getDestChild(root); - - RoleNode srcName = AntlrSimpleName.toRoleNode(getParamIndexedRoleNameChild(src), af); - RPIndexExpr srcStart = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleStartChild(src), af); - RPIndexExpr srcEnd = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleEndChild(src), af); - RoleNode destName = AntlrSimpleName.toRoleNode(getParamIndexedRoleNameChild(dest), af); - RPIndexExpr destStart = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleStartChild(dest), af); - RPIndexExpr destEnd = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleEndChild(dest), af); + RoleNode srcName = AntlrSimpleName.toRoleNode(getSourceNameChild(root), af); + RoleNode destName = AntlrSimpleName.toRoleNode(getDestinationNameChild(root), af); + + CommonTree srcIndexInterval = getSourceIndexIntervalChild(root); + CommonTree destIndexInterval = getDestinationIndexIntervalChild(root); + RPIndexExpr srcStart = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleStartChild(srcIndexInterval), af); + RPIndexExpr srcEnd = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleEndChild(srcIndexInterval), af); + RPIndexExpr destStart = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleStartChild(destIndexInterval), af); + RPIndexExpr destEnd = RPAntlrIndexExpr.parseParamIndexExpr(getParamIndexedRoleEndChild(destIndexInterval), af); return af.ParamGCrossMessageTransfer(root, srcName, msg, destName, srcStart, srcEnd, destStart, destEnd); } @@ -40,26 +44,30 @@ public static CommonTree getMessageChild(CommonTree root) return (CommonTree) root.getChild(MESSAGE_CHILD_INDEX); } - public static CommonTree getSourceChild(CommonTree root) + public static CommonTree getSourceNameChild(CommonTree root) { - return (CommonTree) root.getChild(SOURCE_CHILD_INDEX); + return (CommonTree) root.getChild(SOURCE_NAME_CHILD_INDEX); } - public static CommonTree getDestChild(CommonTree root) + public static CommonTree getDestinationNameChild(CommonTree root) { - return (CommonTree) root.getChild(DESTINATION_CHILD_INDEX); + return (CommonTree) root.getChild(DESTINATION_NAME_CHILD_INDEX); } + public static CommonTree getSourceIndexIntervalChild(CommonTree root) + { + return (CommonTree) root.getChild(SOURCE_INDEXINTERVAL_CHILD_INDEX); + } - // "ParamIndexedRole" -- factor out? - public static final int PARAMINDEXEDROLE_NAME_CHILD_INDEX = 0; - public static final int PARAMINDEXEDROLE_START_CHILD_INDEX = 1; - public static final int PARAMINDEXEDROLE_END_CHILD_INDEX = 2; - - public static CommonTree getParamIndexedRoleNameChild(CommonTree root) + public static CommonTree getDestinationIndexIntervalChild(CommonTree root) { - return (CommonTree) root.getChild(PARAMINDEXEDROLE_NAME_CHILD_INDEX); + return (CommonTree) root.getChild(DESTINATION_INDEXINTERVAL_CHILD_INDEX); } + + + // "ParamIndexedRole" -- factor out? + public static final int PARAMINDEXEDROLE_START_CHILD_INDEX = 0; + public static final int PARAMINDEXEDROLE_END_CHILD_INDEX = 1; public static CommonTree getParamIndexedRoleStartChild(CommonTree root) { From 4a3255fbc938c54e351aa1d83b41607fd197f840 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 29 Sep 2018 19:49:12 +0100 Subject: [PATCH 330/433] Continued. --- .../org/scribble/parser/antlr/ParamScribble.g | 15 +++- .../org/scribble/ext/go/ast/RPAstFactory.java | 3 +- .../scribble/ext/go/ast/RPAstFactoryImpl.java | 5 +- .../org/scribble/ext/go/ast/RPForeach.java | 38 ++++++---- .../ext/go/ast/global/RPGForeach.java | 18 +++-- .../ext/go/core/ast/global/RPCoreGChoice.java | 73 ++++++++++++++++++- .../ext/go/core/ast/global/RPCoreGCont.java | 6 +- .../ext/go/core/ast/global/RPCoreGEnd.java | 6 +- .../go/core/ast/global/RPCoreGForeach.java | 17 ++++- .../core/ast/global/RPCoreGMultiChoices.java | 4 +- .../global/RPCoreGProtocolDeclTranslator.java | 9 ++- .../ext/go/core/ast/global/RPCoreGRec.java | 8 +- .../ext/go/core/ast/global/RPCoreGRecVar.java | 6 +- .../ext/go/core/ast/global/RPCoreGType.java | 7 +- .../ext/go/core/cli/RPCoreCommandLine.java | 3 +- .../ext/go/core/type/RPIndexedRole.java | 12 +++ .../scribble/ext/go/core/type/RPInterval.java | 10 ++- .../ext/go/del/global/RPGForeachDel.java | 7 +- .../ast/global/RPCoreAntlrGForeach.java | 70 ++++++++++++------ .../src/test/scrib/param/tmp/ParamTest.scr | 10 +-- 20 files changed, 249 insertions(+), 78 deletions(-) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 8764529c7..5d766d905 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -186,7 +186,8 @@ tokens PARAM_DELEGDECL = 'PARAM_DELEGDECL'; PARAM_GLOBALFOREACH = 'PARAM_GLOBALFOREACH'; - PARAM_INDEXINTERVAL = 'PARAM_INDEXINTERVAL'; + PARAM_INDEXINTERVAL = 'PARAM_INDEXINTERVAL'; + PARAM_FOREACHINTERVAL = 'PARAM_FOREACHINTERVAL'; } @@ -702,7 +703,6 @@ globalmessagetransfer: ^(GLOBALMESSAGETRANSFER message rolename rolename+) | - // For now require all "singleton indexed roles" to be written as singleton intervals (including foreach-indexed roles) message FROM_KW rolename paramindexinterval TO_KW rolename paramindexinterval ';' -> ^(PARAM_GLOBALCROSSMESSAGETRANSFER message rolename rolename paramindexinterval paramindexinterval) @@ -712,6 +712,7 @@ globalmessagetransfer: ^(PARAM_GLOBALDOTMESSAGETRANSFER message rolename rolename paramindexexpr paramindexexpr paramindexexpr paramindexexpr)*/ ; +// TODO: syntactically allow mix of indexed and non-indexed roles paramindexinterval: ('[' paramindexexpr? ',' paramindexexpr ']')=> '[' paramindexexpr? ',' paramindexexpr ']' -> @@ -922,11 +923,17 @@ argumentinstantiation: globalforeach: - PARAM_FOREACH_KW rolename '[' simplename ':' paramindexexpr ',' paramindexexpr ']' globalprotocolblock // TODO: generalise + PARAM_FOREACH_KW paramforeachinterval (',' paramforeachinterval)* globalprotocolblock // TODO: generalise -> - ^(PARAM_GLOBALFOREACH rolename simplename paramindexexpr paramindexexpr globalprotocolblock) + ^(PARAM_GLOBALFOREACH globalprotocolblock paramforeachinterval+) ; +// Cf. paramindexinterval +paramforeachinterval: + rolename '[' simplename ':' paramindexexpr? ',' paramindexexpr ']' +-> + ^(PARAM_FOREACHINTERVAL rolename simplename paramindexexpr paramindexexpr) +; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java index 6a93e97d6..c68309ec4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java @@ -33,7 +33,8 @@ RPGDotMessageTransfer ParamGDotMessageTransfer(CommonTree source, RoleNode src, //ParamRoleParamNode srcRangeStart, ParamRoleParamNode srcRangeEnd, ParamRoleParamNode destRangeStart, ParamRoleParamNode destRangeEnd); RPIndexExpr srcRangeStart, RPIndexExpr srcRangeEnd, RPIndexExpr destRangeStart, RPIndexExpr destRangeEnd); RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr, List blocks); - RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block); + RPGForeach RPGForeach(CommonTree source, List subjs, + List params, List starts, List ends, GProtocolBlock block); RPIndexedRoleNode RPIndexedRoleNode(CommonTree source, String identifier, RPIndexExpr start, RPIndexExpr end); @Deprecated diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index c31a6427f..a8fa19049 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -95,9 +95,10 @@ public RPGChoice ParamGChoice(CommonTree source, RoleNode subj, RPIndexExpr expr } @Override - public RPGForeach RPGForeach(CommonTree source, RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, GProtocolBlock block) + public RPGForeach RPGForeach(CommonTree source, List subjs, + List params, List starts, List ends, GProtocolBlock block) { - RPGForeach gf = new RPGForeach(source, subj, param, start, end, block); + RPGForeach gf = new RPGForeach(source, subjs, params, starts, ends, block); gf = del(gf, new RPGForeachDel()); return gf; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java index 17f51f663..0476787d8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPForeach.java @@ -1,5 +1,10 @@ package org.scribble.ext.go.ast; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.CompoundInteractionNode; @@ -13,23 +18,27 @@ public abstract class RPForeach extends CompoundInteractionNode { - public final RoleNode subj; - public final RPForeachVar param; - public final RPIndexExpr start; - public final RPIndexExpr end; + public final List subjs; + public final List params; + public final List starts; + public final List ends; public final ProtocolBlock block; - protected RPForeach(CommonTree source, RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block) + // Pre: subjs/params/starts/ends same length -- FIXME: factor out? + protected RPForeach(CommonTree source, List subjs, + List params, List starts, List ends, + ProtocolBlock block) { super(source); - this.subj = subj; - this.param = param; - this.start = start; - this.end = end; + this.subjs = Collections.unmodifiableList(subjs); + this.params = Collections.unmodifiableList(params); + this.starts = Collections.unmodifiableList(starts); + this.ends = Collections.unmodifiableList(ends); this.block = block; } - public abstract RPForeach reconstruct(RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block); + public abstract RPForeach reconstruct(List subjs, + List params, List starts, List ends, ProtocolBlock block); @Override public abstract RPForeach clone(AstFactory af); @@ -37,9 +46,9 @@ protected RPForeach(CommonTree source, RoleNode subj, RPForeachVar param, RPInde @Override public RPForeach visitChildren(AstVisitor nv) throws ScribbleException { - RoleNode subj = (RoleNode) visitChild(this.subj, nv); + List subjs = visitChildListWithClassEqualityCheck(this, this.subjs, nv); ProtocolBlock block = visitChildWithClassEqualityCheck(this, this.block, nv); - return reconstruct(subj, param, start, end, block); + return reconstruct(subjs, this.params, this.starts, this.ends, block); } public abstract ProtocolBlock getBlock(); @@ -47,6 +56,9 @@ public RPForeach visitChildren(AstVisitor nv) throws ScribbleException @Override public String toString() { - return "foreach " + this.subj + "[" + this.param + ":" + this.start + "," + this.end + "] " + this.block; + return "foreach " + IntStream.of(0, this.subjs.size()-1).mapToObj(i -> + this.subjs.get(i) + "[" + this.params.get(i) + ":" + this.starts.get(i) + "," + this.ends.get(i) + "]" + ).collect(Collectors.joining(", ")) + + this.block; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java index ac91ec8d1..db0667b4e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGForeach.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.ast.global; import java.util.List; +import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; @@ -21,10 +22,11 @@ public class RPGForeach extends RPForeach implements GCompoundInteractionNode { - public RPGForeach(CommonTree source, RoleNode subj, RPForeachVar param, - RPIndexExpr start, RPIndexExpr end, GProtocolBlock block) + public RPGForeach(CommonTree source, List subjs, + List params, List starts, List ends, + GProtocolBlock block) { - super(source, subj, param, start, end, block); + super(source, subjs, params, starts, ends, block); } @Override @@ -43,22 +45,22 @@ public LCompoundInteractionNode project(AstFactory af, Role self, List subjs = this.subjs.stream().map(r -> r.clone(af)).collect(Collectors.toList()); GProtocolBlock block = getBlock().clone(af); - return ((RPAstFactory) af).RPGForeach(this.source, subj, this.param, this.start, this.end, block); + return ((RPAstFactory) af).RPGForeach(this.source, subjs, this.params, this.starts, this.ends, block); } @Override - public RPGForeach reconstruct(RoleNode subj, RPForeachVar param, RPIndexExpr start, RPIndexExpr end, ProtocolBlock block) + public RPGForeach reconstruct(List subjs, List params, List starts, List ends, ProtocolBlock block) { ScribDel del = del(); - RPGForeach gc = new RPGForeach(this.source, subj, param, start, end, (GProtocolBlock) block); + RPGForeach gc = new RPGForeach(this.source, subjs, params, starts, ends, (GProtocolBlock) block); gc = (RPGForeach) gc.del(del); return gc; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index f53461853..c299094cf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.Stack; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -24,6 +25,7 @@ import org.scribble.ext.go.core.type.name.RPCoreGDelegationType; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPBinIndexExpr.Op; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexFactory; import org.scribble.ext.go.type.index.RPIndexSelf; @@ -65,8 +67,9 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } } + // gpd only for calling Z3Wrapper.checkSat @Override - public boolean isWellFormed(GoJob job, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) { // src (i.e., choice subj) range size=1 for non-unary choices enforced by ParamScribble.g syntax // Directed choice check by ParamCoreGProtocolDeclTranslator ensures all dests (including ranges) are (syntactically) the same @@ -140,7 +143,69 @@ public boolean isWellFormed(GoJob job, GProtocolDecl gpd) String smt2 = "(assert (exists ((foobartmp Int)"; // FIXME: factor out smt2 += vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")); smt2 += ") (and"; - smt2 += vars.isEmpty() ? "" : vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")); // FIXME: lower bound constant -- replace by global invariant + smt2 += vars.isEmpty() ? "" : vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")); + // FIXME: lower bound constant -- replace by global invariant + + Map peek = context.peek(); + Set all = context.stream().flatMap(m -> m.keySet().stream().map(k -> k.toString())).collect(Collectors.toSet()); + Set curr = peek.keySet().stream().map(k -> k.toString()).collect(Collectors.toSet()); + Set srcVars = this.src.getIndexVars(); + for (RPIndexVar sv : srcVars) + { + String tmp = sv.toString(); + if (all.contains(tmp)) // FIXME: awkwardness of RPForeachVar and RPIndexVar + { + if (!curr.contains(tmp)) + { + job.debugPrintln("\n[param-core] [WF] Illegal access of outer foreach-var: " + this.src); + return false; + } + RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp)); + Set srcIvals = this.src.intervals; + if (srcIvals.size() > 1 || !srcIvals.iterator().next().isSingleton()) + { + job.debugPrintln("\n[param-core] [WF] Non-singleton usage of foreach-var: " + this.src + ", " + ival); + return false; + } + smt2 += " (= " + sv + " " + ival.start + ")"; + } + } + Set destVars = this.dest.getIndexVars(); // FIXME: factor out with above + for (RPIndexVar dv : destVars) + { + String tmp = dv.toString(); + if (all.contains(tmp)) // FIXME: awkwardness of RPForeachVar and RPIndexVar + { + if (!curr.contains(tmp)) + { + job.debugPrintln("\n[param-core] [WF] Illegal access of outer foreach-var: " + this.dest); + return false; + } + RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp)); + Set destIvals = this.dest.intervals; + if (destIvals.size() > 1 || !destIvals.iterator().next().isSingleton()) + { + job.debugPrintln("\n[param-core] [WF] Non-singleton usage of foreach-var: " + this.dest + ", " + ival); + return false; + } + smt2 += " (= " + dv + " " + ival.start + ")"; + } + } + if (src.getName().equals(dest.getName()) && srcVars.size() == 1 && destVars.size() == 1) + { + String sv = srcVars.iterator().next().toString(); + String dv = destVars.iterator().next().toString(); + if (curr.contains(sv) && curr.contains(dv)) + { + if (peek.get(RPIndexFactory.RPForeachVar(sv)).start.equals(peek.get(RPIndexFactory.RPForeachVar(sv)))) + // FIXME: need to prove not equal (not just check for syntactic equality) + { + job.debugPrintln("\n[param-core] (Potential) illegal self-communication: " + this); + return false; + } + } + } + smt2 += Stream.of(srcRange, destRange) .map(r -> " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")") .collect(Collectors.joining()); @@ -376,8 +441,8 @@ else if (this.dest.equals(subj)) throw new RuntimeException("[param-core] TODO: " + this); } - // Not CROSS_TRANSFER, or subj is not sender nor receiver - if (!this.src.equals(subj) && !this.src.equals(subj)) + // CROSS_TRANSFER, and subj not sender nor receiver + if (!this.src.equals(subj) && !this.dest.equals(subj)) { return merge3(af, subj, projs); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java index 257479c4d..89c9d6acc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java @@ -1,7 +1,9 @@ package org.scribble.ext.go.core.ast.global; import java.util.Collections; +import java.util.Map; import java.util.Set; +import java.util.Stack; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.RPCoreAstFactory; @@ -12,8 +14,10 @@ import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -38,7 +42,7 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } @Override - public boolean isWellFormed(GoJob job, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) { return true; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java index 2cdd3718d..8b00b02fa 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java @@ -1,7 +1,9 @@ package org.scribble.ext.go.core.ast.global; import java.util.Collections; +import java.util.Map; import java.util.Set; +import java.util.Stack; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.RPCoreAstFactory; @@ -12,8 +14,10 @@ import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -38,7 +42,7 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } @Override - public boolean isWellFormed(GoJob job, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) { return true; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index d293d0ce2..35a610e4a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -1,7 +1,10 @@ package org.scribble.ext.go.core.ast.global; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; +import java.util.Stack; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -18,6 +21,7 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexFactory; import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexVar; @@ -50,10 +54,15 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } @Override - public boolean isWellFormed(GoJob job, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) { - // FIXME TODO: interval constraints, nested foreach constraints, etc. -- cf. RPCoreGChoice - return this.body.isWellFormed(job, gpd); + // CHECKME: interval constraints, nested foreach constraints, etc. -- cf. RPCoreGChoice + Map curr = new HashMap<>(); + this.ivals.forEach(ival -> curr.put(ival.var, ival)); + context.push(curr); + boolean res = this.body.isWellFormed(job, context, gpd); + context.pop(); + return res; } @Override @@ -118,7 +127,7 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor throw new RuntimeException("TODO: " + ) }*/ Set filtered = this.ivals.stream().filter(iv -> subj.intervals.stream().anyMatch(x -> iv.isSame(x))).collect(Collectors.toSet()); - // CHECKME: actual interval inclusion? (vs. isSame) -- also RPCoreGChoice#project? + // CHECKME: actual interval inclusion? (vs. "syntactic" equals) -- also RPCoreGChoice#project? //RPIndexedRole tmp = new RPIndexedRole(subj.getName().toString(), filtered); // FIXME: should be this, but currently RPIndexedRole interval set for multidim nat intervals (but with >1 TODO exception) RPCoreGForeach tmp = af.RPCoreGForeach(this.roles, this.ivals, body, af.ParamCoreGEnd()); // CHECKME: should be "end" so that it will be discarded? seq will be substituted for cont in the final "unrolling" of foreach diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java index 1d44cb804..dfd206efc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.Stack; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -21,6 +22,7 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.Message; import org.scribble.type.kind.Global; @@ -56,7 +58,7 @@ LinkedHashMap foo(List cases, RPCoreGType cont) } @Override - public boolean isWellFormed(GoJob job, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) { // src (i.e., choice subj) range size=1 for non-unary choices enforced by ParamScribble.g syntax // Directed choice check by ParamCoreGProtocolDeclTranslator ensures all dests (including ranges) are (syntactically) the same diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index b5c9dcfa0..563485447 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -7,8 +7,9 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; +import java.util.stream.IntStream; import org.scribble.ast.global.GChoice; import org.scribble.ast.global.GContinue; @@ -28,8 +29,6 @@ import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; -import org.scribble.ext.go.core.ast.local.RPCoreLCont; -import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; @@ -314,8 +313,10 @@ private RPCoreGForeach parseRPGForeach(Map rvs, boolean checkRec { RPCoreGType body = parseSeq(gf.getBlock().getInteractionSeq().getInteractions(), Collections.emptyMap(), false, true); body = body.subs(af, RPCoreGEnd.END, RPCoreGCont.CONT); + Set ivals = IntStream.of(0, gf.params.size()-1) + .mapToObj(i -> new RPAnnotatedInterval(gf.params.get(i), gf.starts.get(i), gf.ends.get(i))).collect(Collectors.toSet()); return this.af.RPCoreGForeach(//gf.subj.toName(), gf.param, gf.start, gf.end, - Stream.of(gf.subj.toName()).collect(Collectors.toSet()), Stream.of(new RPAnnotatedInterval(gf.param, gf.start, gf.end)).collect(Collectors.toSet()), + gf.subjs.stream().map(r -> r.toName()).collect(Collectors.toSet()), ivals, // FIXME: generalised foreach sig in source AST body, seq); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java index f3d3f1d5b..dc2238072 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java @@ -1,6 +1,8 @@ package org.scribble.ext.go.core.ast.global; +import java.util.Map; import java.util.Set; +import java.util.Stack; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.RPCoreAstFactory; @@ -12,8 +14,10 @@ import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -39,9 +43,9 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } @Override - public boolean isWellFormed(GoJob job, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) { - return this.body.isWellFormed(job, gpd); + return this.body.isWellFormed(job, context, gpd); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java index d47e44c1e..2bffaa0ae 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java @@ -1,7 +1,9 @@ package org.scribble.ext.go.core.ast.global; import java.util.Collections; +import java.util.Map; import java.util.Set; +import java.util.Stack; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.RPCoreAstFactory; @@ -11,8 +13,10 @@ import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -36,7 +40,7 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } @Override - public boolean isWellFormed(GoJob job, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) { return true; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java index 180f48938..b7bc38c10 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java @@ -1,6 +1,8 @@ package org.scribble.ext.go.core.ast.global; +import java.util.Map; import java.util.Set; +import java.util.Stack; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.RPCoreAstFactory; @@ -9,8 +11,10 @@ import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -18,7 +22,8 @@ public interface RPCoreGType extends RPCoreType { - boolean isWellFormed(GoJob job, GProtocolDecl gpd); + // context records nested foreach vars -- only accesses to top-level vars are valid + boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd); // FIXME: clarify, Role subj is used as "role name" //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index f698a0126..a7e3e0866 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -11,6 +11,7 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.Set; +import java.util.Stack; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -245,7 +246,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws job.debugPrintln("\n[rp-core] Translated:\n " + gt); - if (!gt.isWellFormed(job, gpd)) + if (!gt.isWellFormed(job, new Stack<>(), gpd)) { throw new RPCoreException("[rp-core] Global type not well-formed:\n " + gt); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java index 30e3a0a74..63751c092 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java @@ -19,6 +19,7 @@ public class RPIndexedRole extends Role //public final ParamRange range; public final Set intervals; // size >= 1 -- size == 1 for parsed syntax // FIXME: this set was meant for multidim nat intervals, but multidim should be factored into the RPInterval itself + // No, above is wrong -- this set is actually for multiple intervals, but currently only non-singleton at local level (i.e, variants) public RPIndexedRole(String name, Set intervals) { @@ -31,6 +32,17 @@ public RPIndexedRole(String name, Set intervals) }*/ this.intervals = Collections.unmodifiableSet(intervals); } + + // FIXME: currently just a syntactic singleton check on a single interval -- false negatives possible in general case (multiple intervals) + public boolean isSingleton() + { + if (this.intervals.size() != 1) + { + return false; + } + RPInterval ival = this.intervals.stream().findFirst().get(); + return ival.isSingleton(); + } public Set getIndexVars() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java index f45484d67..ef540247f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java @@ -29,10 +29,16 @@ public Set getIndexVars() return Stream.of(this.start, this.end).flatMap(p -> p.getVars().stream()).collect(Collectors.toSet()); } - // Cf. equals -- also cf. "contains" + // FIXME: cf. equals -- this is to avoid awkwardness of RPInterval and RPAnnotatedInterval + // Althoug, also cf. "contains" -- currently "syntactic equality", generalise? public boolean isSame(RPInterval i) { - return this.start == i.start && this.end == i.end; + return this.start.equals(i.start) && this.end.equals(i.end); + } + + public boolean isSingleton() + { + return this.start.equals(this.end); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java index 80ab5d755..afad74c6f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGForeachDel.java @@ -1,5 +1,8 @@ package org.scribble.ext.go.del.global; +import java.util.List; +import java.util.stream.Collectors; + import org.scribble.ast.ScribNode; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.simple.RoleNode; @@ -17,9 +20,9 @@ public class RPGForeachDel extends RPForeachDel public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inlr, ScribNode visited) throws ScribbleException { RPGForeach fe = (RPGForeach) visited; - RoleNode subj = fe.subj.clone(inlr.job.af); + List subjs = fe.subjs.stream().map(r -> r.clone(inlr.job.af)).collect(Collectors.toList()); GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) fe.block.del().env()).getTranslation(); - RPGForeach inlined = ((RPAstFactory) inlr.job.af).RPGForeach(fe.getSource(), subj, fe.param, fe.start, fe.end, block); + RPGForeach inlined = ((RPAstFactory) inlr.job.af).RPGForeach(fe.getSource(), subjs, fe.params, fe.starts, fe.ends, block); inlr.pushEnv(inlr.popEnv().setTranslation(inlined)); //return (GChoice) super.leaveProtocolInlining(parent, child, inl, gc); return ScribDelBase.popAndSetVisitorEnv(this, inlr, visited); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java index 6e54552d1..874d290df 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPCoreAntlrGForeach.java @@ -1,5 +1,9 @@ package org.scribble.ext.go.parser.scribble.ast.global; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.simple.RoleNode; @@ -14,46 +18,70 @@ public class RPCoreAntlrGForeach { - public static final int SUBJECT_CHILD_INDEX = 0; - - public static final int BLOCK_CHILD_INDEX = 4; - - public static final int INDEX_VAR_CHILD_INDEX = 1; - public static final int START_INDEX_EXPR_CHILD_INDEX = 2; - public static final int END_INDEX_EXPR_CHILD_INDEX = 3; + //public static final int SUBJECT_CHILD_INDEX = 0; + public static final int BLOCK_CHILD_INDEX = 0; + public static final int FOREACHINTERVAL_CHILDREN_START_INDEX = 1; public static RPGForeach parseRPGForeach(AntlrToScribParser parser, CommonTree root, RPAstFactory af) throws ScribParserException { - RoleNode subj = AntlrSimpleName.toRoleNode(getSubjectChild(root), af); - RPForeachVar var = (RPForeachVar) RPAntlrIndexExpr.parseRPForeachVar(getIndexVarChild(root), af); - RPIndexExpr start = RPAntlrIndexExpr.parseParamIndexExpr(getStartIndexExprChild(root), af); - RPIndexExpr end = RPAntlrIndexExpr.parseParamIndexExpr(getEndIndexExprChild(root), af); + //RoleNode subj = AntlrSimpleName.toRoleNode(getSubjectChild(root), af); GProtocolBlock block = (GProtocolBlock) parser.parse(getBlockChild(root), af); - return af.RPGForeach(root, subj, var, start, end, block); + + List subjs = new LinkedList<>(); + List vars = new LinkedList<>(); + List starts = new LinkedList<>(); + List ends = new LinkedList<>(); + for (CommonTree fi : getForeachIntevalChildren(root)) + { + subjs.add(AntlrSimpleName.toRoleNode(getForeachIntervalSubjectChild(fi), af)); + vars.add((RPForeachVar) RPAntlrIndexExpr.parseRPForeachVar(getForeachIntervalIndexVarChild(fi), af)); + starts.add(RPAntlrIndexExpr.parseParamIndexExpr(getForeachIntervalStartIndexExprChild(fi), af)); + ends.add(RPAntlrIndexExpr.parseParamIndexExpr(getForeachIntervalEndIndexExprChild(fi), af)); + } + return af.RPGForeach(root, subjs, vars, starts, ends, block); } - public static CommonTree getSubjectChild(CommonTree ct) + /*public static CommonTree getSubjectChild(CommonTree ct) { return (CommonTree) ct.getChild(SUBJECT_CHILD_INDEX); + }*/ + + public static CommonTree getBlockChild(CommonTree ct) + { + return (CommonTree) ct.getChild(BLOCK_CHILD_INDEX); } - public static CommonTree getIndexVarChild(CommonTree ct) + public static List getForeachIntevalChildren(CommonTree ct) { - return (CommonTree) ct.getChild(INDEX_VAR_CHILD_INDEX); + List children = ct.getChildren(); + return children.subList(FOREACHINTERVAL_CHILDREN_START_INDEX, children.size()).stream() + .map(c -> (CommonTree) c).collect(Collectors.toList()); + } + + + // PARAM_FOREACHINTERVAL -- factor out? + public static final int SUBJECT_CHILD_INDEX = 0; + public static final int INDEX_VAR_CHILD_INDEX = 1; + public static final int START_INDEX_EXPR_CHILD_INDEX = 2; + public static final int END_INDEX_EXPR_CHILD_INDEX = 3; + + public static CommonTree getForeachIntervalSubjectChild(CommonTree ct) + { + return (CommonTree) ct.getChild(SUBJECT_CHILD_INDEX); } - public static CommonTree getStartIndexExprChild(CommonTree ct) + public static CommonTree getForeachIntervalIndexVarChild(CommonTree ct) { - return (CommonTree) ct.getChild(START_INDEX_EXPR_CHILD_INDEX); + return (CommonTree) ct.getChild(INDEX_VAR_CHILD_INDEX); } - public static CommonTree getEndIndexExprChild(CommonTree ct) + public static CommonTree getForeachIntervalStartIndexExprChild(CommonTree ct) { - return (CommonTree) ct.getChild(END_INDEX_EXPR_CHILD_INDEX); + return (CommonTree) ct.getChild(START_INDEX_EXPR_CHILD_INDEX); } - public static CommonTree getBlockChild(CommonTree ct) + public static CommonTree getForeachIntervalEndIndexExprChild(CommonTree ct) { - return (CommonTree) ct.getChild(BLOCK_CHILD_INDEX); + return (CommonTree) ct.getChild(END_INDEX_EXPR_CHILD_INDEX); } } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index abbb56166..e72cee9ec 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -15,15 +15,15 @@ sig "msgsig.Request" from "github.com/nickng/httpget/msgsig" as Request; sig "msgsig.Response" from "github.com/nickng/httpget/msgsig" as Response; global protocol Proto1(role M, role F, role S) { - URL(int) from M[1,1] to F[1,N]; + URL(int) from M[1] to F[1,N]; foreach F[I:1,N] { - Request from F[I,I] to S[1,1]; - Response from S[1,1] to F[I,I]; - //tmp() from S[1,1] to M[1,1]; // FIXME: projection + Request from F[I] to S[1]; + Response from S[1] to F[I]; + //tmp() from S[1] to M[1]; // FIXME: projection } - Done(string) from F[1,N] to M[1,1]; + Done(string) from F[1,N] to M[1]; } //*/ From 750a0c9774e1e4a7e1b3f9197d09b98205b588a0 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 29 Sep 2018 20:06:22 +0100 Subject: [PATCH 331/433] Continued. --- .../org/scribble/ext/go/core/ast/RPCoreForeach.java | 1 + .../ext/go/core/ast/global/RPCoreGChoice.java | 9 +++++---- .../scribble/ext/go/core/cli/RPCoreCommandLine.java | 13 +++++++++---- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 7 ++++++- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java index 522f1713f..e6c8eec99 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/RPCoreForeach.java @@ -16,6 +16,7 @@ public abstract class RPCoreForeach, K extends ProtocolK public final RPIndexExpr start; // Gives the Scribble choices-subj range // Cf. ParamCoreGChoice singleton src public final RPIndexExpr end; // this.dest == super.role -- arbitrary?*/ + // FIXME: record original role-ival bindings -- to check valid foreach index usage per rolename in WF public final Set roles; public final Set ivals; // FIXME: co-intervals? diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index c299094cf..db30feea1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -397,8 +397,9 @@ public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> (RPIndexVar) x).collect(Collectors.toSet()); - if (roles.contains(destName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> x.toString()).collect(Collectors.toSet()); + // FIXME: awardness of RPIndexVar and RPForeachVar + if (!tmp.isEmpty() && roles.contains(destName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) fvars.containsAll(tmp)) { RPIndexExpr destExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, destStart, srcStart)); @@ -420,8 +421,8 @@ else if (this.dest.equals(subj)) { RPIndexExpr srcStart = srcRange.start; RPIndexExpr destStart = destRange.start; - Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> (RPIndexVar) x).collect(Collectors.toSet()); - if (roles.contains(srcName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> x.toString()).collect(Collectors.toSet()); + if (!tmp.isEmpty() && roles.contains(srcName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) fvars.containsAll(tmp)) { RPIndexExpr srcExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, srcStart, destStart)); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index a7e3e0866..54d603925 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -403,13 +403,18 @@ private Map> getPeers(GoJob job) String smt2 = "(assert "; smt2 += "(exists ((peer Int) " - + (vars.isEmpty() ? "" : vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" "))) + ")\n"; + + (vars.isEmpty() ? "" : vars.stream() + .map(x -> "(" + x + " Int)").collect(Collectors.joining(" "))) + ")\n"; smt2 += "(and \n"; - smt2 += peer.intervals.stream().map(x -> "(>= peer " + x.start + ") (<= peer " + x.end + ")").collect(Collectors.joining(" ")) + "\n"; + smt2 += peer.intervals.stream() + .map(x -> "(>= peer " + x.start.toSmt2Formula() + ") (<= peer " + x.end.toSmt2Formula() + ")") + .collect(Collectors.joining(" ")) + "\n"; smt2 += peer.cointervals.isEmpty() ? "" - : "(or " + peer.cointervals.stream().map(x -> "(< peer " + x.start + ") (> peer " + x.end + ")").collect(Collectors.joining(" ")) + ")\n"; - smt2 += "(>= peer " + d.start + ") (<= peer " + d.end + ")\n"; + : "(or " + peer.cointervals.stream() + .map(x -> "(< peer " + x.start.toSmt2Formula() + ") (> peer " + x.end.toSmt2Formula() + ")") + .collect(Collectors.joining(" ")) + ")\n"; + smt2 += "(>= peer " + d.start.toSmt2Formula() + ") (<= peer " + d.end.toSmt2Formula() + ")\n"; smt2 += ")"; smt2 += ")"; smt2 += ")"; diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index e72cee9ec..36255eeb3 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -7,8 +7,13 @@ module param.tmp.ParamTest; +global protocol Proto1(role A, role B) { + foreach B[I:1,K-1] { + Foo() from A[1] to B[I]; + } +} -//* +/* type "int" from "builtin" as int; type "string" from "builtin" as string; sig "msgsig.Request" from "github.com/nickng/httpget/msgsig" as Request; From d481b93fb98583fea330d33792c4f828cef68452 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 29 Sep 2018 20:57:27 +0100 Subject: [PATCH 332/433] Continued. --- .../statetype3/RPCoreSTApiGenerator.java | 38 ++++++++++++++++++- .../RPCoreSTStateChanApiBuilder.java | 17 ++++++--- .../ext/go/type/index/RPBinIndexExpr.java | 3 +- .../ext/go/type/index/RPIndexExpr.java | 2 +- .../ext/go/type/index/RPIndexVar.java | 2 +- 5 files changed, 52 insertions(+), 10 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index f68f9857c..ad2724c19 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -17,6 +17,9 @@ import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPBinIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; @@ -239,12 +242,43 @@ public static String getGeneratedRoleVariantName(RPRoleVariant variant) ParamRange g = actual.ranges.iterator().next(); return actual.getName() + "_" + g.start + "To" + g.end;*/ return variant.getName() + "_" - + variant.intervals.stream().map(g -> g.start + "to" + g.end).sorted().collect(Collectors.joining("and")) + + variant.intervals.stream().map(g -> getGeneratedNameLabel(g.start) + "to" + getGeneratedNameLabel(g.end)) + .sorted().collect(Collectors.joining("and")) + (variant.cointervals.isEmpty() ? "" - : "_not_" + variant.cointervals.stream().map(g -> g.start + "to" + g.end).sorted().collect(Collectors.joining("and"))); + : "_not_" + variant.cointervals.stream().map(g -> getGeneratedNameLabel(g.start) + "to" + getGeneratedNameLabel(g.end)) + .sorted().collect(Collectors.joining("and"))); } + // For type name generation -- cf. RPCoreSTStateChanApiBuilder#generateIndexExpr + public static String getGeneratedNameLabel(RPIndexExpr e) + { + if (e instanceof RPIndexInt) + { + return e.toGoString(); + } + else if (e instanceof RPIndexVar) + { + return e.toGoString(); + } + else if (e instanceof RPBinIndexExpr) + { + RPBinIndexExpr b = (RPBinIndexExpr) e; + String op; + switch (b.op) + { + case Add: op = "plus"; break; + case Mult: op = "mul"; break; + case Subt: op = "sub"; break; + default: throw new RuntimeException("TODO: " + b.op); + } + return getGeneratedNameLabel(b.left) + op + getGeneratedNameLabel(b.right); // FIXME: pre/postfix more consistent? + } + else + { + throw new RuntimeException("Shouldn't get here: " + e); + } + } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index c77697077..12c66cd91 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -29,6 +29,7 @@ import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.core.type.name.RPCoreGDelegationType; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPBinIndexExpr; import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexInt; @@ -607,30 +608,36 @@ public static String getGeneratedIndexedRoleName(RPIndexedRole r) return r.getName() + "_" + g.start + "to" + g.end; } + // Expressions to be used in code -- cf. RPCoreSTApiGenerator.getGeneratedNameLabel public String generateIndexExpr(RPIndexExpr e) { if (e instanceof RPIndexInt) { - return e.toString(); + return e.toGoString(); } else if (e instanceof RPIndexVar) { String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; if (e instanceof RPForeachVar - || this.fvars.stream().anyMatch(p -> p.toString().equals(e.toString()))) // FIXME HACK + || this.fvars.stream().anyMatch(p -> p.toString().equals(e.toString()))) // FIXME HACK -- foreach var occurrences inside foreach body are RPIndexVars { - return sEp + ".Params[\"" + e + "\"]"; + return sEp + ".Params[\"" + e.toGoString() + "\"]"; } else { return sEp //+ "." + RPCoreSTApiGenConstants.GO_ENDPOINT_PARAMS + "[\"" + e + "\"]"; - + "." + e; + + "." + e.toGoString(); } } + else if (e instanceof RPBinIndexExpr) + { + RPBinIndexExpr b = (RPBinIndexExpr) e; + return "(" + generateIndexExpr(b.left) + b.op.toString() + generateIndexExpr(b.right) + ")"; + } else { - throw new RuntimeException("[rp-core] TODO: " + e); + throw new RuntimeException("[rp-core] Shouldn't get in here: " + e); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java index d6ad9f073..a63b02ae5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java @@ -40,7 +40,8 @@ protected RPBinIndexExpr(Op op, RPIndexExpr left, RPIndexExpr right) @Override public String toGoString() { - throw new RuntimeException("[param-core] TODO: " + this); + //throw new RuntimeException("[param-core] TODO: " + this); + return toString(); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java index 764704c93..4b7ef14dc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java @@ -9,7 +9,7 @@ public boolean isConstant() return false; } - public abstract String toGoString(); + public abstract String toGoString(); // As basic Go expressions, but not (necessarily) actual code generation "ouput" public abstract Set getVars(); // Doesn't include foreach params diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java index 1957b019d..d2e9aaeec 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java @@ -21,7 +21,7 @@ protected RPIndexVar(String name) @Override public String toGoString() { - return this.name; + return toString(); } @Override From 31119c0ef5a0672d64f3893ee98b6548217f3057 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 29 Sep 2018 22:12:17 +0100 Subject: [PATCH 333/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 25 +++++++++++++++---- .../statetype3/RPCoreSTSessionApiBuilder.java | 8 +++--- .../RPCoreSTStateChanApiBuilder.java | 3 ++- .../ext/go/type/index/RPIndexSelf.java | 6 ----- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index db30feea1..24dfbbf64 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -397,12 +397,19 @@ public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> x.toString()).collect(Collectors.toSet()); - // FIXME: awardness of RPIndexVar and RPForeachVar + //Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> x.toString()).collect(Collectors.toSet()); + String srcTmp = (srcStart instanceof RPIndexVar) ? ((RPIndexVar) srcStart).name : null; + String destTmp = (destStart instanceof RPIndexVar) ? ((RPIndexVar) destStart).name : null; + // FIXME: awkwardness of RPIndexVar and RPForeachVar + Set tmp = Stream.of(srcTmp, destTmp).filter(x -> x != null).collect(Collectors.toSet()); if (!tmp.isEmpty() && roles.contains(destName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) fvars.containsAll(tmp)) { - RPIndexExpr destExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, destStart, srcStart)); + RPIndexExpr upper = (destTmp != null) ? ivals.stream().filter(x -> x.var.name.equals(destTmp)).findFirst().get().start : destStart; + RPIndexExpr lower = (srcTmp != null) ? ivals.stream().filter(x -> x.var.name.equals(srcTmp)).findFirst().get().start : srcStart; + RPIndexExpr destExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, + //RPIndexFactory.ParamBinIndexExpr(Op.Subt, destStart, srcStart)); + RPIndexFactory.ParamBinIndexExpr(Op.Subt, upper, lower)); RPIndexedRole dest = new RPIndexedRole(destName.toString(), Stream.of(new RPInterval(destExpr, destExpr)).collect(Collectors.toSet())); return af.ParamCoreLCrossChoice(dest, RPCoreLActionKind.CROSS_SEND, projs); } @@ -421,11 +428,19 @@ else if (this.dest.equals(subj)) { RPIndexExpr srcStart = srcRange.start; RPIndexExpr destStart = destRange.start; - Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> x.toString()).collect(Collectors.toSet()); + //Set tmp = Stream.of(srcStart, destStart).filter(x -> x instanceof RPIndexVar).map(x -> x.toString()).collect(Collectors.toSet()); + String srcTmp = (srcStart instanceof RPIndexVar) ? ((RPIndexVar) srcStart).name : null; + String destTmp = (destStart instanceof RPIndexVar) ? ((RPIndexVar) destStart).name : null; + // FIXME: awkwardness of RPIndexVar and RPForeachVar + Set tmp = Stream.of(srcTmp, destTmp).filter(x -> x != null).collect(Collectors.toSet()); if (!tmp.isEmpty() && roles.contains(srcName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) fvars.containsAll(tmp)) { - RPIndexExpr srcExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, RPIndexFactory.ParamBinIndexExpr(Op.Subt, srcStart, destStart)); + RPIndexExpr upper = (srcTmp != null) ? ivals.stream().filter(x -> x.var.name.equals(srcTmp)).findFirst().get().start : srcStart; + RPIndexExpr lower = (destTmp != null) ? ivals.stream().filter(x -> x.var.name.equals(destTmp)).findFirst().get().start : destStart; + RPIndexExpr srcExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, + //RPIndexFactory.ParamBinIndexExpr(Op.Subt, srcStart, destStart)); + RPIndexFactory.ParamBinIndexExpr(Op.Subt, upper, lower)); RPIndexedRole src = new RPIndexedRole(destName.toString(), Stream.of(new RPInterval(srcExpr, srcExpr)).collect(Collectors.toSet())); return af.ParamCoreLCrossChoice(src, RPCoreLActionKind.CROSS_RECEIVE, projs); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index dad5ad3fe..e87be61ca 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -218,7 +218,8 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) String tmp = "func (p *" + simpname + ") New" + "_" + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") + epkindTypeName // FIXME: factor out common variants between families - + "(" + ivars.stream().map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" + + "(" + ivars.stream().filter(x -> !x.name.equals("self")) // CHECKME: can check for RPIndexSelf instead? + .map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" + " *" + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) // FIXME: factor out (and separate type name from package name) @@ -232,7 +233,8 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) // FIXME: factor out + ".New" + "(p" //", params" - + ivars.stream().map(x -> ", " + x).collect(Collectors.joining("")) + + ivars.stream().filter(x -> !x.name.equals("self")) // CHECKME: can check for RPIndexSelf instead? + .map(x -> ", " + x).collect(Collectors.joining("")) + ", self)\n" + "}\n"; @@ -326,7 +328,7 @@ public int compare(Entry o1, Entry o2) // Endpoint Kind type constructor -- makes connection maps + "\n" + "func New(p " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + ", " //+"params map[string]int," - + ivars.stream().map(x -> x + " int, ").collect(Collectors.joining("")) + + ivars.stream().filter(x -> !x.name.equals("self")).map(x -> x + " int, ").collect(Collectors.joining("")) // CHECKME: can check for RPIndexSelf instead? + "self int) *" + epkindTypeName + " {\n" /*+ "conns := make(map[string]map[int]transport.Channel)\n" + this.apigen.variants.entrySet().stream() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 12c66cd91..cf2b5f330 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -605,7 +605,8 @@ public static String getGeneratedIndexedRoleName(RPIndexedRole r) throw new RuntimeException("[rp-core] TODO: " + r); } RPInterval g = r.intervals.iterator().next(); - return r.getName() + "_" + g.start + "to" + g.end; + return r.getName() + "_" + RPCoreSTApiGenerator.getGeneratedNameLabel(g.start) + + (g.start.equals(g.end) ? "" : "to" + RPCoreSTApiGenerator.getGeneratedNameLabel(g.end)); } // Expressions to be used in code -- cf. RPCoreSTApiGenerator.getGeneratedNameLabel diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java index 84bcb0aab..8a4c97038 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java @@ -8,12 +8,6 @@ private RPIndexSelf() { super("self"); } - - @Override - public String toSmt2Formula() - { - throw new RuntimeException("Shouldn't get in here: "); - } @Override public String toString() From 716f3a2349421660ff3682286093cc4260a2b5a9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 30 Sep 2018 12:15:35 +0100 Subject: [PATCH 334/433] Continued. --- .../ext/go/core/cli/RPCoreCommandLine.java | 7 ++- .../statetype3/RPCoreSTApiGenerator.java | 44 ++++++++++++++++++- .../statetype3/RPCoreSTSessionApiBuilder.java | 39 +++++++++++++--- .../RPCoreSTStateChanApiBuilder.java | 3 +- .../go/core/model/endpoint/RPCoreEState.java | 1 + .../src/test/scrib/param/tmp/ParamTest.scr | 6 ++- 6 files changed, 88 insertions(+), 12 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 54d603925..f2045b231 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -357,7 +357,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws //..HERE FIXME ActualParam -- ParamRange is now already a Set - // Compute variant peers of each variant + // Compute variant peers of each variant -- for "common" endpoint kind factoring (w.r.t. dial/accept -- i.e., looking for variants whose set of dial/accept methods is the same for all families it is involved in) private Map> getPeers(GoJob job) { job.debugPrintln("\n[rp-core] Computing peers:"); @@ -379,6 +379,8 @@ private Map> getPeers(GoJob job) RPCoreEState.getReachableActions((RPCoreEModelFactory) job.ef, (RPCoreEState) this.E0.get(rname).get(self).init).stream() // FIXME: static "overloading" (cf. MState) error prone .map(a -> ((RPCoreEAction) a).getPeer()).collect(Collectors.toSet()); + // CHECKME: in presence of foreach, actions will include unqualified foreachvars -- is that what the following Z3 assertion is/should be doing? + Set peers = new HashSet<>(); next: for (RPRoleVariant peer : (Iterable) // Candidate this.E0.values().stream() @@ -387,13 +389,14 @@ private Map> getPeers(GoJob job) if (!peer.equals(self) && !peers.contains(peer)) { job.debugPrintln("\n[rp-core] For " + self + ", checking potential peer: " + peer); + // "checking potential peer" means checking if any of our action-peer indexed roles fits the candidate variant-peer (so we would need a dial/accept for them) for (RPIndexedRole ir : irs) { if (ir.getName().equals(peer.getName())) { if (ir.intervals.size() > 1) { - throw new RuntimeException("[rp-core] TODO: multi-dimension intervals: " + ir); + throw new RuntimeException("[rp-core] TODO: multi-dimension intervals: " + ir); // No? Multiple intervals is not actually about multidim intervals, it's about constraint intersection? (A multdim interval should be a single interval value?) } RPInterval d = ir.intervals.stream().findAny().get(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index ad2724c19..ff95e4d11 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -40,8 +40,8 @@ public class RPCoreSTApiGenerator public final Map> projections; public final Map> variants; //public final Map, Set>>> families; - public final Map, Set>, Integer> families; - public final Map> peers; + public final Map, Set>, Integer> families; // int is arbitrary familiy id + public final Map> peers; // For "common" endpoint kind factoring public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module @@ -280,6 +280,46 @@ else if (e instanceof RPBinIndexExpr) } } + public boolean isCommonEndpointKind(RPRoleVariant variant) + { + // For factoring out "common" endpoint kinds from families -- FIXME: do earlier with/after family computation? + // Means current variant talks to at most the same single peer in all families (but maybe not involved in some families -- but that is fine, considering a distributed projection needs only to know what to do in its relevant families) + // Note: without explicit connections, even if don't directly talk with a family co-member, basic session model still forms the connection + // E.g., basic pipeline, left/right not "common" because of "connections to right/[middle]/left" distinguished from "connections to *neighbours*" + // Ideally, want to reason about dial/accept to make only the "necessary connections" => explicit connections + //boolean isCommonEndpointKind = this.apigen.peers.get(variant).size() == 1; + // CHECKME: why 1, should it be generalised? + // CHECKME: peers doesn't consider families -- should isCommonEndpointKind be determined from families? + boolean isCommonEndpointKind = this.families.keySet().stream().filter(p -> p.left.contains(variant)) + // Would also be reasonable to require variant to be in every family -- but not necessary since a distributed projection is only for the families that the variant is involved in + .allMatch(p -> p.left.containsAll(this.peers.get(variant))); + return isCommonEndpointKind; + + /*// "Syntactically" determining common endpoint kinds difficult because concrete peers depends on param (and foreachvar) values, e.g., M in PGet w.r.t. #F + // Also, family factoring is more about dial/accept + isCommonEndpointKind = true; + Set peers = null; + X: for (Pair, Set> fam : this.apigen.families.keySet()) + { + if (fam.left.contains(variant)) + { + EGraph g = this.apigen.variants.get(rname).get(variant); + Set as = RPCoreEState.getReachableActions((RPCoreEModelFactory) this.apigen.job.ef, (RPCoreEState) g.init); + Set tmp = as.stream().map(a -> a.getPeer()).collect(Collectors.toSet()); + if (peers == null) + { + peers = tmp; + } + else if (!peers.equals(tmp)) + { + isCommonEndpointKind = false; + break X; + } + } + } + //*/ + } + /*//@Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index e87be61ca..4519ff4c0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -28,6 +28,8 @@ // Cf. STStateChanApiBuilder public class RPCoreSTSessionApiBuilder { + private final RPCoreSTApiGenerator apigen; + /*... move stateChanNames (and peers?) here ... cache reachable states, use for state chan pre-creation (to include intermed states -- and case objects?) ... do "global" linearity counter*/ @@ -35,8 +37,6 @@ public class RPCoreSTSessionApiBuilder protected final Map> reachable = new HashMap<>(); protected final Map> stateChanNames; // State2 //private Map> foreachNames = new HashMap<>(); // State2_ intermediary name (N.B. RPCoreSTStateChanApiBuilder swaps them around for convenience) - - private RPCoreSTApiGenerator apigen; private static final Comparator IVAR_COMP = new Comparator() { @@ -154,7 +154,8 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) // Cf. getEndpointKindFilePath boolean isCommonEndpointKind = //this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(v)); // No: doesn't consider dial/accept //this.apigen.families.keySet().stream().filter(f -> f.left.contains(v)).distinct().count() == 1; // No: too conservative -- should be about required peer endpoint kinds (to dial/accept with) - this.apigen.peers.get(v).size() == 1; + //this.apigen.peers.get(v).size() == 1; // Cf. + this.apigen.isCommonEndpointKind(v); return isCommonEndpointKind ? "import " + epkindPackName @@ -185,12 +186,13 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) + "func New() *" + simpname + " {\n" + "return &" + simpname + "{ }\n" + "}\n"; - + for (Role rname : rolenames) { for (RPRoleVariant variant : this.apigen.variants.get(rname).keySet()) { - boolean isCommonEndpointKind = this.apigen.peers.get(variant).size() == 1; + boolean isCommonEndpointKind = this.apigen.isCommonEndpointKind(variant); + Set, Set>> families = isCommonEndpointKind ? Stream.of((Pair, Set>) null).collect(Collectors.toSet()) // FIXME HACK: when isCommonEndpointKind, just loop once (to make one New) : this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant)).collect(Collectors.toSet()); @@ -525,11 +527,36 @@ public String getEndpointKindFilePath(Pair, Set f.left.contains(variant)); // No: doesn't consider dial/accept //this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant)).distinct().count() == 1; - this.apigen.peers.get(variant).size() == 1; + //this.apigen.peers.get(variant).size() == 1; + this.apigen.isCommonEndpointKind(variant); String basedir = this.apigen.proto.toString().replaceAll("\\.", "/") + "/"; // Full name return basedir //+ "/" + this.apigen.getFamilyPackageName(family) + (isCommonEndpointKind ? "" : "/" + this.apigen.getFamilyPackageName(family)) + "/" + RPCoreSTApiGenerator.getEndpointKindPackageName(variant); + + /*// "Syntactically" determining common endpoint kinds difficult because concrete peers depends on param (and foreachvar) values, e.g., M in PGet w.r.t. #F + // Also, family factoring is more about dial/accept + isCommonEndpointKind = true; + Set peers = null; + X: for (Pair, Set> fam : this.apigen.families.keySet()) + { + if (fam.left.contains(variant)) + { + EGraph g = this.apigen.variants.get(rname).get(variant); + Set as = RPCoreEState.getReachableActions((RPCoreEModelFactory) this.apigen.job.ef, (RPCoreEState) g.init); + Set tmp = as.stream().map(a -> a.getPeer()).collect(Collectors.toSet()); + if (peers == null) + { + peers = tmp; + } + else if (!peers.equals(tmp)) + { + isCommonEndpointKind = false; + break X; + } + } + } + //*/ } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index cf2b5f330..4ba29f359 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -225,7 +225,8 @@ public String getStateChannelFilePath(String filename) } boolean isCommonEndpointKind = //this.apigen.families.keySet().stream().allMatch(f -> f.left.contains(this.variant)); // No: doesn't consider dial/accept //this.apigen.families.keySet().stream().filter(f -> f.left.contains(this.variant)).distinct().count() == 1; // No: too conservative -- should be about required peer endpoint kinds (to dial/accept with) - this.apigen.peers.get(this.variant).size() == 1; + //this.apigen.peers.get(this.variant).size() == 1; + this.apigen.isCommonEndpointKind(variant); return //getStateChannelPackagePathPrefix() // Duplicated from RPCoreSTSessionApiBuilder#getEndpointKindFilePath this.gpn.toString().replaceAll("\\.", "/") diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java index dadfe3625..eb1e4f21e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEState.java @@ -158,6 +158,7 @@ public static Set getReachableStates(RPCoreEState start) } // FIXME: make not static -- otherwise choosing statics (cf. MState) by overloading, error prone + // Note: returns "syntactic" results, e.g., foreachvars directly returned unqualified // cf. RPCoreGForeach#getIndexedRoles public static Set getReachableActions(RPCoreEModelFactory ef, RPCoreEState start) { diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 36255eeb3..bc205ca74 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -7,13 +7,17 @@ module param.tmp.ParamTest; + +/* global protocol Proto1(role A, role B) { foreach B[I:1,K-1] { Foo() from A[1] to B[I]; } } +//*/ -/* + +//* type "int" from "builtin" as int; type "string" from "builtin" as string; sig "msgsig.Request" from "github.com/nickng/httpget/msgsig" as Request; From 74a3a34916a8e8090b5954fd9100078adc5ab0be Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 30 Sep 2018 15:24:05 +0100 Subject: [PATCH 335/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 128 ++++++++++++------ .../src/test/scrib/param/tmp/ParamTest.scr | 69 +++++++++- 2 files changed, 150 insertions(+), 47 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 24dfbbf64..421afdb97 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.core.ast.global; +import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; @@ -77,6 +78,7 @@ public boolean isWellFormed(GoJob job, Stack> cont RPInterval srcRange = this.src.getParsedRange(); RPInterval destRange = this.dest.getParsedRange(); Set vars = Stream.of(srcRange, destRange).flatMap(r -> r.getIndexVars().stream()).collect(Collectors.toSet()); + // FIXME: record foreachvars separately, for additional constraint generation /*// CHECKME: is range size>0 already ensured by syntax? Function foo1 = r -> @@ -133,9 +135,28 @@ public boolean isWellFormed(GoJob job, Stack> cont return false; } } + + Set all = context.stream().flatMap(m -> m.keySet().stream().map(k -> k.name)).collect(Collectors.toSet()); // FIXME: awkwardness of RPForeachVar and RPIndexVar + Function checkForeachVarIndex = ir -> + { + Set vs = ir.getIndexVars().stream().map(x -> x.name).collect(Collectors.toSet()); // FIXME: awkwardness of RPForeachVar and RPIndexVar + if (vs.stream().anyMatch(x -> all.contains(x))) + { + if (!hasValidForeachVarIndex(context, ir)) + { + // FIXME: check in name disamb pass? + job.debugPrintln("\n[param-core] [WF] Illegal use/access of foreach-var: " + ir); + return false; + } + } + return true; + }; + if (!checkForeachVarIndex.apply(this.src) || !checkForeachVarIndex.apply(this.dest)) + { + return false; + } } - if (this.src.getName().equals(this.dest.getName())) { if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) @@ -144,83 +165,88 @@ public boolean isWellFormed(GoJob job, Stack> cont smt2 += vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")); smt2 += ") (and"; smt2 += vars.isEmpty() ? "" : vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")); - // FIXME: lower bound constant -- replace by global invariant + // FIXME: lower bound constant '1' -- replace by global invariant - Map peek = context.peek(); - Set all = context.stream().flatMap(m -> m.keySet().stream().map(k -> k.toString())).collect(Collectors.toSet()); - Set curr = peek.keySet().stream().map(k -> k.toString()).collect(Collectors.toSet()); - Set srcVars = this.src.getIndexVars(); - for (RPIndexVar sv : srcVars) + Map peek = context.isEmpty() ? Collections.emptyMap() : context.peek(); + Set curr = peek.keySet().stream().map(k -> k.name).collect(Collectors.toSet()); + Set srcAndDestVars = new HashSet<>(); + srcAndDestVars.addAll(this.src.getIndexVars()); + srcAndDestVars.addAll(this.dest.getIndexVars()); + for (RPIndexVar sv : srcAndDestVars) { String tmp = sv.toString(); - if (all.contains(tmp)) // FIXME: awkwardness of RPForeachVar and RPIndexVar + if (curr.contains(tmp)) // FIXME: awkwardness of RPForeachVar and RPIndexVar { - if (!curr.contains(tmp)) - { - job.debugPrintln("\n[param-core] [WF] Illegal access of outer foreach-var: " + this.src); - return false; - } RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp)); - Set srcIvals = this.src.intervals; - if (srcIvals.size() > 1 || !srcIvals.iterator().next().isSingleton()) - { - job.debugPrintln("\n[param-core] [WF] Non-singleton usage of foreach-var: " + this.src + ", " + ival); - return false; - } smt2 += " (= " + sv + " " + ival.start + ")"; } } - Set destVars = this.dest.getIndexVars(); // FIXME: factor out with above - for (RPIndexVar dv : destVars) - { - String tmp = dv.toString(); - if (all.contains(tmp)) // FIXME: awkwardness of RPForeachVar and RPIndexVar - { - if (!curr.contains(tmp)) - { - job.debugPrintln("\n[param-core] [WF] Illegal access of outer foreach-var: " + this.dest); - return false; - } - RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp)); - Set destIvals = this.dest.intervals; - if (destIvals.size() > 1 || !destIvals.iterator().next().isSingleton()) - { - job.debugPrintln("\n[param-core] [WF] Non-singleton usage of foreach-var: " + this.dest + ", " + ival); - return false; - } - smt2 += " (= " + dv + " " + ival.start + ")"; - } - } - if (src.getName().equals(dest.getName()) && srcVars.size() == 1 && destVars.size() == 1) + + /*//Set curr = peek.keySet().stream().map(k -> k.toString()).collect(Collectors.toSet()); + if (isValidForeachIndexVar(context, this.src) && isValidForeachIndexVar(context, this.dest)) { String sv = srcVars.iterator().next().toString(); String dv = destVars.iterator().next().toString(); if (curr.contains(sv) && curr.contains(dv)) { - if (peek.get(RPIndexFactory.RPForeachVar(sv)).start.equals(peek.get(RPIndexFactory.RPForeachVar(sv)))) - // FIXME: need to prove not equal (not just check for syntactic equality) + RPIndexExpr s = peek.get(RPIndexFactory.RPForeachVar(sv)).start; + RPIndexExpr d = peek.get(RPIndexFactory.RPForeachVar(dv)).start; + if (!(s instanceof RPIndexInt) && !(s instanceof RPIndexInt)) + { + System.err.println("\n[param-core] Interval separation not being fully proved: " + s + " and " + d); + } + if (s.equals(d)) + // FIXME: use Z3 to prove intervals not equal (not just checking against syntactic equality) { job.debugPrintln("\n[param-core] (Potential) illegal self-communication: " + this); return false; } } - } + }*/ smt2 += Stream.of(srcRange, destRange) .map(r -> " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")") .collect(Collectors.joining()); smt2 += ")))"; - job.debugPrintln("\n[param-core] [WF] Checking non-overlapping ranges for " + this.src.getName() + ":\n " + smt2); + job.debugPrintln("\n[param-core] [WF] Checking non-overlapping ranges (potential self-communication) for " + this.src.getName() + ":\n " + smt2); if (Z3Wrapper.checkSat(job, gpd, smt2)) { return false; } // CHECKME: projection cases for rolename self-comm but non-overlapping intervals + + // FIXME: only do if both are foreachvars + if (hasValidForeachVarIndex(context, this.src) && hasValidForeachVarIndex(context, this.dest)) + { + String sv = ((RPIndexVar) this.src.intervals.iterator().next().start).toString(); + String dv = ((RPIndexVar) this.dest.intervals.iterator().next().end).toString(); + RPInterval s = peek.get(RPIndexFactory.RPForeachVar(sv)); + RPInterval d = peek.get(RPIndexFactory.RPForeachVar(dv)); + Set tmp = Stream.of(s, d).flatMap(r -> r.getIndexVars().stream()).collect(Collectors.toSet()); + // Duplicated from DOT_TRANSFER + smt2 = "(assert" + + (tmp.isEmpty() ? "" : " (forall (" + tmp.stream().map(v -> "(" + v + " Int)").collect(Collectors.joining(" "))) + ") " + + "(and (= (- " + s.end.toSmt2Formula() + " " + s.start.toSmt2Formula() + ") (- " + + d.end.toSmt2Formula() + " " + d.start.toSmt2Formula() + "))" + + (!this.src.getName().equals(this.dest.getName()) ? "" : + " (not (= " + s.start.toSmt2Formula() + " " + d.start.toSmt2Formula() + "))") + + ")" + + (tmp.isEmpty() ? "" : ")") + + ")"; + + job.debugPrintln("\n[param-core] [WF] Checking foreach-var alignment between " + srcRange + " and " + destRange + ":\n " + smt2); + + if (!Z3Wrapper.checkSat(job, gpd, smt2)) + { + return false; + } + } } } + // Now redundant if (this.kind == RPCoreGActionKind.DOT_TRANSFER) { String smt2 = "(assert" @@ -244,6 +270,18 @@ public boolean isWellFormed(GoJob job, Stack> cont return true; } + public static boolean hasValidForeachVarIndex(Stack> context, RPIndexedRole xxx) + { + if (context.isEmpty()) + { + return false; + } + Set curr = context.peek().keySet().stream().map(k -> k.toString()).collect(Collectors.toSet()); + RPInterval ival = xxx.intervals.iterator().next(); + return xxx.intervals.size() == 1 && ival.isSingleton() + && (ival.start instanceof RPIndexVar) && curr.contains(((RPIndexVar) ival.start).name); // N.B. RPIndexVar, not RPForeachVar (FIXME) + } + @Override public RPCoreGActionKind getKind() { diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index bc205ca74..c9f335a2c 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,16 +8,81 @@ module param.tmp.ParamTest; +/* +global protocol Proto1(role B) { + foreach B[I:2,K-1] { + Foo() from B[I+1] to B[1]; // FIXME: projection + } +} +//*/ + + +/* +global protocol Proto1(role B) { + foreach B[I:1,K], B[J:K,K+K] { // FIXME TODO foreach interval constraint + Foo() from B[I] to B[J]; + } +} +//*/ + + + /* global protocol Proto1(role A, role B) { foreach B[I:1,K-1] { - Foo() from A[1] to B[I]; + Foo() from A[1] to B[I]; + //Foo() from A[1] to B[I+1]; // Bad if uncommented + //Foo() from B[I+1] to A[1]; // Bad if uncommented } } //*/ -//* +/* +global protocol Proto1(role B) { + foreach B[I:1,K] { + Foo() from B[I] to B[I]; // Bad + } +} +//*/ + + +/* +global protocol Proto1(role B) { + foreach B[I:1,K], B[J:1,K] { + Foo() from B[I] to B[J]; // Bad + } +} +//*/ + + +/* +global protocol Proto1(role B) { + foreach B[I:1,K-1], B[J:2,K] { + Foo() from B[I] to B[J]; // OK + } +} +//*/ + + +/* +global protocol Proto1(role B) { + foreach B[I:1,K], B[J:2,K+1] { // Bad + Foo() from B[I] to B[J]; + } +} +//*/ + + +/* +global protocol Proto1(role B) { + Foo() from B[1,2] to B[1,K]; // Bad + Foo() from B[1,2] to B[J,J+1]; // Bad +} +//*/ + + +/* type "int" from "builtin" as int; type "string" from "builtin" as string; sig "msgsig.Request" from "github.com/nickng/httpget/msgsig" as Request; From 449778ea4b9132cf85c9cbbca628b66ebfb9a9ae Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 30 Sep 2018 22:40:28 +0100 Subject: [PATCH 336/433] Fixed rp-core branch API gen hardcoding of src index. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 38 ++++++++++++++++--- .../ext/go/core/cli/RPCoreCommandLine.java | 2 +- .../RPCoreSTBranchActionBuilder.java | 21 ++++++++-- .../statetype3/RPCoreSTCaseActionBuilder.java | 13 ++++++- .../src/test/scrib/param/tmp/ParamTest.scr | 24 ++++++++++++ 5 files changed, 87 insertions(+), 11 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 421afdb97..c3cfbbbd2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -18,6 +18,7 @@ import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLActionKind; +import org.scribble.ext.go.core.ast.local.RPCoreLCrossChoice; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; @@ -513,14 +514,41 @@ private RPCoreLType merge(RPCoreAstFactory af, RPRoleVariant r, { // "Merge" Set values = new HashSet<>(projs.values()); - if (values.size() > 1) + /*if (values.size() > 1) { throw new RPCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r //+ " for " + ranges - + ": cannot merge for: " + projs.keySet()); + + ": cannot merge: " + projs); + }*/ + if (values.size() == 1) // Handles output choices + { + return values.iterator().next(); } - - return values.iterator().next(); + RPIndexedRole peer = null; + LinkedHashMap cases = new LinkedHashMap<>(); + for (Message m : projs.keySet()) + { + RPCoreLType p = projs.get(m); + if (!(p instanceof RPCoreLCrossChoice)) + { + throw new RPCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge: " + projs); + } + RPCoreLCrossChoice c = (RPCoreLCrossChoice) p; + if (c.kind != RPCoreLActionKind.CROSS_RECEIVE) // FIXME generalise + { + throw new RPCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge: " + projs); + } + if (peer == null) + { + peer = c.role; + } + else if (!c.role.equals(peer)) + { + throw new RPCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge: " + projs); + } + cases.putAll(c.cases); + } + return af.ParamCoreLCrossChoice(peer, RPCoreLActionKind.CROSS_RECEIVE, cases); } // Cf. merge above @@ -529,7 +557,7 @@ private RPCoreLType merge3(RPCoreAstFactory af, RPIndexedRole r, Map values = new HashSet<>(projs.values()); if (values.size() > 1) { - throw new RPCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge for: " + projs.keySet()); + throw new RPCoreSyntaxException("[param-core] Cannot project \n" + this + "\n onto " + r + ": cannot merge: " + values); } return values.iterator().next(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index f2045b231..3bb2caaaf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -286,7 +286,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws for (RPRoleVariant variant : this.L0.get(r).keySet()) { - System.out.println("Projection onto " + variant + ": " + this.L0.get(r).get(variant)); + System.out.println("\nProjection onto " + variant + ": " + this.L0.get(r).get(variant)); EGraph g = builder.build(this.L0.get(r).get(variant)); //Map, EGraph> tmp = this.E0.get(r); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index f2280a46d..c7c2c8ddc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -6,6 +6,7 @@ import org.scribble.codegen.statetype.STBranchActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.MessageSigName; @@ -63,7 +64,7 @@ public String getReturnType(STStateChanApiBuilder api, EState curr, EState succ) @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { - //RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; List as = curr.getAllActions(); if (!as.stream().allMatch(x -> x.mid.isOp()) && !as.stream().allMatch(x -> x.mid.isMessageSigName())) @@ -83,13 +84,24 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ", " + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; + // Duplicated from RPCoreSTReceiveActionBuilder + RPInterval d = peer.intervals.iterator().next(); + if (peer.intervals.size() > 1) + { + throw new RuntimeException("[rp-core] TODO: " + a); + } + if (!d.isSingleton()) + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + a); + } if (a.mid.isOp()) // Currently, assuming all mids are Ops; else all mids are sig names { // Duplicated from RPCoreSTReceiveActionBuilder - res += "var lab string\n" // cf. RPCoreSTReceiveActionBuilder + res += "var lab string\n" // cf. RPCoreSTReceiveActionBuilder + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(" + "&lab" + ")"*/ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", 1, &lab" + ")" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", " + + rpapi.generateIndexExpr(d.start) + ", &lab" + ")" + "; err != nil {\n" //+ "log.Fatal(err)\n" //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? @@ -115,7 +127,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat "var msg session2.ScribMessage\n" + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + "." //+ RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" + "&msg" + ")"*/ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", 1, &msg" + ")" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", " + + rpapi.generateIndexExpr(d.start) + ", &msg" + ")" + "; err != nil {\n" //+ "log.Fatal(err)\n" + "panic(err)\n" // FIXME: which case object to return for error? make "default" error case object? diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index 490286f6c..62b236641 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -7,6 +7,7 @@ import org.scribble.codegen.statetype.STCaseActionBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.model.endpoint.EState; import org.scribble.model.endpoint.actions.EAction; import org.scribble.type.name.DataType; @@ -51,11 +52,21 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "[\"" + peer.getName() + "\"]";*/ // Duplicated from RPCoreSTReceiveActionBuilder + RPInterval d = peer.intervals.iterator().next(); + if (peer.intervals.size() > 1) + { + throw new RuntimeException("[rp-core] TODO: " + a); + } + if (!d.isSingleton()) + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + a); + } Function makeCaseReceive = pt -> //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK: [] // N.B. *arg0 matches buildArgs "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(&tmp)"*/ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", 1, &arg0)" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", " + + rpapi.generateIndexExpr(d.start) + ", &arg0)" + "; err != nil {\n" //+ "log.Fatal(err)\n" //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index c9f335a2c..53d33b809 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -26,6 +26,30 @@ global protocol Proto1(role B) { //*/ +/* +global protocol Proto1(role A, role B) { + foreach B[I:1,K] { + Foo() from A[1] to B[2]; // OK? FIXME projection -- have to consider if 2 is inside 1,K? + //Foo() from A[I] to B[I]; // FIXME TODO + } +} +//*/ + + +/* +global protocol Proto1(role A, role B) { + choice at A[1] + { + Foo() from A[1] to B[1]; + } + or + { + Bar() from A[1] to B[2]; + } +} +//*/ + + /* global protocol Proto1(role A, role B) { From 8fedfadacae0d6775792ef86f040873c3fc2f4ae Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 1 Oct 2018 13:51:33 +0100 Subject: [PATCH 337/433] Fixed parameter collection bug in rp-core session API generation. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 4519ff4c0..7a3270ac3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -209,11 +209,7 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) throw new RuntimeException("[rp-core] Shouldn't get in here: ", e); } List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList());*/ - - List ivars = this.apigen.projections.get(rname).get(variant) - .getIndexVars().stream().sorted(IVAR_COMP) - .collect(Collectors.toList()); // N.B., params only from action subjects (not self) - ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) + List ivars = getParameters(variant); String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); // Endpoint Kind constructor -- makes index var value maps @@ -279,9 +275,8 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map } List ivars = coll.getIndexVars().stream().sorted().collect(Collectors.toList());*/ - List ivars = this.apigen.projections.get(rname).get(variant) - .getIndexVars().stream().sorted(IVAR_COMP).collect(Collectors.toList()); // N.B., params only from action subjects (not self) - ivars.addAll(variant.getIndexVars()); // Do variant params subsume projection params? (vice versa not true -- e.g., param needed to check self) + List ivars = getParameters(variant); + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); String epkindFile = epkindImports + "\n" @@ -510,6 +505,15 @@ public int compare(Entry o1, Entry o2) } } } + + private List getParameters(RPRoleVariant variant) + { + List ivars = this.apigen.projections.get(variant.getName()).get(variant) + .getIndexVars().stream().sorted(IVAR_COMP).collect(Collectors.toList()); // N.B., params only from action subjects (not self) + ivars.addAll(variant.getIndexVars().stream().filter(x -> !ivars.contains(x)) + .sorted(IVAR_COMP).collect(Collectors.toList())); // Do variant params subsume projection params? -- nope: often projections [self] and variant [K] + return ivars; + } // Returns path to use as offset to -d // -- cf. packpath, "absolute" Go import path (github.com/...) -- would coincide if protocol full name (i.e., module) used "github.com/..." From fe2f0965f557fa0c30d9b0d47697ca28e94b36a8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 6 Oct 2018 11:50:17 +0100 Subject: [PATCH 338/433] Relaxed rp-core nested foreach-var WF. Fixed endpoint-kind param name sorting. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 11 ++-- .../statetype3/RPCoreSTSessionApiBuilder.java | 6 +- .../src/test/scrib/param/tmp/ParamTest.scr | 62 +++++++++++++++++++ 3 files changed, 71 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index c3cfbbbd2..e9b14e540 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -271,16 +271,17 @@ public boolean isWellFormed(GoJob job, Stack> cont return true; } - public static boolean hasValidForeachVarIndex(Stack> context, RPIndexedRole xxx) + public static boolean hasValidForeachVarIndex(Stack> context, RPIndexedRole ir) { if (context.isEmpty()) { return false; } - Set curr = context.peek().keySet().stream().map(k -> k.toString()).collect(Collectors.toSet()); - RPInterval ival = xxx.intervals.iterator().next(); - return xxx.intervals.size() == 1 && ival.isSingleton() - && (ival.start instanceof RPIndexVar) && curr.contains(((RPIndexVar) ival.start).name); // N.B. RPIndexVar, not RPForeachVar (FIXME) + //Set curr = context.peek().keySet().stream().map(k -> k.toString()).collect(Collectors.toSet()); + Set all = context.stream().flatMap(m -> m.keySet().stream().map(k -> k.name)).collect(Collectors.toSet()); // FIXME: awkwardness of RPForeachVar and RPIndexVar + RPInterval ival = ir.intervals.iterator().next(); + return ir.intervals.size() == 1 && ival.isSingleton() + && (ival.start instanceof RPIndexVar) && all.contains(((RPIndexVar) ival.start).name); // N.B. RPIndexVar, not RPForeachVar (FIXME) } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 7a3270ac3..ec52ae529 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -509,10 +509,10 @@ public int compare(Entry o1, Entry o2) private List getParameters(RPRoleVariant variant) { List ivars = this.apigen.projections.get(variant.getName()).get(variant) - .getIndexVars().stream().sorted(IVAR_COMP).collect(Collectors.toList()); // N.B., params only from action subjects (not self) + .getIndexVars().stream().collect(Collectors.toList()); // N.B., params only from action subjects (not self) ivars.addAll(variant.getIndexVars().stream().filter(x -> !ivars.contains(x)) - .sorted(IVAR_COMP).collect(Collectors.toList())); // Do variant params subsume projection params? -- nope: often projections [self] and variant [K] - return ivars; + .collect(Collectors.toList())); // Do variant params subsume projection params? -- nope: often projections [self] and variant [K] + return ivars.stream().sorted(IVAR_COMP).collect(Collectors.toList()); } // Returns path to use as offset to -d diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 53d33b809..a8137447f 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,6 +8,68 @@ module param.tmp.ParamTest; + + + +global protocol Proto1(role A, role B) +{ + foreach A[I:1,KA] + { + foreach B[J:1,KB] + { + Foo() from A[I] to B[J]; + } + } +} + + + + +/* +sig "http.HeadReq" from "github.com/rhu1/scribble-go-examples/9_pget/http" as Head; +sig "http.GetReq" from "github.com/rhu1/scribble-go-examples/9_pget/http" as Get; +sig "http.Response" from "github.com/rhu1/scribble-go-examples/9_pget/http" as Res; + +sig "msg.Meta" from "github.com/rhu1/scribble-go-examples/9_pget/msg" as Meta; +sig "msg.Job" from "github.com/rhu1/scribble-go-examples/9_pget/msg" as Job; +sig "msg.Data" from "github.com/rhu1/scribble-go-examples/9_pget/msg" as Data; +sig "msg.Done" from "github.com/rhu1/scribble-go-examples/9_pget/msg" as Done; + +global protocol Proto1(role M, role F, role S) { + // Get metadata (size) + Head from F[1] to S[1]; + Res from S[1] to F[1]; + Meta from F[1] to M[1]; + + // Send jobs. + Job from M[1] to F[1,K]; + Get from F[1,K] to S[1]; + Res from S[1] to F[1,K]; + Data from F[1,K] to M[1]; + + Foo(Sync@A) from F[1,K] to M[1]; +} + +aux global protocol Sync(role A, role B) { + Done from A[1] to B[1]; +} +//*/ + + + +/* +global protocol Proto1(role A, role B) +{ + Foo(Proto1a@C) from A[1] to B[1]; +} + +aux global protocol Proto1a(role C, role D) +{ + Bar() from C[1] to D[1]; +} +//*/ + + /* global protocol Proto1(role B) { foreach B[I:2,K-1] { From 9da1f061be0fd3e956bd74e20a80cd043de8494c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 6 Oct 2018 13:51:58 +0100 Subject: [PATCH 339/433] Fixed rp-core API gen for empty-payload op messages. --- .../RPCoreSTReceiveActionBuilder.java | 28 +++++----- .../statetype3/RPCoreSTSendActionBuilder.java | 55 ++++++++++++------- .../src/test/scrib/param/tmp/ParamTest.scr | 4 +- 3 files changed, 53 insertions(+), 34 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index ab29c9b08..c273a0c37 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -95,6 +95,20 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat if (a.mid.isOp()) { + //if (!a.mid.toString().equals("")) // HACK FIXME? // Now redundant, -param-api checks mid starts uppercase + { + res += "var lab string\n" + + "if " + errorField + " = " + sEpRecv /*+ "[i]" + + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&lab" + ")" + + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_STRING + "()"*/ + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &lab)" + + "; " + errorField + " != nil {\n" + //+ "log.Fatal(err)\n" + //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + + rpapi.makeReturnSuccStateChan(succ) + "\n" + + "}\n"; + } + if (!a.payload.elems.isEmpty()) { if (a.payload.elems.size() > 1) @@ -102,20 +116,6 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat throw new RuntimeException("[rp-core] [-param-api] TODO: " + a); } - //if (!a.mid.toString().equals("")) // HACK FIXME? // Now redundant, -param-api checks mid starts uppercase - { - res += "var lab string\n" - + "if " + errorField + " = " + sEpRecv /*+ "[i]" - + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(" + "&lab" + ")" - + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_STRING + "()"*/ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &lab)" - + "; " + errorField + " != nil {\n" - //+ "log.Fatal(err)\n" - //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? - + rpapi.makeReturnSuccStateChan(succ) + "\n" - + "}\n"; - } - Function makeReceivePayType = pt -> //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(arg0))\n" : "") // HACK? for passthru? "if " + errorField + " = " + sEpRecv /*+ "[i]" // FIXME: use peer interval diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index e7e19ff91..923ab3be2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -108,30 +108,47 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } else*/ { - if (a.mid.isOp() && a.payload.elems.size() < 1) + /*if (a.mid.isOp() && a.payload.elems.size() < 1) { throw new RuntimeException("[rp-core] [param-api] TODO: " + a); + }*/ + if (a.mid.isOp()) + { + /*res += "if err := " + sEpWrite /*+ "[i]" + + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL + + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_INT + + "(" + "arg0[j])" // FIXME: hardcoded arg0* / + + "." + + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) + + "(\"" + r.getName() + "\", i, &arg0[j])" + + "; err != nil {\n" + + "log.Fatal(err)\n" + + "}\n";*/ + if (!a.payload.elems.isEmpty()) + { + if (a.payload.elems.size() > 1) + { + throw new RuntimeException("[rp-core] [param-api] TODO: " + a); + } + + res += errorField + " = " + + sEpWrite + + "." + + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) + + "(\"" + r.getName() + "\", i" + + IntStream.range(0, a.payload.elems.size()).mapToObj(i -> ", &arg" + i + "[j]").collect(Collectors.joining("")) + + ")\n"; + } } - if (a.payload.elems.size() > 1) + else //(a.mid.isMessageSigName) { - throw new RuntimeException("[rp-core] [param-api] TODO: " + a); + // FIXME: factor out with above + res += errorField + " = " + + sEpWrite + + "." + + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) + + "(\"" + r.getName() + "\", i, &arg0[0])\n"; } - - /*res += "if err := " + sEpWrite /*+ "[i]" - + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_WRITEALL - + RPCoreSTApiGenConstants.GO_FORMATTER_ENCODE_INT - + "(" + "arg0[j])" // FIXME: hardcoded arg0* / - + "." - + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) - + "(\"" + r.getName() + "\", i, &arg0[j])" - + "; err != nil {\n" - + "log.Fatal(err)\n" - + "}\n";*/ - res += errorField + " = " - + sEpWrite - + "." - + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) - + "(\"" + r.getName() + "\", i, &arg0[j])\n"; } res += "}\n"; diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index a8137447f..a16796e21 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -11,6 +11,7 @@ module param.tmp.ParamTest; +/* global protocol Proto1(role A, role B) { foreach A[I:1,KA] @@ -21,11 +22,12 @@ global protocol Proto1(role A, role B) } } } +//*/ -/* +//* sig "http.HeadReq" from "github.com/rhu1/scribble-go-examples/9_pget/http" as Head; sig "http.GetReq" from "github.com/rhu1/scribble-go-examples/9_pget/http" as Get; sig "http.Response" from "github.com/rhu1/scribble-go-examples/9_pget/http" as Res; From a931c4c690a11cb7bb9129a77f99651868bdfdff Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 6 Oct 2018 14:50:08 +0100 Subject: [PATCH 340/433] Minor. --- .../core/codegen/statetype3/RPCoreSTBranchActionBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index c7c2c8ddc..62d97a154 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -101,7 +101,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(" + "&lab" + ")"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", " - + rpapi.generateIndexExpr(d.start) + ", &lab" + ")" + + rpapi.generateIndexExpr(d.start) + ", &lab" + ")" // peer must have singleton interval + "; err != nil {\n" //+ "log.Fatal(err)\n" //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? @@ -128,7 +128,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + "." //+ RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(" + "&msg" + ")"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_MRECV + "(\"" + peer.getName() + "\", " - + rpapi.generateIndexExpr(d.start) + ", &msg" + ")" + + rpapi.generateIndexExpr(d.start) + ", &msg" + ")" // peer must have singleton interval + "; err != nil {\n" //+ "log.Fatal(err)\n" + "panic(err)\n" // FIXME: which case object to return for error? make "default" error case object? From b961b6cd58817613e1f9eb31f25141bb514b6e79 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 6 Oct 2018 16:31:30 +0100 Subject: [PATCH 341/433] Fixed rp-core API gen empty-body (cont) foreach projection bug. --- .../org/scribble/ext/go/core/ast/global/RPCoreGForeach.java | 2 +- .../java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 35a610e4a..5fa12c5db 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -138,7 +138,7 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor else { RPCoreLType body = this.body.project(af, subj); - if (body instanceof RPCoreLEnd) + if (body instanceof RPCoreLCont) // Cf. project2, ivals.isEmpty case { return seq; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 3bb2caaaf..37ac818bc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -468,6 +468,7 @@ private Set, Set>> getFamilies(GoJob job) { smt2 += "(exists (" + vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" ")) + ")\n"; // FIXME: factor up -- and factor out with getVariants smt2 += "(and\n"; + smt2 += vars.stream().map(x -> "(>= " + x + " 1)").collect(Collectors.joining(" ")) + "\n"; // FIXME: generalise, parameter domain annotations } smt2 += "(and " + cand.stream() .map(v -> makePhiSmt2(v.intervals, v.cointervals)).collect(Collectors.joining(" ")) + ")\n"; From 284576936a36e1e9b30da9e6c84f26c4a1f804b1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 6 Oct 2018 17:19:59 +0100 Subject: [PATCH 342/433] Minor. --- .../src/test/scrib/param/tmp/ParamTest.scr | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index a16796e21..95d18ad72 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -9,6 +9,45 @@ module param.tmp.ParamTest; +//* +global protocol Proto1(role F, role S, role M) +{ + Head() from F[1] to S[1]; + Res() from S[1] to F[1]; + Meta() from F[1] to M[1]; + + Job() from M[1] to F[1,K]; + // Send jobs. + foreach F[I:1,K] + { + Get() from F[I] to S[1]; + Res() from S[1] to F[I]; + } + Data() from F[1,K] to M[1]; + } +//*/ + +/*Projection onto S{[1]}: mu param_tmp_ParamTest_Proto1___F__S__M_.F[1]?Head().F[1]!Res().foreach {F}{I:1..K} do F[I]?Get().F[I]!Res().cont ; end + +[rp-core] Built endpoint graph for S{[1]}: +digraph G { +compound = true; +"14" [ label="14: " ]; +"14" -> "16" [ label="F[1]?Head()" ]; +"16" [ label="16: " ]; +"16" -> "17" [ label="F[1]!Res()" ]; +"17" [ label="17: I:[1,K]; 10" ]; +} + +digraph G { +compound = true; +"10" [ label="10: " ]; +"10" -> "12" [ label="F[I]?Get()" ]; +"12" [ label="12: " ]; +"12" -> "13" [ label="F[I]!Res()" ]; +"13" [ label="13: " ]; +}*/ + /* @@ -27,7 +66,7 @@ global protocol Proto1(role A, role B) -//* +/* sig "http.HeadReq" from "github.com/rhu1/scribble-go-examples/9_pget/http" as Head; sig "http.GetReq" from "github.com/rhu1/scribble-go-examples/9_pget/http" as Get; sig "http.Response" from "github.com/rhu1/scribble-go-examples/9_pget/http" as Res; From 2c8a92dc1c0af9a4573bb3297ffc016649ecb762 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 6 Oct 2018 20:34:28 +0100 Subject: [PATCH 343/433] Fixed rp-core dial/accept API gen bugs. --- .../ext/go/core/cli/RPCoreCommandLine.java | 52 ++++++++++++++----- .../statetype3/RPCoreSTSessionApiBuilder.java | 4 +- .../src/test/scrib/param/tmp/ParamTest.scr | 7 ++- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 37ac818bc..7bb4ee399 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -39,6 +39,7 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPIndexSelf; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.ext.go.util.RecursiveFunctionalInterface; import org.scribble.ext.go.util.Z3Wrapper; @@ -286,7 +287,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws for (RPRoleVariant variant : this.L0.get(r).keySet()) { - System.out.println("\nProjection onto " + variant + ": " + this.L0.get(r).get(variant)); + //System.out.println("\nProjection onto " + variant + ": " + this.L0.get(r).get(variant)); EGraph g = builder.build(this.L0.get(r).get(variant)); //Map, EGraph> tmp = this.E0.get(r); @@ -357,7 +358,8 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws //..HERE FIXME ActualParam -- ParamRange is now already a Set - // Compute variant peers of each variant -- for "common" endpoint kind factoring (w.r.t. dial/accept -- i.e., looking for variants whose set of dial/accept methods is the same for all families it is involved in) + // Compute variant peers of each variant -- which peer variants (possibly self variant) can match the indexed-role peers of self's I/O actions + // for "common" endpoint kind factoring (w.r.t. dial/accept, i.e., to look for variants whose set of dial/accept methods is the same for all families it is involved in) private Map> getPeers(GoJob job) { job.debugPrintln("\n[rp-core] Computing peers:"); @@ -375,24 +377,25 @@ private Map> getPeers(GoJob job) this.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial {*/ // CHECKME: use local types instead of FSMs? (RPCoreGForeach#getIndexedRoles) - Set irs = //MState.getReachableActions + Set actionIRs = //MState.getReachableActions RPCoreEState.getReachableActions((RPCoreEModelFactory) job.ef, (RPCoreEState) this.E0.get(rname).get(self).init).stream() // FIXME: static "overloading" (cf. MState) error prone .map(a -> ((RPCoreEAction) a).getPeer()).collect(Collectors.toSet()); // CHECKME: in presence of foreach, actions will include unqualified foreachvars -- is that what the following Z3 assertion is/should be doing? Set peers = new HashSet<>(); - next: for (RPRoleVariant peer : (Iterable) // Candidate + next: for (RPRoleVariant peerVariant : (Iterable) // Candidate this.E0.values().stream() .flatMap(m -> m.keySet().stream())::iterator) { - if (!peer.equals(self) && !peers.contains(peer)) + if (//!peerVariant.equals(self) && // No: e.g., pipe/ring middlemen + !peers.contains(peerVariant)) { - job.debugPrintln("\n[rp-core] For " + self + ", checking potential peer: " + peer); + job.debugPrintln("\n[rp-core] For " + self + ", checking potential peer: " + peerVariant); // "checking potential peer" means checking if any of our action-peer indexed roles fits the candidate variant-peer (so we would need a dial/accept for them) - for (RPIndexedRole ir : irs) + for (RPIndexedRole ir : actionIRs) { - if (ir.getName().equals(peer.getName())) + if (ir.getName().equals(peerVariant.getName())) { if (ir.intervals.size() > 1) { @@ -400,7 +403,7 @@ private Map> getPeers(GoJob job) } RPInterval d = ir.intervals.stream().findAny().get(); - Set vars = Stream.concat(peer.intervals.stream().flatMap(x -> x.getIndexVars().stream()), peer.cointervals.stream().flatMap(x -> x.getIndexVars().stream())) + Set vars = Stream.concat(peerVariant.intervals.stream().flatMap(x -> x.getIndexVars().stream()), peerVariant.cointervals.stream().flatMap(x -> x.getIndexVars().stream())) .collect(Collectors.toSet()); vars.addAll(ir.getIndexVars()); @@ -409,26 +412,47 @@ private Map> getPeers(GoJob job) + (vars.isEmpty() ? "" : vars.stream() .map(x -> "(" + x + " Int)").collect(Collectors.joining(" "))) + ")\n"; smt2 += "(and \n"; - smt2 += peer.intervals.stream() + smt2 += vars.stream().map(x -> "(>= " + x + " 1)").collect(Collectors.joining(" ")) + "\n"; // FIXME: generalise, parameter domain annotations + + smt2 += peerVariant.intervals.stream() .map(x -> "(>= peer " + x.start.toSmt2Formula() + ") (<= peer " + x.end.toSmt2Formula() + ")") + // Is there a peer index inside all the peer-variant intervals .collect(Collectors.joining(" ")) + "\n"; - smt2 += peer.cointervals.isEmpty() + smt2 += peerVariant.cointervals.isEmpty() ? "" - : "(or " + peer.cointervals.stream() + : "(or " + peerVariant.cointervals.stream() .map(x -> "(< peer " + x.start.toSmt2Formula() + ") (> peer " + x.end.toSmt2Formula() + ")") .collect(Collectors.joining(" ")) + ")\n"; + // ...and the peer index is outside one of the peer-variant cointervals smt2 += "(>= peer " + d.start.toSmt2Formula() + ") (<= peer " + d.end.toSmt2Formula() + ")\n"; + // ...and the peer index is inside our I/O action interval -- then this is peer-variant is a peer + + if (vars.contains(RPIndexSelf.SELF)) + { + // FIXME: factor variant/covariant inclusion/exclusion + smt2 += self.intervals.stream() + .map(x -> "(>= self " + x.start.toSmt2Formula() + ") (<= self " + x.end.toSmt2Formula() + ")") + // Is there a self index inside all the self-variant intervals + .collect(Collectors.joining(" ")) + "\n"; + smt2 += self.cointervals.isEmpty() + ? "" + : "(or " + self.cointervals.stream() + .map(x -> "(< self " + x.start.toSmt2Formula() + ") (> self " + x.end.toSmt2Formula() + ")") + .collect(Collectors.joining(" ")) + ")\n"; + // ...and the peer index is outside one of the peer-variant cointervals + } + smt2 += ")"; smt2 += ")"; smt2 += ")"; - job.debugPrintln("[rp-core] Running Z3 on:\n" + smt2); + job.debugPrintln("[rp-core] Running Z3 on " + d + " :\n" + smt2); boolean isSat = Z3Wrapper.checkSat(job, this.gpd, smt2); job.debugPrintln("[rp-core] Checked sat: " + isSat); if (isSat) { - peers.add(peer); + peers.add(peerVariant); continue next; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index ec52ae529..f28fabf1d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -404,9 +404,11 @@ public int compare(Entry o1, Entry o2) /*for (RPRoleVariant v : (Iterable) this.apigen.variants.values().stream() .flatMap(m -> m.keySet().stream())::iterator)*/ + for (RPRoleVariant v : this.apigen.peers.get(variant)) { - if (!v.equals(variant) && family.left.contains(v)) // FIXME: endpoint families -- and id value checks + if (//!v.equals(variant) && // No: e.g., pipe/ring middlemen + family.left.contains(v)) // FIXME: endpoint families -- and id value checks { // Accept/Dial methods String r = v.getLastElement(); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 95d18ad72..d21d70dfa 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,8 +8,13 @@ module param.tmp.ParamTest; +global protocol Proto1(role A, role B) +{ + Foo() from A[1] to B[1,K]; +} -//* + +/* global protocol Proto1(role F, role S, role M) { Head() from F[1] to S[1]; From d2d3fe0f63280ccd098fed9324fcba9591e0f23e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 6 Oct 2018 23:25:34 +0100 Subject: [PATCH 344/433] Added rp-core interval/variant/indexexpr "reduction". --- .../ext/go/core/ast/global/RPCoreGType.java | 2 +- .../ext/go/core/ast/local/RPCoreLCont.java | 7 +++ .../go/core/ast/local/RPCoreLCrossChoice.java | 25 ++++++++++ .../go/core/ast/local/RPCoreLDotChoice.java | 7 +++ .../ext/go/core/ast/local/RPCoreLEnd.java | 7 +++ .../ext/go/core/ast/local/RPCoreLForeach.java | 23 +++++++++ .../core/ast/local/RPCoreLMultiChoices.java | 7 +++ .../ext/go/core/ast/local/RPCoreLRec.java | 7 +++ .../ext/go/core/ast/local/RPCoreLRecVar.java | 7 +++ .../ext/go/core/ast/local/RPCoreLType.java | 5 ++ .../ext/go/core/cli/RPCoreCommandLine.java | 10 +++- .../statetype3/RPCoreSTApiGenerator.java | 12 +++-- .../ext/go/core/type/RPAnnotatedInterval.java | 6 +++ .../ext/go/core/type/RPIndexedRole.java | 13 +++++ .../scribble/ext/go/core/type/RPInterval.java | 6 +++ .../ext/go/core/type/RPRoleVariant.java | 22 +++++++++ .../ext/go/type/index/RPBinIndexExpr.java | 49 +++++++++++++++++++ .../ext/go/type/index/RPIndexExpr.java | 2 + .../ext/go/type/index/RPIndexInt.java | 6 +++ .../ext/go/type/index/RPIndexSelf.java | 8 +++ .../ext/go/type/index/RPIndexVar.java | 6 +++ 21 files changed, 232 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java index b7bc38c10..74b36e4e4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java @@ -25,7 +25,7 @@ public interface RPCoreGType extends RPCoreType // context records nested foreach vars -- only accesses to top-level vars are valid boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd); - // FIXME: clarify, Role subj is used as "role name" + // TODO: clarify, Role subj is used as "role name" //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException; // G proj r \vec{D} RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ivals, RPIndexedRole subj) throws RPCoreSyntaxException; // G proj R \vec{C} r[z] diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCont.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCont.java index d0dd4a6fb..044bcf754 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCont.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCont.java @@ -6,6 +6,7 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreCont; import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; @@ -18,6 +19,12 @@ private RPCoreLCont() { } + + @Override + public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) + { + return this; + } @Override public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java index 2e4fbec4f..76ecca712 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java @@ -7,10 +7,14 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.Message; import org.scribble.type.kind.Local; +// FIXME: rename public class RPCoreLCrossChoice extends RPCoreLChoice { //public RPCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHashMap cases) @@ -22,6 +26,27 @@ public RPCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHash throw new RuntimeException("[param-core] Shouldn't get in here: " + kind); } } + + @Override + public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) + { + // FIXME: factor out with RPCoreLForeach + int self = -1000; + RPRoleVariant msubj = subj.minimise(self); + if (msubj.isSingleton()) + { + RPInterval ival = msubj.intervals.iterator().next(); + if (ival.start instanceof RPIndexInt) + { + self = ((RPIndexInt) ival.start).val; + } + } + + RPIndexedRole mrole = this.role.minimise(self); + LinkedHashMap tmp = new LinkedHashMap<>(); + this.cases.forEach((k, v) -> tmp.put(k, v.minimise(af, subj))); + return af.ParamCoreLCrossChoice(mrole, getKind(), tmp); + } @Override public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java index 38f138c3b..9c48e74f2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLDotChoice.java @@ -7,6 +7,7 @@ import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.Message; @@ -28,6 +29,12 @@ public RPCoreLDotChoice(RPIndexedRole role, RPIndexExpr offset, RPCoreLActionKin this.offset = offset; } + @Override + public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + this); + } + @Override public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java index 1c9628bae..35a298953 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLEnd.java @@ -6,6 +6,7 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreEnd; import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; @@ -18,6 +19,12 @@ private RPCoreLEnd() { } + + @Override + public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) + { + return this; + } @Override public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java index cbfc114ea..c6542f74d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java @@ -8,6 +8,9 @@ import org.scribble.ext.go.core.ast.RPCoreForeach; import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.type.RPAnnotatedInterval; +import org.scribble.ext.go.core.type.RPInterval; +import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; import org.scribble.type.name.Role; @@ -22,6 +25,26 @@ public RPCoreLForeach(//Role role, RPForeachVar param, RPIndexExpr start, RPInde roles, ivals, body, cont); } + + @Override + public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) + { + // FIXME: factor out with RPCoreLChoice + int self = -1000; + RPRoleVariant msubj = subj.minimise(self); + if (msubj.isSingleton()) + { + RPInterval ival = msubj.intervals.iterator().next(); + if (ival.start instanceof RPIndexInt) + { + self = ((RPIndexInt) ival.start).val; + } + } + + int y = self; + Set tmp = this.ivals.stream().map(x -> (RPAnnotatedInterval) x.minimise(y)).collect(Collectors.toSet()); + return af.RPCoreLForeach(this.roles, tmp, this.body.minimise(af, subj), this.seq.minimise(af, subj)); + } @Override public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java index fd04c8d86..ad08cfd1b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLMultiChoices.java @@ -8,6 +8,7 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.type.RPIndexedRole; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.Message; import org.scribble.type.kind.Local; @@ -27,6 +28,12 @@ public RPCoreLMultiChoices(RPIndexedRole role, RPIndexVar var, //List old, RPCoreType neu) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java index 8d4a95953..158f0bf20 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRec.java @@ -5,6 +5,7 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreRec; import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; @@ -16,6 +17,12 @@ public RPCoreLRec(RecVar recvar, RPCoreLType body) //super(recvar, annot, init, body); super(recvar, body); } + + @Override + public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) + { + return af.ParamCoreLRec(this.recvar, this.body.minimise(af, subj)); + } @Override public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java index c509b9c02..17bbc6f55 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLRecVar.java @@ -6,6 +6,7 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreRecVar; import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; import org.scribble.type.name.RecVar; @@ -17,6 +18,12 @@ public RPCoreLRecVar(RecVar var) { super(var); } + + @Override + public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) + { + return this; + } @Override public RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java index 530449465..3446cb638 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java @@ -4,6 +4,7 @@ import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreType; +import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.type.kind.Local; @@ -14,4 +15,8 @@ public interface RPCoreLType extends RPCoreType @Override RPCoreLType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType neu); + + // N.B. subj not necessarily minimised + // TODO: rename + RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 7bb4ee399..046e0b74b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -70,6 +70,8 @@ public class RPCoreCommandLine extends CommandLine private Set, Set>> families; private Map> peers; + private Map aliases; + public RPCoreCommandLine(String... args) throws CommandLineException { this(new RPCoreCLArgParser(args)); @@ -173,8 +175,10 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co outputClasses(goClasses);*/ } + this.aliases = Collections.emptyMap(); // FIXME: + Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, - this.L0, this.E0, this.families, this.peers, impath, roles).build(); + this.L0, this.E0, this.families, this.peers, this.aliases, impath, roles).build(); outputClasses(goClasses); } else @@ -266,6 +270,10 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws { //ParamCoreLType lt = gt.project(af, r, ranges); RPCoreLType lt = gt.project(af, variant); + + System.out.println("AAA: " + variant + " ,, " + lt + "\n" + lt.minimise(af, variant) + "\n"); + lt = lt.minimise(af, variant); + //Map, ParamCoreLType> tmp = P0.get(r); Map tmp = L0.get(r); if (tmp == null) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index ff95e4d11..fbda6242a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -43,6 +43,8 @@ public class RPCoreSTApiGenerator public final Map, Set>, Integer> families; // int is arbitrary familiy id public final Map> peers; // For "common" endpoint kind factoring + public final Map aliases; + public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module //public final Role self; @@ -53,6 +55,7 @@ public class RPCoreSTApiGenerator public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> projections, Map> variants, Set, Set>> families, Map> peers, + Map aliases, String packpath, //Role self) List selfs) { @@ -119,6 +122,8 @@ public int compare(Pair, Set> f1, Pair e.getKey(), e -> Collections.unmodifiableSet(e.getValue()) ))); + + this.aliases = Collections.unmodifiableMap(aliases); } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later @@ -290,11 +295,12 @@ public boolean isCommonEndpointKind(RPRoleVariant variant) //boolean isCommonEndpointKind = this.apigen.peers.get(variant).size() == 1; // CHECKME: why 1, should it be generalised? // CHECKME: peers doesn't consider families -- should isCommonEndpointKind be determined from families? - boolean isCommonEndpointKind = this.families.keySet().stream().filter(p -> p.left.contains(variant)) + /*boolean isCommonEndpointKind = this.families.keySet().stream().filter(p -> p.left.contains(variant)) // Would also be reasonable to require variant to be in every family -- but not necessary since a distributed projection is only for the families that the variant is involved in .allMatch(p -> p.left.containsAll(this.peers.get(variant))); - return isCommonEndpointKind; - + return isCommonEndpointKind;*/ + return this.families.size() == 1; // Now essentially disabled, to make "variant equivalence" easier + /*// "Syntactically" determining common endpoint kinds difficult because concrete peers depends on param (and foreachvar) values, e.g., M in PGet w.r.t. #F // Also, family factoring is more about dial/accept isCommonEndpointKind = true; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPAnnotatedInterval.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPAnnotatedInterval.java index 7a7eb2269..0f0453f5f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPAnnotatedInterval.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPAnnotatedInterval.java @@ -13,6 +13,12 @@ public RPAnnotatedInterval(RPForeachVar var, RPIndexExpr start, RPIndexExpr end) this.var = var; } + @Override + public RPInterval minimise(int self) + { + return new RPAnnotatedInterval(var, this.start.minimise(self), this.end.minimise(self)); + } + @Override public String toString() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java index 63751c092..db199a98c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.core.type; import java.util.Collections; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -33,6 +34,18 @@ public RPIndexedRole(String name, Set intervals) this.intervals = Collections.unmodifiableSet(intervals); } + // FIXME: rename + public RPIndexedRole minimise(int self) + { + Set ivals = this.intervals.stream().map(x -> x.minimise(self)).collect(Collectors.toSet()); + Optional o = ivals.stream().filter(x -> x.isSingleton()).findFirst(); + if (o.isPresent()) // FIXME: more general interval "merge"? + { + ivals = Stream.of(o.get()).collect(Collectors.toSet()); + } + return new RPIndexedRole(this.getLastElement(), ivals); + } + // FIXME: currently just a syntactic singleton check on a single interval -- false negatives possible in general case (multiple intervals) public boolean isSingleton() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java index ef540247f..94923e367 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java @@ -22,6 +22,12 @@ public RPInterval(RPIndexExpr start, RPIndexExpr end) this.end = end; } + // FIXME: rename + public RPInterval minimise(int self) + { + return new RPInterval(this.start.minimise(self), this.end.minimise(self)); + } + //public Set getActualParams() // Hack public Set getIndexVars() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java index 62052d490..2b9b6c08d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPRoleVariant.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.core.type; import java.util.Collections; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -22,6 +23,27 @@ public RPRoleVariant(String name, Set ranges, Set corang this.cointervals = Collections.unmodifiableSet(coranges); } + // self is irrelevant -- variants don't contain self + @Override + public RPRoleVariant minimise(int self) + { + Set ivals = this.intervals.stream().map(x -> x.minimise(self)).collect(Collectors.toSet()); + Optional o = ivals.stream().filter(x -> x.isSingleton()).findFirst(); + if (o.isPresent()) // FIXME: more general interval "merge"? + { + ivals = Stream.of(o.get()).collect(Collectors.toSet()); + return new RPRoleVariant(this.getLastElement(), ivals, Collections.emptySet()); + } + Set coivals = this.cointervals.stream().map(x -> x.minimise(self)).collect(Collectors.toSet()); + return new RPRoleVariant(this.getLastElement(), ivals, coivals); + } + + /*@Override + public boolean isSingleton() + { + return super.isSingleton(); + }*/ + @Override public Set getIndexVars() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java index a63b02ae5..3a2e3aa67 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java @@ -36,6 +36,55 @@ protected RPBinIndexExpr(Op op, RPIndexExpr left, RPIndexExpr right) this.right = right; this.op = op; } + + @Override + public RPIndexExpr minimise(int self) + { + // FIXME: consider associativity for "maximal" reduction (or normal forms) + RPIndexExpr left = this.left.minimise(self); + RPIndexExpr right = this.right.minimise(self); + if (right instanceof RPIndexInt) + { + int y = ((RPIndexInt) right).val; + if (left instanceof RPIndexInt) + { + int x = ((RPIndexInt) left).val; + switch (this.op) + { + case Add: return RPIndexFactory.ParamIntVal(x + y); + case Mult: return RPIndexFactory.ParamIntVal(x * y); + case Subt: return RPIndexFactory.ParamIntVal(x - y); + default: throw new RuntimeException("Shouldn't get in here: " + this); + } + } + else + { + if (y < 0) + { + if (this.op == Op.Add) + { + return RPIndexFactory.ParamBinIndexExpr(Op.Subt, left, RPIndexFactory.ParamIntVal(-y)); + } + else if (this.op == Op.Subt) + { + return RPIndexFactory.ParamBinIndexExpr(Op.Add, left, RPIndexFactory.ParamIntVal(-y)); + } + } + } + } + else + { + if (left instanceof RPIndexInt) + { + int x = ((RPIndexInt) left).val; + if (x < 0 && this.op == Op.Add) + { + return RPIndexFactory.ParamBinIndexExpr(Op.Subt, right, RPIndexFactory.ParamIntVal(-x)); + } + } + } + return RPIndexFactory.ParamBinIndexExpr(this.op, left, right); + } @Override public String toGoString() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java index 4b7ef14dc..68c6e356c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java @@ -9,6 +9,8 @@ public boolean isConstant() return false; } + public abstract RPIndexExpr minimise(int self); + public abstract String toGoString(); // As basic Go expressions, but not (necessarily) actual code generation "ouput" public abstract Set getVars(); // Doesn't include foreach params diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java index 6d64e5e25..d8bbab639 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java @@ -13,6 +13,12 @@ protected RPIndexInt(int i) this.val = i; } + @Override + public RPIndexExpr minimise(int self) + { + return this; + } + @Override public boolean isConstant() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java index 8a4c97038..d6347a0cf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexSelf.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.type.index; +// Does not occur in RPRoleVariant, only RPIndexedRole public class RPIndexSelf extends RPIndexVar { public static final RPIndexSelf SELF = new RPIndexSelf(); @@ -8,6 +9,13 @@ private RPIndexSelf() { super("self"); } + + @Override + public RPIndexExpr minimise(int self) + { + // FIXME: factor out constant + return (self < 1) ? this : RPIndexFactory.ParamIntVal(self); + } @Override public String toString() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java index d2e9aaeec..2eae87017 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java @@ -12,6 +12,12 @@ protected RPIndexVar(String name) { this.name = name; } + + @Override + public RPIndexExpr minimise(int self) + { + return this; + } /*public RPRoleParam toRoleParam() { From 7406070349a3dbd058eb67d0c42b45b0c3990723 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Oct 2018 09:58:13 +0100 Subject: [PATCH 345/433] Refactored rp-core family/peer computation. --- .../go/core/ast/global/RPCoreGForeach.java | 1 - .../go/core/ast/local/RPCoreLCrossChoice.java | 6 +- .../ext/go/core/ast/local/RPCoreLForeach.java | 6 +- .../ext/go/core/ast/local/RPCoreLType.java | 2 +- .../ext/go/core/cli/RPCoreCommandLine.java | 97 +++++++++++++++++-- .../statetype3/RPCoreSTApiGenerator.java | 7 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 17 +++- .../ext/go/core/type/RPIndexedRole.java | 5 +- 8 files changed, 115 insertions(+), 26 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 5fa12c5db..daa2c606d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -14,7 +14,6 @@ import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.RPCoreType; import org.scribble.ext.go.core.ast.local.RPCoreLCont; -import org.scribble.ext.go.core.ast.local.RPCoreLEnd; import org.scribble.ext.go.core.ast.local.RPCoreLType; import org.scribble.ext.go.core.type.RPAnnotatedInterval; import org.scribble.ext.go.core.type.RPIndexedRole; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java index 76ecca712..08da2f855 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLCrossChoice.java @@ -28,11 +28,11 @@ public RPCoreLCrossChoice(RPIndexedRole role, RPCoreLActionKind kind, LinkedHash } @Override - public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) + public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant vself) { // FIXME: factor out with RPCoreLForeach int self = -1000; - RPRoleVariant msubj = subj.minimise(self); + RPRoleVariant msubj = vself.minimise(self); if (msubj.isSingleton()) { RPInterval ival = msubj.intervals.iterator().next(); @@ -44,7 +44,7 @@ public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) RPIndexedRole mrole = this.role.minimise(self); LinkedHashMap tmp = new LinkedHashMap<>(); - this.cases.forEach((k, v) -> tmp.put(k, v.minimise(af, subj))); + this.cases.forEach((k, v) -> tmp.put(k, v.minimise(af, vself))); return af.ParamCoreLCrossChoice(mrole, getKind(), tmp); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java index c6542f74d..d152388b0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLForeach.java @@ -27,11 +27,11 @@ public RPCoreLForeach(//Role role, RPForeachVar param, RPIndexExpr start, RPInde } @Override - public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) + public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant vself) { // FIXME: factor out with RPCoreLChoice int self = -1000; - RPRoleVariant msubj = subj.minimise(self); + RPRoleVariant msubj = vself.minimise(self); if (msubj.isSingleton()) { RPInterval ival = msubj.intervals.iterator().next(); @@ -43,7 +43,7 @@ public RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj) int y = self; Set tmp = this.ivals.stream().map(x -> (RPAnnotatedInterval) x.minimise(y)).collect(Collectors.toSet()); - return af.RPCoreLForeach(this.roles, tmp, this.body.minimise(af, subj), this.seq.minimise(af, subj)); + return af.RPCoreLForeach(this.roles, tmp, this.body.minimise(af, vself), this.seq.minimise(af, vself)); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java index 3446cb638..5a1701cde 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/local/RPCoreLType.java @@ -18,5 +18,5 @@ public interface RPCoreLType extends RPCoreType // N.B. subj not necessarily minimised // TODO: rename - RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant subj); + RPCoreLType minimise(RPCoreAstFactory af, RPRoleVariant vself); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 046e0b74b..f6290bf54 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -3,6 +3,7 @@ import java.nio.file.Path; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -67,8 +68,8 @@ public class RPCoreCommandLine extends CommandLine private Map> L0; private Map> E0; //protected ParamCoreSModel model; - private Set, Set>> families; - private Map> peers; + private Set, Set>> families; // Factor out Family (cf. RPRoleVariant) + private Map, Set>, Set>> peers; private Map aliases; @@ -271,7 +272,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws //ParamCoreLType lt = gt.project(af, r, ranges); RPCoreLType lt = gt.project(af, variant); - System.out.println("AAA: " + variant + " ,, " + lt + "\n" + lt.minimise(af, variant) + "\n"); + //System.out.println("AAA: " + variant + " ,, " + lt + "\n" + lt.minimise(af, variant) + "\n"); lt = lt.minimise(af, variant); //Map, ParamCoreLType> tmp = P0.get(r); @@ -357,8 +358,74 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws this.families = new HashSet<>(); this.families.addAll(getFamilies(job)); + + minimise(); + this.peers = new HashMap<>(); this.peers.putAll(getPeers(job)); + + } + + private void minimise() + { + //Map> L0 = + //Map> E0; + /*Set, Set>> families + = this.families.stream().map( + p -> new Pair, Set>(new HashSet<>(p.left), new HashSet<>(p.right)) + ).collect(Collectors.toSet());*/ + + /*Map, Set>, Set>> peers + = + this.peers.entrySet().stream().collect(Collectors.toMap( + e -> e.getKey(), + e -> e.getValue().entrySet().stream().collect(Collectors.toMap( + ee -> ee.getKey(), + ee -> new HashSet<>(ee.getValue()) + )) + ));*/ + RPCoreAstFactory af = new RPCoreAstFactory(); + + Set, Set>> families = new HashSet<>(); + //Map, Set>, Set>> peers = new HashMap<>(); + for (Pair, Set> fam : this.families) + { + Set tmp = new HashSet<>(); + Set vs = fam.left; + Next: for (RPRoleVariant v : vs) + { + if (!v.isSingleton()) + { + tmp.add(v); + } + else + { + for (RPRoleVariant u : vs) + { + if (!u.equals(v)) + { + RPCoreLType vL = this.L0.get(v.getName()).get(v); + RPCoreLType uL = this.L0.get(u.getName()).get(u); + + //System.out.println("4444: " + v + " \n " + vL + " ,, " + vL.minimise(af, v) + " \n " + u + " ,, " + uL + " ,, " + uL.minimise(af, v) + "\n"); + if (vL.minimise(af, v).equals(uL.minimise(af, v))) + { + //System.out.println("5555: " + v + " subsumed by " + u); + continue Next; + } + } + } + tmp.add(v); + } + } + + families.add(new Pair<>(tmp, fam.right)); // Subsumed variants are neither in left nor right + + System.out.println("\n8888:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + "\n\n" + + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n"))); + } + + //this.families = families; } // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? @@ -368,11 +435,12 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws // Compute variant peers of each variant -- which peer variants (possibly self variant) can match the indexed-role peers of self's I/O actions // for "common" endpoint kind factoring (w.r.t. dial/accept, i.e., to look for variants whose set of dial/accept methods is the same for all families it is involved in) - private Map> getPeers(GoJob job) + // FIXME: optimise, peers are symmetric + private Map, Set>, Set>> getPeers(GoJob job) { job.debugPrintln("\n[rp-core] Computing peers:"); - Map> map = new HashMap<>(); + Map, Set>, Set>> res = new HashMap<>(); /*String[] args = this.rpArgs.get(RPCoreCLArgFlag.RPCORE_API_GEN); for (Role rname : (Iterable) Arrays.asList(args).stream().map(r -> new Role(r))::iterator)*/ @@ -437,7 +505,7 @@ private Map> getPeers(GoJob job) if (vars.contains(RPIndexSelf.SELF)) { - // FIXME: factor variant/covariant inclusion/exclusion + // FIXME: factor out variant/covariant inclusion/exclusion with above smt2 += self.intervals.stream() .map(x -> "(>= self " + x.start.toSmt2Formula() + ") (<= self " + x.end.toSmt2Formula() + ")") // Is there a self index inside all the self-variant intervals @@ -467,11 +535,24 @@ private Map> getPeers(GoJob job) } } } - map.put(self, peers); + + Map, Set>, Set> tmp = new HashMap<>(); + res.put(self, tmp); + for (Pair, Set> fam : this.families) + { + if (fam.left.contains(self)) + { + Set tmp2 = new HashSet<>(peers); + tmp2.retainAll(fam.left); + tmp.put(fam, tmp2); + } + } //} + } } - return map; + + return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index fbda6242a..91fac4b84 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -41,7 +41,8 @@ public class RPCoreSTApiGenerator public final Map> variants; //public final Map, Set>>> families; public final Map, Set>, Integer> families; // int is arbitrary familiy id - public final Map> peers; // For "common" endpoint kind factoring + public final Map, Set>, Set>> peers; + // For "common" endpoint kind factoring (dial/accept methods) public final Map aliases; @@ -54,7 +55,7 @@ public class RPCoreSTApiGenerator public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> projections, Map> variants, Set, Set>> families, - Map> peers, + Map, Set>, Set>> peers, Map aliases, String packpath, //Role self) List selfs) @@ -120,7 +121,7 @@ public int compare(Pair, Set> f1, Pair e.getKey(), - e -> Collections.unmodifiableSet(e.getValue()) + e -> Collections.unmodifiableMap(e.getValue()) ))); this.aliases = Collections.unmodifiableMap(aliases); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index f28fabf1d..acfe640c3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -262,7 +262,7 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map { for (Pair, Set> family : (Iterable, Set>>) - this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) // FIXME: use family to make accept/dial + this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) { /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); try @@ -279,7 +279,10 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); - String epkindFile = epkindImports + "\n" + String epkindFile = "//" + family.left.toString() + "\n\n"; + + epkindFile += + epkindImports + "\n" // Endpoint Kind type + "type " + epkindTypeName + " struct {\n" @@ -405,11 +408,15 @@ public int compare(Entry o1, Entry o2) this.apigen.variants.values().stream() .flatMap(m -> m.keySet().stream())::iterator)*/ - for (RPRoleVariant v : this.apigen.peers.get(variant)) + /*for (RPRoleVariant v : this.apigen.peers.get(variant)) { if (//!v.equals(variant) && // No: e.g., pipe/ring middlemen family.left.contains(v)) // FIXME: endpoint families -- and id value checks - { + // FIXME: should record peers according to families and lookup directly -- wouldn't need to re-check family inclusion here + {*/ + Set peers = this.apigen.peers.get(variant).get(family); + for (RPRoleVariant v : peers) + { // Accept/Dial methods String r = v.getLastElement(); String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(v); @@ -454,7 +461,7 @@ public int compare(Entry o1, Entry o2) + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept + "return err\n" // FIXME: runtime currently does log.Fatal on error + "}\n"; - } + //} } // Top-level Run method // FIXME: add session completion check diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java index db199a98c..a5f28f6f1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPIndexedRole.java @@ -49,12 +49,13 @@ public RPIndexedRole minimise(int self) // FIXME: currently just a syntactic singleton check on a single interval -- false negatives possible in general case (multiple intervals) public boolean isSingleton() { - if (this.intervals.size() != 1) + /*if (this.intervals.size() != 1) { return false; } RPInterval ival = this.intervals.stream().findFirst().get(); - return ival.isSingleton(); + return ival.isSingleton();*/ + return this.intervals.stream().anyMatch(x -> x.isSingleton()); } public Set getIndexVars() From c0ba213aa132e8df90989252a4898e9735ee818d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Oct 2018 12:48:18 +0100 Subject: [PATCH 346/433] Continued on rp-core variant subsumption API gen. --- .../ext/go/core/cli/RPCoreCommandLine.java | 43 +++-- .../statetype3/RPCoreSTApiGenerator.java | 9 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 171 +++++++++++++----- 3 files changed, 163 insertions(+), 60 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index f6290bf54..8bf718b04 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -3,7 +3,6 @@ import java.nio.file.Path; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -71,7 +70,8 @@ public class RPCoreCommandLine extends CommandLine private Set, Set>> families; // Factor out Family (cf. RPRoleVariant) private Map, Set>, Set>> peers; - private Map aliases; + private Map, Set>, Pair, Set>> subsum; + private Map, Set>, RPRoleVariant>> aliases; public RPCoreCommandLine(String... args) throws CommandLineException { @@ -175,11 +175,9 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, this.L0, this.E0, this.families, impath, role).build(); outputClasses(goClasses);*/ } - - this.aliases = Collections.emptyMap(); // FIXME: Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, - this.L0, this.E0, this.families, this.peers, this.aliases, impath, roles).build(); + this.L0, this.E0, this.families, this.peers, this.subsum, this.aliases, impath, roles).build(); outputClasses(goClasses); } else @@ -358,16 +356,17 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws this.families = new HashSet<>(); this.families.addAll(getFamilies(job)); - - minimise(); - this.peers = new HashMap<>(); this.peers.putAll(getPeers(job)); + minimise(); } private void minimise() { + this.subsum = new HashMap<>(); + this.aliases = new HashMap<>(); + //Map> L0 = //Map> E0; /*Set, Set>> families @@ -387,7 +386,7 @@ private void minimise() RPCoreAstFactory af = new RPCoreAstFactory(); Set, Set>> families = new HashSet<>(); - //Map, Set>, Set>> peers = new HashMap<>(); + ////Map, Set>, Set>> peers = new HashMap<>(); for (Pair, Set> fam : this.families) { Set tmp = new HashSet<>(); @@ -411,6 +410,15 @@ private void minimise() if (vL.minimise(af, v).equals(uL.minimise(af, v))) { //System.out.println("5555: " + v + " subsumed by " + u); + + Map, Set>, RPRoleVariant> m = this.aliases.get(v); + if (m == null) + { + m = new HashMap<>(); + this.aliases.put(v, m); + m.put(fam, u); + } + continue Next; } } @@ -419,13 +427,22 @@ private void minimise() } } - families.add(new Pair<>(tmp, fam.right)); // Subsumed variants are neither in left nor right + //if (!tmp.equals(fam.left)) + { + Pair, Set> compressed = new Pair<>(tmp, fam.right); + families.add(compressed); // Subsumed variants are neither in left nor right - System.out.println("\n8888:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + "\n\n" - + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n"))); + System.out.println("\n8888:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + "\n\n" + + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n"))); + + if (!tmp.equals(fam.left)) + { + this.subsum.put(compressed, fam); + } + } } - //this.families = families; + this.families = families; } // ..FIXME: generalise to multirole processes? i.e. all roles are A with different indices? -- also subsumes MP with single rolename? diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 91fac4b84..34f753f5e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -44,7 +44,8 @@ public class RPCoreSTApiGenerator public final Map, Set>, Set>> peers; // For "common" endpoint kind factoring (dial/accept methods) - public final Map aliases; + public final Map, Set>, Pair, Set>> subsum; + public final Map, Set>, RPRoleVariant>> aliases; public final String packpath; // Prefix for absolute imports in generated APIs (e.g., "github.com/rhu1/scribble-go-runtime/test2/bar/bar02/Bar2") -- not supplied by Scribble module @@ -56,7 +57,8 @@ public class RPCoreSTApiGenerator public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> projections, Map> variants, Set, Set>> families, Map, Set>, Set>> peers, - Map aliases, + Map, Set>, Pair, Set>> subsum, + Map, Set>, RPRoleVariant>> aliases, String packpath, //Role self) List selfs) { @@ -113,6 +115,7 @@ public int compare(Pair, Set> f1, Pair x.toString()).collect(Collectors.joining("_")) + "_not_" + f2.right.stream().sorted(variantComp).map(x -> x.toString()).collect(Collectors.joining("_"))); }}) .collect(Collectors.toMap(f -> f, f -> i[0]++))); + // CHECKME: deep copy? this.packpath = packpath; //this.self = self; @@ -124,7 +127,9 @@ public int compare(Pair, Set> f1, Pair Collections.unmodifiableMap(e.getValue()) ))); + this.subsum = Collections.unmodifiableMap(subsum); this.aliases = Collections.unmodifiableMap(aliases); + // FIXME: deep copies } // N.B. the base EGraph class will probably be replaced by a more specific (and more helpful) param-core class later diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index acfe640c3..981e49085 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -414,55 +414,136 @@ public int compare(Entry o1, Entry o2) family.left.contains(v)) // FIXME: endpoint families -- and id value checks // FIXME: should record peers according to families and lookup directly -- wouldn't need to re-check family inclusion here {*/ - Set peers = this.apigen.peers.get(variant).get(family); + + Pair, Set> orig = (this.apigen.subsum.containsKey(family)) ? this.apigen.subsum.get(family) : family; + Set peers = this.apigen.peers.get(variant).get(orig); + + RPRoleVariant subbdbyus = null; + for (RPRoleVariant subbd : this.apigen.aliases.keySet()) + { + Map, Set>, RPRoleVariant> ais = this.apigen.aliases.get(subbd); + if (ais.containsKey(orig) && ais.get(orig).equals(variant)) + { + subbdbyus = subbd; + break; + } + } + + //System.out.println("ffff: " + family + "\n" + variant + " ,, " + peers); + for (RPRoleVariant v : peers) { - // Accept/Dial methods - String r = v.getLastElement(); - String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(v); - epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int" - + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE - + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" - + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" - + "c, err := ss.Accept()\n" - + "if err != nil {\n" - + "return err\n" - + "}\n" - + "\n" - + "sfmt.Wrap(c)\n" - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" - + "return err\n" // FIXME: runtime currently does log.Fatal on error - + "}\n" - + "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id int" - + ", host string, port int" - + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" - + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" - + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" - + "c, err := dialler(host, port)\n" - + "if err != nil {\n" - + "return err\n" - + "}\n" - + "\n" - + "sfmt.Wrap(c)\n" - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept - + "return err\n" // FIXME: runtime currently does log.Fatal on error - + "}\n"; + RPRoleVariant pp = v; + if (this.apigen.aliases.containsKey(v)) + { + Map, Set>, RPRoleVariant> ali = this.apigen.aliases.get(v); + if (ali.containsKey(orig)) + { + pp = ali.get(orig); + if (peers.contains(pp)) + { + continue; + } + } + } + + // Accept/Dial methods + String r = pp.getLastElement(); + String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(pp); + epkindFile += "\n" + + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int" + + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE + + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" + + "c, err := ss.Accept()\n" + + "if err != nil {\n" + + "return err\n" + + "}\n" + + "\n" + + "sfmt.Wrap(c)\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" + + "return err\n" // FIXME: runtime currently does log.Fatal on error + + "}\n" + + "\n" + + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id int" + + ", host string, port int" + + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" + + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" + + "c, err := dialler(host, port)\n" + + "if err != nil {\n" + + "return err\n" + + "}\n" + + "\n" + + "sfmt.Wrap(c)\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept + + "return err\n" // FIXME: runtime currently does log.Fatal on error + + "}\n"; //} } + if (subbdbyus != null) + { + // FIXME: factor out with above + RPRoleVariant pp = subbdbyus; + // Accept/Dial methods + String r = pp.getLastElement(); + String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(pp); + epkindFile += "\n" + + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int" + + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE + + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" + + "c, err := ss.Accept()\n" + + "if err != nil {\n" + + "return err\n" + + "}\n" + + "\n" + + "sfmt.Wrap(c)\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" + + "return err\n" // FIXME: runtime currently does log.Fatal on error + + "}\n" + + "\n" + + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id int" + + ", host string, port int" + + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" + + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" + + "c, err := dialler(host, port)\n" + + "if err != nil {\n" + + "return err\n" + + "}\n" + + "\n" + + "sfmt.Wrap(c)\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept + + "return err\n" // FIXME: runtime currently does log.Fatal on error + + "}\n"; + } + + // Top-level Run method // FIXME: add session completion check /*EGraph g = this.apigen.variants.get(variant.getName()).get(variant); From bedcf9ccc8458e0369ff0c307fb0a9ed0f580b9d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Oct 2018 13:00:08 +0100 Subject: [PATCH 347/433] Minor. --- .../java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 8bf718b04..a3194d422 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -68,10 +68,14 @@ public class RPCoreCommandLine extends CommandLine private Map> E0; //protected ParamCoreSModel model; private Set, Set>> families; // Factor out Family (cf. RPRoleVariant) + // families after subsumption private Map, Set>, Set>> peers; + // variant-from-an-original-family -> an-original-family -> peer-variants-in-that-family private Map, Set>, Pair, Set>> subsum; + // new-family-after-subsumptions -> original-family-before-subsumptions private Map, Set>, RPRoleVariant>> aliases; + // subsumed-variant -> original-family-subsumed-in -> subsuming-variant public RPCoreCommandLine(String... args) throws CommandLineException { From d0cac273d7af288e8845b7ec5b9cf072b825e039 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Oct 2018 13:04:32 +0100 Subject: [PATCH 348/433] Minor. --- .../org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 3 ++- .../core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index a3194d422..7fec5ab24 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -76,6 +76,7 @@ public class RPCoreCommandLine extends CommandLine // new-family-after-subsumptions -> original-family-before-subsumptions private Map, Set>, RPRoleVariant>> aliases; // subsumed-variant -> original-family-subsumed-in -> subsuming-variant + // FIXME: can a variant be subsumed by mutiple other variants? currently only recording one public RPCoreCommandLine(String... args) throws CommandLineException { @@ -420,8 +421,8 @@ private void minimise() { m = new HashMap<>(); this.aliases.put(v, m); - m.put(fam, u); } + m.put(fam, u); // FIXME: can a variant be subsumed by mutiple other variants? currently only recording one continue Next; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 981e49085..0db11d832 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -424,7 +424,7 @@ public int compare(Entry o1, Entry o2) Map, Set>, RPRoleVariant> ais = this.apigen.aliases.get(subbd); if (ais.containsKey(orig) && ais.get(orig).equals(variant)) { - subbdbyus = subbd; + subbdbyus = subbd; // We subsumed "subbd", so we need to inherit all their peers break; } } @@ -439,8 +439,8 @@ public int compare(Entry o1, Entry o2) Map, Set>, RPRoleVariant> ali = this.apigen.aliases.get(v); if (ali.containsKey(orig)) { - pp = ali.get(orig); - if (peers.contains(pp)) + pp = ali.get(orig); // Replace subsumed-peer by subsuming-peer + if (peers.contains(pp)) // ...but skip if we're already peers with subsuming-peer { continue; } From b36353df8e6adecf8815e8225af191a68837f5aa Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 7 Oct 2018 16:42:58 +0100 Subject: [PATCH 349/433] Fixed rp-core send API gen arg index typo. --- .../go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 923ab3be2..24b4cd687 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -147,7 +147,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat + sEpWrite + "." + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) - + "(\"" + r.getName() + "\", i, &arg0[0])\n"; + + "(\"" + r.getName() + "\", i, &arg0[j])\n"; } } From 3cb00ef418245f032a609c4753e7d3f9901af65d Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 8 Oct 2018 15:24:50 +0100 Subject: [PATCH 350/433] Fixed rp-core foreach projection level-2 bug. --- .../scribble/ext/go/core/ast/global/RPCoreGForeach.java | 2 +- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index daa2c606d..dbca1d345 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -171,7 +171,7 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set ivals.stream().filter(y -> !x.equals(y)).allMatch(y -> ((RPIndexInt) x.start).val > ((RPIndexInt) y.start).val)) + .filter(x -> ivals.stream().filter(y -> !x.equals(y)).allMatch(y -> ((RPIndexInt) x.start).val >= ((RPIndexInt) y.start).val)) .findFirst().get(); // FIXME: non-RPIndexInt start exprs for nat intervals -- FIXME: generalised interval comparison (multidim) RPIndexVar var = RPIndexFactory.ParamIntVar(max.var.toString()); // N.B. not RPForeachVar -- occurrences in body are parsed as RPIndexVar, not RPForeachVar diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index d21d70dfa..dc4bbf97b 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,10 +8,18 @@ module param.tmp.ParamTest; +global protocol Proto1(role A, role B) +{ + foreach A[I:1,N], B[J:1,N] { + Foo() from A[I] to B[J]; + } +} +/* global protocol Proto1(role A, role B) { Foo() from A[1] to B[1,K]; } +*/ /* From e18f650fc9598a2abe63cec499da2b46c0d4d169 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Fri, 12 Oct 2018 16:11:49 +0100 Subject: [PATCH 351/433] Detect and panic if final statetype has error. --- .../core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 0db11d832..39f6a68db 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -569,7 +569,11 @@ public int compare(Entry o1, Entry o2) // cf. state chan builder // FIXME: chan struct reuse //"ini._" + init + ".id = 1\n" + "return f(ini._" + init + ")\n")*/ - + "return f(ini.Init())\n" + + "end := f(ini.Init())\n" + + "if end." + RPCoreSTApiGenConstants.GO_MPCHAN_ERR + " != nil {\n" + + "panic(end." + RPCoreSTApiGenConstants.GO_MPCHAN_ERR + ")\n" + + "}\n" + + "return end\n" + "}"; From 062522ae2caa7ce3ef39c17f95fe0542261468bd Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Fri, 12 Oct 2018 17:44:31 +0100 Subject: [PATCH 352/433] Patch error handling for Send functions. --- .../statetype3/RPCoreSTSendActionBuilder.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 24b4cd687..9712de0e4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -42,6 +42,24 @@ public String buildArgs(STStateChanApiBuilder api, EAction a) } } + /** + * checkError helper function surrounds the given expression expr with Go's error check + * and assigns errorField with err if it exists, i.e. + * + *
{@code
+	 * if err := $expression; err != nil {
+	 * 	 $errField = err
+	 * }
+	 * }
+ * + * @param expr Expression that returns error + * @param errField Location to store the error + * @return code fragment of expr with error check + */ + private String checkError(String expr, String errField) { + return "if err := " + expr + "; err != nil {\n" + errField + " = err\n" + "}\n"; + } + @Override public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EState succ) { @@ -131,23 +149,21 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat throw new RuntimeException("[rp-core] [param-api] TODO: " + a); } - res += errorField + " = " - + sEpWrite + res += checkError(sEpWrite + "." + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) + "(\"" + r.getName() + "\", i" + IntStream.range(0, a.payload.elems.size()).mapToObj(i -> ", &arg" + i + "[j]").collect(Collectors.joining("")) - + ")\n"; + + ")", errorField); } } else //(a.mid.isMessageSigName) { // FIXME: factor out with above - res += errorField + " = " - + sEpWrite + res += checkError( sEpWrite + "." + (a.mid.isOp() ? RPCoreSTApiGenConstants.GO_MPCHAN_ISEND : RPCoreSTApiGenConstants.GO_MPCHAN_MSEND) - + "(\"" + r.getName() + "\", i, &arg0[j])\n"; + + "(\"" + r.getName() + "\", i, &arg0[j])", errorField); } } From 66718710f01e0f19b733873df41b4192dfb69c40 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Fri, 12 Oct 2018 21:21:33 +0100 Subject: [PATCH 353/433] Add package comments for protocol & role variants. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 54 +++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 0db11d832..b3aca749f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -14,6 +14,7 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; import org.scribble.ext.go.core.model.endpoint.RPCoreEState; +import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EGraph; @@ -140,7 +141,10 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) // roles String protoFile = - "package " + this.apigen.getApiRootPackageName() + "\n" + + "// Package " + this.apigen.getApiRootPackageName() + " is the generated API for the " + this.apigen.proto.getPrefix().getSimpleName().toString() + "." + this.apigen.getApiRootPackageName() + " protocol.\n" + + "// Use functions in this package to create instances of role variants.\n" + + "package " + this.apigen.getApiRootPackageName() + "\n" + "\n" // Import Endpoint Kind APIs -- FIXME: CL args @@ -173,6 +177,7 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) protoFile += "\n" // Protocol type + + "// " + simpname + " is an instance of the " + this.apigen.proto.getPrefix().getSimpleName().toString() + "." + this.apigen.getApiRootPackageName() + " protocol.\n" + "type " + simpname + " struct {\n" + "}\n" @@ -183,6 +188,7 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) // Protocol type constructor + "\n" + + "// New returns a new instance of the protocol.\n" + "func New() *" + simpname + " {\n" + "return &" + simpname + "{ }\n" + "}\n"; @@ -212,10 +218,11 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) List ivars = getParameters(variant); String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant); + String fnName = "New_" + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") + epkindTypeName; + // Endpoint Kind constructor -- makes index var value maps - String tmp = "func (p *" + simpname + ") New" + "_" - + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") - + epkindTypeName // FIXME: factor out common variants between families + String tmp = "// " + fnName + " returns a new instance of " + epkindTypeName + " role variant.\n" + + "func (p *" + simpname + ") " + fnName // FIXME: factor out common variants between families + "(" + ivars.stream().filter(x -> !x.name.equals("self")) // CHECKME: can check for RPIndexSelf instead? .map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" + " *" @@ -590,10 +597,47 @@ public int compare(Entry o1, Entry o2) res.put(getEndpointKindFilePath(family, variant) + "/" + RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, variant) + ".go", - "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "\n" + epkindFile); + "// Generated API for the " + variant.getName() + humanReadableName(variant) + " role variant.\n" + + "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) + "\n" + epkindFile); + } + } + } + } + + private String humanReadableName(RPRoleVariant variant) { + StringBuilder sb = new StringBuilder(); + sb.append("["); // array index notation. + for (RPInterval iv : variant.intervals) { + sb.append("{"); + if (iv.isSingleton()) { + sb.append(iv.start.toString()); + } else { + sb.append(iv.start.toString()); + sb.append(",..,"); + sb.append(iv.end.toString()); + } + sb.append("}"); + sb.append("∩"); + } + sb.deleteCharAt(sb.length()-1); + if (variant.cointervals.size() > 0) { + sb.append(" - "); + for (RPInterval iv : variant.cointervals) { + sb.append("{"); + if (iv.isSingleton()) { + sb.append(iv.start.toString()); + } else { + sb.append(iv.start.toString()); + sb.append(",..,"); + sb.append(iv.end.toString()); } + sb.append("}"); + sb.append("∩"); } + sb.deleteCharAt(sb.length()-1); } + sb.append("]"); // array index notation. + return sb.toString(); } private List getParameters(RPRoleVariant variant) From 508a2f3bd5315ce75af6307e753a6a054020cec7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Fri, 12 Oct 2018 22:41:57 +0100 Subject: [PATCH 354/433] Fixed rp-core foreach translation bug. --- .../go/core/ast/global/RPCoreGForeach.java | 4 +- .../global/RPCoreGProtocolDeclTranslator.java | 2 +- .../ext/go/core/cli/RPCoreCommandLine.java | 1 - .../src/test/scrib/param/tmp/ParamTest.scr | 45 +++++++++++++++++++ 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index dbca1d345..2516b262c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -90,14 +90,14 @@ public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCo RPIndexVar tmp = RPIndexFactory.ParamIntVar(ival.var.toString()); // HACK FIXME: because RPIndexVar and RPForeachVar now distinguished -- unify? - Set d = Stream.of(new RPInterval(ival.start, ival.end)).collect(Collectors.toSet()); - // TODO: multidim intervals (currently singleton set for onedim) Set var = Stream.of(new RPInterval(tmp, tmp)).collect(Collectors.toSet()); for (RPIndexedRole ir : found) { if (ir.intervals.equals(var)) { done.add(ir); + Set d = Stream.of(new RPInterval(ival.start, ival.end)).collect(Collectors.toSet()); + // TODO: multidim intervals (currently singleton set for onedim) res.add(new RPIndexedRole(ir.getName().toString(), d)); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java index 563485447..6872b3ace 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGProtocolDeclTranslator.java @@ -313,7 +313,7 @@ private RPCoreGForeach parseRPGForeach(Map rvs, boolean checkRec { RPCoreGType body = parseSeq(gf.getBlock().getInteractionSeq().getInteractions(), Collections.emptyMap(), false, true); body = body.subs(af, RPCoreGEnd.END, RPCoreGCont.CONT); - Set ivals = IntStream.of(0, gf.params.size()-1) + Set ivals = IntStream.range(0, gf.params.size()) .mapToObj(i -> new RPAnnotatedInterval(gf.params.get(i), gf.starts.get(i), gf.ends.get(i))).collect(Collectors.toSet()); return this.af.RPCoreGForeach(//gf.subj.toName(), gf.param, gf.start, gf.end, gf.subjs.stream().map(r -> r.toName()).collect(Collectors.toSet()), ivals, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 7fec5ab24..55390650d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -637,7 +637,6 @@ private Set, Set>> getFamilies(GoJob job) getVariants(GoJob job, RPCoreGType gt) { Set prs = gt.getIndexedRoles(); - Map> map = prs.stream() .map(x -> x.getName()) diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index dc4bbf97b..06bd50df0 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,12 +8,57 @@ module param.tmp.ParamTest; +/*//foreach { A , B , C }{ i:k 11 ..k wh } do ( A [ i ]→ C [ i ] :Val.B [ i ]→ C [ i ] :Val.cont ) ;end +global protocol Proto1(role A, role B, role C) +{ + for A[I:1] +}*/ + +global protocol Proto1(role W) +{ + foreach W[I2:1,K-2], W[I1:2,K-1], W[I:3,K] + { + Foo() from W[I2] to W[I]; + Foo() from W[I1] to W[I]; + } +} + +/* +W{[1,(K-2)], [3,K]}{[I1]}, +W{[I1], [3,K]}{[1,(K-2)]}, +W{[I1]}{[1,(K-2)], [3,K]}, +W{[3,K]}{[1,(K-2)], [I1]}, +W{[1,(K-2)], [I1], [3,K]}, +W{[1,(K-2)], [I1]}{[3,K]}, +W{[1,(K-2)]}{[I1], [3,K]} +//*/ + + + +/* global protocol Proto1(role A, role B) { foreach A[I:1,N], B[J:1,N] { Foo() from A[I] to B[J]; } } +//*/ + + +/* +global protocol Proto1(role A, role B) +{ + foreach Manufacturer[J:1,M] { + QuoteReq from Supplier[1,S] to Manufacturer[J]; + Quote from Manufacturer[J] to Supplier[1,S]; + } +} +//*/ + + + + + /* global protocol Proto1(role A, role B) { From 1ebe45759db839033a5dc488d5ef942281b7e015 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Fri, 12 Oct 2018 22:56:45 +0100 Subject: [PATCH 355/433] Generate branch label documentation for Branch(). --- .../codegen/statetype3/RPCoreSTBranchActionBuilder.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 62d97a154..541116e49 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -20,9 +20,12 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME //RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; //String scTypeName = rpapi.getStateChanName(curr); - EState succ = curr.getSuccessor(a); + EState succ = curr.getSuccessor(a); + String labels = curr.getAllSuccessors().stream().map(s -> s.getActions().get(0)).map(act -> act.mid.toString()).collect(Collectors.joining(" or ")); return - "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + "// " + getActionName(api, a) + " is a branch with branch label\n" + + "// " + labels + "\n" + + "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + buildArgs(null, a) + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: return type is interface, so no need for *return (unlike other state chans) + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" From 6a40dc90726f430109b7dcb2d1a70b8487e01018 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Fri, 12 Oct 2018 23:00:19 +0100 Subject: [PATCH 356/433] Index exclusion is union not intersect. --- .../go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index b3aca749f..b497bd8d1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -632,7 +632,7 @@ private String humanReadableName(RPRoleVariant variant) { sb.append(iv.end.toString()); } sb.append("}"); - sb.append("∩"); + sb.append("∪"); } sb.deleteCharAt(sb.length()-1); } From bfb1e4fab9b6c8ab6898b4e85f213784d2676ad9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 00:18:39 +0100 Subject: [PATCH 357/433] Adding rp-core index pairs. --- .../org/scribble/parser/antlr/ParamScribble.g | 6 ++++++ .../ext/go/core/cli/RPCoreCommandLine.java | 1 + .../scribble/ast/index/RPAntlrIndexExpr.java | 12 +++++++++++- .../ext/go/type/index/RPIndexFactory.java | 5 +++++ .../java/org/scribble/ext/go/util/Z3Wrapper.java | 5 +++++ .../src/test/scrib/param/tmp/ParamTest.scr | 15 +++++++++++++-- 6 files changed, 41 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 5d766d905..8f9cff3d6 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -188,6 +188,8 @@ tokens PARAM_INDEXINTERVAL = 'PARAM_INDEXINTERVAL'; PARAM_FOREACHINTERVAL = 'PARAM_FOREACHINTERVAL'; + + PARAM_PAIR = 'PARAM_PAIR'; } @@ -751,6 +753,10 @@ paramindexexpr: unaryparamindexexpr: simplename +| + '(' simplename ',' simplename ')' +-> + ^(PARAM_PAIR simplename simplename) | '(' paramindexexpr ')' -> diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 55390650d..7fec5ab24 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -637,6 +637,7 @@ private Set, Set>> getFamilies(GoJob job) getVariants(GoJob job, RPCoreGType gt) { Set prs = gt.getIndexedRoles(); + Map> map = prs.stream() .map(x -> x.getName()) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java index a3948557d..8fd3772d5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java @@ -17,7 +17,7 @@ public static RPIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) case "PARAM_BININDEXEXPR": // FIXME: factor out { RPIndexExpr left = parseParamIndexExpr((CommonTree) ct.getChild(0), af); - if (ct.getChildCount() < 2) + if (ct.getChildCount() < 3) { return left; } @@ -32,6 +32,16 @@ public static RPIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) } return RPIndexFactory.ParamBinIndexExpr(op, left, right); } + case "PARAM_PAIR": // FIXME + { + RPIndexExpr left = parseParamIndexExpr((CommonTree) ct.getChild(0), af); + if (ct.getChildCount() < 2) + { + return left; + } + RPIndexExpr right = parseParamIndexExpr((CommonTree) ct.getChild(1), af); + return RPIndexFactory.RPIndexPair(left, right); + } default: { return isInteger(type) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java index 83d038451..f10e7ded0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java @@ -36,4 +36,9 @@ public static RPIndexSelf RPIndexSelf() { return RPIndexSelf.SELF; } + + public static RPIndexPair RPIndexPair(RPIndexExpr left, RPIndexExpr right) + { + return new RPIndexPair(left, right); + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index ddf6cf41f..fc192150c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -22,6 +22,11 @@ public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) { throw new RuntimeException("Cannot overwrite: " + tmpName); } + smt2 = "(declare-datatypes (T1 T2) ((Pair (mk-pair (first T1) (second T2)))))\n" + + "(define-fun pair_lt ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Bool\n" + + "(or (< (first p!1) (first p!2)) (< (second p!1) (second p!2)))\n" + + ")\n" + + smt2; smt2 = smt2 + "\n(check-sat)\n(exit)"; try { diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 06bd50df0..f6320d4ae 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,12 +8,22 @@ module param.tmp.ParamTest; +global protocol Proto1(role A, role B) +{ + Foo() from A[(1,1)] to B[(1,1)]; +} + + /*//foreach { A , B , C }{ i:k 11 ..k wh } do ( A [ i ]→ C [ i ] :Val.B [ i ]→ C [ i ] :Val.cont ) ;end global protocol Proto1(role A, role B, role C) { - for A[I:1] -}*/ + foreach A[I:(1,1),(W,H)] +} +//*/ + + +/* global protocol Proto1(role W) { foreach W[I2:1,K-2], W[I1:2,K-1], W[I:3,K] @@ -31,6 +41,7 @@ W{[3,K]}{[1,(K-2)], [I1]}, W{[1,(K-2)], [I1], [3,K]}, W{[1,(K-2)], [I1]}{[3,K]}, W{[1,(K-2)]}{[I1], [3,K]} +*/ //*/ From 82841a1d74657c21b037b69383bbc39eb241878a Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 12:14:14 +0100 Subject: [PATCH 358/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 1 + .../ext/go/core/cli/RPCoreCommandLine.java | 8 +- .../ext/go/type/index/RPIndexExpr.java | 1 + .../ext/go/util/IntSmt2Translator.java | 38 ++++++++ .../scribble/ext/go/util/Smt2Translator.java | 79 +++++++++++++++ .../org/scribble/ext/go/util/Z3Wrapper.java | 97 ++++++++++++++++++- .../src/test/scrib/param/tmp/ParamTest.scr | 3 +- 7 files changed, 217 insertions(+), 10 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index e9b14e540..fabca1233 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -102,6 +102,7 @@ public boolean isWellFormed(GoJob job, Stack> cont + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant + (vars.isEmpty() ? "" : ")") + " (> " + r.start.toSmt2Formula() + " " + r.end.toSmt2Formula() + ")" + //+ Z3Wrapper.getSmt2_gt(r.start, r.end) + (vars.isEmpty() ? "" : "))") + ")"; Predicate foo2 = r -> diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 7fec5ab24..24e0ccd6b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -577,7 +577,6 @@ private Map, Set>, Set return res; } - private Set, Set>> getFamilies(GoJob job) { job.debugPrintln("\n[rp-core] Computing families:"); @@ -709,10 +708,11 @@ private static String makePhiSmt2(Set cand, Set coset) if (cand.size() > 0) { - z3 += cand.stream().map(c -> "(and (>= self " + c.start.toSmt2Formula() + ") (<= self " + c.end.toSmt2Formula() + ")" + z3 += cand.stream().map(c -> + "(and (>= self " + c.start.toSmt2Formula() + ") (<= self " + c.end.toSmt2Formula() + ")" + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") - + ")") - .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); + + ")" + ).reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); } if (coset.size() > 0) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java index 68c6e356c..fb275a9ab 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java @@ -16,6 +16,7 @@ public boolean isConstant() public abstract Set getVars(); // Doesn't include foreach params public abstract String toSmt2Formula(); // Cf. toString -- but can be useful to separate, for debugging (and printing) + // TODO: factor out Smt2 translation interface // N.B. "syntactic" comparison @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java new file mode 100644 index 000000000..dea89719a --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java @@ -0,0 +1,38 @@ +package org.scribble.ext.go.util; + +public class IntSmt2Translator extends Smt2Translator +{ + public IntSmt2Translator() + { + //super(Sort.Int); + } + + public String getSort() + { + return "Int"; + } + + @Override + public String getLtOp() + { + return "<"; + } + + @Override + public String getLteOp() + { + return "<="; + } + + @Override + public String getGtOp() + { + return ">"; + } + + @Override + public String getGteOp() + { + return ">="; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java new file mode 100644 index 000000000..1e8c4d3d8 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java @@ -0,0 +1,79 @@ +package org.scribble.ext.go.util; + +import java.util.Set; +import java.util.stream.Collectors; + +import org.scribble.ext.go.type.index.RPIndexVar; + +public abstract class Smt2Translator +{ + /*enum Sort { Int, Pair } + + private final Sort sort;*/ + + public Smt2Translator() + { + //this.sort = sort; + } + + public abstract String getSort(); + public abstract String getLtOp(); + public abstract String getLteOp(); + public abstract String getGtOp(); + public abstract String getGteOp(); + + public String makeVarDecl(RPIndexVar v) + { + return "(" + v.toSmt2Formula() + " " + getSort() + ")"; // Factor out + } + + public String makeExists(Set vars, String body) + { + return "(exists " + + "(" + vars.stream().map(x -> makeVarDecl(x)).collect(Collectors.joining(" ")) + ")" + + body + ")"; + } + + public String makeForall(Set vars, String body) + { + // TODO: factor out with above + return "(forall " + + "(" + vars.stream().map(x -> makeVarDecl(x)).collect(Collectors.joining(" ")) + ")" + + body + ")"; + } + + public String makeLt(String x, String y) + { + return "(" + getLtOp() + " " + x + " " + y + ")"; + } + + public String makeLte(String x, String y) + { + return "(" + getLteOp() + " " + x + " " + y + ")"; + } + + public String makeGt(String x, String y) + { + return "(" + getGtOp() + " " + x + " " + y + ")"; + } + + public String makeGte(String x, String y) + { + return "(" + getGteOp() + " " + x + " " + y + ")"; + } + + public String makeAnd(Set cs) + { + return "(and " + cs.stream().collect(Collectors.joining(" ")) + ")"; + } + + public String makeOr(Set cs) + { + return "(or " + cs.stream().collect(Collectors.joining(" ")) + ")"; + } + + public String makeNot(String c) + { + return "(not " + "(" + c + "))"; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index fc192150c..9685a8444 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -5,6 +5,8 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexPair; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.util.ScribUtil; @@ -13,6 +15,86 @@ public class Z3Wrapper { + /*public static String getSmt2VarDecl(RPIndexExpr x) + { + if (x instanceof RPIndexPair) + { + return () + } + }*/ + + /*public static String getSmt2_lte(RPIndexExpr x, RPIndexExpr y) + { + String op; + if (x instanceof RPIndexPair) + { + if (!(y instanceof RPIndexPair)) + { + throw new RuntimeException("Shouldn't get in here: " + x + ", " + y); + } + op = "pair_lte"; + } + else + { + op = "<="; + } + return "(" + op + " " + x.toSmt2Formula() + " " + y.toSmt2Formula() + ")"; + } + + public static String getSmt2_lt(RPIndexExpr x, RPIndexExpr y) + { + String op; + if (x instanceof RPIndexPair) + { + if (!(y instanceof RPIndexPair)) + { + throw new RuntimeException("Shouldn't get in here: " + x + ", " + y); + } + op = "pair_lt"; + } + else + { + op = "<"; + } + return "(" + op + " " + x.toSmt2Formula() + " " + y.toSmt2Formula() + ")"; + } + + public static String getSmt2_gte(RPIndexExpr x, RPIndexExpr y) + { + String op; + if (x instanceof RPIndexPair) + { + if (!(y instanceof RPIndexPair)) + { + throw new RuntimeException("Shouldn't get in here: " + x + ", " + y); + } + op = "pair_gte"; + } + else + { + op = ">="; + } + return "(" + op + " " + x.toSmt2Formula() + " " + y.toSmt2Formula() + ")"; + } + + public static String getSmt2_gt(RPIndexExpr x, RPIndexExpr y) + { + String op; + if (x instanceof RPIndexPair) + { + if (!(y instanceof RPIndexPair)) + { + throw new RuntimeException("Shouldn't get in here: " + x + ", " + y); + } + op = "pair_gt"; + } + else + { + op = ">"; + } + return "(" + op + " " + x.toSmt2Formula() + " " + y.toSmt2Formula() + ")"; + }*/ + // Based on CommandLine::runDot, JobContext::runAut, etc public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) //throws ScribbleException { @@ -22,11 +104,16 @@ public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) { throw new RuntimeException("Cannot overwrite: " + tmpName); } - smt2 = "(declare-datatypes (T1 T2) ((Pair (mk-pair (first T1) (second T2)))))\n" - + "(define-fun pair_lt ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Bool\n" - + "(or (< (first p!1) (first p!2)) (< (second p!1) (second p!2)))\n" - + ")\n" - + smt2; + smt2 = "(declare-datatypes (T1 T2) ((Pair (mk-pair (fst T1) (snd T2)))))\n" + + "(define-fun pair_max ((p!1 (Pair Int Int))) Int (ite (< (fst p!1) (snd p!1)) (snd p!1) (fst p!1) ) )\n" + + "(define-fun pair_min ((p!1 (Pair Int Int))) Int (ite (< (fst p!1) (snd p!1)) (fst p!1) (snd p!1)))\n" + + "(define-fun twopair_max ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Int (ite (< (pair_max p!1) (pair_max p!2)) (pair_max p!2) (pair_max p!1)))\n" + + "(define-fun twopair_min ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Int (ite (< (pair_min p!1) (pair_min p!2)) (pair_min p!1) (pair_min p!2)))\n" + + "(define-fun pair_lte ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Bool (and (<= (fst p!1) (fst p!2)) (<= (snd p!1) (snd p!2)) ))\n" + + "(define-fun pair_lt ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Bool (and (pair_lte p!1 p!2) (not (= p!1 p!2))))\n" + + "(define-fun pair_gte ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Bool (pair_lte p!2 p!1))\n" + + "(define-fun pair_gt ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Bool (pair_lt p!2 p!1))\n" + + smt2; smt2 = smt2 + "\n(check-sat)\n(exit)"; try { diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index f6320d4ae..fab6e0b7d 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -10,7 +10,8 @@ module param.tmp.ParamTest; global protocol Proto1(role A, role B) { - Foo() from A[(1,1)] to B[(1,1)]; + //Foo() from A[(1,1)] to B[(1,1)]; + Foo() from A[1] to B[1]; } From 8adb3388fea9c7defcdee35d5df8ba92c58d631e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 13:49:54 +0100 Subject: [PATCH 359/433] Continued. --- .../ext/go/core/cli/RPCoreCommandLine.java | 108 +++++++++++++----- .../scribble/ext/go/core/type/RPInterval.java | 5 + .../ext/go/type/index/RPBinIndexExpr.java | 8 ++ .../ext/go/type/index/RPIndexExpr.java | 3 +- .../ext/go/type/index/RPIndexInt.java | 8 ++ .../ext/go/type/index/RPIndexVar.java | 7 ++ .../scribble/ext/go/util/Smt2Translator.java | 40 +++++-- .../org/scribble/ext/go/util/Z3Wrapper.java | 2 - 8 files changed, 137 insertions(+), 44 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 24e0ccd6b..fd2e32ce0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -39,9 +39,13 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPIndexPair; import org.scribble.ext.go.type.index.RPIndexSelf; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.IntSmt2Translator; +import org.scribble.ext.go.util.PairSmt2Translator; import org.scribble.ext.go.util.RecursiveFunctionalInterface; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.main.AntlrSourceException; import org.scribble.main.Job; @@ -260,9 +264,24 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws throw new RPCoreException("[rp-core] Global type not well-formed:\n " + gt); } + Smt2Translator smt2t; + Set irs = gt.getIndexedRoles(); + if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().allMatch(z -> z instanceof RPIndexPair)))) + { + smt2t = new PairSmt2Translator(); + } + else if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().noneMatch(z -> z instanceof RPIndexPair)))) + { + smt2t = new IntSmt2Translator(); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + irs); + } + //Map>> Map> - variants = getVariants(job, gt); + variants = getVariants(job, gt, smt2t); job.debugPrintln("\n[rp-core] Computed roles: " + variants); @@ -360,9 +379,9 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws //return gt; this.families = new HashSet<>(); - this.families.addAll(getFamilies(job)); + this.families.addAll(getFamilies(job, smt2t)); this.peers = new HashMap<>(); - this.peers.putAll(getPeers(job)); + this.peers.putAll(getPeers(job, smt2t)); minimise(); } @@ -458,7 +477,7 @@ private void minimise() // Compute variant peers of each variant -- which peer variants (possibly self variant) can match the indexed-role peers of self's I/O actions // for "common" endpoint kind factoring (w.r.t. dial/accept, i.e., to look for variants whose set of dial/accept methods is the same for all families it is involved in) // FIXME: optimise, peers are symmetric - private Map, Set>, Set>> getPeers(GoJob job) + private Map, Set>, Set>> getPeers(GoJob job, Smt2Translator smt2t) { job.debugPrintln("\n[rp-core] Computing peers:"); @@ -577,7 +596,7 @@ private Map, Set>, Set return res; } - private Set, Set>> getFamilies(GoJob job) + private Set, Set>> getFamilies(GoJob job, Smt2Translator smt2t) { job.debugPrintln("\n[rp-core] Computing families:"); @@ -605,10 +624,10 @@ private Set, Set>> getFamilies(GoJob job) smt2 += vars.stream().map(x -> "(>= " + x + " 1)").collect(Collectors.joining(" ")) + "\n"; // FIXME: generalise, parameter domain annotations } smt2 += "(and " + cand.stream() - .map(v -> makePhiSmt2(v.intervals, v.cointervals)).collect(Collectors.joining(" ")) + ")\n"; + .map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t)).collect(Collectors.joining(" ")) + ")\n"; smt2 += (coset.size() > 0) ? "(and " + coset.stream() - .map(v -> "(not " + makePhiSmt2(v.intervals, v.cointervals) + ")").collect(Collectors.joining(" ")) + ")\n" + .map(v -> "(not " + makePhiSmt2(v.intervals, v.cointervals, smt2t) + ")").collect(Collectors.joining(" ")) + ")\n" : ""; if (!vars.isEmpty()) { @@ -633,7 +652,7 @@ private Set, Set>> getFamilies(GoJob job) private //Map>> Map> - getVariants(GoJob job, RPCoreGType gt) + getVariants(GoJob job, RPCoreGType gt, Smt2Translator smt2t) { Set prs = gt.getIndexedRoles(); @@ -672,16 +691,15 @@ private Set, Set>> getFamilies(GoJob job) .flatMap(Collection::stream) .collect(Collectors.toSet()); - String z3 = makePhiSmt2(cand, coset); - Set vars = Stream.concat( + String z3 = makePhiSmt2(cand, coset, smt2t); + List vars = Stream.concat( cand.stream().flatMap(c -> c.getIndexVars().stream()), coset.stream().flatMap(c -> c.getIndexVars().stream()) - ).collect(Collectors.toSet()); + ).collect(Collectors.toList()); if (!vars.isEmpty()) { - z3 = "(exists (" - + vars.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) - + ") " + z3 + ")"; + //z3 = "(exists (" + vars.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + ") " + z3 + ")"; + z3 = smt2t.makeExists(vars.stream().map(v -> v.toSmt2Formula()).collect(Collectors.toList()), z3); } z3 = "(assert " + z3 + ")"; @@ -702,36 +720,64 @@ private Set, Set>> getFamilies(GoJob job) } // Doesn't include "assert", nor exists-bind index vars - private static String makePhiSmt2(Set cand, Set coset) + private static String makePhiSmt2(Set cand, Set coset, Smt2Translator smt2t) { - String z3 = ""; + List cs = new LinkedList<>(); - if (cand.size() > 0) + //if (cand.size() > 0) { - z3 += cand.stream().map(c -> - "(and (>= self " + c.start.toSmt2Formula() + ") (<= self " + c.end.toSmt2Formula() + ")" - + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") - + ")" - ).reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); + //z3 += smt2t.makeAnd( + cs.addAll( + cand.stream().map(c -> + //"(and (>= self " + c.start.toSmt2Formula() + ") (<= self " + c.end.toSmt2Formula() + ")" + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") + ")" + { + List tmp = new LinkedList<>(); + tmp.add(smt2t.makeGte("self", c.start.toSmt2Formula())); + tmp.add(smt2t.makeLte("self", c.end.toSmt2Formula())); + if (!c.start.isConstant() || !c.end.isConstant()) + { + tmp.add(smt2t.makeLte(c.start.toSmt2Formula(), c.end.toSmt2Formula())); + } + return smt2t.makeAnd(tmp); + }) + //.reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); + .collect(Collectors.toList()) + ); } - if (coset.size() > 0) + /*if (coset.size() > 0) { if (cand.size() > 0) { z3 = "(and " + z3 + " "; - } - z3 += coset.stream().map(c -> "(and (not (and (>= self " + c.start.toSmt2Formula() + ") (<= self " + c.end.toSmt2Formula() + ")))" - + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") - + ")") - .reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); - if (cand.size() > 0) + }*/ + cs.addAll( + coset.stream().map(c -> + //z3 += coset.stream().map(c -> "(and (not (and (>= self " + c.start.toSmt2Formula() + ") (<= self " + c.end.toSmt2Formula() + ")))" + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") + ")") + { + List tmp = new LinkedList<>(); + //tmp.add(smt2t.makeOr(smt2t.makeLt("self", c.start.toSmt2Formula()), smt2t.makeGt("self", c.end.toSmt2Formula()))); + tmp.add(smt2t.makeNot(smt2t.makeAnd(smt2t.makeGte("self", c.start.toSmt2Formula()), smt2t.makeLte("self", c.end.toSmt2Formula())))); + if (!c.start.isConstant() || !c.end.isConstant()) + { + tmp.add(smt2t.makeLte(c.start.toSmt2Formula(), c.end.toSmt2Formula())); // CHECKME: Needed? + } + return //(tmp.size() == 1) ? tmp.get(0) : + smt2t.makeAnd(tmp); + }) + //.reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); + .collect(Collectors.toList()) + + //(and (not (and (and (>= self 1) (<= self K))) (<= 1 K))) + ); + /*if (cand.size() > 0) { z3 += ")"; } - } + }*/ - z3 = "(exists ((self Int))" + z3 + ")"; + String z3 = //"(exists ((self Int))" + z3 + ")"; + smt2t.makeExists(Stream.of("self").collect(Collectors.toList()), smt2t.makeAnd(cs)); return z3; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java index 94923e367..8f0eac9ae 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/type/RPInterval.java @@ -28,6 +28,11 @@ public RPInterval minimise(int self) return new RPInterval(this.start.minimise(self), this.end.minimise(self)); } + public Set getIndexVals() + { + return Stream.of(this.start, this.end).flatMap(p -> p.getVals().stream()).collect(Collectors.toSet()); + } + //public Set getActualParams() // Hack public Set getIndexVars() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java index 3a2e3aa67..90ba7edd1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java @@ -109,6 +109,14 @@ public String toSmt2Formula() return "(" + op + " " + left + " " + right + ")"; } + @Override + public Set getVals() + { + Set vals = new HashSet<>(this.left.getVals()); + vals.addAll(this.right.getVals()); + return vals; + } + @Override public Set getVars() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java index fb275a9ab..b63dd89ee 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java @@ -13,7 +13,8 @@ public boolean isConstant() public abstract String toGoString(); // As basic Go expressions, but not (necessarily) actual code generation "ouput" - public abstract Set getVars(); // Doesn't include foreach params + public abstract Set getVals(); // TODO: factor out a "value" interface + public abstract Set getVars(); // N.B. doesn't include foreach params public abstract String toSmt2Formula(); // Cf. toString -- but can be useful to separate, for debugging (and printing) // TODO: factor out Smt2 translation interface diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java index d8bbab639..608cdb847 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java @@ -2,6 +2,8 @@ import java.util.Collections; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; // Integer literal public class RPIndexInt extends RPIndexExpr @@ -36,6 +38,12 @@ public String toSmt2Formula() { return Integer.toString(this.val); } + + @Override + public Set getVals() + { + return Stream.of(this).collect(Collectors.toSet()); + } @Override public Set getVars() diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java index 2eae87017..95ed893a3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.type.index; +import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -41,6 +42,12 @@ public String toSmt2Formula() return this.name; } + @Override + public Set getVals() + { + return Collections.emptySet(); + } + @Override public Set getVars() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java index 1e8c4d3d8..7a7ce0dc4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.util; -import java.util.Set; +import java.util.Arrays; +import java.util.List; import java.util.stream.Collectors; import org.scribble.ext.go.type.index.RPIndexVar; @@ -22,24 +23,28 @@ public Smt2Translator() public abstract String getGtOp(); public abstract String getGteOp(); - public String makeVarDecl(RPIndexVar v) + //public String makeVarDecl(RPIndexVar v) + public String makeVarDecl(String v) { - return "(" + v.toSmt2Formula() + " " + getSort() + ")"; // Factor out + return "(" + v//.toSmt2Formula() + + " " + getSort() + ")"; // Factor out } - public String makeExists(Set vars, String body) + //public String makeExists(List vars, String body) + public String makeExists(List vars, String body) { return "(exists " + "(" + vars.stream().map(x -> makeVarDecl(x)).collect(Collectors.joining(" ")) + ")" - + body + ")"; + + " " + body + ")"; } - public String makeForall(Set vars, String body) + //public String makeForall(List vars, String body) + public String makeForall(List vars, String body) { // TODO: factor out with above return "(forall " + "(" + vars.stream().map(x -> makeVarDecl(x)).collect(Collectors.joining(" ")) + ")" - + body + ")"; + + " " + body + ")"; } public String makeLt(String x, String y) @@ -62,18 +67,33 @@ public String makeGte(String x, String y) return "(" + getGteOp() + " " + x + " " + y + ")"; } - public String makeAnd(Set cs) + public String makeAnd(String... cs) // OK because cs last parameter + { + return makeAnd(Arrays.asList(cs)); + } + + public String makeAnd(List cs) { return "(and " + cs.stream().collect(Collectors.joining(" ")) + ")"; } - public String makeOr(Set cs) + public String makeOr(String... cs) + { + return makeOr(Arrays.asList(cs)); + } + + public String makeOr(List cs) { return "(or " + cs.stream().collect(Collectors.joining(" ")) + ")"; } public String makeNot(String c) { - return "(not " + "(" + c + "))"; + return "(not " + c + ")"; + } + + public String makeAssert(String body) + { + return "(assert " + body + ")"; } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index 9685a8444..21478deb1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -5,8 +5,6 @@ import org.scribble.ast.ProtocolDecl; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.RPIndexExpr; -import org.scribble.ext.go.type.index.RPIndexPair; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.util.ScribUtil; From fd06efe2b7feb4086d779ba9960dcc8b834af3d2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 13:50:37 +0100 Subject: [PATCH 360/433] Added missing files. --- .../ext/go/type/index/RPIndexPair.java | 104 ++++++++++++++++++ .../ext/go/util/PairSmt2Translator.java | 38 +++++++ 2 files changed, 142 insertions(+) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java new file mode 100644 index 000000000..3330a1514 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java @@ -0,0 +1,104 @@ +package org.scribble.ext.go.type.index; + +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + + +// Currently only considered as a value +public class RPIndexPair extends RPIndexExpr +{ + public final RPIndexExpr left; + public final RPIndexExpr right; + + protected RPIndexPair(RPIndexExpr left, RPIndexExpr right) + { + //if (!isUnaryExpr(left) || !isUnaryExpr(right)) + if (!(left instanceof RPIndexInt) || !(right instanceof RPIndexInt)) + { + throw new RuntimeException("TODO: (" + left + ", " + right + ")"); + } + this.left = left; + this.right = right; + } + + /*private static boolean isUnaryExpr(RPIndexExpr e) + { + return (e instanceof RPIndexInt) || (e instanceof RPIndexVar); + }*/ + + @Override + public RPIndexExpr minimise(int self) + { + return RPIndexFactory.RPIndexPair(this.left.minimise(self), this.right.minimise(self)); + } + + @Override + public String toGoString() + { + throw new RuntimeException("[param-core] TODO: " + this); + //return toString(); + } + + @Override + public String toSmt2Formula() + { + String left = this.left.toSmt2Formula(); + String right = this.right.toSmt2Formula(); + return "(mk-pair " + left + " " + right + ")"; + } + + @Override + public Set getVals() + { + return Stream.of(this).collect(Collectors.toSet()); + } + + @Override + public Set getVars() + { + /*Set vars = new HashSet<>(this.left.getVars()); + vars.addAll(this.right.getVars()); + return vars;*/ + return Collections.emptySet(); // Currently only considered as a value + } + + @Override + public String toString() + { + return "(" + this.left.toString() + ", " + this.right.toString() + ")"; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPIndexPair)) + { + return false; + } + RPIndexPair f = (RPIndexPair) o; + return super.equals(this) // Does canEqual + && this.left.equals(f.left) && this.right.equals(f.right); + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof RPIndexPair; + } + + @Override + public int hashCode() + { + int hash = 6311; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.left.hashCode(); + hash = 31 * hash + this.right.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java new file mode 100644 index 000000000..f25447452 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java @@ -0,0 +1,38 @@ +package org.scribble.ext.go.util; + +public class PairSmt2Translator extends Smt2Translator +{ + public PairSmt2Translator() + { + //super(Sort.Pair); + } + + public String getSort() + { + return "Pair"; + } + + @Override + public String getLtOp() + { + return "pair_lt"; + } + + @Override + public String getLteOp() + { + return "pair_lte"; + } + + @Override + public String getGtOp() + { + return "pair_gt"; + } + + @Override + public String getGteOp() + { + return "pair_gte"; + } +} From 10e3873c0b97130de30bfafd2a2ef86ddec98ef9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 14:47:12 +0100 Subject: [PATCH 361/433] Continued. --- .../ext/go/core/cli/RPCoreCommandLine.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index fd2e32ce0..92157e021 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -616,7 +616,7 @@ private Set, Set>> getFamilies(GoJob job, Set coset = all.stream() .filter(x -> !cand.contains(x)).collect(Collectors.toSet()); - String smt2 = "(assert "; + /*String smt2 = "(assert "; if (!vars.isEmpty()) { smt2 += "(exists (" + vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" ")) + ")\n"; // FIXME: factor up -- and factor out with getVariants @@ -633,7 +633,18 @@ private Set, Set>> getFamilies(GoJob job, { smt2 += "))"; } - smt2 += ")"; + smt2 += ")";*/ + + List cs = new LinkedList<>(); + cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(), "1")).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations + cs.addAll(cand.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t)).collect(Collectors.toList())); + cs.addAll(coset.stream().map(v -> smt2t.makeNot(makePhiSmt2(v.intervals, v.cointervals, smt2t))).collect(Collectors.toList())); + String smt2 = smt2t.makeAnd(cs); + if (!vars.isEmpty()) + { + smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula()).collect(Collectors.toList()), smt2); + } + smt2 = smt2t.makeAssert(smt2); job.debugPrintln("\n[rp-core] Candidate (" + i++ + "/" + size + "): " + cand); job.debugPrintln("[rp-core] Co-set: " + coset); @@ -701,7 +712,7 @@ private Set, Set>> getFamilies(GoJob job, //z3 = "(exists (" + vars.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + ") " + z3 + ")"; z3 = smt2t.makeExists(vars.stream().map(v -> v.toSmt2Formula()).collect(Collectors.toList()), z3); } - z3 = "(assert " + z3 + ")"; + z3 = smt2t.makeAssert(z3); job.debugPrintln("\n[rp-core] Candidate (" + i++ + "/" + size + "): " + cand); job.debugPrintln("[rp-core] Co-set: " + coset); @@ -762,8 +773,7 @@ private static String makePhiSmt2(Set cand, Set coset, S { tmp.add(smt2t.makeLte(c.start.toSmt2Formula(), c.end.toSmt2Formula())); // CHECKME: Needed? } - return //(tmp.size() == 1) ? tmp.get(0) : - smt2t.makeAnd(tmp); + return (tmp.size() == 1) ? tmp.get(0) : smt2t.makeAnd(tmp); }) //.reduce((c1, c2) -> "(and " + c1 + " " + c2 +")").get(); .collect(Collectors.toList()) From da3a877bfc577461d45db4142b58eeee542c6c50 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 15:05:24 +0100 Subject: [PATCH 362/433] Continued. --- .../ext/go/core/cli/RPCoreCommandLine.java | 47 ++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 92157e021..bac480eb7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -524,7 +524,7 @@ private Map, Set>, Set .collect(Collectors.toSet()); vars.addAll(ir.getIndexVars()); - String smt2 = "(assert "; + /*String smt2 = "(assert "; smt2 += "(exists ((peer Int) " + (vars.isEmpty() ? "" : vars.stream() .map(x -> "(" + x + " Int)").collect(Collectors.joining(" "))) + ")\n"; @@ -543,7 +543,7 @@ private Map, Set>, Set // ...and the peer index is outside one of the peer-variant cointervals smt2 += "(>= peer " + d.start.toSmt2Formula() + ") (<= peer " + d.end.toSmt2Formula() + ")\n"; // ...and the peer index is inside our I/O action interval -- then this is peer-variant is a peer - + if (vars.contains(RPIndexSelf.SELF)) { // FIXME: factor out variant/covariant inclusion/exclusion with above @@ -556,12 +556,47 @@ private Map, Set>, Set : "(or " + self.cointervals.stream() .map(x -> "(< self " + x.start.toSmt2Formula() + ") (> self " + x.end.toSmt2Formula() + ")") .collect(Collectors.joining(" ")) + ")\n"; - // ...and the peer index is outside one of the peer-variant cointervals + // ...and the self index is outside one of the self-variant cointervals } - + smt2 += ")"; smt2 += ")"; smt2 += ")"; + */ + + List cs = new LinkedList<>(); + cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(), "1")).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations + for (RPInterval ival : peerVariant.intervals) // Is there a peer index inside all the peer-variant intervals + { + cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula())); + cs.add(smt2t.makeLte("peer", ival.end.toSmt2Formula())); + } + cs.addAll(peerVariant.cointervals.stream() // ...and the peer index is outside one of the peer-variant cointervals + .map(x -> smt2t.makeOr(smt2t.makeLt("peer", x.start.toSmt2Formula()), smt2t.makeGt("peer", x.end.toSmt2Formula()))).collect(Collectors.toList()) + ); + // ...and the peer index is inside our I/O action interval -- then this is peer-variant is a peer + cs.add(smt2t.makeGte("peer", d.start.toSmt2Formula())); + cs.add(smt2t.makeLte("peer", d.end.toSmt2Formula())); + + if (vars.contains(RPIndexSelf.SELF)) + { + // FIXME: factor out variant/covariant inclusion/exclusion with above + for (RPInterval ival : self.intervals) // Is there a self index inside all the self-variant intervals + { + cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula())); + cs.add(smt2t.makeLte("peer", ival.end.toSmt2Formula())); + } + cs.addAll(self.cointervals.stream() // ...and the self index is outside one of the self-variant cointervals + .map(x -> smt2t.makeOr(smt2t.makeLt("self", x.start.toSmt2Formula()), smt2t.makeGt("peer", x.end.toSmt2Formula()))).collect(Collectors.toList()) + ); + } + + String smt2 = smt2t.makeAnd(cs); + List tmp = new LinkedList<>(); + tmp.add("peer"); + tmp.addAll(vars.stream().map(x -> x.toSmt2Formula()).collect(Collectors.toList())); + smt2 = smt2t.makeExists(tmp, smt2); + smt2 = smt2t.makeAssert(smt2); job.debugPrintln("[rp-core] Running Z3 on " + d + " :\n" + smt2); @@ -646,7 +681,7 @@ private Set, Set>> getFamilies(GoJob job, } smt2 = smt2t.makeAssert(smt2); - job.debugPrintln("\n[rp-core] Candidate (" + i++ + "/" + size + "): " + cand); + job.debugPrintln("\n[rp-core] Family candidate (" + i++ + "/" + size + "): " + cand); job.debugPrintln("[rp-core] Co-set: " + coset); job.debugPrintln("[rp-core] Running Z3 on:\n" + smt2); @@ -714,7 +749,7 @@ private Set, Set>> getFamilies(GoJob job, } z3 = smt2t.makeAssert(z3); - job.debugPrintln("\n[rp-core] Candidate (" + i++ + "/" + size + "): " + cand); + job.debugPrintln("\n[rp-core] Variant andidate (" + i++ + "/" + size + "): " + cand); job.debugPrintln("[rp-core] Co-set: " + coset); job.debugPrintln("[rp-core] Running Z3 on:\n" + z3); From 39938d50a9f4b6a9f46c2390a2bd08cce8a0f530 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 16:01:29 +0100 Subject: [PATCH 363/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 359 +++++++++++------- .../ext/go/core/ast/global/RPCoreGCont.java | 3 +- .../ext/go/core/ast/global/RPCoreGEnd.java | 3 +- .../go/core/ast/global/RPCoreGForeach.java | 5 +- .../core/ast/global/RPCoreGMultiChoices.java | 3 +- .../ext/go/core/ast/global/RPCoreGRec.java | 5 +- .../ext/go/core/ast/global/RPCoreGRecVar.java | 3 +- .../ext/go/core/ast/global/RPCoreGType.java | 3 +- .../ext/go/core/cli/RPCoreCommandLine.java | 22 +- .../go/del/global/RPGMessageTransferDel.java | 2 + .../org/scribble/ext/go/util/Z3Wrapper.java | 21 + 11 files changed, 257 insertions(+), 172 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index fabca1233..365a31d68 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -32,6 +32,7 @@ import org.scribble.ext.go.type.index.RPIndexFactory; import org.scribble.ext.go.type.index.RPIndexSelf; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.type.Message; import org.scribble.type.MessageSig; @@ -71,7 +72,7 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< // gpd only for calling Z3Wrapper.checkSat @Override - public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd, Smt2Translator smt2t) { // src (i.e., choice subj) range size=1 for non-unary choices enforced by ParamScribble.g syntax // Directed choice check by ParamCoreGProtocolDeclTranslator ensures all dests (including ranges) are (syntactically) the same @@ -81,79 +82,23 @@ public boolean isWellFormed(GoJob job, Stack> cont Set vars = Stream.of(srcRange, destRange).flatMap(r -> r.getIndexVars().stream()).collect(Collectors.toSet()); // FIXME: record foreachvars separately, for additional constraint generation - /*// CHECKME: is range size>0 already ensured by syntax? - Function foo1 = r -> - "(assert (exists ((foobartmp Int)" - + vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")) - + ") (and" - + " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")" // FIXME: factor out with above - + ")))"; - Predicate foo2 = r -> - { - String foo = foo1.apply(srcRange); - - job.debugPrintln("\n[param-core] [WF] Checking non-empty ranges:\n " + foo); - - return Z3Wrapper.checkSat(job, gpd, foo); - };*/ - Function foo1 = r -> // FIXME: factor out with above - "(assert " - + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and (and") - + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant - + (vars.isEmpty() ? "" : ")") - + " (> " + r.start.toSmt2Formula() + " " + r.end.toSmt2Formula() + ")" - //+ Z3Wrapper.getSmt2_gt(r.start, r.end) - + (vars.isEmpty() ? "" : "))") - + ")"; - Predicate foo2 = r -> - { - String foo = foo1.apply(r); - - job.debugPrintln("\n[param-core] [WF] Checking WF range interval for " + r + ":\n " + foo); - - return Z3Wrapper.checkSat(job, gpd, foo); - }; - if (foo2.test(srcRange) || foo2.test(destRange)) + //if (!checkNonEmptyIntervals(...)) + if (!checkIntervalRanges(job, gpd, vars, smt2t)) { return false; } - if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) { if (this.cases.size() > 1) { - String bar = "(assert " - + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and ") - + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant - + "(not (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") 0))" - + (vars.isEmpty() ? "" : "))") - + ")"; - - job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subject for " + this.src + ":\n " + bar); - - if (Z3Wrapper.checkSat(job, gpd, bar)) + if (!checkSingletonChoiceSubject(job, gpd, vars, smt2t)) { return false; } } - Set all = context.stream().flatMap(m -> m.keySet().stream().map(k -> k.name)).collect(Collectors.toSet()); // FIXME: awkwardness of RPForeachVar and RPIndexVar - Function checkForeachVarIndex = ir -> - { - Set vs = ir.getIndexVars().stream().map(x -> x.name).collect(Collectors.toSet()); // FIXME: awkwardness of RPForeachVar and RPIndexVar - if (vs.stream().anyMatch(x -> all.contains(x))) - { - if (!hasValidForeachVarIndex(context, ir)) - { - // FIXME: check in name disamb pass? - job.debugPrintln("\n[param-core] [WF] Illegal use/access of foreach-var: " + ir); - return false; - } - } - return true; - }; - if (!checkForeachVarIndex.apply(this.src) || !checkForeachVarIndex.apply(this.dest)) + if (!checkForeachVars(job, context, smt2t)) { return false; } @@ -161,94 +106,18 @@ public boolean isWellFormed(GoJob job, Stack> cont if (this.src.getName().equals(this.dest.getName())) { - if (this.kind == RPCoreGActionKind.CROSS_TRANSFER) + if (this.kind != RPCoreGActionKind.CROSS_TRANSFER) { - String smt2 = "(assert (exists ((foobartmp Int)"; // FIXME: factor out - smt2 += vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")); - smt2 += ") (and"; - smt2 += vars.isEmpty() ? "" : vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")); - // FIXME: lower bound constant '1' -- replace by global invariant - - Map peek = context.isEmpty() ? Collections.emptyMap() : context.peek(); - Set curr = peek.keySet().stream().map(k -> k.name).collect(Collectors.toSet()); - Set srcAndDestVars = new HashSet<>(); - srcAndDestVars.addAll(this.src.getIndexVars()); - srcAndDestVars.addAll(this.dest.getIndexVars()); - for (RPIndexVar sv : srcAndDestVars) - { - String tmp = sv.toString(); - if (curr.contains(tmp)) // FIXME: awkwardness of RPForeachVar and RPIndexVar - { - RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp)); - smt2 += " (= " + sv + " " + ival.start + ")"; - } - } - - /*//Set curr = peek.keySet().stream().map(k -> k.toString()).collect(Collectors.toSet()); - if (isValidForeachIndexVar(context, this.src) && isValidForeachIndexVar(context, this.dest)) - { - String sv = srcVars.iterator().next().toString(); - String dv = destVars.iterator().next().toString(); - if (curr.contains(sv) && curr.contains(dv)) - { - RPIndexExpr s = peek.get(RPIndexFactory.RPForeachVar(sv)).start; - RPIndexExpr d = peek.get(RPIndexFactory.RPForeachVar(dv)).start; - if (!(s instanceof RPIndexInt) && !(s instanceof RPIndexInt)) - { - System.err.println("\n[param-core] Interval separation not being fully proved: " + s + " and " + d); - } - if (s.equals(d)) - // FIXME: use Z3 to prove intervals not equal (not just checking against syntactic equality) - { - job.debugPrintln("\n[param-core] (Potential) illegal self-communication: " + this); - return false; - } - } - }*/ + throw new RuntimeException("Shouldn't get here: " + this.kind); + } - smt2 += Stream.of(srcRange, destRange) - .map(r -> " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")") - .collect(Collectors.joining()); - smt2 += ")))"; - - job.debugPrintln("\n[param-core] [WF] Checking non-overlapping ranges (potential self-communication) for " + this.src.getName() + ":\n " + smt2); - - if (Z3Wrapper.checkSat(job, gpd, smt2)) - { - return false; - } - // CHECKME: projection cases for rolename self-comm but non-overlapping intervals - - // FIXME: only do if both are foreachvars - if (hasValidForeachVarIndex(context, this.src) && hasValidForeachVarIndex(context, this.dest)) - { - String sv = ((RPIndexVar) this.src.intervals.iterator().next().start).toString(); - String dv = ((RPIndexVar) this.dest.intervals.iterator().next().end).toString(); - RPInterval s = peek.get(RPIndexFactory.RPForeachVar(sv)); - RPInterval d = peek.get(RPIndexFactory.RPForeachVar(dv)); - Set tmp = Stream.of(s, d).flatMap(r -> r.getIndexVars().stream()).collect(Collectors.toSet()); - // Duplicated from DOT_TRANSFER - smt2 = "(assert" - + (tmp.isEmpty() ? "" : " (forall (" + tmp.stream().map(v -> "(" + v + " Int)").collect(Collectors.joining(" "))) + ") " - + "(and (= (- " + s.end.toSmt2Formula() + " " + s.start.toSmt2Formula() + ") (- " - + d.end.toSmt2Formula() + " " + d.start.toSmt2Formula() + "))" - + (!this.src.getName().equals(this.dest.getName()) ? "" : - " (not (= " + s.start.toSmt2Formula() + " " + d.start.toSmt2Formula() + "))") - + ")" - + (tmp.isEmpty() ? "" : ")") - + ")"; - - job.debugPrintln("\n[param-core] [WF] Checking foreach-var alignment between " + srcRange + " and " + destRange + ":\n " + smt2); - - if (!Z3Wrapper.checkSat(job, gpd, smt2)) - { - return false; - } - } + if (!checkOverlappingIntervals(job, context, gpd, vars, smt2t) || !checkForeachVarAlignment(job, context, gpd, smt2t)) + { + return false; } } - // Now redundant + /*// Now redundant -- restore for "pair/pipe" sugar if (this.kind == RPCoreGActionKind.DOT_TRANSFER) { String smt2 = "(assert" @@ -267,8 +136,210 @@ public boolean isWellFormed(GoJob job, Stack> cont { return false; } + }*/ + + return true; + } + + // Returns true if OK + private boolean checkForeachVarAlignment(GoJob job, Stack> context, GProtocolDecl gpd, Smt2Translator smt2t) + { + RPInterval srcRange = this.src.getParsedRange(); + RPInterval destRange = this.dest.getParsedRange(); + + Map peek = context.isEmpty() ? Collections.emptyMap() : context.peek(); + // FIXME: only do if both are foreachvars + if (hasValidForeachVarIndex(context, this.src) && hasValidForeachVarIndex(context, this.dest)) + { + String sv = ((RPIndexVar) this.src.intervals.iterator().next().start).toString(); + String dv = ((RPIndexVar) this.dest.intervals.iterator().next().end).toString(); + RPInterval s = peek.get(RPIndexFactory.RPForeachVar(sv)); + RPInterval d = peek.get(RPIndexFactory.RPForeachVar(dv)); + Set tmp = Stream.of(s, d).flatMap(r -> r.getIndexVars().stream()).collect(Collectors.toSet()); + // Duplicated from DOT_TRANSFER + String smt2 = "(assert" + + (tmp.isEmpty() ? "" : " (forall (" + tmp.stream().map(v -> "(" + v + " Int)").collect(Collectors.joining(" "))) + ") " + + "(and (= (- " + s.end.toSmt2Formula() + " " + s.start.toSmt2Formula() + ") (- " + + d.end.toSmt2Formula() + " " + d.start.toSmt2Formula() + "))" + + (!this.src.getName().equals(this.dest.getName()) ? "" : + " (not (= " + s.start.toSmt2Formula() + " " + d.start.toSmt2Formula() + "))") + + ")" + + (tmp.isEmpty() ? "" : ")") + + ")"; + + job.debugPrintln("\n[param-core] [WF] Checking foreach-var alignment between " + srcRange + " and " + destRange + ":\n " + smt2); + + if (!Z3Wrapper.checkSat(job, gpd, smt2)) + { + return false; + } + } + return true; + } + + /*private boolean checkSelfCommunication(...) + { + //Set curr = peek.keySet().stream().map(k -> k.toString()).collect(Collectors.toSet()); + if (isValidForeachIndexVar(context, this.src) && isValidForeachIndexVar(context, this.dest)) + { + String sv = srcVars.iterator().next().toString(); + String dv = destVars.iterator().next().toString(); + if (curr.contains(sv) && curr.contains(dv)) + { + RPIndexExpr s = peek.get(RPIndexFactory.RPForeachVar(sv)).start; + RPIndexExpr d = peek.get(RPIndexFactory.RPForeachVar(dv)).start; + if (!(s instanceof RPIndexInt) && !(s instanceof RPIndexInt)) + { + System.err.println("\n[param-core] Interval separation not being fully proved: " + s + " and " + d); + } + if (s.equals(d)) + // FIXME: use Z3 to prove intervals not equal (not just checking against syntactic equality) + { + job.debugPrintln("\n[param-core] (Potential) illegal self-communication: " + this); + return false; + } + } + } + }*/ + + // Returns true if OK + private boolean checkOverlappingIntervals(GoJob job, + Stack> context, GProtocolDecl gpd, Set vars, Smt2Translator smt2t) + { + RPInterval srcRange = this.src.getParsedRange(); + RPInterval destRange = this.dest.getParsedRange(); + + String smt2 = "(assert (exists ((foobartmp Int)"; // FIXME: factor out + smt2 += vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")); + smt2 += ") (and"; + smt2 += vars.isEmpty() ? "" : vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")); + // FIXME: lower bound constant '1' -- replace by global invariant + + Map peek = context.isEmpty() ? Collections.emptyMap() : context.peek(); + Set curr = peek.keySet().stream().map(k -> k.name).collect(Collectors.toSet()); + Set srcAndDestVars = new HashSet<>(); + srcAndDestVars.addAll(this.src.getIndexVars()); + srcAndDestVars.addAll(this.dest.getIndexVars()); + for (RPIndexVar sv : srcAndDestVars) + { + String tmp = sv.toString(); + if (curr.contains(tmp)) // FIXME: awkwardness of RPForeachVar and RPIndexVar + { + RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp)); + smt2 += " (= " + sv + " " + ival.start + ")"; + } + } + + smt2 += Stream.of(srcRange, destRange) + .map(r -> " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")") + .collect(Collectors.joining()); + smt2 += ")))"; + + job.debugPrintln("\n[param-core] [WF] Checking non-overlapping ranges (potential self-communication) for " + this.src.getName() + ":\n " + smt2); + + if (Z3Wrapper.checkSat(job, gpd, smt2)) + { + return false; } + // CHECKME: projection cases for rolename self-comm but non-overlapping intervals + + return true; + } + + // Returns true if OK + private boolean checkForeachVars(GoJob job, Stack> context, Smt2Translator smt2t) + { + Set all = context.stream().flatMap(m -> m.keySet().stream().map(k -> k.name)).collect(Collectors.toSet()); // FIXME: awkwardness of RPForeachVar and RPIndexVar + Function checkForeachVarIndex = ir -> + { + Set vs = ir.getIndexVars().stream().map(x -> x.name).collect(Collectors.toSet()); // FIXME: awkwardness of RPForeachVar and RPIndexVar + if (vs.stream().anyMatch(x -> all.contains(x))) + { + if (!hasValidForeachVarIndex(context, ir)) + { + // FIXME: check in name disamb pass? + job.debugPrintln("\n[param-core] [WF] Illegal use/access of foreach-var: " + ir); + return false; + } + } + return true; + }; + if (!checkForeachVarIndex.apply(this.src) || !checkForeachVarIndex.apply(this.dest)) + { + return false; + } + return true; + } + + // Returns true if OK + private boolean checkSingletonChoiceSubject(GoJob job, GProtocolDecl gpd, Set vars, Smt2Translator smt2t) + { + RPInterval srcRange = this.src.getParsedRange(); + String bar = "(assert " + + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and ") + + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant + + "(not (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") 0))" + + (vars.isEmpty() ? "" : "))") + + ")"; + + job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subject for " + this.src + ":\n " + bar); + + if (Z3Wrapper.checkSat(job, gpd, bar)) + { + return false; + } + return true; + } + + /*// Returns true if OK + private boolean checkNonEmptyIntervals(...) + { + // CHECKME: is range size>0 already ensured by syntax? + Function foo1 = r -> + "(assert (exists ((foobartmp Int)" + + vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")) + + ") (and" + + " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")" // FIXME: factor out with above + + ")))"; + Predicate foo2 = r -> + { + String foo = foo1.apply(srcRange); + + job.debugPrintln("\n[param-core] [WF] Checking non-empty ranges:\n " + foo); + + return Z3Wrapper.checkSat(job, gpd, foo); + }; + ... + */ + + // Returns true if OK + private boolean checkIntervalRanges(GoJob job, GProtocolDecl gpd, Set vars, Smt2Translator smt2t) + { + RPInterval srcRange = this.src.getParsedRange(); + RPInterval destRange = this.dest.getParsedRange(); + + Function foo1 = r -> // FIXME: factor out with above + "(assert " + + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and (and") + + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant + + (vars.isEmpty() ? "" : ")") + + " (> " + r.start.toSmt2Formula() + " " + r.end.toSmt2Formula() + ")" + //+ Z3Wrapper.getSmt2_gt(r.start, r.end) + + (vars.isEmpty() ? "" : "))") + + ")"; + Predicate foo2 = r -> + { + String foo = foo1.apply(r); + + job.debugPrintln("\n[param-core] [WF] Checking WF range interval for " + r + ":\n " + foo); + + return Z3Wrapper.checkSat(job, gpd, foo); + }; + if (foo2.test(srcRange) || foo2.test(destRange)) + { + return false; + } return true; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java index 89c9d6acc..b23e81ec1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java @@ -18,6 +18,7 @@ import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPForeachVar; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -42,7 +43,7 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } @Override - public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd, Smt2Translator smt2t) { return true; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java index 8b00b02fa..1e23126b8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java @@ -18,6 +18,7 @@ import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPForeachVar; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -42,7 +43,7 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } @Override - public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd, Smt2Translator smt2t) { return true; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 2516b262c..e7fd838a8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -24,6 +24,7 @@ import org.scribble.ext.go.type.index.RPIndexFactory; import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -53,13 +54,13 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } @Override - public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd, Smt2Translator smt2t) { // CHECKME: interval constraints, nested foreach constraints, etc. -- cf. RPCoreGChoice Map curr = new HashMap<>(); this.ivals.forEach(ival -> curr.put(ival.var, ival)); context.push(curr); - boolean res = this.body.isWellFormed(job, context, gpd); + boolean res = this.body.isWellFormed(job, context, gpd, smt2t); context.pop(); return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java index dfd206efc..a76e627c9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java @@ -24,6 +24,7 @@ import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.type.Message; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -58,7 +59,7 @@ LinkedHashMap foo(List cases, RPCoreGType cont) } @Override - public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd, Smt2Translator smt2t) { // src (i.e., choice subj) range size=1 for non-unary choices enforced by ParamScribble.g syntax // Directed choice check by ParamCoreGProtocolDeclTranslator ensures all dests (including ranges) are (syntactically) the same diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java index dc2238072..5f7978283 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java @@ -18,6 +18,7 @@ import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPForeachVar; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -43,9 +44,9 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } @Override - public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd, Smt2Translator smt2t) { - return this.body.isWellFormed(job, context, gpd); + return this.body.isWellFormed(job, context, gpd, smt2t); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java index 2bffaa0ae..4e2c28dca 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java @@ -17,6 +17,7 @@ import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPForeachVar; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.type.kind.Global; import org.scribble.type.name.RecVar; import org.scribble.type.name.Role; @@ -40,7 +41,7 @@ public RPCoreGType subs(RPCoreAstFactory af, RPCoreType old, RPCoreType< } @Override - public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd) + public boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd, Smt2Translator smt2t) { return true; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java index 74b36e4e4..b3561d750 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java @@ -15,6 +15,7 @@ import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPForeachVar; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -23,7 +24,7 @@ public interface RPCoreGType extends RPCoreType { // context records nested foreach vars -- only accesses to top-level vars are valid - boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd); + boolean isWellFormed(GoJob job, Stack> context, GProtocolDecl gpd, Smt2Translator smt2t); // TODO: clarify, Role subj is used as "role name" //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index bac480eb7..7c978570f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -39,11 +39,8 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.RPIndexPair; import org.scribble.ext.go.type.index.RPIndexSelf; import org.scribble.ext.go.type.index.RPIndexVar; -import org.scribble.ext.go.util.IntSmt2Translator; -import org.scribble.ext.go.util.PairSmt2Translator; import org.scribble.ext.go.util.RecursiveFunctionalInterface; import org.scribble.ext.go.util.Smt2Translator; import org.scribble.ext.go.util.Z3Wrapper; @@ -256,29 +253,16 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws RPCoreAstFactory af = new RPCoreAstFactory(); RPCoreGType gt = new RPCoreGProtocolDeclTranslator(job, af).translate(this.gpd); + + Smt2Translator smt2t = Z3Wrapper.getSmt2Translator(gt); job.debugPrintln("\n[rp-core] Translated:\n " + gt); - if (!gt.isWellFormed(job, new Stack<>(), gpd)) + if (!gt.isWellFormed(job, new Stack<>(), gpd, smt2t)) { throw new RPCoreException("[rp-core] Global type not well-formed:\n " + gt); } - Smt2Translator smt2t; - Set irs = gt.getIndexedRoles(); - if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().allMatch(z -> z instanceof RPIndexPair)))) - { - smt2t = new PairSmt2Translator(); - } - else if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().noneMatch(z -> z instanceof RPIndexPair)))) - { - smt2t = new IntSmt2Translator(); - } - else - { - throw new RuntimeException("Shouldn't get in here: " + irs); - } - //Map>> Map> variants = getVariants(job, gt, smt2t); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java index d8e6a945b..e7eb3008f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java @@ -2,6 +2,7 @@ import java.util.List; +import org.scribble.ast.MessageTransfer; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GMessageTransfer; import org.scribble.del.global.GMessageTransferDel; @@ -10,6 +11,7 @@ import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.main.ScribbleException; import org.scribble.type.name.Role; +import org.scribble.visit.util.RoleCollector; import org.scribble.visit.wf.NameDisambiguator; public class RPGMessageTransferDel extends GMessageTransferDel implements RPDel diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index 21478deb1..082d45070 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -2,9 +2,13 @@ import java.io.File; import java.util.Arrays; +import java.util.Set; import org.scribble.ast.ProtocolDecl; +import org.scribble.ext.go.core.ast.global.RPCoreGType; +import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.index.RPIndexPair; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.util.ScribUtil; @@ -93,6 +97,23 @@ public static String getSmt2_gt(RPIndexExpr x, RPIndexExpr y) return "(" + op + " " + x.toSmt2Formula() + " " + y.toSmt2Formula() + ")"; }*/ + public static Smt2Translator getSmt2Translator(RPCoreGType gt) + { + Set irs = gt.getIndexedRoles(); + if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().allMatch(z -> z instanceof RPIndexPair)))) + { + return new PairSmt2Translator(); + } + else if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().noneMatch(z -> z instanceof RPIndexPair)))) + { + return new IntSmt2Translator(); + } + else + { + throw new RuntimeException("Shouldn't get in here: " + irs); + } + } + // Based on CommandLine::runDot, JobContext::runAut, etc public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) //throws ScribbleException { From 705e8317d45a2dc26de4300219d72511cdbf436c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 16:48:52 +0100 Subject: [PATCH 364/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 55 ++++++++++++++++--- .../ext/go/util/IntSmt2Translator.java | 12 ++++ .../ext/go/util/PairSmt2Translator.java | 12 ++++ .../scribble/ext/go/util/Smt2Translator.java | 17 ++++++ 4 files changed, 88 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 365a31d68..68a691298 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -3,6 +3,8 @@ import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -155,17 +157,30 @@ private boolean checkForeachVarAlignment(GoJob job, Stack tmp = Stream.of(s, d).flatMap(r -> r.getIndexVars().stream()).collect(Collectors.toSet()); + Set vars = Stream.of(s, d).flatMap(r -> r.getIndexVars().stream()).collect(Collectors.toSet()); // Duplicated from DOT_TRANSFER - String smt2 = "(assert" - + (tmp.isEmpty() ? "" : " (forall (" + tmp.stream().map(v -> "(" + v + " Int)").collect(Collectors.joining(" "))) + ") " + /*String smt2 = "(assert" + + (tmp.isEmpty() ? "" : " (forall (" + vars.stream().map(v -> "(" + v + " Int)").collect(Collectors.joining(" "))) + ") " + "(and (= (- " + s.end.toSmt2Formula() + " " + s.start.toSmt2Formula() + ") (- " + d.end.toSmt2Formula() + " " + d.start.toSmt2Formula() + "))" + (!this.src.getName().equals(this.dest.getName()) ? "" : " (not (= " + s.start.toSmt2Formula() + " " + d.start.toSmt2Formula() + "))") + ")" + (tmp.isEmpty() ? "" : ")") - + ")"; + + ")";*/ + + List cs = new LinkedList<>(); + cs.add(smt2t.makeEq(smt2t.makeSub(s.end.toSmt2Formula(), s.start.toSmt2Formula()), smt2t.makeSub(d.end.toSmt2Formula(), d.start.toSmt2Formula()))); + if (this.src.getName().equals(this.dest.getName())) + { + cs.add(smt2t.makeNot(smt2t.makeEq(s.start.toSmt2Formula(), d.start.toSmt2Formula()))); + } + String smt2 = (cs.size() == 1) ? cs.get(0) : smt2t.makeAnd(cs); + if (!vars.isEmpty()) + { + smt2 = smt2t.makeForall(vars.stream().map(x -> x.toSmt2Formula()).collect(Collectors.toList()), smt2); + } + smt2 = smt2t.makeAssert(smt2); job.debugPrintln("\n[param-core] [WF] Checking foreach-var alignment between " + srcRange + " and " + destRange + ":\n " + smt2); @@ -208,15 +223,15 @@ private boolean checkOverlappingIntervals(GoJob job, { RPInterval srcRange = this.src.getParsedRange(); RPInterval destRange = this.dest.getParsedRange(); + Map peek = context.isEmpty() ? Collections.emptyMap() : context.peek(); + Set curr = peek.keySet().stream().map(k -> k.name).collect(Collectors.toSet()); - String smt2 = "(assert (exists ((foobartmp Int)"; // FIXME: factor out + /*String smt2 = "(assert (exists ((foobartmp Int)"; // FIXME: factor out smt2 += vars.stream().map(v -> " (" + v.name + " Int)").collect(Collectors.joining("")); smt2 += ") (and"; smt2 += vars.isEmpty() ? "" : vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")); // FIXME: lower bound constant '1' -- replace by global invariant - Map peek = context.isEmpty() ? Collections.emptyMap() : context.peek(); - Set curr = peek.keySet().stream().map(k -> k.name).collect(Collectors.toSet()); Set srcAndDestVars = new HashSet<>(); srcAndDestVars.addAll(this.src.getIndexVars()); srcAndDestVars.addAll(this.dest.getIndexVars()); @@ -233,7 +248,31 @@ private boolean checkOverlappingIntervals(GoJob job, smt2 += Stream.of(srcRange, destRange) .map(r -> " (>= foobartmp " + r.start.toSmt2Formula() + ") (<= foobartmp " + r.end.toSmt2Formula() + ")") .collect(Collectors.joining()); - smt2 += ")))"; + smt2 += ")))";*/ + + List cs = new LinkedList<>(); + vars.forEach(x -> cs.add(smt2t.makeGte(x.toSmt2Formula(), "1"))); + Set srcAndDestVars = new HashSet<>(); + srcAndDestVars.addAll(this.src.getIndexVars()); + srcAndDestVars.addAll(this.dest.getIndexVars()); + for (RPIndexVar sv : srcAndDestVars) + { + String tmp = sv.toString(); + if (curr.contains(tmp)) // FIXME: awkwardness of RPForeachVar and RPIndexVar + { + RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp)); + cs.add(smt2t.makeEq(sv.toSmt2Formula(), ival.start.toSmt2Formula())); + } + } + Stream.of(srcRange, destRange).forEach(r -> + { + cs.add(smt2t.makeGte("foobartmp", r.start.toSmt2Formula())); + cs.add(smt2t.makeLte("foobartmp", r.end.toSmt2Formula())); + }); + List tmp = new LinkedList<>(); + tmp.add("foobartmp"); + vars.forEach(x -> tmp.add(x.toSmt2Formula())); + String smt2 = smt2t.makeAssert(smt2t.makeExists(tmp, smt2t.makeAnd(cs))); job.debugPrintln("\n[param-core] [WF] Checking non-overlapping ranges (potential self-communication) for " + this.src.getName() + ":\n " + smt2); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java index dea89719a..85b807875 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java @@ -35,4 +35,16 @@ public String getGteOp() { return ">="; } + + @Override + public String getPlusOp() + { + return "+"; + } + + @Override + public String getSubOp() + { + return "-"; + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java index f25447452..3405cd0ce 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java @@ -35,4 +35,16 @@ public String getGteOp() { return "pair_gte"; } + + @Override + public String getPlusOp() + { + throw new RuntimeException("TODO: "); + } + + @Override + public String getSubOp() + { + throw new RuntimeException("TODO: "); + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java index 7a7ce0dc4..c44829230 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java @@ -22,6 +22,8 @@ public Smt2Translator() public abstract String getLteOp(); public abstract String getGtOp(); public abstract String getGteOp(); + public abstract String getPlusOp(); + public abstract String getSubOp(); //public String makeVarDecl(RPIndexVar v) public String makeVarDecl(String v) @@ -67,6 +69,21 @@ public String makeGte(String x, String y) return "(" + getGteOp() + " " + x + " " + y + ")"; } + public String makePlus(String x, String y) + { + return "(" + getPlusOp() + " " + x + " " + y + ")"; + } + + public String makeSub(String x, String y) + { + return "(" + getSubOp() + " " + x + " " + y + ")"; + } + + public String makeEq(String x, String y) + { + return "(= " + x + " " + y + ")"; + } + public String makeAnd(String... cs) // OK because cs last parameter { return makeAnd(Arrays.asList(cs)); From f42eae33b52e34dd6f281b78a818ef37ff8f50dc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 16:56:49 +0100 Subject: [PATCH 365/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 68a691298..44ceb535c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -11,6 +11,7 @@ import java.util.Stack; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -315,16 +316,26 @@ private boolean checkForeachVars(GoJob job, Stack> private boolean checkSingletonChoiceSubject(GoJob job, GProtocolDecl gpd, Set vars, Smt2Translator smt2t) { RPInterval srcRange = this.src.getParsedRange(); - String bar = "(assert " + /*String bar = "(assert " + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and ") + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant + "(not (= (- " + srcRange.end.toSmt2Formula() + " " + srcRange.start.toSmt2Formula() + ") 0))" + (vars.isEmpty() ? "" : "))") - + ")"; + + ")";*/ + + List cs = new LinkedList<>(); + vars.forEach(v -> cs.add(smt2t.makeGte(v.toSmt2Formula(), "1"))); + cs.add(smt2t.makeNot(smt2t.makeEq(smt2t.makeSub(srcRange.end.toSmt2Formula(), srcRange.start.toSmt2Formula()), "0"))); + String smt2 = smt2t.makeAnd(cs); + if (!vars.isEmpty()) + { + smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula()).collect(Collectors.toList()), smt2); + } + smt2 = smt2t.makeAssert(smt2); - job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subject for " + this.src + ":\n " + bar); + job.debugPrintln("\n[param-core] [WF] Checking singleton choice-subject for " + this.src + ":\n " + smt2); - if (Z3Wrapper.checkSat(job, gpd, bar)) + if (Z3Wrapper.checkSat(job, gpd, smt2)) { return false; } From 8ee9ff1a480bdc238e10c4d809fa46eef414f157 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 17:06:14 +0100 Subject: [PATCH 366/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 44ceb535c..e0e7daddb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -11,7 +11,6 @@ import java.util.Stack; import java.util.function.Function; import java.util.function.Predicate; -import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -369,7 +368,7 @@ private boolean checkIntervalRanges(GoJob job, GProtocolDecl gpd, Set foo1 = r -> // FIXME: factor out with above + /*Function foo1 = r -> // FIXME: factor out with above "(assert " + (vars.isEmpty() ? "" : "(exists (" + vars.stream().map(v -> "(" + v.name + " Int)").collect(Collectors.joining(" ")) + ") (and (and") + vars.stream().map(v -> " (>= " + v + " 1)").collect(Collectors.joining("")) // FIXME: lower bound constant -- replace by global invariant @@ -377,7 +376,20 @@ private boolean checkIntervalRanges(GoJob job, GProtocolDecl gpd, Set " + r.start.toSmt2Formula() + " " + r.end.toSmt2Formula() + ")" //+ Z3Wrapper.getSmt2_gt(r.start, r.end) + (vars.isEmpty() ? "" : "))") - + ")"; + + ")";*/ + + Function foo1 = r -> // FIXME: factor out with above + { + List cs = new LinkedList<>(); + vars.forEach(x -> cs.add(smt2t.makeGte(x.toSmt2Formula(), "1"))); + cs.add(smt2t.makeGt(r.start.toSmt2Formula(), r.end.toSmt2Formula())); + String smt2 = smt2t.makeAnd(cs); + if (!vars.isEmpty()) + { + smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula()).collect(Collectors.toList()), smt2); + } + return smt2t.makeAssert(smt2); + }; Predicate foo2 = r -> { String foo = foo1.apply(r); From 4da5d78b994b90d12483e3476d714d7822e74c49 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 17:45:12 +0100 Subject: [PATCH 367/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 8 +- .../ext/go/core/cli/RPCoreCommandLine.java | 4 +- .../ext/go/util/IntSmt2Translator.java | 13 +++ .../ext/go/util/PairSmt2Translator.java | 15 +++- .../scribble/ext/go/util/Smt2Translator.java | 5 +- .../org/scribble/ext/go/util/Z3Wrapper.java | 82 +------------------ .../src/test/scrib/param/tmp/ParamTest.scr | 12 ++- 7 files changed, 48 insertions(+), 91 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index e0e7daddb..05b1a58a6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -251,7 +251,7 @@ private boolean checkOverlappingIntervals(GoJob job, smt2 += ")))";*/ List cs = new LinkedList<>(); - vars.forEach(x -> cs.add(smt2t.makeGte(x.toSmt2Formula(), "1"))); + vars.forEach(x -> cs.add(smt2t.makeGte(x.toSmt2Formula(), smt2t.getDefaultBaseValue()))); Set srcAndDestVars = new HashSet<>(); srcAndDestVars.addAll(this.src.getIndexVars()); srcAndDestVars.addAll(this.dest.getIndexVars()); @@ -323,8 +323,8 @@ private boolean checkSingletonChoiceSubject(GoJob job, GProtocolDecl gpd, Set cs = new LinkedList<>(); - vars.forEach(v -> cs.add(smt2t.makeGte(v.toSmt2Formula(), "1"))); - cs.add(smt2t.makeNot(smt2t.makeEq(smt2t.makeSub(srcRange.end.toSmt2Formula(), srcRange.start.toSmt2Formula()), "0"))); + vars.forEach(v -> cs.add(smt2t.makeGte(v.toSmt2Formula(), smt2t.getDefaultBaseValue()))); + cs.add(smt2t.makeNot(smt2t.makeEq(smt2t.makeSub(srcRange.end.toSmt2Formula(), srcRange.start.toSmt2Formula()), smt2t.getZeroValue()))); String smt2 = smt2t.makeAnd(cs); if (!vars.isEmpty()) { @@ -381,7 +381,7 @@ private boolean checkIntervalRanges(GoJob job, GProtocolDecl gpd, Set foo1 = r -> // FIXME: factor out with above { List cs = new LinkedList<>(); - vars.forEach(x -> cs.add(smt2t.makeGte(x.toSmt2Formula(), "1"))); + vars.forEach(x -> cs.add(smt2t.makeGte(x.toSmt2Formula(), smt2t.getDefaultBaseValue()))); cs.add(smt2t.makeGt(r.start.toSmt2Formula(), r.end.toSmt2Formula())); String smt2 = smt2t.makeAnd(cs); if (!vars.isEmpty()) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 7c978570f..155b65689 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -549,7 +549,7 @@ private Map, Set>, Set */ List cs = new LinkedList<>(); - cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(), "1")).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations + cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations for (RPInterval ival : peerVariant.intervals) // Is there a peer index inside all the peer-variant intervals { cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula())); @@ -655,7 +655,7 @@ private Set, Set>> getFamilies(GoJob job, smt2 += ")";*/ List cs = new LinkedList<>(); - cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(), "1")).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations + cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations cs.addAll(cand.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t)).collect(Collectors.toList())); cs.addAll(coset.stream().map(v -> smt2t.makeNot(makePhiSmt2(v.intervals, v.cointervals, smt2t))).collect(Collectors.toList())); String smt2 = smt2t.makeAnd(cs); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java index 85b807875..9342b6739 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java @@ -7,11 +7,24 @@ public IntSmt2Translator() //super(Sort.Int); } + @Override public String getSort() { return "Int"; } + @Override + public String getZeroValue() + { + return "0"; + } + + @Override + public String getDefaultBaseValue() + { + return "1"; + } + @Override public String getLtOp() { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java index 3405cd0ce..5f80a4868 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java @@ -7,9 +7,22 @@ public PairSmt2Translator() //super(Sort.Pair); } + @Override public String getSort() { - return "Pair"; + return "(Pair Int Int)"; + } + + @Override + public String getZeroValue() + { + return "(mk-pair 0 0)"; + } + + @Override + public String getDefaultBaseValue() + { + return "(mk-pair 1 1)"; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java index c44829230..b28a8a721 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java @@ -4,8 +4,6 @@ import java.util.List; import java.util.stream.Collectors; -import org.scribble.ext.go.type.index.RPIndexVar; - public abstract class Smt2Translator { /*enum Sort { Int, Pair } @@ -25,6 +23,9 @@ public Smt2Translator() public abstract String getPlusOp(); public abstract String getSubOp(); + public abstract String getZeroValue(); + public abstract String getDefaultBaseValue(); + //public String makeVarDecl(RPIndexVar v) public String makeVarDecl(String v) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index 082d45070..83de830cf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -17,86 +17,6 @@ public class Z3Wrapper { - /*public static String getSmt2VarDecl(RPIndexExpr x) - { - if (x instanceof RPIndexPair) - { - return () - } - }*/ - - /*public static String getSmt2_lte(RPIndexExpr x, RPIndexExpr y) - { - String op; - if (x instanceof RPIndexPair) - { - if (!(y instanceof RPIndexPair)) - { - throw new RuntimeException("Shouldn't get in here: " + x + ", " + y); - } - op = "pair_lte"; - } - else - { - op = "<="; - } - return "(" + op + " " + x.toSmt2Formula() + " " + y.toSmt2Formula() + ")"; - } - - public static String getSmt2_lt(RPIndexExpr x, RPIndexExpr y) - { - String op; - if (x instanceof RPIndexPair) - { - if (!(y instanceof RPIndexPair)) - { - throw new RuntimeException("Shouldn't get in here: " + x + ", " + y); - } - op = "pair_lt"; - } - else - { - op = "<"; - } - return "(" + op + " " + x.toSmt2Formula() + " " + y.toSmt2Formula() + ")"; - } - - public static String getSmt2_gte(RPIndexExpr x, RPIndexExpr y) - { - String op; - if (x instanceof RPIndexPair) - { - if (!(y instanceof RPIndexPair)) - { - throw new RuntimeException("Shouldn't get in here: " + x + ", " + y); - } - op = "pair_gte"; - } - else - { - op = ">="; - } - return "(" + op + " " + x.toSmt2Formula() + " " + y.toSmt2Formula() + ")"; - } - - public static String getSmt2_gt(RPIndexExpr x, RPIndexExpr y) - { - String op; - if (x instanceof RPIndexPair) - { - if (!(y instanceof RPIndexPair)) - { - throw new RuntimeException("Shouldn't get in here: " + x + ", " + y); - } - op = "pair_gt"; - } - else - { - op = ">"; - } - return "(" + op + " " + x.toSmt2Formula() + " " + y.toSmt2Formula() + ")"; - }*/ - public static Smt2Translator getSmt2Translator(RPCoreGType gt) { Set irs = gt.getIndexedRoles(); @@ -132,6 +52,8 @@ public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) + "(define-fun pair_lt ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Bool (and (pair_lte p!1 p!2) (not (= p!1 p!2))))\n" + "(define-fun pair_gte ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Bool (pair_lte p!2 p!1))\n" + "(define-fun pair_gt ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) Bool (pair_lt p!2 p!1))\n" + + "(define-fun pair_plus ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) (Pair Int Int) (mk-pair (+ (fst p!1) (fst p!2)) (+ (snd p!1) (snd p!2))))\n" + + "(define-fun pair_sub ((p!1 (Pair Int Int)) (p!2 (Pair Int Int))) (Pair Int Int) (mk-pair (- (fst p!1) (fst p!2)) (- (snd p!1) (snd p!2))))\n" + smt2; smt2 = smt2 + "\n(check-sat)\n(exit)"; try diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index fab6e0b7d..713330ceb 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -10,11 +10,19 @@ module param.tmp.ParamTest; global protocol Proto1(role A, role B) { - //Foo() from A[(1,1)] to B[(1,1)]; - Foo() from A[1] to B[1]; + Foo() from A[(1,1)] to B[K]; + //Foo() from A[1] to B[1]; } +/* +global protocol Proto1(role A, role B) +{ + Foo() from A[K] to B[K]; // FIXME: 1d or 2d? +} +//*/ + + /*//foreach { A , B , C }{ i:k 11 ..k wh } do ( A [ i ]→ C [ i ] :Val.B [ i ]→ C [ i ] :Val.cont ) ;end global protocol Proto1(role A, role B, role C) { From a5aa2bea333f63ec9bbe749b9e6c9b17c5af9417 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 17:46:15 +0100 Subject: [PATCH 368/433] Continued. --- .../main/java/org/scribble/ext/go/util/Z3Wrapper.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index 83de830cf..9f2ba0816 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -20,13 +20,14 @@ public class Z3Wrapper public static Smt2Translator getSmt2Translator(RPCoreGType gt) { Set irs = gt.getIndexedRoles(); - if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().allMatch(z -> z instanceof RPIndexPair)))) + if (irs.isEmpty() || + irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().noneMatch(z -> z instanceof RPIndexPair)))) { - return new PairSmt2Translator(); + return new IntSmt2Translator(); } - else if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().noneMatch(z -> z instanceof RPIndexPair)))) + else if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().allMatch(z -> z instanceof RPIndexPair)))) { - return new IntSmt2Translator(); + return new PairSmt2Translator(); } else { From 16f1594d99b1cf3904c7195ec611cc372119a0a9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 18:11:56 +0100 Subject: [PATCH 369/433] Continued. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 28 +++++++------- .../go/core/ast/global/RPCoreGForeach.java | 6 ++- .../ext/go/core/cli/RPCoreCommandLine.java | 38 +++++++++---------- .../ext/go/type/index/RPBinIndexExpr.java | 18 +++++---- .../ext/go/type/index/RPIndexExpr.java | 5 ++- .../ext/go/type/index/RPIndexInt.java | 12 +++++- .../ext/go/type/index/RPIndexPair.java | 17 +++++++-- .../ext/go/type/index/RPIndexVal.java | 6 +++ .../ext/go/type/index/RPIndexVar.java | 4 +- .../ext/go/util/PairSmt2Translator.java | 4 +- .../src/test/scrib/param/tmp/ParamTest.scr | 11 +++++- 11 files changed, 94 insertions(+), 55 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVal.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 05b1a58a6..7347cfb56 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -170,15 +170,15 @@ private boolean checkForeachVarAlignment(GoJob job, Stack cs = new LinkedList<>(); - cs.add(smt2t.makeEq(smt2t.makeSub(s.end.toSmt2Formula(), s.start.toSmt2Formula()), smt2t.makeSub(d.end.toSmt2Formula(), d.start.toSmt2Formula()))); + cs.add(smt2t.makeEq(smt2t.makeSub(s.end.toSmt2Formula(smt2t), s.start.toSmt2Formula(smt2t)), smt2t.makeSub(d.end.toSmt2Formula(smt2t), d.start.toSmt2Formula(smt2t)))); if (this.src.getName().equals(this.dest.getName())) { - cs.add(smt2t.makeNot(smt2t.makeEq(s.start.toSmt2Formula(), d.start.toSmt2Formula()))); + cs.add(smt2t.makeNot(smt2t.makeEq(s.start.toSmt2Formula(smt2t), d.start.toSmt2Formula(smt2t)))); } String smt2 = (cs.size() == 1) ? cs.get(0) : smt2t.makeAnd(cs); if (!vars.isEmpty()) { - smt2 = smt2t.makeForall(vars.stream().map(x -> x.toSmt2Formula()).collect(Collectors.toList()), smt2); + smt2 = smt2t.makeForall(vars.stream().map(x -> x.toSmt2Formula(smt2t)).collect(Collectors.toList()), smt2); } smt2 = smt2t.makeAssert(smt2); @@ -251,7 +251,7 @@ private boolean checkOverlappingIntervals(GoJob job, smt2 += ")))";*/ List cs = new LinkedList<>(); - vars.forEach(x -> cs.add(smt2t.makeGte(x.toSmt2Formula(), smt2t.getDefaultBaseValue()))); + vars.forEach(x -> cs.add(smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue()))); Set srcAndDestVars = new HashSet<>(); srcAndDestVars.addAll(this.src.getIndexVars()); srcAndDestVars.addAll(this.dest.getIndexVars()); @@ -261,17 +261,17 @@ private boolean checkOverlappingIntervals(GoJob job, if (curr.contains(tmp)) // FIXME: awkwardness of RPForeachVar and RPIndexVar { RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp)); - cs.add(smt2t.makeEq(sv.toSmt2Formula(), ival.start.toSmt2Formula())); + cs.add(smt2t.makeEq(sv.toSmt2Formula(smt2t), ival.start.toSmt2Formula(smt2t))); } } Stream.of(srcRange, destRange).forEach(r -> { - cs.add(smt2t.makeGte("foobartmp", r.start.toSmt2Formula())); - cs.add(smt2t.makeLte("foobartmp", r.end.toSmt2Formula())); + cs.add(smt2t.makeGte("foobartmp", r.start.toSmt2Formula(smt2t))); + cs.add(smt2t.makeLte("foobartmp", r.end.toSmt2Formula(smt2t))); }); List tmp = new LinkedList<>(); tmp.add("foobartmp"); - vars.forEach(x -> tmp.add(x.toSmt2Formula())); + vars.forEach(x -> tmp.add(x.toSmt2Formula(smt2t))); String smt2 = smt2t.makeAssert(smt2t.makeExists(tmp, smt2t.makeAnd(cs))); job.debugPrintln("\n[param-core] [WF] Checking non-overlapping ranges (potential self-communication) for " + this.src.getName() + ":\n " + smt2); @@ -323,12 +323,12 @@ private boolean checkSingletonChoiceSubject(GoJob job, GProtocolDecl gpd, Set cs = new LinkedList<>(); - vars.forEach(v -> cs.add(smt2t.makeGte(v.toSmt2Formula(), smt2t.getDefaultBaseValue()))); - cs.add(smt2t.makeNot(smt2t.makeEq(smt2t.makeSub(srcRange.end.toSmt2Formula(), srcRange.start.toSmt2Formula()), smt2t.getZeroValue()))); + vars.forEach(v -> cs.add(smt2t.makeGte(v.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue()))); + cs.add(smt2t.makeNot(smt2t.makeEq(smt2t.makeSub(srcRange.end.toSmt2Formula(smt2t), srcRange.start.toSmt2Formula(smt2t)), smt2t.getZeroValue()))); String smt2 = smt2t.makeAnd(cs); if (!vars.isEmpty()) { - smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula()).collect(Collectors.toList()), smt2); + smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula(smt2t)).collect(Collectors.toList()), smt2); } smt2 = smt2t.makeAssert(smt2); @@ -381,12 +381,12 @@ private boolean checkIntervalRanges(GoJob job, GProtocolDecl gpd, Set foo1 = r -> // FIXME: factor out with above { List cs = new LinkedList<>(); - vars.forEach(x -> cs.add(smt2t.makeGte(x.toSmt2Formula(), smt2t.getDefaultBaseValue()))); - cs.add(smt2t.makeGt(r.start.toSmt2Formula(), r.end.toSmt2Formula())); + vars.forEach(x -> cs.add(smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue()))); + cs.add(smt2t.makeGt(r.start.toSmt2Formula(smt2t), r.end.toSmt2Formula(smt2t))); String smt2 = smt2t.makeAnd(cs); if (!vars.isEmpty()) { - smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula()).collect(Collectors.toList()), smt2); + smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula(smt2t)).collect(Collectors.toList()), smt2); } return smt2t.makeAssert(smt2); }; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index e7fd838a8..0d79113f2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -22,7 +22,7 @@ import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexFactory; -import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexVal; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.ext.go.util.Smt2Translator; import org.scribble.type.kind.Global; @@ -172,7 +172,9 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set ivals.stream().filter(y -> !x.equals(y)).allMatch(y -> ((RPIndexInt) x.start).val >= ((RPIndexInt) y.start).val)) + .filter(x -> ivals.stream().filter(y -> !x.equals(y)) + //.allMatch(y -> ((RPIndexInt) x.start).val >= ((RPIndexInt) y.start).val)) + .allMatch(y -> ((RPIndexVal) x.start).gtEq(((RPIndexVal) y.start)))) .findFirst().get(); // FIXME: non-RPIndexInt start exprs for nat intervals -- FIXME: generalised interval comparison (multidim) RPIndexVar var = RPIndexFactory.ParamIntVar(max.var.toString()); // N.B. not RPForeachVar -- occurrences in body are parsed as RPIndexVar, not RPForeachVar diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 155b65689..8c88b04ea 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -492,7 +492,7 @@ private Map, Set>, Set if (//!peerVariant.equals(self) && // No: e.g., pipe/ring middlemen !peers.contains(peerVariant)) { - job.debugPrintln("\n[rp-core] For " + self + ", checking potential peer: " + peerVariant); + job.debugPrintln("\n[rp-core] For " + self + ", checking peer candidate: " + peerVariant); // "checking potential peer" means checking if any of our action-peer indexed roles fits the candidate variant-peer (so we would need a dial/accept for them) for (RPIndexedRole ir : actionIRs) { @@ -549,36 +549,36 @@ private Map, Set>, Set */ List cs = new LinkedList<>(); - cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations + cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations for (RPInterval ival : peerVariant.intervals) // Is there a peer index inside all the peer-variant intervals { - cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula())); - cs.add(smt2t.makeLte("peer", ival.end.toSmt2Formula())); + cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula(smt2t))); + cs.add(smt2t.makeLte("peer", ival.end.toSmt2Formula(smt2t))); } cs.addAll(peerVariant.cointervals.stream() // ...and the peer index is outside one of the peer-variant cointervals - .map(x -> smt2t.makeOr(smt2t.makeLt("peer", x.start.toSmt2Formula()), smt2t.makeGt("peer", x.end.toSmt2Formula()))).collect(Collectors.toList()) + .map(x -> smt2t.makeOr(smt2t.makeLt("peer", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("peer", x.end.toSmt2Formula(smt2t)))).collect(Collectors.toList()) ); // ...and the peer index is inside our I/O action interval -- then this is peer-variant is a peer - cs.add(smt2t.makeGte("peer", d.start.toSmt2Formula())); - cs.add(smt2t.makeLte("peer", d.end.toSmt2Formula())); + cs.add(smt2t.makeGte("peer", d.start.toSmt2Formula(smt2t))); + cs.add(smt2t.makeLte("peer", d.end.toSmt2Formula(smt2t))); if (vars.contains(RPIndexSelf.SELF)) { // FIXME: factor out variant/covariant inclusion/exclusion with above for (RPInterval ival : self.intervals) // Is there a self index inside all the self-variant intervals { - cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula())); - cs.add(smt2t.makeLte("peer", ival.end.toSmt2Formula())); + cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula(smt2t))); + cs.add(smt2t.makeLte("peer", ival.end.toSmt2Formula(smt2t))); } cs.addAll(self.cointervals.stream() // ...and the self index is outside one of the self-variant cointervals - .map(x -> smt2t.makeOr(smt2t.makeLt("self", x.start.toSmt2Formula()), smt2t.makeGt("peer", x.end.toSmt2Formula()))).collect(Collectors.toList()) + .map(x -> smt2t.makeOr(smt2t.makeLt("self", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("peer", x.end.toSmt2Formula(smt2t)))).collect(Collectors.toList()) ); } String smt2 = smt2t.makeAnd(cs); List tmp = new LinkedList<>(); tmp.add("peer"); - tmp.addAll(vars.stream().map(x -> x.toSmt2Formula()).collect(Collectors.toList())); + tmp.addAll(vars.stream().map(x -> x.toSmt2Formula(smt2t)).collect(Collectors.toList())); smt2 = smt2t.makeExists(tmp, smt2); smt2 = smt2t.makeAssert(smt2); @@ -655,13 +655,13 @@ private Set, Set>> getFamilies(GoJob job, smt2 += ")";*/ List cs = new LinkedList<>(); - cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations + cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations cs.addAll(cand.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t)).collect(Collectors.toList())); cs.addAll(coset.stream().map(v -> smt2t.makeNot(makePhiSmt2(v.intervals, v.cointervals, smt2t))).collect(Collectors.toList())); String smt2 = smt2t.makeAnd(cs); if (!vars.isEmpty()) { - smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula()).collect(Collectors.toList()), smt2); + smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula(smt2t)).collect(Collectors.toList()), smt2); } smt2 = smt2t.makeAssert(smt2); @@ -729,7 +729,7 @@ private Set, Set>> getFamilies(GoJob job, if (!vars.isEmpty()) { //z3 = "(exists (" + vars.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + ") " + z3 + ")"; - z3 = smt2t.makeExists(vars.stream().map(v -> v.toSmt2Formula()).collect(Collectors.toList()), z3); + z3 = smt2t.makeExists(vars.stream().map(v -> v.toSmt2Formula(smt2t)).collect(Collectors.toList()), z3); } z3 = smt2t.makeAssert(z3); @@ -762,11 +762,11 @@ private static String makePhiSmt2(Set cand, Set coset, S //"(and (>= self " + c.start.toSmt2Formula() + ") (<= self " + c.end.toSmt2Formula() + ")" + ((!c.start.isConstant() || !c.end.isConstant()) ? " (<= " + c.start.toSmt2Formula() + " " + c.end.toSmt2Formula() + ")" : "") + ")" { List tmp = new LinkedList<>(); - tmp.add(smt2t.makeGte("self", c.start.toSmt2Formula())); - tmp.add(smt2t.makeLte("self", c.end.toSmt2Formula())); + tmp.add(smt2t.makeGte("self", c.start.toSmt2Formula(smt2t))); + tmp.add(smt2t.makeLte("self", c.end.toSmt2Formula(smt2t))); if (!c.start.isConstant() || !c.end.isConstant()) { - tmp.add(smt2t.makeLte(c.start.toSmt2Formula(), c.end.toSmt2Formula())); + tmp.add(smt2t.makeLte(c.start.toSmt2Formula(smt2t), c.end.toSmt2Formula(smt2t))); } return smt2t.makeAnd(tmp); }) @@ -787,10 +787,10 @@ private static String makePhiSmt2(Set cand, Set coset, S { List tmp = new LinkedList<>(); //tmp.add(smt2t.makeOr(smt2t.makeLt("self", c.start.toSmt2Formula()), smt2t.makeGt("self", c.end.toSmt2Formula()))); - tmp.add(smt2t.makeNot(smt2t.makeAnd(smt2t.makeGte("self", c.start.toSmt2Formula()), smt2t.makeLte("self", c.end.toSmt2Formula())))); + tmp.add(smt2t.makeNot(smt2t.makeAnd(smt2t.makeGte("self", c.start.toSmt2Formula(smt2t)), smt2t.makeLte("self", c.end.toSmt2Formula(smt2t))))); if (!c.start.isConstant() || !c.end.isConstant()) { - tmp.add(smt2t.makeLte(c.start.toSmt2Formula(), c.end.toSmt2Formula())); // CHECKME: Needed? + tmp.add(smt2t.makeLte(c.start.toSmt2Formula(smt2t), c.end.toSmt2Formula(smt2t))); // CHECKME: Needed? } return (tmp.size() == 1) ? tmp.get(0) : smt2t.makeAnd(tmp); }) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java index 90ba7edd1..d8e9575b2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java @@ -3,6 +3,8 @@ import java.util.HashSet; import java.util.Set; +import org.scribble.ext.go.util.Smt2Translator; + // Binary arithmetic public class RPBinIndexExpr extends RPIndexExpr @@ -20,8 +22,8 @@ public String toString() { case Add: return "+"; case Subt: return "-"; - case Mult: return "*"; - default: throw new RuntimeException("[param] Won't get in here: " + this); + case Mult: //return "*"; + default: throw new RuntimeException("[param] Shouldn't get in here: " + this); } } } @@ -94,16 +96,16 @@ public String toGoString() } @Override - public String toSmt2Formula() + public String toSmt2Formula(Smt2Translator smt2t) { - String left = this.left.toSmt2Formula(); - String right = this.right.toSmt2Formula(); + String left = this.left.toSmt2Formula(smt2t); + String right = this.right.toSmt2Formula(smt2t); String op; switch(this.op) { - case Add: op = "+"; break; - case Subt: op = "-"; break; - case Mult: op = "*"; break; + case Add: op = smt2t.getPlusOp(); break; + case Subt: op = smt2t.getSubOp(); break; + //case Mult: op = "*"; break; default: throw new RuntimeException("[param] Shouldn't get in here: " + this.op); } return "(" + op + " " + left + " " + right + ")"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java index b63dd89ee..048f5f712 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexExpr.java @@ -2,6 +2,8 @@ import java.util.Set; +import org.scribble.ext.go.util.Smt2Translator; + public abstract class RPIndexExpr { public boolean isConstant() @@ -16,7 +18,8 @@ public boolean isConstant() public abstract Set getVals(); // TODO: factor out a "value" interface public abstract Set getVars(); // N.B. doesn't include foreach params - public abstract String toSmt2Formula(); // Cf. toString -- but can be useful to separate, for debugging (and printing) + public abstract String toSmt2Formula(Smt2Translator smt2t); // Cf. toString -- but can be useful to separate, for debugging (and printing) + // FIXME: inconsistency with toString // TODO: factor out Smt2 translation interface // N.B. "syntactic" comparison diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java index 608cdb847..99ed5620f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexInt.java @@ -5,8 +5,10 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.scribble.ext.go.util.Smt2Translator; + // Integer literal -public class RPIndexInt extends RPIndexExpr +public class RPIndexInt extends RPIndexExpr implements RPIndexVal { public final int val; @@ -15,6 +17,12 @@ protected RPIndexInt(int i) this.val = i; } + @Override + public boolean gtEq(RPIndexVal them) + { + return this.val >= ((RPIndexInt) them).val; + } + @Override public RPIndexExpr minimise(int self) { @@ -34,7 +42,7 @@ public String toGoString() } @Override - public String toSmt2Formula() + public String toSmt2Formula(Smt2Translator smt2t) { return Integer.toString(this.val); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java index 3330a1514..3831bf444 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java @@ -5,9 +5,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.scribble.ext.go.util.Smt2Translator; + // Currently only considered as a value -public class RPIndexPair extends RPIndexExpr +public class RPIndexPair extends RPIndexExpr implements RPIndexVal { public final RPIndexExpr left; public final RPIndexExpr right; @@ -28,6 +30,13 @@ protected RPIndexPair(RPIndexExpr left, RPIndexExpr right) return (e instanceof RPIndexInt) || (e instanceof RPIndexVar); }*/ + @Override + public boolean gtEq(RPIndexVal them) + { + RPIndexPair p = (RPIndexPair) them; + return ((RPIndexInt) this.left).val >= ((RPIndexInt) p.left).val && ((RPIndexInt) this.right).val >= ((RPIndexInt) p.right).val; + } + @Override public RPIndexExpr minimise(int self) { @@ -42,10 +51,10 @@ public String toGoString() } @Override - public String toSmt2Formula() + public String toSmt2Formula(Smt2Translator smt2t) { - String left = this.left.toSmt2Formula(); - String right = this.right.toSmt2Formula(); + String left = this.left.toSmt2Formula(smt2t); + String right = this.right.toSmt2Formula(smt2t); return "(mk-pair " + left + " " + right + ")"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVal.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVal.java new file mode 100644 index 000000000..1699e7d96 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVal.java @@ -0,0 +1,6 @@ +package org.scribble.ext.go.type.index; + +public interface RPIndexVal +{ + public boolean gtEq(RPIndexVal them); +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java index 95ed893a3..24d280e11 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexVar.java @@ -4,6 +4,8 @@ import java.util.HashSet; import java.util.Set; +import org.scribble.ext.go.util.Smt2Translator; + // Variable occurrence public class RPIndexVar extends RPIndexExpr // FIXME: extend AbstractName? cf. Role -- e.g., for compatibility with NameCollector { @@ -32,7 +34,7 @@ public String toGoString() } @Override - public String toSmt2Formula() + public String toSmt2Formula(Smt2Translator smt2t) { /*if (this.name.startsWith("_dum")) // FIXME { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java index 5f80a4868..90ed812bb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java @@ -52,12 +52,12 @@ public String getGteOp() @Override public String getPlusOp() { - throw new RuntimeException("TODO: "); + return "pair_plus"; } @Override public String getSubOp() { - throw new RuntimeException("TODO: "); + return "pair_sub"; } } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 713330ceb..d1aeb6ebb 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,11 +8,13 @@ module param.tmp.ParamTest; +/* global protocol Proto1(role A, role B) { Foo() from A[(1,1)] to B[K]; //Foo() from A[1] to B[1]; } +//*/ /* @@ -23,10 +25,15 @@ global protocol Proto1(role A, role B) //*/ -/*//foreach { A , B , C }{ i:k 11 ..k wh } do ( A [ i ]→ C [ i ] :Val.B [ i ]→ C [ i ] :Val.cont ) ;end +//* +//foreach { A , B , C }{ i:k 11 ..k wh } do ( A [ i ]→ C [ i ] :Val.B [ i ]→ C [ i ] :Val.cont ) ;end global protocol Proto1(role A, role B, role C) { - foreach A[I:(1,1),(W,H)] + foreach A[IA:(1,1),K], B[IB:(1,1),K], C[IC:(1,1),K] + { + Foo() from A[IA] to C[IC]; + Bar() from B[IB] to C[IC]; + } } //*/ From 11643b7ec0251565a793caacb404c7791a401e89 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 18:42:02 +0100 Subject: [PATCH 370/433] Continued. --- .../go/core/ast/global/RPCoreGForeach.java | 5 ++- .../ext/go/type/index/RPBinIndexExpr.java | 44 +++++++++++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 14 +++++- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 0d79113f2..33c7ae555 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -171,10 +171,11 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set ivals.stream().filter(y -> !x.equals(y)) - //.allMatch(y -> ((RPIndexInt) x.start).val >= ((RPIndexInt) y.start).val)) - .allMatch(y -> ((RPIndexVal) x.start).gtEq(((RPIndexVal) y.start)))) + ////.allMatch(y -> ((RPIndexInt) x.start).val >= ((RPIndexInt) y.start).val)) + .allMatch(y -> ((RPIndexVal) x.start).gtEq(((RPIndexVal) y.start)))) // FIXME: general index expressions .findFirst().get(); // FIXME: non-RPIndexInt start exprs for nat intervals -- FIXME: generalised interval comparison (multidim) RPIndexVar var = RPIndexFactory.ParamIntVar(max.var.toString()); // N.B. not RPForeachVar -- occurrences in body are parsed as RPIndexVar, not RPForeachVar diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java index d8e9575b2..c95d96cf8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java @@ -84,6 +84,50 @@ else if (this.op == Op.Subt) return RPIndexFactory.ParamBinIndexExpr(Op.Subt, right, RPIndexFactory.ParamIntVal(-x)); } } + else + { + if (right instanceof RPIndexPair) + { + RPIndexPair y = ((RPIndexPair) right); + if (left instanceof RPIndexPair) + { + RPIndexPair x = ((RPIndexPair) left); + switch (this.op) + { + case Add: return RPIndexFactory.RPIndexPair(RPIndexFactory.ParamIntVal(((RPIndexInt) x.left).val + ((RPIndexInt) y.left).val), + RPIndexFactory.ParamIntVal(((RPIndexInt) x.right).val + ((RPIndexInt) y.right).val)); + case Subt: RPIndexFactory.RPIndexPair(RPIndexFactory.ParamIntVal(((RPIndexInt) x.left).val - ((RPIndexInt) y.left).val), + RPIndexFactory.ParamIntVal(((RPIndexInt) x.right).val - ((RPIndexInt) y.right).val)); + case Mult: //return RPIndexFactory.ParamIntVal(x * y); + default: throw new RuntimeException("Shouldn't get in here: " + this); + } + } + else + { + /*if (y < 0) // TODO + { + if (this.op == Op.Add) + { + return RPIndexFactory.ParamBinIndexExpr(Op.Subt, left, RPIndexFactory.ParamIntVal(-y)); + } + else if (this.op == Op.Subt) + { + return RPIndexFactory.ParamBinIndexExpr(Op.Add, left, RPIndexFactory.ParamIntVal(-y)); + } + }*/ + } + } + else + { + /*if (left instanceof RPIndexPair) // TODO + { + int x = ((RPIndexInt) left).val; + if (x < 0 && this.op == Op.Add) + { + return RPIndexFactory.ParamBinIndexExpr(Op.Subt, right, RPIndexFactory.ParamIntVal(-x)); + }*/ + } + } } return RPIndexFactory.ParamBinIndexExpr(this.op, left, right); } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index d1aeb6ebb..8152c1fcb 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -25,7 +25,7 @@ global protocol Proto1(role A, role B) //*/ -//* +/* //foreach { A , B , C }{ i:k 11 ..k wh } do ( A [ i ]→ C [ i ] :Val.B [ i ]→ C [ i ] :Val.cont ) ;end global protocol Proto1(role A, role B, role C) { @@ -38,6 +38,18 @@ global protocol Proto1(role A, role B, role C) //*/ +//* +//foreach W { i 1 :k 11 ..k wh -(1,0) , i 2 :k 11 +(1,0)..k wh } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; +//foreach W { i 1 :k w1 ..k wh , i 2 :k 11 ..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; +//foreach W { i 1 :k 11 ..k 1h -(0,1) , i 2 :k 11 +(0,1)..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ;W [ k 1h ]→ W [ k 11 ] .end +global protocol Proto1(role W) +{ + foreach W[I1:(1,1),K-(1,0)], W[I2:(1,1)+(1,0),K] { + Foo() from W[I1] to W[I2]; + } +} +//*/ + /* global protocol Proto1(role W) From 8e07c3a0f1dcee67c1bd838f2bb527e7a14ffcc6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 18:51:51 +0100 Subject: [PATCH 371/433] Disabled branch comments generation. --- .../codegen/statetype3/RPCoreSTBranchActionBuilder.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 541116e49..10d84d930 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -21,11 +21,12 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME //String scTypeName = rpapi.getStateChanName(curr); EState succ = curr.getSuccessor(a); - String labels = curr.getAllSuccessors().stream().map(s -> s.getActions().get(0)).map(act -> act.mid.toString()).collect(Collectors.joining(" or ")); + + //String labels = curr.getAllSuccessors().stream().map(s -> s.getActions().get(0)).map(act -> act.mid.toString()).collect(Collectors.joining(" or ")); return - "// " + getActionName(api, a) + " is a branch with branch label\n" - + "// " + labels + "\n" - + "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + /* "// " + getActionName(api, a) + " is a branch with branch label\n" + //+ "// " + labels + "\n"*/ + "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + buildArgs(null, a) + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: return type is interface, so no need for *return (unlike other state chans) + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" From e33def0214c9f4239923f6521f0139d665c8e537 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Sat, 13 Oct 2018 20:33:57 +0100 Subject: [PATCH 372/433] Fix for branch comment. --- .../codegen/statetype3/RPCoreSTBranchActionBuilder.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 10d84d930..85edd427f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -22,11 +22,12 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME EState succ = curr.getSuccessor(a); - //String labels = curr.getAllSuccessors().stream().map(s -> s.getActions().get(0)).map(act -> act.mid.toString()).collect(Collectors.joining(" or ")); + String branchComment = + "// " + getActionName(api, a) + " is a branch with branch label\n" + + "// " + curr.getActions().stream().map(action -> action.mid.toString()).collect(Collectors.joining(" or ")) + "\n"; return - /* "// " + getActionName(api, a) + " is a branch with branch label\n" - //+ "// " + labels + "\n"*/ - "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + branchComment + + "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + buildArgs(null, a) + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: return type is interface, so no need for *return (unlike other state chans) + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" From 81fafa6ab30d82116ff5f56f049d98e5d4e55600 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 22:09:43 +0100 Subject: [PATCH 373/433] In progress. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 10 ++++-- .../ext/go/core/cli/RPCoreCommandLine.java | 8 +++-- .../statetype3/RPCoreSTApiGenerator.java | 15 ++++++-- .../RPCoreSTStateChanApiBuilder.java | 5 +++ .../ext/go/type/index/RPBinIndexExpr.java | 2 +- .../ext/go/type/index/RPIndexExpr.java | 1 + .../ext/go/type/index/RPIndexPair.java | 3 +- .../src/test/scrib/param/tmp/ParamTest.scr | 34 ++++++++++++++++++- 8 files changed, 67 insertions(+), 11 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 7347cfb56..5fa0d7752 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -576,7 +576,8 @@ public RPCoreLType project3(RPCoreAstFactory af, Set roles, Set tmp = Stream.of(srcTmp, destTmp).filter(x -> x != null).collect(Collectors.toSet()); - if (!tmp.isEmpty() && roles.contains(destName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + if (//!tmp.isEmpty() && + roles.contains(destName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) fvars.containsAll(tmp)) { RPIndexExpr upper = (destTmp != null) ? ivals.stream().filter(x -> x.var.name.equals(destTmp)).findFirst().get().start : destStart; @@ -592,6 +593,8 @@ else if (!roles.contains(destName) || !(fvars.contains(srcStart.toString()) && f return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); } } + System.out.println("BBB: " + srcRange.start + " ,, " + srcRange.end + " ,, " + srcRange.start.equals(srcRange.end)); + System.out.println("BBB: " + destRange.start + " ,, " + destRange.end + " ,, " + destRange.start.equals(destRange.end)); // Otherwise try merge (if neither src/dest are subj) } else if (this.dest.equals(subj)) @@ -607,7 +610,8 @@ else if (this.dest.equals(subj)) String destTmp = (destStart instanceof RPIndexVar) ? ((RPIndexVar) destStart).name : null; // FIXME: awkwardness of RPIndexVar and RPForeachVar Set tmp = Stream.of(srcTmp, destTmp).filter(x -> x != null).collect(Collectors.toSet()); - if (!tmp.isEmpty() && roles.contains(srcName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) + if (//!tmp.isEmpty() && + roles.contains(srcName) && //fvars.contains(srcVar.toString()) && fvars.contains(destVar.toString())) fvars.containsAll(tmp)) { RPIndexExpr upper = (srcTmp != null) ? ivals.stream().filter(x -> x.var.name.equals(srcTmp)).findFirst().get().start : srcStart; @@ -638,6 +642,8 @@ else if (this.dest.equals(subj)) } else { + System.out.println("AAA: " + this.src + " ,, " + subj + " ,, " + this.src.equals(subj)); + System.out.println("AAA: " + this.dest + " ,, " + subj + " ,, " + this.dest.equals(subj)); throw new RuntimeException("[rp-core] Projection not defined: " + this + ", " + subj); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 8c88b04ea..6031c3607 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -65,6 +65,8 @@ public class RPCoreCommandLine extends CommandLine // HACK: store in (Core) Job/JobContext? private GProtocolDecl gpd; + private RPCoreGType gt; + private Smt2Translator smt2t; private Map> L0; private Map> E0; //protected ParamCoreSModel model; @@ -183,7 +185,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co } Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, - this.L0, this.E0, this.families, this.peers, this.subsum, this.aliases, impath, roles).build(); + this.L0, this.E0, this.families, this.peers, this.subsum, this.aliases, impath, roles, this.smt2t).build(); outputClasses(goClasses); } else @@ -252,9 +254,9 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws this.gpd = (GProtocolDecl) main.getProtocolDecl(simpname); RPCoreAstFactory af = new RPCoreAstFactory(); - RPCoreGType gt = new RPCoreGProtocolDeclTranslator(job, af).translate(this.gpd); + this.gt = new RPCoreGProtocolDeclTranslator(job, af).translate(this.gpd); - Smt2Translator smt2t = Z3Wrapper.getSmt2Translator(gt); + this.smt2t = Z3Wrapper.getSmt2Translator(gt); job.debugPrintln("\n[rp-core] Translated:\n " + gt); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 34f753f5e..1c361191c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -20,7 +20,9 @@ import org.scribble.ext.go.type.index.RPBinIndexExpr; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexInt; +import org.scribble.ext.go.type.index.RPIndexPair; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; import org.scribble.type.kind.Global; @@ -35,6 +37,7 @@ public class RPCoreSTApiGenerator { public final GoJob job; public final GProtocolName proto; // Full name + public final Smt2Translator smt2t; // FIXME: factor out an RPCoreJob(Context) public final Map> projections; @@ -60,7 +63,7 @@ public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map, Set>, Pair, Set>> subsum, Map, Set>, RPRoleVariant>> aliases, String packpath, //Role self) - List selfs) + List selfs, Smt2Translator smt2t) { this.job = job; this.proto = fullname; @@ -130,6 +133,8 @@ public int compare(Pair, Set> f1, Pair getVals(); // TODO: factor out a "value" interface public abstract Set getVars(); // N.B. doesn't include foreach params diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java index 3831bf444..4cd5856c9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java @@ -46,8 +46,7 @@ public RPIndexExpr minimise(int self) @Override public String toGoString() { - throw new RuntimeException("[param-core] TODO: " + this); - //return toString(); + return "util.Pair{" + this.left.toGoString() + ", " + this.right.toGoString() + "}"; } @Override diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 8152c1fcb..0df7cf2da 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,6 +8,38 @@ module param.tmp.ParamTest; +sig "message.QuoteReq" from "github.com/nickng/scribble-go-examples/11_quote-request/message" as QuoteReq; +type "message.Quote" from "github.com/nickng/scribble-go-examples/11_quote-request/message" as Quote; + + +global protocol Proto1(role Buyer, role Supplier, role Manufacturer) { + // (5) Supplier received updated quote + foreach Supplier[I:1,S] { + choice at Supplier[I] { + // (5a) Either Supplier respond by agreeing to it and sending a confirmation + Confirm() from Supplier[I] to Buyer[1]; + End() from Supplier[I] to Manufacturer[1,M]; + } or { + // (5b) Or Supplier modify it and sending it back to Buyer. + // Buyer goes back to (4) + Modify() from Supplier[I] to Buyer[1]; + NoOp() from Supplier[I] to Manufacturer[1,M]; + //do MakeDeal(Buyer, Supplier, Manufacturer); + } or { + // (5c) Or Supplier reject updated quote. + Reject() from Supplier[I] to Buyer[1]; + End() from Supplier[I] to Manufacturer[1,M]; + } or { + // (5d) Or Supplier renegotiate with the Manufacturers + // going back to (3) + Renegotiate() from Supplier[I] to Buyer[1]; + Renegotiate() from Supplier[I] to Manufacturer[1,M]; + //do Negotiate(Buyer, Supplier, Manufacturer); + } + } +} + + /* global protocol Proto1(role A, role B) { @@ -38,7 +70,7 @@ global protocol Proto1(role A, role B, role C) //*/ -//* +/* //foreach W { i 1 :k 11 ..k wh -(1,0) , i 2 :k 11 +(1,0)..k wh } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; //foreach W { i 1 :k w1 ..k wh , i 2 :k 11 ..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; //foreach W { i 1 :k 11 ..k 1h -(0,1) , i 2 :k 11 +(0,1)..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ;W [ k 1h ]→ W [ k 11 ] .end From e6ac7079d52b495ce89b1c53806ea0dbaab8dfda Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 22:40:52 +0100 Subject: [PATCH 374/433] Patch for projection level 3. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 5fa0d7752..d0e46a302 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -593,8 +593,10 @@ else if (!roles.contains(destName) || !(fvars.contains(srcStart.toString()) && f return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); } } - System.out.println("BBB: " + srcRange.start + " ,, " + srcRange.end + " ,, " + srcRange.start.equals(srcRange.end)); - System.out.println("BBB: " + destRange.start + " ,, " + destRange.end + " ,, " + destRange.start.equals(destRange.end)); + else if (!roles.contains(destName) || !(fvars.contains(srcRange.getIndexVars()) && fvars.contains(destRange.getIndexVars()))) + { + return af.ParamCoreLCrossChoice(this.dest, RPCoreLActionKind.CROSS_SEND, projs); + } // Otherwise try merge (if neither src/dest are subj) } else if (this.dest.equals(subj)) @@ -622,11 +624,15 @@ else if (this.dest.equals(subj)) RPIndexedRole src = new RPIndexedRole(destName.toString(), Stream.of(new RPInterval(srcExpr, srcExpr)).collect(Collectors.toSet())); return af.ParamCoreLCrossChoice(src, RPCoreLActionKind.CROSS_RECEIVE, projs); } - else + else if (!roles.contains(srcName) || !(fvars.contains(srcStart.toString()) && fvars.contains(destStart.toString()))) { return af.ParamCoreLCrossChoice(this.src, RPCoreLActionKind.CROSS_RECEIVE, projs); } } + else if (!roles.contains(srcName) || !(fvars.contains(srcRange.getIndexVars()) && fvars.contains(destRange.getIndexVars()))) + { + return af.ParamCoreLCrossChoice(this.src, RPCoreLActionKind.CROSS_RECEIVE, projs); + } // Otherwise merge (if neither src/dest are subj) } } @@ -642,8 +648,6 @@ else if (this.dest.equals(subj)) } else { - System.out.println("AAA: " + this.src + " ,, " + subj + " ,, " + this.src.equals(subj)); - System.out.println("AAA: " + this.dest + " ,, " + subj + " ,, " + this.dest.equals(subj)); throw new RuntimeException("[rp-core] Projection not defined: " + this + ", " + subj); } } From 8dd5c620145bbbcb3aba224a1c4f0b4f6d4c8690 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 13 Oct 2018 23:43:11 +0100 Subject: [PATCH 375/433] Patch for rp-core inconsistent state numbering. --- .../ext/go/core/cli/RPCoreCommandLine.java | 19 +++++++- .../src/test/scrib/param/tmp/ParamTest.scr | 44 +++++++++++++++++-- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 6031c3607..b5a24ddcb 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -3,6 +3,7 @@ import java.nio.file.Path; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -298,10 +299,24 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws RPCoreEGraphBuilder builder = new RPCoreEGraphBuilder(job); this.E0 = new HashMap<>(); - for (Role r : L0.keySet()) + for (Role r : (Iterable) L0.keySet().stream().sorted( // For consistent state numbering + new Comparator() { + @Override + public int compare(Role o1, Role o2) { + return o1.toString().compareTo(o2.toString()); + } + } + )::iterator) { //for (Set ranges : this.P0.get(r).keySet()) - for (RPRoleVariant variant : this.L0.get(r).keySet()) + for (RPRoleVariant variant : (Iterable) this.L0.get(r).keySet().stream().sorted( + new Comparator() { + @Override + public int compare(RPRoleVariant o1, RPRoleVariant o2) { + return o1.toString().compareTo(o2.toString()); + } + } + )::iterator) { //System.out.println("\nProjection onto " + variant + ": " + this.L0.get(r).get(variant)); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 0df7cf2da..7576ef100 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -11,8 +11,45 @@ module param.tmp.ParamTest; sig "message.QuoteReq" from "github.com/nickng/scribble-go-examples/11_quote-request/message" as QuoteReq; type "message.Quote" from "github.com/nickng/scribble-go-examples/11_quote-request/message" as Quote; - global protocol Proto1(role Buyer, role Supplier, role Manufacturer) { + // (1) Buyer requests quote from Suppliers. + QuoteReq from Buyer[1] to Supplier[1,S]; + do Negotiate(Buyer, Supplier, Manufacturer); +} + +aux global protocol Negotiate(role Buyer, role Supplier, role Manufacturer) { + // (2) All Suppliers forward quote request to their Manufacturers. + /*foreach Supplier[I:1,S] { + foreach Manufacturer[J:1,M] { + QuoteReq from Supplier[I] to Manufacturer[J]; + Reply(Quote) from Manufacturer[J] to Supplier[I]; + } + }*/ + QuoteReq from Supplier[1,S] to Manufacturer[1,M]; + Reply(Quote) from Manufacturer[1,M] to Supplier[1,S]; + // (3) Suppliers build quote for the Buyer, + // which is then sent back to the Buyer. + Reply(Quote) from Supplier[1,S] to Buyer[1]; + do MakeDeal(Buyer, Supplier, Manufacturer); +} + +aux global protocol MakeDeal(role Buyer, role Supplier, role Manufacturer) { + choice at Buyer[1] { + // (4a) Either the Buyer agrees to the quote and place order. + Order(Quote) from Buyer[1] to Supplier[1,S]; + End() from Supplier[1] to Manufacturer[1,M]; + End() from Supplier[1,S] to Manufacturer[1,M]; + } or { + // (4b) Or the Buyer modify the quote and send back to Suppliers. + Modify(Quote) from Buyer[1] to Supplier[1,S]; + Wait() from Supplier[1] to Manufacturer[1,M]; + Wait() from Supplier[1,S] to Manufacturer[1,M]; + + do UpdatedQuoteRequest(Buyer, Supplier, Manufacturer); + } +} + +aux global protocol UpdatedQuoteRequest(role Buyer, role Supplier, role Manufacturer) { // (5) Supplier received updated quote foreach Supplier[I:1,S] { choice at Supplier[I] { @@ -22,9 +59,9 @@ global protocol Proto1(role Buyer, role Supplier, role Manufacturer) { } or { // (5b) Or Supplier modify it and sending it back to Buyer. // Buyer goes back to (4) - Modify() from Supplier[I] to Buyer[1]; + Modify(Quote) from Supplier[I] to Buyer[1]; NoOp() from Supplier[I] to Manufacturer[1,M]; - //do MakeDeal(Buyer, Supplier, Manufacturer); + do MakeDeal(Buyer, Supplier, Manufacturer); } or { // (5c) Or Supplier reject updated quote. Reject() from Supplier[I] to Buyer[1]; @@ -39,7 +76,6 @@ global protocol Proto1(role Buyer, role Supplier, role Manufacturer) { } } - /* global protocol Proto1(role A, role B) { From 2731dd02b52984196ba50a1af933f9423799f6dd Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 09:16:03 +0100 Subject: [PATCH 376/433] Fixed rp-core peer computation typos. --- .../ext/go/core/cli/RPCoreCommandLine.java | 18 ++++++++++-------- .../src/test/scrib/param/tmp/ParamTest.scr | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index b5a24ddcb..fbd7432a3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -572,9 +572,10 @@ private Map, Set>, Set cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula(smt2t))); cs.add(smt2t.makeLte("peer", ival.end.toSmt2Formula(smt2t))); } - cs.addAll(peerVariant.cointervals.stream() // ...and the peer index is outside one of the peer-variant cointervals - .map(x -> smt2t.makeOr(smt2t.makeLt("peer", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("peer", x.end.toSmt2Formula(smt2t)))).collect(Collectors.toList()) - ); + cs.add(smt2t.makeOr( // ...and the peer index is outside one of the peer-variant cointervals + self.cointervals.stream().flatMap(x -> + Stream.of(smt2t.makeLt("peer", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("peer", x.end.toSmt2Formula(smt2t))) + ).collect(Collectors.toList()))); // ...and the peer index is inside our I/O action interval -- then this is peer-variant is a peer cs.add(smt2t.makeGte("peer", d.start.toSmt2Formula(smt2t))); cs.add(smt2t.makeLte("peer", d.end.toSmt2Formula(smt2t))); @@ -584,12 +585,13 @@ private Map, Set>, Set // FIXME: factor out variant/covariant inclusion/exclusion with above for (RPInterval ival : self.intervals) // Is there a self index inside all the self-variant intervals { - cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula(smt2t))); - cs.add(smt2t.makeLte("peer", ival.end.toSmt2Formula(smt2t))); + cs.add(smt2t.makeGte("self", ival.start.toSmt2Formula(smt2t))); + cs.add(smt2t.makeLte("self", ival.end.toSmt2Formula(smt2t))); } - cs.addAll(self.cointervals.stream() // ...and the self index is outside one of the self-variant cointervals - .map(x -> smt2t.makeOr(smt2t.makeLt("self", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("peer", x.end.toSmt2Formula(smt2t)))).collect(Collectors.toList()) - ); + cs.add(smt2t.makeOr( // ...and the self index is outside one of the self-variant cointervals + self.cointervals.stream().flatMap(x -> + Stream.of(smt2t.makeLt("self", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("self", x.end.toSmt2Formula(smt2t))) + ).collect(Collectors.toList()))); } String smt2 = smt2t.makeAnd(cs); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 7576ef100..9bd1bb5f0 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -61,7 +61,7 @@ aux global protocol UpdatedQuoteRequest(role Buyer, role Supplier, role Manufact // Buyer goes back to (4) Modify(Quote) from Supplier[I] to Buyer[1]; NoOp() from Supplier[I] to Manufacturer[1,M]; - do MakeDeal(Buyer, Supplier, Manufacturer); + //do MakeDeal(Buyer, Supplier, Manufacturer); } or { // (5c) Or Supplier reject updated quote. Reject() from Supplier[I] to Buyer[1]; From 9cc5eb078915a5938a9fb41f824383a737e60cc7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 09:19:29 +0100 Subject: [PATCH 377/433] Minor. --- .../ext/go/core/cli/RPCoreCommandLine.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index fbd7432a3..57fc78af3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -572,10 +572,13 @@ private Map, Set>, Set cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula(smt2t))); cs.add(smt2t.makeLte("peer", ival.end.toSmt2Formula(smt2t))); } - cs.add(smt2t.makeOr( // ...and the peer index is outside one of the peer-variant cointervals - self.cointervals.stream().flatMap(x -> - Stream.of(smt2t.makeLt("peer", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("peer", x.end.toSmt2Formula(smt2t))) - ).collect(Collectors.toList()))); + if (!self.cointervals.isEmpty()) + { + cs.add(smt2t.makeOr( // ...and the peer index is outside one of the peer-variant cointervals + self.cointervals.stream().flatMap(x -> + Stream.of(smt2t.makeLt("peer", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("peer", x.end.toSmt2Formula(smt2t))) + ).collect(Collectors.toList()))); + } // ...and the peer index is inside our I/O action interval -- then this is peer-variant is a peer cs.add(smt2t.makeGte("peer", d.start.toSmt2Formula(smt2t))); cs.add(smt2t.makeLte("peer", d.end.toSmt2Formula(smt2t))); @@ -588,10 +591,13 @@ private Map, Set>, Set cs.add(smt2t.makeGte("self", ival.start.toSmt2Formula(smt2t))); cs.add(smt2t.makeLte("self", ival.end.toSmt2Formula(smt2t))); } - cs.add(smt2t.makeOr( // ...and the self index is outside one of the self-variant cointervals - self.cointervals.stream().flatMap(x -> - Stream.of(smt2t.makeLt("self", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("self", x.end.toSmt2Formula(smt2t))) - ).collect(Collectors.toList()))); + if (!self.cointervals.isEmpty()) + { + cs.add(smt2t.makeOr( // ...and the self index is outside one of the self-variant cointervals + self.cointervals.stream().flatMap(x -> + Stream.of(smt2t.makeLt("self", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("self", x.end.toSmt2Formula(smt2t))) + ).collect(Collectors.toList()))); + } } String smt2 = smt2t.makeAnd(cs); From 266738369762d406704701fd3787ecead421744b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 09:49:43 +0100 Subject: [PATCH 378/433] Minor. --- .../ext/go/core/cli/RPCoreCommandLine.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 57fc78af3..e3c5ce547 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -565,6 +565,8 @@ private Map, Set>, Set smt2 += ")"; */ + // FIXME: need to constrain K (by family?) + List cs = new LinkedList<>(); cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations for (RPInterval ival : peerVariant.intervals) // Is there a peer index inside all the peer-variant intervals @@ -572,12 +574,16 @@ private Map, Set>, Set cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula(smt2t))); cs.add(smt2t.makeLte("peer", ival.end.toSmt2Formula(smt2t))); } - if (!self.cointervals.isEmpty()) + if (!peerVariant.cointervals.isEmpty()) { - cs.add(smt2t.makeOr( // ...and the peer index is outside one of the peer-variant cointervals + // ...and the peer index is outside one of the peer-variant cointervals + /*cs.add(smt2t.makeOr( self.cointervals.stream().flatMap(x -> Stream.of(smt2t.makeLt("peer", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("peer", x.end.toSmt2Formula(smt2t))) - ).collect(Collectors.toList()))); + ).collect(Collectors.toList())));*/ + cs.addAll(peerVariant.cointervals.stream().map(x -> + smt2t.makeOr(smt2t.makeLt("peer", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("peer", x.end.toSmt2Formula(smt2t))) + ).collect(Collectors.toList())); } // ...and the peer index is inside our I/O action interval -- then this is peer-variant is a peer cs.add(smt2t.makeGte("peer", d.start.toSmt2Formula(smt2t))); @@ -585,7 +591,9 @@ private Map, Set>, Set if (vars.contains(RPIndexSelf.SELF)) { - // FIXME: factor out variant/covariant inclusion/exclusion with above + // peer is not self + cs.add(smt2t.makeNot(smt2t.makeEq("peer", "self"))); + // TODO: factor out variant/covariant inclusion/exclusion with above for (RPInterval ival : self.intervals) // Is there a self index inside all the self-variant intervals { cs.add(smt2t.makeGte("self", ival.start.toSmt2Formula(smt2t))); @@ -593,10 +601,14 @@ private Map, Set>, Set } if (!self.cointervals.isEmpty()) { - cs.add(smt2t.makeOr( // ...and the self index is outside one of the self-variant cointervals + // ...and the self index is outside one of the self-variant cointervals + /*cs.add(smt2t.makeOr( self.cointervals.stream().flatMap(x -> Stream.of(smt2t.makeLt("self", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("self", x.end.toSmt2Formula(smt2t))) - ).collect(Collectors.toList()))); + ).collect(Collectors.toList())));*/ + cs.addAll(self.cointervals.stream().map(x -> + smt2t.makeOr(smt2t.makeLt("self", x.start.toSmt2Formula(smt2t)), smt2t.makeGt("self", x.end.toSmt2Formula(smt2t))) + ).collect(Collectors.toList())); } } From 7a12fe6f9656c18f15c21e708ed45ee27bac6455 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 10:13:03 +0100 Subject: [PATCH 379/433] Minor. --- .../ext/go/core/cli/RPCoreCommandLine.java | 19 +++++++++++++++++-- .../statetype3/RPCoreSTApiGenerator.java | 15 ++++++++------- .../RPCoreSTReceiveStateBuilder.java | 1 - .../statetype3/RPCoreSTSendActionBuilder.java | 3 ++- .../RPCoreSTStateChanApiBuilder.java | 7 ++++--- .../go/del/global/RPGMessageTransferDel.java | 2 -- .../ext/go/type/index/RPBinIndexExpr.java | 8 ++++---- .../ext/go/type/index/RPIndexFactory.java | 4 ++-- .../{RPIndexPair.java => RPIndexIntPair.java} | 12 ++++++------ ...slator.java => IntPairSmt2Translator.java} | 4 ++-- .../org/scribble/ext/go/util/Z3Wrapper.java | 8 ++++---- 11 files changed, 49 insertions(+), 34 deletions(-) rename scribble-go/src/main/java/org/scribble/ext/go/type/index/{RPIndexPair.java => RPIndexIntPair.java} (88%) rename scribble-go/src/main/java/org/scribble/ext/go/util/{PairSmt2Translator.java => IntPairSmt2Translator.java} (88%) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index e3c5ce547..97e5f4646 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -30,6 +30,7 @@ //import org.scribble.ext.go.core.codegen.statetype.ParamCoreSTEndpointApiGenerator; //import org.scribble.ext.go.core.codegen.statetype2.ParamCoreSTEndpointApiGenerator; import org.scribble.ext.go.core.codegen.statetype3.RPCoreSTApiGenerator; +import org.scribble.ext.go.core.codegen.statetype3.RPCoreSTApiGenerator.Mode; import org.scribble.ext.go.core.main.RPCoreException; import org.scribble.ext.go.core.main.RPCoreMainContext; import org.scribble.ext.go.core.model.endpoint.RPCoreEGraphBuilder; @@ -42,6 +43,7 @@ import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexSelf; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.IntSmt2Translator; import org.scribble.ext.go.util.RecursiveFunctionalInterface; import org.scribble.ext.go.util.Smt2Translator; import org.scribble.ext.go.util.Z3Wrapper; @@ -185,8 +187,21 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co outputClasses(goClasses);*/ } + Mode mode; + if (this.smt2t instanceof IntSmt2Translator) + { + mode = Mode.Int; + } + else if (this.smt2t instanceof IntSmt2Translator) + { + mode = Mode.IntPair; + } + else + { + throw new RuntimeException("Shouldn't get in here: " + this.smt2t.getClass()); + } Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, - this.L0, this.E0, this.families, this.peers, this.subsum, this.aliases, impath, roles, this.smt2t).build(); + this.L0, this.E0, this.families, this.peers, this.subsum, this.aliases, impath, roles, mode).build(); outputClasses(goClasses); } else @@ -565,7 +580,7 @@ private Map, Set>, Set smt2 += ")"; */ - // FIXME: need to constrain K (by family?) + // CHECKME: need to further constrain K? (by family?) List cs = new LinkedList<>(); cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 1c361191c..ac34b4522 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -20,9 +20,8 @@ import org.scribble.ext.go.type.index.RPBinIndexExpr; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexInt; -import org.scribble.ext.go.type.index.RPIndexPair; +import org.scribble.ext.go.type.index.RPIndexIntPair; import org.scribble.ext.go.type.index.RPIndexVar; -import org.scribble.ext.go.util.Smt2Translator; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; import org.scribble.type.kind.Global; @@ -35,9 +34,11 @@ // Duplicated from org.scribble.ext.go.codegen.statetype.go.GoSTEndpointApiGenerator public class RPCoreSTApiGenerator { + public enum Mode { Int, IntPair } + public final GoJob job; public final GProtocolName proto; // Full name - public final Smt2Translator smt2t; + public final Mode mode; // FIXME: factor out an RPCoreJob(Context) public final Map> projections; @@ -63,7 +64,7 @@ public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map, Set>, Pair, Set>> subsum, Map, Set>, RPRoleVariant>> aliases, String packpath, //Role self) - List selfs, Smt2Translator smt2t) + List selfs, Mode mode) { this.job = job; this.proto = fullname; @@ -134,7 +135,7 @@ public int compare(Pair, Set> f1, Pair + //boolean isDeleg = + a.payload.elems.stream().anyMatch(pet -> //pet.isGDelegationType() // FIXME: currently deleg specified by ParamCoreDelegDecl, not GDelegationElem rpapi//.isDelegType((DataType) pet)); .isDelegType(pet)); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 2d8e0ad1e..1cdc43e11 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -33,7 +33,7 @@ import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexInt; -import org.scribble.ext.go.type.index.RPIndexPair; +import org.scribble.ext.go.type.index.RPIndexIntPair; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.MState; import org.scribble.model.endpoint.EGraph; @@ -618,7 +618,7 @@ public String generateIndexExpr(RPIndexExpr e) { return e.toGoString(); } - else if (e instanceof RPIndexPair) + else if (e instanceof RPIndexIntPair) { return e.toGoString(); } @@ -686,7 +686,8 @@ protected String getPayloadElemTypeName(PayloadElemType pet) try { RPCoreGType gt = new RPCoreGProtocolDeclTranslator(this.job, af).translate(gpd); - RPCoreLType lt = gt.project(af, v); + //RPCoreLType lt = + gt.project(af, v); /* // FIXME: currently cannot determine state chan name of target state in delegated protocol because of decoupled state numbering // If we rebuild the target endpoint graph here, the state numbering won't match diff --git a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java index e7eb3008f..d8e6a945b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/del/global/RPGMessageTransferDel.java @@ -2,7 +2,6 @@ import java.util.List; -import org.scribble.ast.MessageTransfer; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GMessageTransfer; import org.scribble.del.global.GMessageTransferDel; @@ -11,7 +10,6 @@ import org.scribble.ext.go.core.visit.RPCoreIndexVarCollector; import org.scribble.main.ScribbleException; import org.scribble.type.name.Role; -import org.scribble.visit.util.RoleCollector; import org.scribble.visit.wf.NameDisambiguator; public class RPGMessageTransferDel extends GMessageTransferDel implements RPDel diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java index d3d17f740..b4dc002f4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPBinIndexExpr.java @@ -86,12 +86,12 @@ else if (this.op == Op.Subt) } else { - if (right instanceof RPIndexPair) + if (right instanceof RPIndexIntPair) { - RPIndexPair y = ((RPIndexPair) right); - if (left instanceof RPIndexPair) + RPIndexIntPair y = ((RPIndexIntPair) right); + if (left instanceof RPIndexIntPair) { - RPIndexPair x = ((RPIndexPair) left); + RPIndexIntPair x = ((RPIndexIntPair) left); switch (this.op) { case Add: return RPIndexFactory.RPIndexPair(RPIndexFactory.ParamIntVal(((RPIndexInt) x.left).val + ((RPIndexInt) y.left).val), diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java index f10e7ded0..b8a252331 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java @@ -37,8 +37,8 @@ public static RPIndexSelf RPIndexSelf() return RPIndexSelf.SELF; } - public static RPIndexPair RPIndexPair(RPIndexExpr left, RPIndexExpr right) + public static RPIndexIntPair RPIndexPair(RPIndexExpr left, RPIndexExpr right) { - return new RPIndexPair(left, right); + return new RPIndexIntPair(left, right); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java similarity index 88% rename from scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java rename to scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java index 4cd5856c9..5d6aaf209 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexPair.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java @@ -9,12 +9,12 @@ // Currently only considered as a value -public class RPIndexPair extends RPIndexExpr implements RPIndexVal +public class RPIndexIntPair extends RPIndexExpr implements RPIndexVal { public final RPIndexExpr left; public final RPIndexExpr right; - protected RPIndexPair(RPIndexExpr left, RPIndexExpr right) + protected RPIndexIntPair(RPIndexExpr left, RPIndexExpr right) { //if (!isUnaryExpr(left) || !isUnaryExpr(right)) if (!(left instanceof RPIndexInt) || !(right instanceof RPIndexInt)) @@ -33,7 +33,7 @@ protected RPIndexPair(RPIndexExpr left, RPIndexExpr right) @Override public boolean gtEq(RPIndexVal them) { - RPIndexPair p = (RPIndexPair) them; + RPIndexIntPair p = (RPIndexIntPair) them; return ((RPIndexInt) this.left).val >= ((RPIndexInt) p.left).val && ((RPIndexInt) this.right).val >= ((RPIndexInt) p.right).val; } @@ -85,11 +85,11 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof RPIndexPair)) + if (!(o instanceof RPIndexIntPair)) { return false; } - RPIndexPair f = (RPIndexPair) o; + RPIndexIntPair f = (RPIndexIntPair) o; return super.equals(this) // Does canEqual && this.left.equals(f.left) && this.right.equals(f.right); } @@ -97,7 +97,7 @@ public boolean equals(Object o) @Override protected boolean canEqual(Object o) { - return o instanceof RPIndexPair; + return o instanceof RPIndexIntPair; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/IntPairSmt2Translator.java similarity index 88% rename from scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java rename to scribble-go/src/main/java/org/scribble/ext/go/util/IntPairSmt2Translator.java index 90ed812bb..7307537a7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/PairSmt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/IntPairSmt2Translator.java @@ -1,8 +1,8 @@ package org.scribble.ext.go.util; -public class PairSmt2Translator extends Smt2Translator +public class IntPairSmt2Translator extends Smt2Translator { - public PairSmt2Translator() + public IntPairSmt2Translator() { //super(Sort.Pair); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index 9f2ba0816..49b806808 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -8,7 +8,7 @@ import org.scribble.ext.go.core.ast.global.RPCoreGType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; -import org.scribble.ext.go.type.index.RPIndexPair; +import org.scribble.ext.go.type.index.RPIndexIntPair; import org.scribble.main.ScribbleException; import org.scribble.type.kind.Global; import org.scribble.util.ScribUtil; @@ -21,13 +21,13 @@ public static Smt2Translator getSmt2Translator(RPCoreGType gt) { Set irs = gt.getIndexedRoles(); if (irs.isEmpty() || - irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().noneMatch(z -> z instanceof RPIndexPair)))) + irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().noneMatch(z -> z instanceof RPIndexIntPair)))) { return new IntSmt2Translator(); } - else if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().allMatch(z -> z instanceof RPIndexPair)))) + else if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().allMatch(z -> z instanceof RPIndexIntPair)))) { - return new PairSmt2Translator(); + return new IntPairSmt2Translator(); } else { From a87d7712e59eda63d4ab8ef5ee1b1e518d1111ac Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 10:15:45 +0100 Subject: [PATCH 380/433] Typo fix. --- .../java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 97e5f4646..7441156da 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -43,6 +43,7 @@ import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPIndexSelf; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.IntPairSmt2Translator; import org.scribble.ext.go.util.IntSmt2Translator; import org.scribble.ext.go.util.RecursiveFunctionalInterface; import org.scribble.ext.go.util.Smt2Translator; @@ -192,7 +193,7 @@ protected void doNonAttemptableOutputTasks(Job job) throws ScribbleException, Co { mode = Mode.Int; } - else if (this.smt2t instanceof IntSmt2Translator) + else if (this.smt2t instanceof IntPairSmt2Translator) { mode = Mode.IntPair; } From 15cf5226ec03ef232f0454a570d4995afc8c8cab Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 11:53:10 +0100 Subject: [PATCH 381/433] Continued on rp-core pair API gen. --- .../statetype3/RPCoreSTApiGenConstants.java | 1 + .../RPCoreSTReceiveActionBuilder.java | 23 ++++-- .../statetype3/RPCoreSTSendActionBuilder.java | 17 ++++- .../statetype3/RPCoreSTSessionApiBuilder.java | 71 +++++++++++++------ .../RPCoreSTStateChanApiBuilder.java | 16 ++++- .../ext/go/type/index/RPIndexIntPair.java | 2 +- 6 files changed, 100 insertions(+), 30 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index f1f6eb5ce..14cbb2c89 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -4,6 +4,7 @@ public class RPCoreSTApiGenConstants { //public static final String GO_SCRIBBLERUNTIME_PACKAGE = "org/scribble/runtime/net"; public static final String GO_SCRIBBLERUNTIME_SESSION_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/session2"; + public static final String GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/twodim/session2"; public static final String GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/transport2"; public static final String GO_SCRIBBLERUNTIME_SHM_PACKAGE = "github.com/scribble/go-runtime/transport2/shm"; public static final String GO_SCRIBBLERUNTIME_BYTES_PACKAGE = "bytes"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index c273a0c37..868b1f23d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -81,10 +81,25 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } else { + String lte; + switch (rpapi.apigen.mode) + { + case Int: lte = " <= " + rpapi.generateIndexExpr(d.end); break; + case IntPair: lte = ".Lte(" + rpapi.generateIndexExpr(d.end) + ")"; break; + default: throw new RuntimeException("Shouldn't get in here: " + rpapi.apigen.mode); + } + String inc; + switch (rpapi.apigen.mode) + { + case Int: inc = "i+1"; break; + case IntPair: inc = "i.Inc(" + rpapi.generateIndexExpr(d.end) + ")"; break; + default: throw new RuntimeException("Shouldn't get in here: " + rpapi.apigen.mode); + } + String start = rpapi.generateIndexExpr(d.start); res += //"var err error\n" - "for i := " + start + ";" - + " i <= " + rpapi.generateIndexExpr(d.end) + "; i++ {\n"; + "for i, j := " + start + ", 0;" + + " i " + lte + "; i, j = " + inc + ", j+1 {\n"; // For payloads -- FIXME: currently hardcoded for exactly one payload @@ -121,7 +136,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat "if " + errorField + " = " + sEpRecv /*+ "[i]" // FIXME: use peer interval + "." //+ RPCoreSTApiGenConstants.GO_ENDPOINT_READALL + "(&tmp)" + RPCoreSTApiGenConstants.GO_FORMATTER_DECODE_INT + "()"*/ - + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &arg0[i-" + start + "])" + + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", i, &arg0[j])" + "; " + errorField + " != nil {\n" //+ "log.Fatal(err)\n" @@ -146,7 +161,7 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? + rpapi.makeReturnSuccStateChan(succ) + "\n" + "}\n" - + "arg0[i-" + start + "] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder + + "arg0[j] = *(tmp.(*" + extName + "))\n"; // Cf. ISend in RPCoreSTSendActionBuilder res += makeReceiveExtName.apply(rpapi.getExtName((MessageSigName) a.mid)); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 8ff0329af..8d19d1f4f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -94,8 +94,23 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat rpapi//.isDelegType((DataType) pet)); .isDelegType(pet)); + String lte; + switch (rpapi.apigen.mode) + { + case Int: lte = " <= " + rpapi.generateIndexExpr(d.end); break; + case IntPair: lte = ".Lte(" + rpapi.generateIndexExpr(d.end) + ")"; break; + default: throw new RuntimeException("Shouldn't get in here: " + rpapi.apigen.mode); + } + String inc; + switch (rpapi.apigen.mode) + { + case Int: inc = "i+1"; break; + case IntPair: inc = "i.Inc(" + rpapi.generateIndexExpr(d.end) + ")"; break; + default: throw new RuntimeException("Shouldn't get in here: " + rpapi.apigen.mode); + } + String res = "for i, j := " + rpapi.generateIndexExpr(d.start) + ", 0;" - + " i <= " + rpapi.generateIndexExpr(d.end)+"; i, j = i+1, j+1 {\n"; + + " i" + lte + "; i, j = " + inc + ", j+1 {\n"; String errorField = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 70a724cda..665de785e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -13,6 +13,7 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; +import org.scribble.ext.go.core.codegen.statetype3.RPCoreSTApiGenerator.Mode; import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; @@ -125,15 +126,23 @@ private Map> makeStateChanNames() //@Override public Map build() // FIXME: factor out { + String indexType; + switch (this.apigen.mode) + { + case Int: indexType = "int"; break; // Factor into the mode? + case IntPair: indexType = "session2.Pair"; break; + default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); + } + Module mod = this.apigen.job.getContext().getModule(this.apigen.proto.getPrefix()); ProtocolDecl gpd = mod.getProtocolDecl(this.apigen.proto.getSimpleName()); Map res = new HashMap<>(); // filepath -> source - buildProtocolApi(gpd, res); - buildEndpointKindApi(gpd, res); + buildProtocolApi(gpd, res, indexType); + buildEndpointKindApi(gpd, res, indexType); return res; } - private void buildProtocolApi(ProtocolDecl gpd, Map res) + private void buildProtocolApi(ProtocolDecl gpd, Map res, String indexType) { GProtocolName simpname = this.apigen.proto.getSimpleName(); List rolenames = //gpd.header.roledecls.getRoles(); @@ -145,10 +154,16 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) "// Package " + this.apigen.getApiRootPackageName() + " is the generated API for the " + this.apigen.proto.getPrefix().getSimpleName().toString() + "." + this.apigen.getApiRootPackageName() + " protocol.\n" + "// Use functions in this package to create instances of role variants.\n" + "package " + this.apigen.getApiRootPackageName() + "\n" - + "\n" + + "\n"; + + if (this.apigen.mode == Mode.IntPair) + { + protoFile += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE + "\"\n"; + } + protoFile += // Import Endpoint Kind APIs -- FIXME: CL args - + (rolenames.stream().map(rname -> + (rolenames.stream().map(rname -> { Set variants = this.apigen.variants.get(rname).keySet(); return @@ -224,7 +239,7 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) String tmp = "// " + fnName + " returns a new instance of " + epkindTypeName + " role variant.\n" + "func (p *" + simpname + ") " + fnName // FIXME: factor out common variants between families + "(" + ivars.stream().filter(x -> !x.name.equals("self")) // CHECKME: can check for RPIndexSelf instead? - .map(v -> v + " int, ").collect(Collectors.joining("")) + "self int" + ")" + .map(v -> v + " " + indexType + ", ").collect(Collectors.joining("")) + "self " + indexType + ")" + " *" + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) // FIXME: factor out (and separate type name from package name) @@ -252,15 +267,20 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res) } // FIXME: should be lpd - private void buildEndpointKindApi(ProtocolDecl gpd, Map res) + private void buildEndpointKindApi(ProtocolDecl gpd, Map res, String indexType) { GProtocolName simpname = this.apigen.proto.getSimpleName(); List roles = //gpd.header.roledecls.getRoles(); this.apigen.selfs; - String epkindImports = "\n" // Package decl done later (per variant) - + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" - + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; + String epkindImports = "\n"; // Package decl done later (per variant) + switch (this.apigen.mode) + { + case Int: epkindImports += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; break; + case IntPair: epkindImports += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE + "\"\n"; break; + default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); + } + epkindImports += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; // Endpoint Kind API per role variant for (Role rname : roles) @@ -293,16 +313,23 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map // Endpoint Kind type + "type " + epkindTypeName + " struct {\n" - + RPCoreSTApiGenConstants.GO_MPCHAN_PROTO + " " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + "\n" - + "Self int\n" + + RPCoreSTApiGenConstants.GO_MPCHAN_PROTO + " " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + "\n"; + + switch (this.apigen.mode) + { + case Int: epkindFile += "Self int\n"; break; + case IntPair: epkindFile += "Self session2.Pair\n"; break; + default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); + } - + "*" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" // This is for the Endpoint itself + epkindFile += + "*" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" // This is for the Endpoint itself + "lin uint64\n" + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + " *" + RPCoreSTApiGenConstants.GO_MPCHAN_TYPE + "\n" - + ivars.stream().map(x -> x + " int\n").collect(Collectors.joining("")) + + ivars.stream().map(x -> x + " " + indexType + "\n").collect(Collectors.joining("")) - + "Params map[string]int\n" // FIXME: currently used to record foreach params (and provide access to user) + + "Params map[string]" + indexType + "\n" // FIXME: currently used to record foreach params (and provide access to user) /*+ this.apigen.stateChanNames.get(variant).entrySet().stream().sorted( new Comparator>() @@ -335,8 +362,8 @@ public int compare(Entry o1, Entry o2) // Endpoint Kind type constructor -- makes connection maps + "\n" + "func New(p " + RPCoreSTApiGenConstants.GO_PROTOCOL_TYPE + ", " //+"params map[string]int," - + ivars.stream().filter(x -> !x.name.equals("self")).map(x -> x + " int, ").collect(Collectors.joining("")) // CHECKME: can check for RPIndexSelf instead? - + "self int) *" + epkindTypeName + " {\n" + + ivars.stream().filter(x -> !x.name.equals("self")).map(x -> x + " " + indexType + ", ").collect(Collectors.joining("")) // CHECKME: can check for RPIndexSelf instead? + + "self " + indexType + ") *" + epkindTypeName + " {\n" /*+ "conns := make(map[string]map[int]transport.Channel)\n" + this.apigen.variants.entrySet().stream() .map(e -> "conns[\"" + e.getKey().getLastElement() + "\"] = " + "make(map[int]transport.Channel)\n") @@ -351,7 +378,7 @@ public int compare(Entry o1, Entry o2) + RPCoreSTApiGenConstants.GO_MPCHAN_CONSTRUCTOR + "(self, "//conns)" //"params + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "}),\n" + ivars.stream().map(x -> x + ",\n").collect(Collectors.joining("")) - + "make(map[string]int),\n" // Trailing comma needed + + "make(map[string]" + indexType + "),\n" // Trailing comma needed //+ this.apigen.stateChanNames.get(variant).values().stream().distinct().map(k -> "nil,\n").collect(Collectors.joining()) // FIXME: factor out with above @@ -458,7 +485,7 @@ public int compare(Entry o1, Entry o2) String r = pp.getLastElement(); String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(pp); epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int" + + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id " + indexType + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." @@ -478,7 +505,7 @@ public int compare(Entry o1, Entry o2) + "return err\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id int" + + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id " + indexType + ", host string, port int" + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" @@ -508,7 +535,7 @@ public int compare(Entry o1, Entry o2) String r = pp.getLastElement(); String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(pp); epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id int" + + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id " + indexType + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." @@ -528,7 +555,7 @@ public int compare(Entry o1, Entry o2) + "return err\n" // FIXME: runtime currently does log.Fatal on error + "}\n" + "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id int" + + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id " + indexType + ", host string, port int" + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 1cdc43e11..0e08df011 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -20,7 +20,7 @@ import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.global.RPCoreGProtocolDeclTranslator; import org.scribble.ext.go.core.ast.global.RPCoreGType; -import org.scribble.ext.go.core.ast.local.RPCoreLType; +import org.scribble.ext.go.core.codegen.statetype3.RPCoreSTApiGenerator.Mode; import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossReceive; import org.scribble.ext.go.core.model.endpoint.action.RPCoreECrossSend; @@ -335,7 +335,12 @@ protected String getStateChanPremable(EState s) // FIXME: still needed? -- refactor back into state-specific builders? if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) { - res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; + switch (this.apigen.mode) + { + case Int: res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; break; + case IntPair: res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE + "\"\n"; break; + default: throw new RuntimeException("Shouldn't get in here:" + this.apigen.mode); + } res += "import \"sync/atomic\"\n"; res += "import \"reflect\"\n"; @@ -348,6 +353,13 @@ protected String getStateChanPremable(EState s) res += "var _ = reflect.TypeOf\n"; res += "var _ = sort.Sort\n"; } + else if (s.getStateKind() == EStateKind.OUTPUT) + { + if (this.apigen.mode == Mode.IntPair) + { + res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE + "\"\n"; + } + } // State channel type res += "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java index 5d6aaf209..34ba1dbdd 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java @@ -46,7 +46,7 @@ public RPIndexExpr minimise(int self) @Override public String toGoString() { - return "util.Pair{" + this.left.toGoString() + ", " + this.right.toGoString() + "}"; + return "(session2.XY(" + this.left.toGoString() + ", " + this.right.toGoString() + "))"; } @Override From 6211b5abcfedf15fd7e000d68170afd5b387cfc5 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 13:48:54 +0100 Subject: [PATCH 382/433] Continued. --- .../codegen/statetype3/RPCoreSTCaseBuilder.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java index 72a78eb37..971c1b263 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -36,9 +36,17 @@ public String getPreamble(STStateChanApiBuilder api, EState s) RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; String casename = getCaseActionName(api, s); String res = "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(rpapi.variant) + "\n" - + "\n" - + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n" - + "import \"log\"\n" + + "\n"; + + switch (rpapi.apigen.mode) + { + case Int: res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; break; + case IntPair: res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE + "\"\n"; break; + default: throw new RuntimeException("Shouldn't get in here: " + rpapi.apigen.mode); + } + + res += + "import \"log\"\n" + ((RPCoreSTStateChanApiBuilder) api).makeMessageImports(s) + "\n" + "var _ = log.Fatal\n" From cc4d6063a61cb5d77d86d2c9507f2bdeda922ae5 Mon Sep 17 00:00:00 2001 From: Nicholas Ng Date: Sun, 14 Oct 2018 14:26:26 +0100 Subject: [PATCH 383/433] Fix branch receive parameter. --- .../core/codegen/statetype3/RPCoreSTCaseActionBuilder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java index 62b236641..91b8a3fda 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseActionBuilder.java @@ -61,12 +61,16 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat { throw new RuntimeException("[rp-core] Shouldn't get in here: " + a); } + // makeCaseReceive is called only for payload type which involves the + // use of IRecv. The caller is Recv_Label(arg0 *T) for Label(T) message. + // IRecv accepts pointer as parameter so passing arg0 here (of type *T) + // instead of &arg0 (or type **T). Function makeCaseReceive = pt -> //+ (extName.startsWith("[]") ? "tmp = make(" + extName + ", len(*arg0))\n" : "") // HACK: [] // N.B. *arg0 matches buildArgs "if err := " + sEpRecv /*+ "[1]" // FIXME: use peer interval + "." + RPCoreSTApiGenConstants.GO_MPCHAN_READALL + "(&tmp)"*/ + "." + RPCoreSTApiGenConstants.GO_MPCHAN_IRECV + "(\"" + peer.getName() + "\", " - + rpapi.generateIndexExpr(d.start) + ", &arg0)" + + rpapi.generateIndexExpr(d.start) + ", arg0)" + "; err != nil {\n" //+ "log.Fatal(err)\n" //+ "return " + rpapi.makeCreateSuccStateChan(succ) + "\n" // FIXME: disable linearity check for error chan? Or doesn't matter -- only need to disable completion check? From c386db7990e163db52714677c48bc06a1798f23b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 14:38:51 +0100 Subject: [PATCH 384/433] Fixed rp-core graph building typo. --- .../main/java/org/scribble/model/MState.java | 2 +- .../model/endpoint/RPCoreEGraphBuilder.java | 2 +- .../src/test/scrib/param/tmp/ParamTest.scr | 19 ++++++++++++++++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/model/MState.java b/scribble-core/src/main/java/org/scribble/model/MState.java index caf6a77de..8190035b4 100644 --- a/scribble-core/src/main/java/org/scribble/model/MState.java +++ b/scribble-core/src/main/java/org/scribble/model/MState.java @@ -173,7 +173,7 @@ S getTerminal(S start) { return start; } - Set terms = MState.getReachableStates(start).stream().filter((s) -> s.isTerminal()).collect(Collectors.toSet()); + Set terms = MState.getReachableStates(start).stream().filter(s -> s.isTerminal()).collect(Collectors.toSet()); if (terms.size() > 1) { throw new RuntimeException("Shouldn't get in here: " + terms); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java index 23e2b0f88..7c9e2e9b3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/model/endpoint/RPCoreEGraphBuilder.java @@ -147,7 +147,7 @@ private void buildEdgeAndContinuation(RPCoreEState s1, RPCoreEState s2, Map "message.QuoteReq" from "github.com/nickng/scribble-go-examples/11_quote-request/message" as QuoteReq; type "message.Quote" from "github.com/nickng/scribble-go-examples/11_quote-request/message" as Quote; @@ -24,7 +41,7 @@ aux global protocol Negotiate(role Buyer, role Supplier, role Manufacturer) { QuoteReq from Supplier[I] to Manufacturer[J]; Reply(Quote) from Manufacturer[J] to Supplier[I]; } - }*/ + }* / QuoteReq from Supplier[1,S] to Manufacturer[1,M]; Reply(Quote) from Manufacturer[1,M] to Supplier[1,S]; // (3) Suppliers build quote for the Buyer, From bd16dfd6b80e214a683852bea5fb7433dd05da8b Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 14:54:04 +0100 Subject: [PATCH 385/433] Continued rp-core pair foreach API gen. --- .../RPCoreSTReceiveActionBuilder.java | 22 +++++++----- .../statetype3/RPCoreSTSendActionBuilder.java | 21 ++++++----- .../RPCoreSTStateChanApiBuilder.java | 36 ++++++++++++++++--- 3 files changed, 58 insertions(+), 21 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java index 868b1f23d..722cc2068 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTReceiveActionBuilder.java @@ -81,18 +81,24 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat } else { + + // TODO: factor out with send, etc. String lte; - switch (rpapi.apigen.mode) - { - case Int: lte = " <= " + rpapi.generateIndexExpr(d.end); break; - case IntPair: lte = ".Lte(" + rpapi.generateIndexExpr(d.end) + ")"; break; - default: throw new RuntimeException("Shouldn't get in here: " + rpapi.apigen.mode); - } String inc; switch (rpapi.apigen.mode) { - case Int: inc = "i+1"; break; - case IntPair: inc = "i.Inc(" + rpapi.generateIndexExpr(d.end) + ")"; break; + case Int: + { + lte = " <= " + rpapi.generateIndexExpr(d.end); + inc = "i+1"; + break; + } + case IntPair: + { + lte = ".Lte(" + rpapi.generateIndexExpr(d.end) + ")"; + inc = "i.Inc(" + rpapi.generateIndexExpr(d.end) + ")"; + break; + } default: throw new RuntimeException("Shouldn't get in here: " + rpapi.apigen.mode); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java index 8d19d1f4f..cc64d3680 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSendActionBuilder.java @@ -94,18 +94,23 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat rpapi//.isDelegType((DataType) pet)); .isDelegType(pet)); + // TODO: factor out with receive, etc. String lte; - switch (rpapi.apigen.mode) - { - case Int: lte = " <= " + rpapi.generateIndexExpr(d.end); break; - case IntPair: lte = ".Lte(" + rpapi.generateIndexExpr(d.end) + ")"; break; - default: throw new RuntimeException("Shouldn't get in here: " + rpapi.apigen.mode); - } String inc; switch (rpapi.apigen.mode) { - case Int: inc = "i+1"; break; - case IntPair: inc = "i.Inc(" + rpapi.generateIndexExpr(d.end) + ")"; break; + case Int: + { + lte = " <= " + rpapi.generateIndexExpr(d.end); + inc = "i+1"; + break; + } + case IntPair: + { + lte = ".Lte(" + rpapi.generateIndexExpr(d.end) + ")"; + inc = "i.Inc(" + rpapi.generateIndexExpr(d.end) + ")"; + break; + } default: throw new RuntimeException("Shouldn't get in here: " + rpapi.apigen.mode); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 0e08df011..46cf5dbe5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -238,7 +238,7 @@ public String getStateChannelFilePath(String filename) } // Pre: s.hasNested() -- i.e., s is the "outer" state - // FIXME: factor out with getStateChanPremable + // TODO: factor out with getStateChanPremable protected Map buildForeachIntermediaryState(RPCoreEState s) { GProtocolName simpname = this.apigen.proto.getSimpleName(); @@ -250,9 +250,13 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) String feach = "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(this.variant) + "\n" + "\n"; - //+ "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; + + if (this.apigen.mode == Mode.IntPair) + { + feach += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE + "\"\n"; + } - // State channel type + // State channel type feach += "\n" + "type " + scTypeName + " struct {\n" + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" @@ -275,12 +279,32 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) this.fvars.add(p); // HACK FIXME: state visiting order not guaranteed (w.r.t. lexical var scope) - String initState = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + initName; + // TODO: factor out with send, receive, etc. + String lte; + String inc; + switch (this.apigen.mode) + { + case Int: + { + lte = " <= " + generateIndexExpr(s.getInterval().end); + inc = "p+1"; + break; + } + case IntPair: + { + lte = ".Lte(" + generateIndexExpr(s.getInterval().end) + ")"; + inc = p + ".Inc(" + generateIndexExpr(s.getInterval().end) + ")"; + break; + } + default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); + } + + String initState = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + initName; feach += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + ") Foreach(f func(*" + initName + ") " + termName + ") *" + succName + " {\n" + "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions - + p + " <= " + generateIndexExpr(s.getInterval().end) + "; " + p + " = " + p + " + 1 {\n" + + p + lte + "; " + p + " = " + inc + "{\n" //+ sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? + sEp + ".Params[\"" + p + "\"] = " + p + "\n" // FIXME: nested Endpoint type/struct? @@ -358,6 +382,8 @@ else if (s.getStateKind() == EStateKind.OUTPUT) if (this.apigen.mode == Mode.IntPair) { res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE + "\"\n"; + res += "\n"; + res += "var _ = session2.XY\n"; // For nested states that only use foreach vars (so no session2.XY) } } From 47b554469d5f2969ba58e42d23df6ad82edaf224 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 15:17:32 +0100 Subject: [PATCH 386/433] Fixed rp-core peer computation typo. --- .../scribble/ext/go/core/cli/RPCoreCommandLine.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 7441156da..9a821142f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -527,6 +527,7 @@ private Map, Set>, Set { job.debugPrintln("\n[rp-core] For " + self + ", checking peer candidate: " + peerVariant); // "checking potential peer" means checking if any of our action-peer indexed roles fits the candidate variant-peer (so we would need a dial/accept for them) + for (RPIndexedRole ir : actionIRs) { if (ir.getName().equals(peerVariant.getName())) @@ -537,6 +538,8 @@ private Map, Set>, Set } RPInterval d = ir.intervals.stream().findAny().get(); + System.out.println("AAA: " + ir + " ,, " + d.start + " ,, " + d.end); + Set vars = Stream.concat(peerVariant.intervals.stream().flatMap(x -> x.getIndexVars().stream()), peerVariant.cointervals.stream().flatMap(x -> x.getIndexVars().stream())) .collect(Collectors.toSet()); vars.addAll(ir.getIndexVars()); @@ -607,8 +610,11 @@ private Map, Set>, Set if (vars.contains(RPIndexSelf.SELF)) { - // peer is not self - cs.add(smt2t.makeNot(smt2t.makeEq("peer", "self"))); + // If self name is peer name, peer index is not self index + if (peerVariant.getName().equals(self.getName())) + { + cs.add(smt2t.makeNot(smt2t.makeEq("peer", "self"))); + } // TODO: factor out variant/covariant inclusion/exclusion with above for (RPInterval ival : self.intervals) // Is there a self index inside all the self-variant intervals { From 8f0d019da62f47567dbd1c815dae4685b38834e8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 15:26:45 +0100 Subject: [PATCH 387/433] Fixed rp-core pair index expr gen. --- .../RPCoreSTStateChanApiBuilder.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 46cf5dbe5..5c096512f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -678,7 +678,24 @@ else if (e instanceof RPIndexVar) else if (e instanceof RPBinIndexExpr) { RPBinIndexExpr b = (RPBinIndexExpr) e; - return "(" + generateIndexExpr(b.left) + b.op.toString() + generateIndexExpr(b.right) + ")"; + // TODO: factor out + switch (this.apigen.mode) + { + case Int: return "(" + generateIndexExpr(b.left) + b.op.toString() + generateIndexExpr(b.right) + ")"; + case IntPair: + { + String op; + switch (b.op) + { + case Add: op = "Plus"; break; + case Subt: op = "Sub"; break; + case Mult: + default: throw new RuntimeException("[rp-core] Shouldn't get in here: " + e); + } + return "(" + generateIndexExpr(b.left) + "." + op + "(" + generateIndexExpr(b.right) + "))"; + } + default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); + } } else { From 34f8c989eb5afdec5d54923489c95d8d75ef17b9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 15:50:06 +0100 Subject: [PATCH 388/433] Fixed projection level 3 typo. --- .../org/scribble/ext/go/core/ast/global/RPCoreGChoice.java | 2 +- .../org/scribble/ext/go/core/ast/global/RPCoreGForeach.java | 1 - .../org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 6 +----- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index d0e46a302..fa06e3b75 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -621,7 +621,7 @@ else if (this.dest.equals(subj)) RPIndexExpr srcExpr = RPIndexFactory.ParamBinIndexExpr(Op.Add, RPIndexSelf.SELF, //RPIndexFactory.ParamBinIndexExpr(Op.Subt, srcStart, destStart)); RPIndexFactory.ParamBinIndexExpr(Op.Subt, upper, lower)); - RPIndexedRole src = new RPIndexedRole(destName.toString(), Stream.of(new RPInterval(srcExpr, srcExpr)).collect(Collectors.toSet())); + RPIndexedRole src = new RPIndexedRole(srcName.toString(), Stream.of(new RPInterval(srcExpr, srcExpr)).collect(Collectors.toSet())); return af.ParamCoreLCrossChoice(src, RPCoreLActionKind.CROSS_RECEIVE, projs); } else if (!roles.contains(srcName) || !(fvars.contains(srcStart.toString()) && fvars.contains(destStart.toString()))) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 33c7ae555..9673887ce 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -166,7 +166,6 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set, ParamCoreLType> tmp = P0.get(r); @@ -473,7 +472,7 @@ private void minimise() Pair, Set> compressed = new Pair<>(tmp, fam.right); families.add(compressed); // Subsumed variants are neither in left nor right - System.out.println("\n8888:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + "\n\n" + System.out.println("\nFamily:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + "\nCompacted:\n" + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n"))); if (!tmp.equals(fam.left)) @@ -537,9 +536,6 @@ private Map, Set>, Set throw new RuntimeException("[rp-core] TODO: multi-dimension intervals: " + ir); // No? Multiple intervals is not actually about multidim intervals, it's about constraint intersection? (A multdim interval should be a single interval value?) } RPInterval d = ir.intervals.stream().findAny().get(); - - System.out.println("AAA: " + ir + " ,, " + d.start + " ,, " + d.end); - Set vars = Stream.concat(peerVariant.intervals.stream().flatMap(x -> x.getIndexVars().stream()), peerVariant.cointervals.stream().flatMap(x -> x.getIndexVars().stream())) .collect(Collectors.toSet()); vars.addAll(ir.getIndexVars()); From e9670d6bc98512c8a1e48d6235e6134010d03cd8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 17:16:43 +0100 Subject: [PATCH 389/433] Patched rp-core project2 max interval check. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 4 +- .../ext/go/core/ast/global/RPCoreGCont.java | 2 +- .../ext/go/core/ast/global/RPCoreGEnd.java | 2 +- .../go/core/ast/global/RPCoreGForeach.java | 50 +++++++++++++++---- .../core/ast/global/RPCoreGMultiChoices.java | 4 +- .../ext/go/core/ast/global/RPCoreGRec.java | 4 +- .../ext/go/core/ast/global/RPCoreGRecVar.java | 2 +- .../ext/go/core/ast/global/RPCoreGType.java | 2 +- .../ext/go/core/cli/RPCoreCommandLine.java | 4 +- .../RPCoreSTStateChanApiBuilder.java | 3 +- .../ext/go/util/IntPairSmt2Translator.java | 7 ++- .../ext/go/util/IntSmt2Translator.java | 7 ++- .../scribble/ext/go/util/Smt2Translator.java | 10 +++- .../org/scribble/ext/go/util/Z3Wrapper.java | 7 +-- 14 files changed, 76 insertions(+), 32 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index fa06e3b75..20bd4fb81 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -434,7 +434,7 @@ public Set getIndexedRoles() @Override public RPCoreLType project(RPCoreAstFactory af, //Role r, Set ranges) throws ParamCoreSyntaxException - RPRoleVariant subj) throws RPCoreSyntaxException + RPRoleVariant subj, Smt2Translator smt2t) throws RPCoreSyntaxException { //LinkedHashMap LinkedHashMap @@ -446,7 +446,7 @@ public RPCoreLType project(RPCoreAstFactory af, //Role r, Set ranges //RPCoreMessage a = e.getKey(); Message a = e.getKey(); //projs.put(a, e.getValue().project(af, r, ranges)); - projs.put(a, e.getValue().project(af, subj)); + projs.put(a, e.getValue().project(af, subj, smt2t)); // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) // FIXME: receive assertion projection -- should not be the same as send? diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java index b23e81ec1..4628c3124 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGCont.java @@ -55,7 +55,7 @@ public Set getIndexedRoles() } @Override - public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj, Smt2Translator smt2t) throws RPCoreSyntaxException { return af.ParamCoreLCont(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java index 1e23126b8..f9b60cfc5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGEnd.java @@ -56,7 +56,7 @@ public Set getIndexedRoles() @Override //public ParamCoreLEnd project(ParamCoreAstFactory af, Role r, Set ranges) - public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj, Smt2Translator smt2t) throws RPCoreSyntaxException { return af.ParamCoreLEnd(); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 9673887ce..3134b6db0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -2,6 +2,7 @@ import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.Stack; @@ -22,9 +23,9 @@ import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexFactory; -import org.scribble.ext.go.type.index.RPIndexVal; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.ext.go.util.Smt2Translator; +import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.type.kind.Global; import org.scribble.type.name.Role; @@ -113,9 +114,9 @@ public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCo // G proj r \vec{D} @Override //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException - public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj, Smt2Translator smt2t) throws RPCoreSyntaxException { - RPCoreLType seq = this.seq.project(af, subj); + RPCoreLType seq = this.seq.project(af, subj, smt2t); if (this.roles.contains(subj.getName())) // FIXME: factor out -- cf. RPCoreGChoice#project { /*RPIndexVar tmp = RPIndexFactory.ParamIntVar(this.param.toString()); @@ -132,12 +133,12 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor RPCoreGForeach tmp = af.RPCoreGForeach(this.roles, this.ivals, body, af.ParamCoreGEnd()); // CHECKME: should be "end" so that it will be discarded? seq will be substituted for cont in the final "unrolling" of foreach - RPCoreLType proj = tmp.project2(af, subj.getName(), filtered); + RPCoreLType proj = tmp.project2(af, subj.getName(), filtered, smt2t); return proj.subs(af, RPCoreLCont.CONT, seq); } else { - RPCoreLType body = this.body.project(af, subj); + RPCoreLType body = this.body.project(af, subj, smt2t); if (body instanceof RPCoreLCont) // Cf. project2, ivals.isEmpty case { return seq; @@ -150,7 +151,7 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor } // G proj r \vec{C} - private RPCoreLType project2(RPCoreAstFactory af, Role name, Set ivals) throws RPCoreSyntaxException + private RPCoreLType project2(RPCoreAstFactory af, Role name, Set ivals, Smt2Translator smt2t) throws RPCoreSyntaxException { /*RPInterval v = new RPInterval(this.start, this.end); if (subj.intervals.contains(v)) @@ -171,18 +172,47 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set ivals.stream().filter(y -> !x.equals(y)) - ////.allMatch(y -> ((RPIndexInt) x.start).val >= ((RPIndexInt) y.start).val)) .allMatch(y -> ((RPIndexVal) x.start).gtEq(((RPIndexVal) y.start)))) // FIXME: general index expressions .findFirst().get(); - // FIXME: non-RPIndexInt start exprs for nat intervals -- FIXME: generalised interval comparison (multidim) + // FIXME: non-RPIndexInt start exprs for nat intervals -- FIXME: generalised interval comparison (multidim)*/ + + RPAnnotatedInterval max = null; + List vars = ivals.stream().flatMap(x -> x.getIndexVars().stream().map(y -> y.toSmt2Formula(smt2t))).distinct().collect(Collectors.toList()); + if (ivals.size() > 1) + { + for (RPAnnotatedInterval ival : ivals) + { + List cs = ivals.stream().filter(x -> !x.equals(ival)).map(x -> smt2t.makeLte(x.start.toSmt2Formula(smt2t), ival.start.toSmt2Formula(smt2t))).collect(Collectors.toList()); + String smt2 = smt2t.makeAnd(cs); + if (!vars.isEmpty()) + { + smt2 = smt2t.makeForall(vars, smt2); + } + smt2 = smt2t.makeAssert(smt2); + if (Z3Wrapper.checkSat(smt2t.job, smt2t.global, smt2)) + { + max = ival; + break; + } + } + if (max == null) + { + throw new RuntimeException("Shouldn't get in here: " + ivals); + } + } + else + { + max = ivals.iterator().next(); + } + RPIndexVar var = RPIndexFactory.ParamIntVar(max.var.toString()); // N.B. not RPForeachVar -- occurrences in body are parsed as RPIndexVar, not RPForeachVar RPCoreLType proj = this.body.project3(af, this.roles, this.ivals, new RPIndexedRole(name.toString(), Stream.of(new RPInterval(var, var)).collect(Collectors.toSet()))); Set tmp = new HashSet<>(ivals); tmp.remove(max); - return proj.subs(af, RPCoreLCont.CONT, project2(af, name, tmp)); + return proj.subs(af, RPCoreLCont.CONT, project2(af, name, tmp, smt2t)); } // G proj R \vec{C} r[z] diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java index a76e627c9..6801f5cff 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGMultiChoices.java @@ -167,7 +167,7 @@ public Set getIndexedRoles() @Override //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException - public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj, Smt2Translator smt2t) throws RPCoreSyntaxException { if (this.kind != RPCoreGActionKind.CROSS_TRANSFER) { @@ -185,7 +185,7 @@ public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCor Message a = e.getKey(); //projs.put(a, e.getValue().project(af, r, ranges)); - projs.put(a, e.getValue().project(af, subj)); + projs.put(a, e.getValue().project(af, subj, smt2t)); // N.B. local actions directly preserved from globals -- so core-receive also has assertion (cf. ParamGActionTransfer.project, currently no ParamLReceive) // FIXME: receive assertion projection -- should not be the same as send? } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java index 5f7978283..910708602 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRec.java @@ -57,10 +57,10 @@ public Set getIndexedRoles() @Override //public ParamCoreLType project(ParamCoreAstFactory af, Role r, Set ranges) throws ParamCoreSyntaxException - public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj, Smt2Translator smt2t) throws RPCoreSyntaxException { //ParamCoreLType proj = this.body.project(af, r, ranges); - RPCoreLType proj = this.body.project(af, subj); + RPCoreLType proj = this.body.project(af, subj, smt2t); if (proj instanceof RPCoreLRecVar) { RPCoreLRecVar rv = (RPCoreLRecVar) proj; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java index 4e2c28dca..ce49a06f1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGRecVar.java @@ -54,7 +54,7 @@ public Set getIndexedRoles() @Override //public ParamCoreLRecVar project(ParamCoreAstFactory af, Role r, Set ranges) - public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException + public RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj, Smt2Translator smt2t) throws RPCoreSyntaxException { return af.ParamCoreLRecVar(this.recvar); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java index b3561d750..e7033cfda 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGType.java @@ -28,7 +28,7 @@ public interface RPCoreGType extends RPCoreType // TODO: clarify, Role subj is used as "role name" //ParamCoreLType project(ParamCoreAstFactory af, Role subj, Set ranges) throws ParamCoreSyntaxException; - RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj) throws RPCoreSyntaxException; // G proj r \vec{D} + RPCoreLType project(RPCoreAstFactory af, RPRoleVariant subj, Smt2Translator smt2t) throws RPCoreSyntaxException; // G proj r \vec{D} RPCoreLType project3(RPCoreAstFactory af, Set roles, Set ivals, RPIndexedRole subj) throws RPCoreSyntaxException; // G proj R \vec{C} r[z] Set getIndexedRoles(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 61e0bc7bc..66f5fff5f 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -273,7 +273,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws RPCoreAstFactory af = new RPCoreAstFactory(); this.gt = new RPCoreGProtocolDeclTranslator(job, af).translate(this.gpd); - this.smt2t = Z3Wrapper.getSmt2Translator(gt); + this.smt2t = Z3Wrapper.getSmt2Translator(job, this.gpd, gt); job.debugPrintln("\n[rp-core] Translated:\n " + gt); @@ -295,7 +295,7 @@ private void paramCoreParseAndCheckWF(GoJob job, GProtocolName simpname) throws for (RPRoleVariant variant : variants.get(r)) { //ParamCoreLType lt = gt.project(af, r, ranges); - RPCoreLType lt = gt.project(af, variant); + RPCoreLType lt = gt.project(af, variant, this.smt2t); lt = lt.minimise(af, variant); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 5c096512f..418caa62b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -741,8 +741,7 @@ protected String getPayloadElemTypeName(PayloadElemType pet) try { RPCoreGType gt = new RPCoreGProtocolDeclTranslator(this.job, af).translate(gpd); - //RPCoreLType lt = - gt.project(af, v); + //RPCoreLType lt = gt.project(af, v, smt2t); /* // FIXME: currently cannot determine state chan name of target state in delegated protocol because of decoupled state numbering // If we rebuild the target endpoint graph here, the state numbering won't match diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/IntPairSmt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/IntPairSmt2Translator.java index 7307537a7..208950778 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/IntPairSmt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/IntPairSmt2Translator.java @@ -1,10 +1,13 @@ package org.scribble.ext.go.util; +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ext.go.main.GoJob; + public class IntPairSmt2Translator extends Smt2Translator { - public IntPairSmt2Translator() + public IntPairSmt2Translator(GoJob job, GProtocolDecl global) { - //super(Sort.Pair); + super(job, global); //Sort.Pair); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java index 9342b6739..380f3e2f7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/IntSmt2Translator.java @@ -1,10 +1,13 @@ package org.scribble.ext.go.util; +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ext.go.main.GoJob; + public class IntSmt2Translator extends Smt2Translator { - public IntSmt2Translator() + public IntSmt2Translator(GoJob job, GProtocolDecl global) { - //super(Sort.Int); + super(job, global); //Sort.Int); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java index b28a8a721..2abf22cda 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java @@ -4,14 +4,22 @@ import java.util.List; import java.util.stream.Collectors; +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ext.go.main.GoJob; + public abstract class Smt2Translator { + public final GoJob job; + public final GProtocolDecl global; + /*enum Sort { Int, Pair } private final Sort sort;*/ - public Smt2Translator() + public Smt2Translator(GoJob job, GProtocolDecl global) { + this.job = job; + this.global = global; //this.sort = sort; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index 49b806808..117c89079 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -5,6 +5,7 @@ import java.util.Set; import org.scribble.ast.ProtocolDecl; +import org.scribble.ast.global.GProtocolDecl; import org.scribble.ext.go.core.ast.global.RPCoreGType; import org.scribble.ext.go.core.type.RPIndexedRole; import org.scribble.ext.go.main.GoJob; @@ -17,17 +18,17 @@ public class Z3Wrapper { - public static Smt2Translator getSmt2Translator(RPCoreGType gt) + public static Smt2Translator getSmt2Translator(GoJob job, GProtocolDecl gpd, RPCoreGType gt) { Set irs = gt.getIndexedRoles(); if (irs.isEmpty() || irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().noneMatch(z -> z instanceof RPIndexIntPair)))) { - return new IntSmt2Translator(); + return new IntSmt2Translator(job, gpd); } else if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().allMatch(z -> z instanceof RPIndexIntPair)))) { - return new IntPairSmt2Translator(); + return new IntPairSmt2Translator(job, gpd); } else { From 024bc8e4091da50d95f517dbcd8f5d50eee98da3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 18:15:49 +0100 Subject: [PATCH 390/433] Patched rp-core pair name gen for neg vals. --- .../go/core/codegen/statetype3/RPCoreSTApiGenerator.java | 8 ++++++-- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 8 +++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index ac34b4522..8544e53f4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -267,7 +267,7 @@ public static String getGeneratedRoleVariantName(RPRoleVariant variant) .sorted().collect(Collectors.joining("and"))); } - // For type name generation -- cf. RPCoreSTStateChanApiBuilder#generateIndexExpr + // For type name generation -- not code exprs, cf. RPCoreSTStateChanApiBuilder#generateIndexExpr public static String getGeneratedNameLabel(RPIndexExpr e) { if (e instanceof RPIndexInt) @@ -282,7 +282,11 @@ else if (e instanceof RPIndexIntPair) { //return e.toGoString(); // No: that gives the "value" expression RPIndexIntPair p = (RPIndexIntPair) e; - return "l" + p.left.toGoString() + "r" + p.right.toGoString(); + int l = ((RPIndexInt) p.left).val; + int r = ((RPIndexInt) p.right).val; + String ll = (l < 0) ? "neg" + (-1*l) : Integer.toString(l); + String rr = (r < 0) ? "neg" + (-1*r) : Integer.toString(r); + return "l" + ll + "r" + rr; } else if (e instanceof RPBinIndexExpr) { diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 33667f837..a2cb6ff87 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,6 +8,7 @@ module param.tmp.ParamTest; +/* global protocol Proto1(role A, role B) { foreach B[I:1,K] @@ -22,6 +23,7 @@ global protocol Proto1(role A, role B) } } } +//*/ /* @@ -78,7 +80,7 @@ aux global protocol UpdatedQuoteRequest(role Buyer, role Supplier, role Manufact // Buyer goes back to (4) Modify(Quote) from Supplier[I] to Buyer[1]; NoOp() from Supplier[I] to Manufacturer[1,M]; - //do MakeDeal(Buyer, Supplier, Manufacturer); + //do MakeDeal(Buyer, Supplier, Manufacturer); // No: recursion out of foreach } or { // (5c) Or Supplier reject updated quote. Reject() from Supplier[I] to Buyer[1]; @@ -88,7 +90,7 @@ aux global protocol UpdatedQuoteRequest(role Buyer, role Supplier, role Manufact // going back to (3) Renegotiate() from Supplier[I] to Buyer[1]; Renegotiate() from Supplier[I] to Manufacturer[1,M]; - //do Negotiate(Buyer, Supplier, Manufacturer); + //do Negotiate(Buyer, Supplier, Manufacturer); // No: recursion out of foreach } } } @@ -123,7 +125,7 @@ global protocol Proto1(role A, role B, role C) //*/ -/* +//* //foreach W { i 1 :k 11 ..k wh -(1,0) , i 2 :k 11 +(1,0)..k wh } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; //foreach W { i 1 :k w1 ..k wh , i 2 :k 11 ..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; //foreach W { i 1 :k 11 ..k 1h -(0,1) , i 2 :k 11 +(0,1)..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ;W [ k 1h ]→ W [ k 11 ] .end From 51c6cdfed0403f94ecdc29572a1a86b4254d5c62 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 18:25:50 +0100 Subject: [PATCH 391/433] Updated nested var collection for pairs. --- .../scribble/ext/go/type/index/RPIndexIntPair.java | 6 ++---- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 12 +++++++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java index 34ba1dbdd..088c657e5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java @@ -66,10 +66,8 @@ public Set getVals() @Override public Set getVars() { - /*Set vars = new HashSet<>(this.left.getVars()); - vars.addAll(this.right.getVars()); - return vars;*/ - return Collections.emptySet(); // Currently only considered as a value + return Stream.of(this.left.getVars(), this.right.getVars()).flatMap(x -> x.stream()).collect(Collectors.toSet()); + //return Collections.emptySet(); // Currently only considered as a value } @Override diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index a2cb6ff87..3d614fe49 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -126,14 +126,20 @@ global protocol Proto1(role A, role B, role C) //* -//foreach W { i 1 :k 11 ..k wh -(1,0) , i 2 :k 11 +(1,0)..k wh } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; -//foreach W { i 1 :k w1 ..k wh , i 2 :k 11 ..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; -//foreach W { i 1 :k 11 ..k 1h -(0,1) , i 2 :k 11 +(0,1)..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ;W [ k 1h ]→ W [ k 11 ] .end +//foreach W { i1 :k 11 ..k wh -(1,0) , i2 :k 11 +(1,0)..k wh } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; +//foreach W { i1 :k w1 ..k wh , i2 :k 11 ..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; +//foreach W { i1 :k 11 ..k 1h -(0,1) , i2 :k 11 +(0,1)..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ;W [ k 1h ]→ W [ k 11 ] .end global protocol Proto1(role W) { foreach W[I1:(1,1),K-(1,0)], W[I2:(1,1)+(1,0),K] { Foo() from W[I1] to W[I2]; } + foreach W[I1:(W,1),K], W[I2:(1,1),(1,H)] { + Foo() from W[I1] to W[I2]; + } + /*foreach W[I1:(1,1),(1,H)-(0,1)], W[I2:(1,1)+(0,1),(1,H)] { + Foo() from W[I1] to W[I2]; + }*/ } //*/ From 3d9863a2347379b6029defd105ee8279d68b4987 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 18:26:09 +0100 Subject: [PATCH 392/433] Minor. --- .../main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java | 1 - 1 file changed, 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java index 088c657e5..27f2a9af0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java @@ -1,6 +1,5 @@ package org.scribble.ext.go.type.index; -import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; From 585260b7d71d60cc77abb060e1f4e0f87549c56e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 20:02:16 +0100 Subject: [PATCH 393/433] Update to rp-core project2 max check. --- .../ext/go/core/ast/global/RPCoreGForeach.java | 10 ++++++++-- .../org/scribble/ext/go/type/index/RPIndexIntPair.java | 5 +++-- .../java/org/scribble/ext/go/util/Smt2Translator.java | 5 +++++ scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 4 +++- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 3134b6db0..fcbb3b325 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -2,6 +2,7 @@ import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -184,15 +185,20 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set cs = ivals.stream().filter(x -> !x.equals(ival)).map(x -> smt2t.makeLte(x.start.toSmt2Formula(smt2t), ival.start.toSmt2Formula(smt2t))).collect(Collectors.toList()); + List cs = new LinkedList<>(); + cs.addAll(ivals.stream().filter(x -> !x.equals(ival)).map(x -> smt2t.makeLte(x.start.toSmt2Formula(smt2t), ival.start.toSmt2Formula(smt2t))).collect(Collectors.toList())); String smt2 = smt2t.makeAnd(cs); if (!vars.isEmpty()) { + smt2 = smt2t.makeImplies( + smt2t.makeAnd(vars.stream().map(x -> smt2t.makeGte(x, smt2t.getDefaultBaseValue())).collect(Collectors.toList())), smt2); smt2 = smt2t.makeForall(vars, smt2); } smt2 = smt2t.makeAssert(smt2); - if (Z3Wrapper.checkSat(smt2t.job, smt2t.global, smt2)) + boolean ddd; + if (ddd = Z3Wrapper.checkSat(smt2t.job, smt2t.global, smt2)) { + System.out.println(ddd); max = ival; break; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java index 27f2a9af0..624cf3d19 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexIntPair.java @@ -1,5 +1,6 @@ package org.scribble.ext.go.type.index; +import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -65,8 +66,8 @@ public Set getVals() @Override public Set getVars() { - return Stream.of(this.left.getVars(), this.right.getVars()).flatMap(x -> x.stream()).collect(Collectors.toSet()); - //return Collections.emptySet(); // Currently only considered as a value + //return Stream.of(this.left.getVars(), this.right.getVars()).flatMap(x -> x.stream()).collect(Collectors.toSet()); + return Collections.emptySet(); // Currently only considered as a value } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java index 2abf22cda..82212fe24 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Smt2Translator.java @@ -103,6 +103,11 @@ public String makeAnd(List cs) return "(and " + cs.stream().collect(Collectors.joining(" ")) + ")"; } + public String makeImplies(String left, String right) + { + return "(implies " + left + " " + right + ")"; + } + public String makeOr(String... cs) { return makeOr(Arrays.asList(cs)); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 3d614fe49..602df46fb 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -129,14 +129,16 @@ global protocol Proto1(role A, role B, role C) //foreach W { i1 :k 11 ..k wh -(1,0) , i2 :k 11 +(1,0)..k wh } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; //foreach W { i1 :k w1 ..k wh , i2 :k 11 ..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; //foreach W { i1 :k 11 ..k 1h -(0,1) , i2 :k 11 +(0,1)..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ;W [ k 1h ]→ W [ k 11 ] .end -global protocol Proto1(role W) +global protocol Proto1(role W, role M) { foreach W[I1:(1,1),K-(1,0)], W[I2:(1,1)+(1,0),K] { Foo() from W[I1] to W[I2]; } + /*Bar() from W[(1,1),Kwh] to M[1]; foreach W[I1:(W,1),K], W[I2:(1,1),(1,H)] { Foo() from W[I1] to W[I2]; } + Bar() from W[(1,1),K] to M[1]; /*foreach W[I1:(1,1),(1,H)-(0,1)], W[I2:(1,1)+(0,1),(1,H)] { Foo() from W[I1] to W[I2]; }*/ From bafaeb700144df4d7a837ad12310008584d61dc9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 21:04:12 +0100 Subject: [PATCH 394/433] Patch to prev update. --- .../ext/go/core/ast/global/RPCoreGChoice.java | 13 +++++++------ .../org/scribble/ext/go/util/Z3Wrapper.java | 17 +++++++++++++---- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index 20bd4fb81..e6f6a3a7e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -255,13 +255,17 @@ private boolean checkOverlappingIntervals(GoJob job, Set srcAndDestVars = new HashSet<>(); srcAndDestVars.addAll(this.src.getIndexVars()); srcAndDestVars.addAll(this.dest.getIndexVars()); + List tmp = new LinkedList<>(); + tmp.add("foobartmp"); + vars.forEach(x -> tmp.add(x.toSmt2Formula(smt2t))); for (RPIndexVar sv : srcAndDestVars) { - String tmp = sv.toString(); - if (curr.contains(tmp)) // FIXME: awkwardness of RPForeachVar and RPIndexVar + String tmp2 = sv.toString(); + if (curr.contains(tmp2)) // FIXME: awkwardness of RPForeachVar and RPIndexVar { - RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp)); + RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp2)); cs.add(smt2t.makeEq(sv.toSmt2Formula(smt2t), ival.start.toSmt2Formula(smt2t))); + ival.start.getVars().stream().map(x -> x.toSmt2Formula(smt2t)).forEach(x -> tmp.add(x)); } } Stream.of(srcRange, destRange).forEach(r -> @@ -269,9 +273,6 @@ private boolean checkOverlappingIntervals(GoJob job, cs.add(smt2t.makeGte("foobartmp", r.start.toSmt2Formula(smt2t))); cs.add(smt2t.makeLte("foobartmp", r.end.toSmt2Formula(smt2t))); }); - List tmp = new LinkedList<>(); - tmp.add("foobartmp"); - vars.forEach(x -> tmp.add(x.toSmt2Formula(smt2t))); String smt2 = smt2t.makeAssert(smt2t.makeExists(tmp, smt2t.makeAnd(cs))); job.debugPrintln("\n[param-core] [WF] Checking non-overlapping ranges (potential self-communication) for " + this.src.getName() + ":\n " + smt2); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index 117c89079..e302a49f5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.util; import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.Set; @@ -40,11 +41,11 @@ else if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getInde public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) //throws ScribbleException { String tmpName = gpd.header.name + ".smt2.tmp"; - File tmp = new File(tmpName); - if (tmp.exists()) // Factor out with CommandLine.runDot (file exists check) + File tmp = null; //= new File(tmpName); + /*if (tmp.exists()) // Factor out with CommandLine.runDot (file exists check) { throw new RuntimeException("Cannot overwrite: " + tmpName); - } + }*/ smt2 = "(declare-datatypes (T1 T2) ((Pair (mk-pair (fst T1) (snd T2)))))\n" + "(define-fun pair_max ((p!1 (Pair Int Int))) Int (ite (< (fst p!1) (snd p!1)) (snd p!1) (fst p!1) ) )\n" + "(define-fun pair_min ((p!1 (Pair Int Int))) Int (ite (< (fst p!1) (snd p!1)) (fst p!1) (snd p!1)))\n" @@ -60,6 +61,7 @@ public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) smt2 = smt2 + "\n(check-sat)\n(exit)"; try { + tmp = File.createTempFile(gpd.header.name.toString(), ".smt2.tmp"); ScribUtil.writeToFile(tmpName, smt2); String[] res = ScribUtil.runProcess("z3", tmpName); String trim = res[0].trim(); @@ -76,13 +78,20 @@ else if (trim.equals("unsat")) throw new RuntimeException("[assrt] Z3 error: " + Arrays.toString(res)); } } + catch (IOException x) + { + throw new RuntimeException(x); + } catch (ScribbleException e) { throw new RuntimeException(e); } finally { - tmp.delete(); + if (tmp != null) + { + tmp.delete(); + } } } } From 9df84d96d0a382d7ebc10550f3c03254548bced3 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sun, 14 Oct 2018 21:43:40 +0100 Subject: [PATCH 395/433] Minor. --- .../org/scribble/ext/go/core/ast/global/RPCoreGForeach.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index fcbb3b325..8074b3837 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -195,10 +195,8 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set Date: Sun, 14 Oct 2018 22:51:07 +0100 Subject: [PATCH 396/433] Continued. --- .../scribble/ext/go/core/ast/global/RPCoreGChoice.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java index e6f6a3a7e..eca67d881 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGChoice.java @@ -178,6 +178,9 @@ private boolean checkForeachVarAlignment(GoJob job, Stack smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue())).collect(Collectors.toList())), + smt2); smt2 = smt2t.makeForall(vars.stream().map(x -> x.toSmt2Formula(smt2t)).collect(Collectors.toList()), smt2); } smt2 = smt2t.makeAssert(smt2); @@ -265,7 +268,11 @@ private boolean checkOverlappingIntervals(GoJob job, { RPInterval ival = peek.get(RPIndexFactory.RPForeachVar(tmp2)); cs.add(smt2t.makeEq(sv.toSmt2Formula(smt2t), ival.start.toSmt2Formula(smt2t))); - ival.start.getVars().stream().map(x -> x.toSmt2Formula(smt2t)).forEach(x -> tmp.add(x)); + ival.start.getVars().stream().map(x -> x.toSmt2Formula(smt2t)).forEach(x -> + { + tmp.add(x); + cs.add(smt2t.makeGte(x, smt2t.getDefaultBaseValue())); + }); } } Stream.of(srcRange, destRange).forEach(r -> From 853e772ceaa0701c806be888f9f30134f49196ff Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 00:12:20 +0100 Subject: [PATCH 397/433] Fixed typo in rp-core foreach intermed state gen. --- .../RPCoreSTStateChanApiBuilder.java | 2 +- .../src/test/scrib/param/tmp/ParamTest.scr | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 418caa62b..6c87c92ab 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -287,7 +287,7 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) case Int: { lte = " <= " + generateIndexExpr(s.getInterval().end); - inc = "p+1"; + inc = p + "+1"; break; } case IntPair: diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 602df46fb..678f777e1 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,6 +8,18 @@ module param.tmp.ParamTest; +global protocol Proto1(role P, role Q) +{ + Play(Game@A) from Q[1] to P[1,K]; +} + +global protocol Game(role A, role B, role C) +{ + Foo() from A[1] to B[1]; + Bar() from A[1] to C[1]; +} + + /* global protocol Proto1(role A, role B) { @@ -94,6 +106,8 @@ aux global protocol UpdatedQuoteRequest(role Buyer, role Supplier, role Manufact } } } +//*/ + /* global protocol Proto1(role A, role B) @@ -125,7 +139,7 @@ global protocol Proto1(role A, role B, role C) //*/ -//* +/* //foreach W { i1 :k 11 ..k wh -(1,0) , i2 :k 11 +(1,0)..k wh } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; //foreach W { i1 :k w1 ..k wh , i2 :k 11 ..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ; //foreach W { i1 :k 11 ..k 1h -(0,1) , i2 :k 11 +(0,1)..k 1h } do ( W [ i 1 ]→ W [ i 2 ] .cont ) ;W [ k 1h ]→ W [ k 11 ] .end @@ -141,7 +155,7 @@ global protocol Proto1(role W, role M) Bar() from W[(1,1),K] to M[1]; /*foreach W[I1:(1,1),(1,H)-(0,1)], W[I2:(1,1)+(0,1),(1,H)] { Foo() from W[I1] to W[I2]; - }*/ + }* / } //*/ From 784feabdf02829ae915a5e34e89183a5008168e6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 02:49:18 +0100 Subject: [PATCH 398/433] Patching rp-core API gen runtime checks. --- .../ext/go/core/cli/RPCoreCommandLine.java | 4 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 137 ++++++++++++++++-- .../src/test/scrib/param/tmp/ParamTest.scr | 9 ++ 3 files changed, 133 insertions(+), 17 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 66f5fff5f..3e8fc96e9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -718,6 +718,7 @@ private Set, Set>> getFamilies(GoJob job, { smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula(smt2t)).collect(Collectors.toList()), smt2); } + //smt2 = smt2t.makeExists(Stream.of("self").collect(Collectors.toList()), smt2); smt2 = smt2t.makeAssert(smt2); job.debugPrintln("\n[rp-core] Family candidate (" + i++ + "/" + size + "): " + cand); @@ -786,9 +787,10 @@ private Set, Set>> getFamilies(GoJob job, //z3 = "(exists (" + vars.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + ") " + z3 + ")"; z3 = smt2t.makeExists(vars.stream().map(v -> v.toSmt2Formula(smt2t)).collect(Collectors.toList()), z3); } + //z3 = smt2t.makeExists(Stream.of("self").collect(Collectors.toList()), z3); z3 = smt2t.makeAssert(z3); - job.debugPrintln("\n[rp-core] Variant andidate (" + i++ + "/" + size + "): " + cand); + job.debugPrintln("\n[rp-core] Variant candidate (" + i++ + "/" + size + "): " + cand); job.debugPrintln("[rp-core] Co-set: " + coset); job.debugPrintln("[rp-core] Running Z3 on:\n" + z3); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 665de785e..bcc72168a 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -17,6 +17,9 @@ import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.type.index.RPBinIndexExpr; +import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexIntPair; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EStateKind; @@ -154,6 +157,8 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, "// Package " + this.apigen.getApiRootPackageName() + " is the generated API for the " + this.apigen.proto.getPrefix().getSimpleName().toString() + "." + this.apigen.getApiRootPackageName() + " protocol.\n" + "// Use functions in this package to create instances of role variants.\n" + "package " + this.apigen.getApiRootPackageName() + "\n" + + "\n" + + "import \"strconv\"\n" + "\n"; if (this.apigen.mode == Mode.IntPair) @@ -189,6 +194,8 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, }).collect(Collectors.joining("")); }).collect(Collectors.joining("")); }).collect(Collectors.joining(""))); + + protoFile += "\nvar _ = strconv.Itoa\n"; protoFile += "\n" // Protocol type @@ -220,6 +227,20 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, for (Pair, Set> family : families) // FIXME: use family to make accept/dial { + + // Factor out with below + Pair, Set> orig = (this.apigen.subsum.containsKey(family)) ? this.apigen.subsum.get(family) : family; + RPRoleVariant subbdbyus = null; + for (RPRoleVariant subbd : this.apigen.aliases.keySet()) + { + Map, Set>, RPRoleVariant> ais = this.apigen.aliases.get(subbd); + if (ais.containsKey(orig) && ais.get(orig).equals(variant)) + { + subbdbyus = subbd; // We subsumed "subbd", so we need to inherit all their peers + break; + } + } + /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); try { @@ -244,12 +265,16 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") + RPCoreSTApiGenerator.getGeneratedRoleVariantName(variant) // FIXME: factor out (and separate type name from package name) + "." + epkindTypeName - + " {\n" + + " {\n"; /*+ "params := make(map[string]int)\n" //+ decls.iterator().next().params + ivars .stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining(""))*/ - + "return " + + tmp += makeFamilyCheck(family, ivars); + tmp += makeSelfCheck(variant, ivars, subbdbyus); + + tmp += "return " + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") + RPCoreSTApiGenerator.getEndpointKindPackageName(variant) // FIXME: factor out + ".New" + "(p" //", params" @@ -266,6 +291,82 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, res.put(getProtocolFilePath() + simpname + ".go", protoFile); } + private String makeFamilyCheck(Pair, Set> fff, List ivars) + { + String res = ""; + /*Set left = fff.left; + Set right = fff.right; + for (RPRoleVariant cov : right) + { + res += "covistarts := " + + "[]{" + ((this.apigen.mode == Mode.Int) ? "int" : "session2.Pair") + + "{" + cov.intervals.stream().map(x -> x.start.toGoString()).collect(Collectors.joining("")) + "}};\n"; + res += "coviends := " + + "[]{" + ((this.apigen.mode == Mode.Int) ? "int" : "session2.Pair") + + "{" + cov.intervals.stream().map(x -> x.end.toGoString()).collect(Collectors.joining("")) + "}};\n"; + }*/ + return res; + } + + private String makeSelfCheck(RPRoleVariant vvv, List ivars, RPRoleVariant subbd) + { + String res = "if " + + vvv.intervals.stream().map(x -> + ((this.apigen.mode == Mode.Int) + ? "(self < " + x.start.toGoString() + ") || (self > " + x.end.toGoString() + ")" + : "(self.Lt(" + makeGoIndexExpr(x.start) + ")) || (self.Gt(" + makeGoIndexExpr(x.end) + "))" + ) + ).collect(Collectors.joining(" || ")) + " {\n"; + + if (subbd != null) + { + res += makeSelfCheck(subbd, ivars, null); + } + else + { + res += + "panic(\"Invalid params/self: \" + " + + ivars.stream().filter(x -> !x.name.equals("self")).map(x -> + ((this.apigen.mode == Mode.Int) + ? "strconv.Itoa(" + x.toGoString() + ")" + : x.toGoString() + ".String()" + ) + " + \", \" + ").collect(Collectors.joining("")) + + ((this.apigen.mode == Mode.Int) ? "strconv.Itoa(self)" : "self.String()") + + ")\n"; + } + + res += "}\n"; + + return res; + } + + // Factor out with RPCoreSTStateChanApiGenerator#generateIndexExpr + private String makeGoIndexExpr(RPIndexExpr e) + { + if (e instanceof RPIndexIntPair || e instanceof RPIndexVar) + { + return e.toGoString(); + } + else if (e instanceof RPBinIndexExpr) + { + RPBinIndexExpr b = (RPBinIndexExpr) e; + // TODO: factor out + String op; + switch (b.op) + { + case Add: op = "Plus"; break; + case Subt: op = "Sub"; break; + case Mult: + default: throw new RuntimeException("[rp-core] Shouldn't get in here: " + e); + } + return "(" + makeGoIndexExpr(b.left) + "." + op + "(" + makeGoIndexExpr(b.right) + "))"; + } + else + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + e); + } + } + // FIXME: should be lpd private void buildEndpointKindApi(ProtocolDecl gpd, Map res, String indexType) { @@ -291,6 +392,23 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map (Iterable, Set>>) this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) { + + // Factor out with above + Pair, Set> orig = (this.apigen.subsum.containsKey(family)) ? this.apigen.subsum.get(family) : family; + RPRoleVariant subbdbyus = null; + for (RPRoleVariant subbd : this.apigen.aliases.keySet()) + { + Map, Set>, RPRoleVariant> ais = this.apigen.aliases.get(subbd); + if (ais.containsKey(orig) && ais.get(orig).equals(variant)) + { + subbdbyus = subbd; // We subsumed "subbd", so we need to inherit all their peers + break; + } + } + + //System.out.println("ffff: " + family + "\n" + variant + " ,, " + peers); + + /*RPCoreIndexVarCollector coll = new RPCoreIndexVarCollector(this.apigen.job); try { @@ -449,22 +567,8 @@ public int compare(Entry o1, Entry o2) // FIXME: should record peers according to families and lookup directly -- wouldn't need to re-check family inclusion here {*/ - Pair, Set> orig = (this.apigen.subsum.containsKey(family)) ? this.apigen.subsum.get(family) : family; Set peers = this.apigen.peers.get(variant).get(orig); - RPRoleVariant subbdbyus = null; - for (RPRoleVariant subbd : this.apigen.aliases.keySet()) - { - Map, Set>, RPRoleVariant> ais = this.apigen.aliases.get(subbd); - if (ais.containsKey(orig) && ais.get(orig).equals(variant)) - { - subbdbyus = subbd; // We subsumed "subbd", so we need to inherit all their peers - break; - } - } - - //System.out.println("ffff: " + family + "\n" + variant + " ,, " + peers); - for (RPRoleVariant v : peers) { RPRoleVariant pp = v; @@ -527,6 +631,7 @@ public int compare(Entry o1, Entry o2) + "}\n"; //} } + if (subbdbyus != null) { // FIXME: factor out with above diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 678f777e1..d3ee1db9c 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,6 +8,14 @@ module param.tmp.ParamTest; +global protocol Proto1(role A, role B) +{ + +} + + + +/* global protocol Proto1(role P, role Q) { Play(Game@A) from Q[1] to P[1,K]; @@ -18,6 +26,7 @@ global protocol Game(role A, role B, role C) Foo() from A[1] to B[1]; Bar() from A[1] to C[1]; } +//*/ /* From dce95f0a0befb9b68d320c272c7c3053c07da84c Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 11:49:35 +0100 Subject: [PATCH 399/433] Continued. --- .../statetype3/RPCoreSTApiGenConstants.java | 3 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 56 ++++++++++++++++--- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java index 14cbb2c89..6f1f91be7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenConstants.java @@ -6,9 +6,10 @@ public class RPCoreSTApiGenConstants public static final String GO_SCRIBBLERUNTIME_SESSION_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/session2"; public static final String GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/twodim/session2"; public static final String GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/transport2"; - public static final String GO_SCRIBBLERUNTIME_SHM_PACKAGE = "github.com/scribble/go-runtime/transport2/shm"; + //public static final String GO_SCRIBBLERUNTIME_SHM_PACKAGE = "github.com/scribble/go-runtime/transport2/shm"; public static final String GO_SCRIBBLERUNTIME_BYTES_PACKAGE = "bytes"; public static final String GO_SCRIBBLERUNTIME_GOB_PACKAGE = "encoding/gob"; + public static final String GO_SCRIBBLERUNTIME_UTIL_PACKAGE = "github.com/rhu1/scribble-go-runtime/runtime/util"; public static final String GO_SCRIBBLERUNTIME_SESSIONPARAM_PACKAGE = "github.com/scribble/go-runtime/session2/param"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index bcc72168a..745fd0615 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -4,10 +4,12 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -159,6 +161,7 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, + "package " + this.apigen.getApiRootPackageName() + "\n" + "\n" + "import \"strconv\"\n" + + "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_UTIL_PACKAGE + "\"\n" + "\n"; if (this.apigen.mode == Mode.IntPair) @@ -305,6 +308,37 @@ private String makeFamilyCheck(Pair, Set> fff, "[]{" + ((this.apigen.mode == Mode.Int) ? "int" : "session2.Pair") + "{" + cov.intervals.stream().map(x -> x.end.toGoString()).collect(Collectors.joining("")) + "}};\n"; }*/ + String ivalkind; + switch (this.apigen.mode) + { + case Int: ivalkind = "IntInterval"; break; + case IntPair: ivalkind = "IntPairInterval"; break; + default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); + } + List tmp = new LinkedList<>(); + Function, String> ggg = vs -> + { + for (RPRoleVariant v : vs) + { + v.intervals.forEach(x -> + { + String start = (this.apigen.mode == Mode.Int) ? x.start.toGoString() : makeGoIndexExpr(x.start); + String end = (this.apigen.mode == Mode.Int) ? x.end.toGoString() : makeGoIndexExpr(x.end); + tmp.add("util." + ivalkind + "{" + start + ", " + end + "}"); + }); + } + return "[]util." + ivalkind + "{" + tmp.stream().collect(Collectors.joining(", ")) + "}\n"; + }; + res += "in := " + ggg.apply(fff.left); + res += "if util.Isect" + ivalkind + "s(in).IsEmpty() {\n"; + res += makeParamsSelfPanic(ivars); + res += "}\n"; + + tmp.clear(); + res += "out := " + ggg.apply(fff.right); + res += "if !util.Isect" + ivalkind + "s(out).IsEmpty() {\n"; + res += makeParamsSelfPanic(ivars); + res += "}\n"; return res; } @@ -324,15 +358,7 @@ private String makeSelfCheck(RPRoleVariant vvv, List ivars, RPRoleVa } else { - res += - "panic(\"Invalid params/self: \" + " - + ivars.stream().filter(x -> !x.name.equals("self")).map(x -> - ((this.apigen.mode == Mode.Int) - ? "strconv.Itoa(" + x.toGoString() + ")" - : x.toGoString() + ".String()" - ) + " + \", \" + ").collect(Collectors.joining("")) - + ((this.apigen.mode == Mode.Int) ? "strconv.Itoa(self)" : "self.String()") - + ")\n"; + res += makeParamsSelfPanic(ivars); } res += "}\n"; @@ -340,6 +366,18 @@ private String makeSelfCheck(RPRoleVariant vvv, List ivars, RPRoleVa return res; } + private String makeParamsSelfPanic(List ivars) + { + return "panic(\"Invalid params/self: \" + " + + ivars.stream().filter(x -> !x.name.equals("self")).map(x -> + ((this.apigen.mode == Mode.Int) + ? "strconv.Itoa(" + x.toGoString() + ")" + : x.toGoString() + ".String()" + ) + " + \", \" + ").collect(Collectors.joining("")) + + ((this.apigen.mode == Mode.Int) ? "strconv.Itoa(self)" : "self.String()") + + ")\n"; + } + // Factor out with RPCoreSTStateChanApiGenerator#generateIndexExpr private String makeGoIndexExpr(RPIndexExpr e) { From 073337675a212a39573736a9a7c64bd691b43eda Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 13:16:01 +0100 Subject: [PATCH 400/433] Continued. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 745fd0615..5e82b9f4e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -315,30 +315,34 @@ private String makeFamilyCheck(Pair, Set> fff, case IntPair: ivalkind = "IntPairInterval"; break; default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); } - List tmp = new LinkedList<>(); - Function, String> ggg = vs -> + + res += "var tmp []util." + ivalkind + "\n"; + Function makeIvals = vvv -> { - for (RPRoleVariant v : vs) + List ivals = new LinkedList<>(); + vvv.intervals.forEach(x -> { - v.intervals.forEach(x -> - { - String start = (this.apigen.mode == Mode.Int) ? x.start.toGoString() : makeGoIndexExpr(x.start); - String end = (this.apigen.mode == Mode.Int) ? x.end.toGoString() : makeGoIndexExpr(x.end); - tmp.add("util." + ivalkind + "{" + start + ", " + end + "}"); - }); - } - return "[]util." + ivalkind + "{" + tmp.stream().collect(Collectors.joining(", ")) + "}\n"; + String start = (this.apigen.mode == Mode.Int) ? x.start.toGoString() : makeGoIndexExpr(x.start); + String end = (this.apigen.mode == Mode.Int) ? x.end.toGoString() : makeGoIndexExpr(x.end); + ivals.add("util." + ivalkind + "{" + start + ", " + end + "}"); + }); + return "tmp = []util." + ivalkind + "{" + ivals.stream().collect(Collectors.joining(", ")) + "}\n"; }; - res += "in := " + ggg.apply(fff.left); - res += "if util.Isect" + ivalkind + "s(in).IsEmpty() {\n"; - res += makeParamsSelfPanic(ivars); - res += "}\n"; - tmp.clear(); - res += "out := " + ggg.apply(fff.right); - res += "if !util.Isect" + ivalkind + "s(out).IsEmpty() {\n"; - res += makeParamsSelfPanic(ivars); - res += "}\n"; + for (RPRoleVariant v : fff.left) + { + res += makeIvals.apply(v); + res += "if util.Isect" + ivalkind + "s(tmp).IsEmpty() {\n"; + res += makeParamsSelfPanic(ivars); + res += "}\n"; + } + for (RPRoleVariant v : fff.right) + { + res += makeIvals.apply(v); + res += "if !util.Isect" + ivalkind + "s(tmp).IsEmpty() {\n"; + res += makeParamsSelfPanic(ivars); + res += "}\n"; + } return res; } From c72cb66266460917193b870567277cd559578b06 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 13:37:12 +0100 Subject: [PATCH 401/433] Continued. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 5e82b9f4e..6cd3bcd69 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -224,9 +224,11 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, { boolean isCommonEndpointKind = this.apigen.isCommonEndpointKind(variant); + // HACK: setting family to null for common endpoint kind Set, Set>> families = isCommonEndpointKind ? Stream.of((Pair, Set>) null).collect(Collectors.toSet()) // FIXME HACK: when isCommonEndpointKind, just loop once (to make one New) : this.apigen.families.keySet().stream().filter(f -> f.left.contains(variant)).collect(Collectors.toSet()); + for (Pair, Set> family : families) // FIXME: use family to make accept/dial { @@ -274,7 +276,7 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, + ivars .stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining(""))*/ - tmp += makeFamilyCheck(family, ivars); + tmp += makeFamilyCheck((family == null) ? this.apigen.families.keySet().iterator().next() : family, ivars); // FIXME: due to above family null hack tmp += makeSelfCheck(variant, ivars, subbdbyus); tmp += "return " @@ -297,17 +299,6 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, private String makeFamilyCheck(Pair, Set> fff, List ivars) { String res = ""; - /*Set left = fff.left; - Set right = fff.right; - for (RPRoleVariant cov : right) - { - res += "covistarts := " + - "[]{" + ((this.apigen.mode == Mode.Int) ? "int" : "session2.Pair") - + "{" + cov.intervals.stream().map(x -> x.start.toGoString()).collect(Collectors.joining("")) + "}};\n"; - res += "coviends := " + - "[]{" + ((this.apigen.mode == Mode.Int) ? "int" : "session2.Pair") - + "{" + cov.intervals.stream().map(x -> x.end.toGoString()).collect(Collectors.joining("")) + "}};\n"; - }*/ String ivalkind; switch (this.apigen.mode) { From 2881bb96beb95980f5b9034b1637a56dcacb7fca Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 13:38:33 +0100 Subject: [PATCH 402/433] Continued. --- .../java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 3e8fc96e9..2156b502e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -472,8 +472,7 @@ private void minimise() Pair, Set> compressed = new Pair<>(tmp, fam.right); families.add(compressed); // Subsumed variants are neither in left nor right - System.out.println("\nFamily:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + "\nCompacted:\n" - + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n"))); + //System.out.println("\nFamily:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + "\nCompacted:\n" + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n"))); if (!tmp.equals(fam.left)) { From 1f9b253a156a83c8e4da7c8d5bcfb14db988a6fc Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 14:38:51 +0100 Subject: [PATCH 403/433] Continued. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 6cd3bcd69..89b8633bc 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -277,7 +277,8 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, .stream().map(x -> "params[\"" + x + "\"] = " + x + "\n").collect(Collectors.joining(""))*/ tmp += makeFamilyCheck((family == null) ? this.apigen.families.keySet().iterator().next() : family, ivars); // FIXME: due to above family null hack - tmp += makeSelfCheck(variant, ivars, subbdbyus); + tmp += makeSelfCheck1(variant, ivars, subbdbyus); + tmp += makeSelfCheck2(variant, ivars, subbdbyus); tmp += "return " + (isCommonEndpointKind ? "" : this.apigen.getFamilyPackageName(family) + "_") @@ -337,7 +338,7 @@ private String makeFamilyCheck(Pair, Set> fff, return res; } - private String makeSelfCheck(RPRoleVariant vvv, List ivars, RPRoleVariant subbd) + private String makeSelfCheck1(RPRoleVariant vvv, List ivars, RPRoleVariant subbd) { String res = "if " + vvv.intervals.stream().map(x -> @@ -346,18 +347,45 @@ private String makeSelfCheck(RPRoleVariant vvv, List ivars, RPRoleVa : "(self.Lt(" + makeGoIndexExpr(x.start) + ")) || (self.Gt(" + makeGoIndexExpr(x.end) + "))" ) ).collect(Collectors.joining(" || ")) + " {\n"; - if (subbd != null) { - res += makeSelfCheck(subbd, ivars, null); + res += makeSelfCheck1(subbd, ivars, null); } else { res += makeParamsSelfPanic(ivars); } - res += "}\n"; - + return res; + } + + private String makeSelfCheck2(RPRoleVariant vvv, List ivars, RPRoleVariant subbd) + { + String res = ""; + if (!vvv.cointervals.isEmpty()) { + res += "if " + + vvv.cointervals.stream().map(x -> + ((this.apigen.mode == Mode.Int) + ? "(self >= " + x.start.toGoString() + ") && (self <= " + x.end.toGoString() + ")" + : "(self.Gte(" + makeGoIndexExpr(x.start) + ")) && (self.Lt(" + makeGoIndexExpr(x.end) + "))" + ) + ).collect(Collectors.joining(" || ")) + " {\n"; + } + if (subbd != null) + { + res += makeSelfCheck1(subbd, ivars, null); + } + else + { + if (!vvv.cointervals.isEmpty()) + { + res += makeParamsSelfPanic(ivars); + } + } + if (!vvv.cointervals.isEmpty()) + { + res += "}\n"; + } return res; } From e5d55bdf0c1fb655f54cfba33a8eda2f0e26a253 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 16:02:18 +0100 Subject: [PATCH 404/433] Fixed typo in rp-core run-time family check. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 17 ++++++++++++++ .../RPCoreSTStateChanApiBuilder.java | 23 +++++++++++++++++-- .../src/test/scrib/param/tmp/ParamTest.scr | 20 +++++++++++++++- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 89b8633bc..129638dba 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -299,6 +299,11 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, private String makeFamilyCheck(Pair, Set> fff, List ivars) { + if (ivars.isEmpty()) + { + return ""; + } + String res = ""; String ivalkind; switch (this.apigen.mode) @@ -340,6 +345,13 @@ private String makeFamilyCheck(Pair, Set> fff, private String makeSelfCheck1(RPRoleVariant vvv, List ivars, RPRoleVariant subbd) { + /*if (ivars.isEmpty()) + { + return "if self != " + ((this.apigen.mode == Mode.Int) ? "1" : "session2.XY(1, 1)") + " {\n" + + makeParamsSelfPanic(ivars) + + "}\n"; + }*/ + String res = "if " + vvv.intervals.stream().map(x -> ((this.apigen.mode == Mode.Int) @@ -361,6 +373,11 @@ private String makeSelfCheck1(RPRoleVariant vvv, List ivars, RPRoleV private String makeSelfCheck2(RPRoleVariant vvv, List ivars, RPRoleVariant subbd) { + if (ivars.isEmpty()) + { + return ""; + } + String res = ""; if (!vvv.cointervals.isEmpty()) { res += "if " diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 6c87c92ab..7eee54181 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -302,8 +302,23 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) String initState = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + initName; feach += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName - + ") Foreach(f func(*" + initName + ") " + termName + ") *" + succName + " {\n" - + "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + + ") Foreach(f func(*" + initName + ") " + termName + ") *" + succName + " {\n"; + + // Duplicated from buildAction + feach += + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" + + "panic(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ")\n" + + "}\n" + + + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + "id != " // Not using atomic.LoadUint64 on id for now + //+ "atomic.LoadUint64(&" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin)" + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin" + + " {\n" + + "panic(\"Linear resource already used\")\n" // + reflect.TypeOf(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "))\n" + + "}\n"; + + feach += + "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + p + lte + "; " + p + " = " + inc + "{\n" //+ sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? + sEp + ".Params[\"" + p + "\"] = " + p + "\n" // FIXME: nested Endpoint type/struct? @@ -321,6 +336,10 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) //+ "return " + makeCreateSuccStateChan(s, succName) + "\n" + makeReturnSuccStateChan(s, succName) + "\n" + "}\n"; + + // Parallel method + //feach += "\n"; + res.put(getStateChannelFilePath(scTypeName), feach); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index d3ee1db9c..095159495 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,9 +8,27 @@ module param.tmp.ParamTest; +/* global protocol Proto1(role A, role B) { - + foreach B[I:1,K] + { + Foo() from A[1] to B[K]; + } +} +//*/ + + +sig "message.Parse" from "github.com/nickng/scribble-go-examples/20_webcrawler/message" as Parse; +sig "message.Index" from "github.com/nickng/scribble-go-examples/20_webcrawler/message" as Index; +sig "message.URL" from "github.com/nickng/scribble-go-examples/20_webcrawler/message" as URL; + +global protocol Proto1(role Downloader, role Parser, role Indexer, role Master) { + foreach Downloader[I:1,N], Parser[J:1,N] { + Parse from Downloader[I] to Parser[J]; + } + Index from Parser[1,N] to Indexer[1]; + URL from Indexer[1] to Master[1]; } From 719e3df62b222bb9366c5dd8719d8b285dac09a1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 16:06:32 +0100 Subject: [PATCH 405/433] Continued. --- .../go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 129638dba..329486b92 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -373,10 +373,10 @@ private String makeSelfCheck1(RPRoleVariant vvv, List ivars, RPRoleV private String makeSelfCheck2(RPRoleVariant vvv, List ivars, RPRoleVariant subbd) { - if (ivars.isEmpty()) + /*if (ivars.isEmpty()) { return ""; - } + }*/ String res = ""; if (!vvv.cointervals.isEmpty()) { From 015dd68b98d431316ffdb235b7d0727613375ea7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 16:27:58 +0100 Subject: [PATCH 406/433] Fixed typo in rp-api session api import gen. --- .../go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 1 + 1 file changed, 1 insertion(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 329486b92..08f24041b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -199,6 +199,7 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, }).collect(Collectors.joining(""))); protoFile += "\nvar _ = strconv.Itoa\n"; + protoFile += "\nvar _ = util.IsectIntIntervals\n"; protoFile += "\n" // Protocol type From 44ec29d2fab8b60764d77f3215da0e124598bad2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 18:00:15 +0100 Subject: [PATCH 407/433] Continued on parforeach setting. --- .../ext/go/core/cli/RPCoreCLArgFlag.java | 1 + .../ext/go/core/cli/RPCoreCLArgParser.java | 9 +++ .../ext/go/core/cli/RPCoreCommandLine.java | 3 +- .../statetype3/RPCoreSTSessionApiBuilder.java | 76 ++++++++++++++----- .../RPCoreSTStateChanApiBuilder.java | 24 +++++- .../ext/go/core/main/RPCoreMainContext.java | 6 +- .../java/org/scribble/ext/go/main/GoJob.java | 4 +- .../scribble/ext/go/main/GoMainContext.java | 2 +- .../src/test/scrib/param/tmp/ParamTest.scr | 7 +- 9 files changed, 99 insertions(+), 33 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java index 43782d7fb..37bf6a9d8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgFlag.java @@ -6,6 +6,7 @@ public enum RPCoreCLArgFlag RPCORE_PARAM, RPCORE_SELECT_BRANCH, // Default is type switch RPCORE_NO_COPY, + RPCORE_PARFOREACH, // Non-unique flags RPCORE_EFSM, diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java index 7584b3de4..28ba4d5e5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCLArgParser.java @@ -13,6 +13,7 @@ public class RPCoreCLArgParser extends CLArgParser public static final String RPCORE_PARAM_FLAG = "-param"; public static final String RPCORE_SELECT_BRANCH_FLAG = "-param-select"; public static final String RPCORE_NOCOPY_FLAG = "-nocopy"; + public static final String RPCORE_PARFOREACH_FLAG = "-parforeach"; // Non-unique flags public static final String RPCORE_EFSM_FLAG = "-param-fsm"; @@ -24,6 +25,7 @@ public class RPCoreCLArgParser extends CLArgParser RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_PARAM_FLAG, RPCoreCLArgFlag.RPCORE_PARAM); RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_SELECT_BRANCH_FLAG, RPCoreCLArgFlag.RPCORE_SELECT_BRANCH); RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_NOCOPY_FLAG, RPCoreCLArgFlag.RPCORE_NO_COPY); + RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.put(RPCoreCLArgParser.RPCORE_PARFOREACH_FLAG, RPCoreCLArgFlag.RPCORE_PARFOREACH); } private static final Map RPCORE_NON_UNIQUE_FLAGS = new HashMap<>(); @@ -81,6 +83,7 @@ protected int parseFlag(int i) throws CommandLineException } case RPCoreCLArgParser.RPCORE_SELECT_BRANCH_FLAG: return rpParseSelectBranch(i); case RPCoreCLArgParser.RPCORE_NOCOPY_FLAG: return rpParseNoCopy(i); + case RPCoreCLArgParser.RPCORE_PARFOREACH_FLAG: return rpParseParForeach(i); // Non-unique flags case RPCoreCLArgParser.RPCORE_EFSM_FLAG: return rpParseRoleArg(flag, i); @@ -130,6 +133,12 @@ private int rpParseNoCopy(int i) throws CommandLineException return i; } + private int rpParseParForeach(int i) throws CommandLineException + { + rpCheckAndAddUniqueFlag(RPCoreCLArgParser.RPCORE_PARFOREACH_FLAG, new String[] { }); + return i; + } + private void rpCheckAndAddUniqueFlag(String flag, String[] args) throws CommandLineException { RPCoreCLArgFlag argFlag = RPCoreCLArgParser.RPCORE_UNIQUE_FLAGS.get(flag); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 2156b502e..a1a1db483 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -120,6 +120,7 @@ protected RPCoreMainContext newMainContext() throws ScribParserException, Scribb boolean selectApi = this.rpArgs.containsKey(RPCoreCLArgFlag.RPCORE_SELECT_BRANCH); boolean noCopy = this.rpArgs.containsKey(RPCoreCLArgFlag.RPCORE_NO_COPY); + boolean parForeach = this.rpArgs.containsKey(RPCoreCLArgFlag.RPCORE_PARFOREACH); List impaths = this.args.containsKey(CLArgFlag.IMPORT_PATH) ? CommandLine.parseImportPaths(this.args.get(CLArgFlag.IMPORT_PATH)[0]) @@ -135,7 +136,7 @@ protected RPCoreMainContext newMainContext() throws ScribParserException, Scribb { Path mainpath = CommandLine.parseMainPath(this.args.get(CLArgFlag.MAIN_MOD)[0]); return new RPCoreMainContext(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, - noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, noCopy, selectApi); + noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, noCopy, selectApi, parForeach); } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 08f24041b..adb7d2965 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -19,6 +19,7 @@ import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; +import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPBinIndexExpr; import org.scribble.ext.go.type.index.RPIndexExpr; import org.scribble.ext.go.type.index.RPIndexIntPair; @@ -199,7 +200,7 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, }).collect(Collectors.joining(""))); protoFile += "\nvar _ = strconv.Itoa\n"; - protoFile += "\nvar _ = util.IsectIntIntervals\n"; + protoFile += "var _ = util.IsectIntIntervals\n"; protoFile += "\n" // Protocol type @@ -524,22 +525,31 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map + "lin uint64\n" + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + " *" + RPCoreSTApiGenConstants.GO_MPCHAN_TYPE + "\n" - + ivars.stream().map(x -> x + " " + indexType + "\n").collect(Collectors.joining("")) + + ivars.stream().map(x -> x + " " + indexType + "\n").collect(Collectors.joining("")); - + "Params map[string]" + indexType + "\n" // FIXME: currently used to record foreach params (and provide access to user) + if (this.apigen.job.parForeach) + { + epkindFile += "Params map[int]map[string]" + indexType + "\n"; // FIXME: currently used to record foreach params (and provide access to user) + } + else + { + epkindFile += "Params map[string]" + indexType + "\n"; // FIXME: currently used to record foreach params (and provide access to user) + } - /*+ this.apigen.stateChanNames.get(variant).entrySet().stream().sorted( - new Comparator>() + /*+ this.apigen.stateChanNames.get(variant).entrySet().stream().sorted( + new Comparator>() + { + @Override + public int compare(Entry o1, Entry o2) { - @Override - public int compare(Entry o1, Entry o2) - { - return o1.getKey().compareTo(o2.getKey()); - } + return o1.getKey().compareTo(o2.getKey()); } - )*/ + } + )*/ + + epkindFile += // FIXME TODO: case objects? - + this.reachable.get(variant).stream().sorted(ESTATE_COMP) + this.reachable.get(variant).stream().sorted(ESTATE_COMP) //.map(s -> this.stateChanNames.get(s.id)) .flatMap(s -> { @@ -552,9 +562,14 @@ public int compare(Entry o1, Entry o2) .map(n -> { return "_" + n + " *" + n + "\n"; - }).collect(Collectors.joining()) + }).collect(Collectors.joining()); + + if (this.apigen.job.parForeach) + { + epkindFile += "Thread int\n"; + } - + "}\n" + epkindFile += "}\n" // Endpoint Kind type constructor -- makes connection maps + "\n" @@ -574,12 +589,21 @@ public int compare(Entry o1, Entry o2) + RPCoreSTApiGenConstants.GO_MPCHAN_CONSTRUCTOR + "(self, "//conns)" //"params + "[]string{" + roles.stream().map(x -> "\"" + x + "\"").collect(Collectors.joining(", ")) + "}),\n" - + ivars.stream().map(x -> x + ",\n").collect(Collectors.joining("")) - + "make(map[string]" + indexType + "),\n" // Trailing comma needed + + ivars.stream().map(x -> x + ",\n").collect(Collectors.joining("")); + if (this.apigen.job.parForeach) + { + epkindFile += "make(map[int]map[string]" + indexType + "),\n"; + } + else + { + epkindFile += "make(map[string]" + indexType + "),\n"; // Trailing comma needed + } + + epkindFile += //+ this.apigen.stateChanNames.get(variant).values().stream().distinct().map(k -> "nil,\n").collect(Collectors.joining()) // FIXME: factor out with above - + this.reachable.get(variant).stream().sorted(ESTATE_COMP) + this.reachable.get(variant).stream().sorted(ESTATE_COMP) .flatMap(s -> { String n = this.stateChanNames.get(variant).get(s.id); @@ -588,9 +612,14 @@ public int compare(Entry o1, Entry o2) : Stream.of(n); }) .distinct() - .map(k -> "nil,\n").collect(Collectors.joining()) + .map(k -> "nil,\n").collect(Collectors.joining()); + + if (this.apigen.job.parForeach) + { + epkindFile += "1,\n"; + } - + "}\n" + epkindFile += "}\n" // FIXME: factor out with above + this.reachable.get(variant).stream().sorted(ESTATE_COMP) @@ -613,9 +642,14 @@ public int compare(Entry o1, Entry o2) + " ep }\n"; // cf. state chan builder // CHECKME: reusing pre-created chan structs OK for Err handling? } - ).collect(Collectors.joining()) + ).collect(Collectors.joining()); + + if (this.apigen.job.parForeach) + { + epkindFile += "ep.Params[ep.Thread] = make(map[string]" + indexType + ")\n"; + } - + "return ep\n"; + epkindFile += "return ep\n"; epkindFile += "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 7eee54181..4fea77349 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -319,15 +319,24 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) feach += "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions - + p + lte + "; " + p + " = " + inc + "{\n" + + p + lte + "; " + p + " = " + inc + "{\n"; //+ sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? - + sEp + ".Params[\"" + p + "\"] = " + p + "\n" // FIXME: nested Endpoint type/struct? + + if (this.apigen.job.parForeach) + { + feach += sEp + ".Params[" + sEp + ".Thread][\"" + p + "\"] = " + p + "\n"; + } + else + { + feach += sEp + ".Params[\"" + p + "\"] = " + p + "\n"; // FIXME: nested Endpoint type/struct? + } + feach += // Duplicated from RPCoreSTSessionApiBuilder // FIXME: factor out with makeReturnSuccStateChan /*+ ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) ? "f(newBranch" + initName + "(ini))\n" : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse*/ - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + initState +".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" + "f(" + initState + ")\n" @@ -685,7 +694,14 @@ else if (e instanceof RPIndexVar) if (e instanceof RPForeachVar || this.fvars.stream().anyMatch(p -> p.toString().equals(e.toString()))) // FIXME HACK -- foreach var occurrences inside foreach body are RPIndexVars { - return sEp + ".Params[\"" + e.toGoString() + "\"]"; + if (this.apigen.job.parForeach) + { + return sEp + ".Params[s.Ept.Thread][\"" + e.toGoString() + "\"]"; + } + else + { + return sEp + ".Params[\"" + e.toGoString() + "\"]"; + } } else { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java index 7d92c4818..3ccb05793 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/main/RPCoreMainContext.java @@ -19,15 +19,17 @@ public class RPCoreMainContext extends MainContext { protected final boolean selectApi; protected final boolean noCopy; + protected final boolean parForeach; // Load main module from file system public RPCoreMainContext(boolean debug, ResourceLocator locator, Path mainpath, boolean useOldWF, boolean noLiveness, boolean minEfsm, - boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean noCopy, boolean selectApi) + boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, boolean noCopy, boolean selectApi, boolean parForeach) throws ScribParserException, ScribbleException { super(debug, locator, mainpath, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation); this.noCopy = noCopy; this.selectApi = selectApi; + this.parForeach = parForeach; } @Override @@ -35,7 +37,7 @@ public GoJob newJob() // FIXME: make RPCoreJob? { return new GoJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, - this.af, this.ef, this.sf, this.noCopy, this.selectApi); + this.af, this.ef, this.sf, this.noCopy, this.selectApi, this.parForeach); } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java b/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java index c32ee16a5..925ab8c93 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/GoJob.java @@ -13,15 +13,17 @@ public class GoJob extends Job { public final boolean selectApi; public final boolean noCopy; + public final boolean parForeach; public GoJob(boolean debug, Map parsed, ModuleName main, boolean useOldWF, boolean noLiveness, boolean minEfsm, boolean fair, boolean noLocalChoiceSubjectCheck, boolean noAcceptCorrelationCheck, boolean noValidation, - AstFactory af, EModelFactory ef, SModelFactory sf, boolean noCopy, boolean selectApi) + AstFactory af, EModelFactory ef, SModelFactory sf, boolean noCopy, boolean selectApi, boolean parForeach) { super(debug, parsed, main, useOldWF, noLiveness, minEfsm, fair, noLocalChoiceSubjectCheck, noAcceptCorrelationCheck, noValidation, af, ef, sf); this.noCopy = noCopy; this.selectApi = selectApi; + this.parForeach = parForeach; } /*// FIXME: move to MainContext::newJob? diff --git a/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java b/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java index fde6ef1af..3b1982bd7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/main/GoMainContext.java @@ -22,6 +22,6 @@ public GoJob newJob() { return new GoJob(this.debug, this.getParsedModules(), this.main, this.useOldWF, this.noLiveness, this.minEfsm, this.fair, this.noLocalChoiceSubjectCheck, this.noAcceptCorrelationCheck, this.noValidation, - this.af, this.ef, this.sf, false, false); + this.af, this.ef, this.sf, false, false, false); } } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 095159495..94450211c 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,17 +8,18 @@ module param.tmp.ParamTest; -/* +//* global protocol Proto1(role A, role B) { foreach B[I:1,K] { - Foo() from A[1] to B[K]; + Foo() from A[1] to B[I]; } } //*/ +/* sig "message.Parse" from "github.com/nickng/scribble-go-examples/20_webcrawler/message" as Parse; sig "message.Index" from "github.com/nickng/scribble-go-examples/20_webcrawler/message" as Index; sig "message.URL" from "github.com/nickng/scribble-go-examples/20_webcrawler/message" as URL; @@ -30,7 +31,7 @@ global protocol Proto1(role Downloader, role Parser, role Indexer, role Master) Index from Parser[1,N] to Indexer[1]; URL from Indexer[1] to Master[1]; } - +//*/ /* From 285c251ef078d0ea246a42ef0bd4c308b58ff1ef Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 18:48:15 +0100 Subject: [PATCH 408/433] Continued. --- .../statetype3/RPCoreSTEndStateBuilder.java | 3 ++ .../statetype3/RPCoreSTSessionApiBuilder.java | 8 ++-- .../RPCoreSTStateChanApiBuilder.java | 39 +++++++++++++++---- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java index dd14df5c0..005da9e70 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTEndStateBuilder.java @@ -34,6 +34,9 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(api.gpn.getSimpleName(), schangen.variant) + "\n" // FIXME: factor out + + + (((RPCoreSTStateChanApiBuilder) api).apigen.job.parForeach ? "Thread int\n" : "") + + "}"; return res; // No LinearResource } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index adb7d2965..a831b6ed6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -634,12 +634,14 @@ public int compare(Entry o1, Entry o2) .map(n -> { // FIXME TODO: case objects? - return (n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly - ? "ep._End = &End{ nil, 0, ep }\n" // Now same as below? + return ((n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly + ? "ep._End = &End{ nil, 0, " // Now same as below? : "ep._" + n + " = &" + n + "{ nil," //+ " new(RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE)," + (n.equals("Init") ? " 1," : " 0,") - + " ep }\n"; + ) + + + " ep" + (this.apigen.job.parForeach ? ", 1" : "") + "}\n"; // cf. state chan builder // CHECKME: reusing pre-created chan structs OK for Err handling? } ).collect(Collectors.joining()); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 4fea77349..2fa5a1bcf 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -197,6 +197,9 @@ public Map build() // filepath -> source + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" + + + (this.apigen.job.parForeach ? "Thread int\n" : "") + + "}\n"; res.put(getStateChannelFilePath("End"), end); } @@ -264,8 +267,14 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + "id uint64\n" - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" - + "}\n"; + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n"; + + if (this.apigen.job.parForeach) + { + feach += "Thread int\n"; + } + + feach += "}\n"; // Foreach method -- cf. RPCoreSTSessionApiBuilder, top-level Run String sEp = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT; @@ -324,7 +333,7 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) if (this.apigen.job.parForeach) { - feach += sEp + ".Params[" + sEp + ".Thread][\"" + p + "\"] = " + p + "\n"; + feach += sEp + ".Params[" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread][\"" + p + "\"] = " + p + "\n"; } else { @@ -423,8 +432,14 @@ else if (s.getStateKind() == EStateKind.OUTPUT) //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + "id uint64\n" - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n" - + "}\n"; + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n"; + + if (this.apigen.job.parForeach) + { + res += "Thread int\n"; + } + + res += "}\n"; return res; } @@ -588,9 +603,17 @@ protected String makeReturnSuccStateChan(EState succ, String name) res += " }";*/ String nextState = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + name; String res = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" - + nextState + ".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" - + "return "+ nextState + "\n"; + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + + nextState + ".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n"; + + if (this.apigen.job.parForeach) + { + res += RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Thread = " // FIXME: sync + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Thread + 1\n" + + nextState + ".Thread = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Thread\n"; + } + res += + "return "+ nextState + "\n"; return res; } } From d2d635d19c37f30494d2d67cdc37200a39025fc2 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 19:07:08 +0100 Subject: [PATCH 409/433] Continued. --- .../statetype3/RPCoreSTStateChanApiBuilder.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 2fa5a1bcf..04d11728d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -606,14 +606,14 @@ protected String makeReturnSuccStateChan(EState succ, String name) + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + nextState + ".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n"; - if (this.apigen.job.parForeach) + /*if (this.apigen.job.parForeach) { res += RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Thread = " // FIXME: sync + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Thread + 1\n" + nextState + ".Thread = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Thread\n"; - } - res += - "return "+ nextState + "\n"; + }*/ + + res += "return "+ nextState + "\n"; return res; } } @@ -719,7 +719,7 @@ else if (e instanceof RPIndexVar) { if (this.apigen.job.parForeach) { - return sEp + ".Params[s.Ept.Thread][\"" + e.toGoString() + "\"]"; + return sEp + ".Params[" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread][\"" + e.toGoString() + "\"]"; } else { From 245a770441e757fffb40044f523dce41506af3f1 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Mon, 15 Oct 2018 21:23:58 +0100 Subject: [PATCH 410/433] Continued. --- .../ext/go/core/cli/RPCoreCommandLine.java | 7 ++++-- .../statetype3/RPCoreSTSessionApiBuilder.java | 24 +++++++++++++++---- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index a1a1db483..c06dbb388 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -473,7 +473,9 @@ private void minimise() Pair, Set> compressed = new Pair<>(tmp, fam.right); families.add(compressed); // Subsumed variants are neither in left nor right - //System.out.println("\nFamily:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + "\nCompacted:\n" + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n"))); + /*System.out.println("\nFamily:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + + "\nCovars:\n" + fam.right.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + + "\nCompacted:\n" + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n")));*/ if (!tmp.equals(fam.left)) { @@ -781,7 +783,7 @@ private Set, Set>> getFamilies(GoJob job, List vars = Stream.concat( cand.stream().flatMap(c -> c.getIndexVars().stream()), coset.stream().flatMap(c -> c.getIndexVars().stream()) - ).collect(Collectors.toList()); + ).distinct().collect(Collectors.toList()); if (!vars.isEmpty()) { //z3 = "(exists (" + vars.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + ") " + z3 + ")"; @@ -803,6 +805,7 @@ private Set, Set>> getFamilies(GoJob job, job.debugPrintln("[rp-core] Checked sat: " + isSat); } } + return variants; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index a831b6ed6..884a9d0a1 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -316,6 +316,7 @@ private String makeFamilyCheck(Pair, Set> fff, } res += "var tmp []util." + ivalkind + "\n"; + //res += "var tmp2 []util." + ivalkind + "\n"; Function makeIvals = vvv -> { List ivals = new LinkedList<>(); @@ -327,21 +328,36 @@ private String makeFamilyCheck(Pair, Set> fff, }); return "tmp = []util." + ivalkind + "{" + ivals.stream().collect(Collectors.joining(", ")) + "}\n"; }; + /*Function makeCoIvals = vvv -> + { + List coivals = new LinkedList<>(); + vvv.cointervals.forEach(x -> + { + String start = (this.apigen.mode == Mode.Int) ? x.start.toGoString() : makeGoIndexExpr(x.start); + String end = (this.apigen.mode == Mode.Int) ? x.end.toGoString() : makeGoIndexExpr(x.end); + coivals.add("util." + ivalkind + "{" + start + ", " + end + "}"); + }); + return "tmp2 = []util." + ivalkind + "{" + coivals.stream().collect(Collectors.joining(", ")) + "}\n"; + };*/ for (RPRoleVariant v : fff.left) { res += makeIvals.apply(v); - res += "if util.Isect" + ivalkind + "s(tmp).IsEmpty() {\n"; + //res += makeCoIvals.apply(v); + res += "if util.Isect" + ivalkind + "s(tmp)"//.SubtIntIntervals(tmp2) + + ".IsEmpty() {\n"; res += makeParamsSelfPanic(ivars); res += "}\n"; } - for (RPRoleVariant v : fff.right) + /*for (RPRoleVariant v : fff.right) { res += makeIvals.apply(v); - res += "if !util.Isect" + ivalkind + "s(tmp).IsEmpty() {\n"; + //res += makeCoIvals.apply(v); + res += "if !util.Isect" + ivalkind + "s(tmp)"//.SubtIntIntervals(tmp2) + + ".IsEmpty() {\n"; res += makeParamsSelfPanic(ivars); res += "}\n"; - } + }*/ return res; } From 46d9c30eeb83cb7bd9d9d2bd2892b2ba6b08b857 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Oct 2018 00:09:20 +0100 Subject: [PATCH 411/433] Continued. --- .../java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index c06dbb388..079891ad6 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -440,7 +440,7 @@ private void minimise() } else { - for (RPRoleVariant u : vs) + for (RPRoleVariant u : vs.stream().filter(x -> x.getName().equals(v.getName())).collect(Collectors.toList())) { if (!u.equals(v)) { From 16b95f7fba342f8f2c94e490a4a795f041bc9357 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Oct 2018 02:46:27 +0100 Subject: [PATCH 412/433] More rp-core API gen output ordering. Testing dial/accept runtime checks. --- .../statetype3/RPCoreSTApiGenerator.java | 30 +++- .../statetype3/RPCoreSTSessionApiBuilder.java | 154 +++++++++++++++++- .../RPCoreSTStateChanApiBuilder.java | 10 +- 3 files changed, 187 insertions(+), 7 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 8544e53f4..6708489f5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -185,14 +185,36 @@ public Map build() throws ScribbleException //makeStateChanNames(); Map res = new HashMap<>(); // filepath -> source res.putAll(buildSessionApi()); - for (Role self : this.selfs) + for (Role self : this.selfs.stream().sorted(new Comparator() + { + @Override + public int compare(Role o1, Role o2) + { + return o1.toString().compareTo(o2.toString()); + } + }).collect(Collectors.toList())) { - for (Entry e : this.variants.get(self).entrySet()) + for (Entry e : this.variants.get(self).entrySet().stream().sorted(new Comparator>() + { + @Override + public int compare(Entry o1, Entry o2) + { + return o1.getValue().init.id - o2.getValue().init.id; + } + }).collect(Collectors.toList())) { RPRoleVariant variant = e.getKey(); for (Pair, Set> family : - (Iterable, Set>>) - this.families.keySet().stream().filter(f -> f.left.contains(variant))::iterator) + this.families.entrySet().stream().filter(x -> x.getKey().left.contains(variant)) + .sorted(new Comparator, Set>, Integer>>() + { + @Override + public int compare(Entry, Set>, Integer> o1, + Entry, Set>, Integer> o2) + { + return o1.getValue() - o2.getValue(); + } + }).map(x -> x.getKey()).collect(Collectors.toList())) { res.putAll(buildStateChannelApi(family, variant, e.getValue())); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 884a9d0a1..f7f29e5b8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -19,9 +19,9 @@ import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; -import org.scribble.ext.go.main.GoJob; import org.scribble.ext.go.type.index.RPBinIndexExpr; import org.scribble.ext.go.type.index.RPIndexExpr; +import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexIntPair; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.model.endpoint.EGraph; @@ -408,7 +408,7 @@ private String makeSelfCheck2(RPRoleVariant vvv, List ivars, RPRoleV } if (subbd != null) { - res += makeSelfCheck1(subbd, ivars, null); + res += makeSelfCheck2(subbd, ivars, null); } else { @@ -463,6 +463,131 @@ else if (e instanceof RPBinIndexExpr) } } + private String makeGoIndexExprInt2(RPIndexExpr e) + { + if (e instanceof RPIndexInt) + { + return e.toGoString(); + } + else if (e instanceof RPIndexVar) + { + return "ini." + e.toGoString(); + } + else if (e instanceof RPBinIndexExpr) + { + RPBinIndexExpr b = (RPBinIndexExpr) e; + // TODO: factor out + String op; + switch (b.op) + { + case Add: op = " + "; break; + case Subt: op = " - "; break; + case Mult: + default: throw new RuntimeException("[rp-core] Shouldn't get in here: " + e); + } + return "(" + makeGoIndexExprInt2(b.left) + op + "(" + makeGoIndexExprInt2(b.right) + "))"; + } + else + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + e); + } + } + + private String makeGoIndexIntPairExpr2(RPIndexExpr e) + { + if (e instanceof RPIndexIntPair) + { + return e.toGoString(); + } + else if (e instanceof RPIndexVar) + { + return "ini." + e.toGoString(); + } + else if (e instanceof RPBinIndexExpr) + { + RPBinIndexExpr b = (RPBinIndexExpr) e; + // TODO: factor out + String op; + switch (b.op) + { + case Add: op = "Plus"; break; + case Subt: op = "Sub"; break; + case Mult: + default: throw new RuntimeException("[rp-core] Shouldn't get in here: " + e); + } + return "(" + makeGoIndexIntPairExpr2(b.left) + "." + op + "(" + makeGoIndexIntPairExpr2(b.right) + "))"; + } + else + { + throw new RuntimeException("[rp-core] Shouldn't get in here: " + e); + } + } + + // TODO: factor out with above + private String makePeerIdCheck1(RPRoleVariant vvv, List ivars, RPRoleVariant subbd) + { + String res = "if " + + vvv.intervals.stream().map(x -> + ((this.apigen.mode == Mode.Int) + ? "(id < " + makeGoIndexExprInt2(x.start) + ") || (id > " + makeGoIndexExprInt2(x.end) + ")" + : "(id.Lt(" + makeGoIndexIntPairExpr2(x.start) + ")) || (id.Gt(" + makeGoIndexIntPairExpr2(x.end) + "))" + ) + ).collect(Collectors.joining(" || ")) + " {\n"; + if (subbd != null) + { + res += makePeerIdCheck1(subbd, ivars, null); + } + else + { + res += makeParamsPeerIdPanic(ivars); + } + res += "}\n"; + return res; + } + + private String makePeerIdCheck2(RPRoleVariant vvv, List ivars, RPRoleVariant subbd) + { + + String res = ""; + if (!vvv.cointervals.isEmpty()) { + res += "if " + + vvv.cointervals.stream().map(x -> + ((this.apigen.mode == Mode.Int) + ? "(id >= " + makeGoIndexExprInt2(x.start) + ") && (id <= " + makeGoIndexExprInt2(x.end) + ")" + : "(id.Gte(" + makeGoIndexIntPairExpr2(x.start) + ")) && (id.Lt(" + makeGoIndexIntPairExpr2(x.end) + "))" + ) + ).collect(Collectors.joining(" || ")) + " {\n"; + } + if (subbd != null) + { + res += makePeerIdCheck2(subbd, ivars, null); + } + else + { + if (!vvv.cointervals.isEmpty()) + { + res += makeParamsPeerIdPanic(ivars); + } + } + if (!vvv.cointervals.isEmpty()) + { + res += "}\n"; + } + return res; + } + + private String makeParamsPeerIdPanic(List ivars) + { + return "panic(\"Invalid params/id: \" + " + + ivars.stream().filter(x -> !x.name.equals("self")).map(x -> + ((this.apigen.mode == Mode.Int) + ? "strconv.Itoa(ini." + x.toGoString() + ")" + : "ini." + x.toGoString() + ".String()" + ) + " + \", \" + ").collect(Collectors.joining("")) + + ((this.apigen.mode == Mode.Int) ? "strconv.Itoa(id)" : "id.String()") + + ")\n"; + } + // FIXME: should be lpd private void buildEndpointKindApi(ProtocolDecl gpd, Map res, String indexType) { @@ -478,6 +603,9 @@ private void buildEndpointKindApi(ProtocolDecl gpd, Map default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); } epkindImports += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_TRANSPORT_PACKAGE + "\"\n"; + epkindImports += "import \"strconv\"\n"; + + epkindImports += "\nvar _ = strconv.Itoa\n"; // Endpoint Kind API per role variant for (Role rname : roles) @@ -703,6 +831,20 @@ public int compare(Entry o1, Entry o2) for (RPRoleVariant v : peers) { RPRoleVariant pp = v; + + // TODO: factor out with above + Pair, Set> peerorig = (this.apigen.subsum.containsKey(family)) ? this.apigen.subsum.get(family) : family; + RPRoleVariant subbdbypeer = null; + for (RPRoleVariant subbd : this.apigen.aliases.keySet()) + { + Map, Set>, RPRoleVariant> ais = this.apigen.aliases.get(subbd); + if (ais.containsKey(peerorig) && ais.get(peerorig).equals(variant)) + { + subbdbypeer = subbd; // We subsumed "subbd", so we need to inherit all their peers + break; + } + } + if (this.apigen.aliases.containsKey(v)) { Map, Set>, RPRoleVariant> ali = this.apigen.aliases.get(v); @@ -723,6 +865,10 @@ public int compare(Entry o1, Entry o2) + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id " + indexType + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + + makePeerIdCheck1(v, ivars, subbdbypeer) + + makePeerIdCheck2(v, ivars, subbdbypeer) + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." @@ -744,6 +890,10 @@ public int compare(Entry o1, Entry o2) + ", host string, port int" + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + + makePeerIdCheck1(v, ivars, subbdbypeer) + + makePeerIdCheck2(v, ivars, subbdbypeer) + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 04d11728d..021a1db04 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -1,6 +1,7 @@ package org.scribble.ext.go.core.codegen.statetype3; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; @@ -122,7 +123,14 @@ public Map build() // filepath -> source states.add(this.graph.init); states.addAll(MState.getReachableStates(this.graph.init)); boolean hasTerm = false; - for (EState s : states) + for (EState s : states.stream().sorted(new Comparator() + { + @Override + public int compare(EState o1, EState o2) + { + return o1.id - o2.id; + } + }).collect(Collectors.toList())) { switch (RPCoreSTStateChanApiBuilder.getStateKind(s)) { From 9effadfefe7564df37d0ad992476a06598403cdb Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Oct 2018 03:02:26 +0100 Subject: [PATCH 413/433] Patch to rp-core dial/accept generation. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 183 ++++++++++-------- 1 file changed, 99 insertions(+), 84 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index f7f29e5b8..0c85d3c66 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -828,92 +828,16 @@ public int compare(Entry o1, Entry o2) Set peers = this.apigen.peers.get(variant).get(orig); - for (RPRoleVariant v : peers) - { - RPRoleVariant pp = v; - - // TODO: factor out with above - Pair, Set> peerorig = (this.apigen.subsum.containsKey(family)) ? this.apigen.subsum.get(family) : family; - RPRoleVariant subbdbypeer = null; - for (RPRoleVariant subbd : this.apigen.aliases.keySet()) - { - Map, Set>, RPRoleVariant> ais = this.apigen.aliases.get(subbd); - if (ais.containsKey(peerorig) && ais.get(peerorig).equals(variant)) - { - subbdbypeer = subbd; // We subsumed "subbd", so we need to inherit all their peers - break; - } - } - - if (this.apigen.aliases.containsKey(v)) - { - Map, Set>, RPRoleVariant> ali = this.apigen.aliases.get(v); - if (ali.containsKey(orig)) - { - pp = ali.get(orig); // Replace subsumed-peer by subsuming-peer - if (peers.contains(pp)) // ...but skip if we're already peers with subsuming-peer - { - continue; - } - } - } - - // Accept/Dial methods - String r = pp.getLastElement(); - String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(pp); - epkindFile += "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id " + indexType - + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE - + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" - - + makePeerIdCheck1(v, ivars, subbdbypeer) - + makePeerIdCheck2(v, ivars, subbdbypeer) - - + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" - + "c, err := ss.Accept()\n" - + "if err != nil {\n" - + "return err\n" - + "}\n" - + "\n" - + "sfmt.Wrap(c)\n" - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" - + "return err\n" // FIXME: runtime currently does log.Fatal on error - + "}\n" - + "\n" - + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id " + indexType - + ", host string, port int" - + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" - + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + epkindFile = makeDialsAccepts(indexType, variant, family, orig, ivars, epkindTypeName, epkindFile, peers); - + makePeerIdCheck1(v, ivars, subbdbypeer) - + makePeerIdCheck2(v, ivars, subbdbypeer) - - + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" - + "c, err := dialler(host, port)\n" - + "if err != nil {\n" - + "return err\n" - + "}\n" - + "\n" - + "sfmt.Wrap(c)\n" - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) - + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." - + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept - + "return err\n" // FIXME: runtime currently does log.Fatal on error - + "}\n"; - //} + if (subbdbyus != null) + { + Set peers2 = this.apigen.peers.get(subbdbyus).get(orig); + peers2.removeAll(peers); + epkindFile = makeDialsAccepts(indexType, variant, family, orig, ivars, epkindTypeName, epkindFile, peers2); } - if (subbdbyus != null) + /*if (subbdbyus != null) { // FIXME: factor out with above RPRoleVariant pp = subbdbyus; @@ -961,7 +885,7 @@ public int compare(Entry o1, Entry o2) + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept + "return err\n" // FIXME: runtime currently does log.Fatal on error + "}\n"; - } + }*/ @@ -1021,6 +945,97 @@ public int compare(Entry o1, Entry o2) } } + private String makeDialsAccepts(String indexType, RPRoleVariant variant, + Pair, Set> family, Pair, Set> orig, + List ivars, String epkindTypeName, String epkindFile, Set peers) + { + for (RPRoleVariant v : peers) + { + RPRoleVariant pp = v; + + // TODO: factor out with above + Pair, Set> peerorig = (this.apigen.subsum.containsKey(family)) ? this.apigen.subsum.get(family) : family; + RPRoleVariant subbdbypeer = null; + for (RPRoleVariant subbd : this.apigen.aliases.keySet()) + { + Map, Set>, RPRoleVariant> ais = this.apigen.aliases.get(subbd); + if (ais.containsKey(peerorig) && ais.get(peerorig).equals(variant)) + { + subbdbypeer = subbd; // We can connect to peer or who they subbd + break; + } + } + + if (this.apigen.aliases.containsKey(v)) + { + Map, Set>, RPRoleVariant> ali = this.apigen.aliases.get(v); + if (ali.containsKey(orig)) + { + pp = ali.get(orig); // Replace subsumed-peer by subsuming-peer + if (peers.contains(pp)) // ...but skip if we're already peers with subsuming-peer + { + continue; + } + } + } + + // Accept/Dial methods + String r = pp.getLastElement(); + String vname = RPCoreSTApiGenerator.getGeneratedRoleVariantName(pp); + epkindFile += "\n" + + "func (ini *" + epkindTypeName + ") " + vname + "_Accept(id " + indexType + + ", ss " + RPCoreSTApiGenConstants.GO_SCRIB_LISTENER_TYPE + + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + + makePeerIdCheck1(v, ivars, subbdbypeer) + + makePeerIdCheck2(v, ivars, subbdbypeer) + + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" + + "c, err := ss.Accept()\n" + + "if err != nil {\n" + + "return err\n" + + "}\n" + + "\n" + + "sfmt.Wrap(c)\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" + + "return err\n" // FIXME: runtime currently does log.Fatal on error + + "}\n" + + "\n" + + "func (ini *" + epkindTypeName + ") " + vname + "_Dial(id " + indexType + + ", host string, port int" + + ", dialler func (string, int) (" + RPCoreSTApiGenConstants.GO_SCRIB_BINARY_CHAN_TYPE + ", error)" + + ", sfmt " + RPCoreSTApiGenConstants.GO_FORMATTER_TYPE + ") error {\n" + + + makePeerIdCheck1(v, ivars, subbdbypeer) + + makePeerIdCheck2(v, ivars, subbdbypeer) + + + "defer ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Done()\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_WG + ".Add(1)\n" + + "c, err := dialler(host, port)\n" + + "if err != nil {\n" + + "return err\n" + + "}\n" + + "\n" + + "sfmt.Wrap(c)\n" + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_CONN_MAP + "[\"" + r + "\"][id] = c\n" // CHECKME: connection map keys (cf. variant?) + + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + "." + + RPCoreSTApiGenConstants.GO_MPCHAN_FORMATTER_MAP + "[\"" + r + "\"][id] = sfmt\n" // FIXME: factor out with Accept + + "return err\n" // FIXME: runtime currently does log.Fatal on error + + "}\n"; + //} + } + return epkindFile; + } + private String humanReadableName(RPRoleVariant variant) { StringBuilder sb = new StringBuilder(); sb.append("["); // array index notation. From 284946cdc311fbf494b309fbf43c36d14a473590 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Oct 2018 10:14:52 +0100 Subject: [PATCH 414/433] Minor. --- .../src/main/java/org/scribble/ext/go/util/Z3Wrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index e302a49f5..4768045a5 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -63,7 +63,7 @@ public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) { tmp = File.createTempFile(gpd.header.name.toString(), ".smt2.tmp"); ScribUtil.writeToFile(tmpName, smt2); - String[] res = ScribUtil.runProcess("z3", tmpName); + String[] res = ScribUtil.runProcess("z3", tmpName);//, "-T:60"); String trim = res[0].trim(); if (trim.equals("sat")) // FIXME: factor out { From 961cbdcc3d6d4121a798278c2351a9dce5af9af7 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Tue, 16 Oct 2018 23:49:32 +0100 Subject: [PATCH 415/433] Patch for unnecessary message imports in rp-core API gen. --- .../RPCoreSTBranchStateBuilder.java | 75 ++++++++++++++++++- .../statetype3/RPCoreSTCaseBuilder.java | 2 +- .../RPCoreSTStateChanApiBuilder.java | 47 ++++++------ 3 files changed, 100 insertions(+), 24 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java index 9aef524a7..4c0612d6e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java @@ -2,7 +2,10 @@ import org.scribble.codegen.statetype.STBranchStateBuilder; import org.scribble.codegen.statetype.STStateChanApiBuilder; +import org.scribble.ext.go.core.codegen.statetype3.RPCoreSTApiGenerator.Mode; import org.scribble.model.endpoint.EState; +import org.scribble.model.endpoint.EStateKind; +import org.scribble.type.name.GProtocolName; // Type switch branch -- cf., RPCoreSTSelectStateBuilder public class RPCoreSTBranchStateBuilder extends STBranchStateBuilder @@ -22,7 +25,8 @@ public String getPreamble(STStateChanApiBuilder api, EState s) String scTypeName = rpapi.getStateChanName(s); String epTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, rpapi.variant); */ - String res = rpapi.getStateChanPremable(s); + String res = //rpapi.getStateChanPremable(s); + getStateChanPremable(rpapi, s); /*// Explicit constructor -- for compatibility with RPCoreSTSelectStateBuilder -- not currently needed: assuming select/typeswitch API gen mutually exclusive res += "\n" @@ -36,4 +40,73 @@ public String getPreamble(STStateChanApiBuilder api, EState s) return res; } + + // FIXME refactor -- duplicated from RPCoreSTStateChanApiBuilder#getStateChanPremable, just to set false in apib.makeMessageImports(s, false); + protected String getStateChanPremable(RPCoreSTStateChanApiBuilder apib, EState s) + { + GProtocolName simpname = apib.apigen.proto.getSimpleName(); + String scTypeName = apib.getStateChanName(s); + String epkindTypeName = RPCoreSTApiGenerator.getEndpointKindTypeName(simpname, apib.variant); + + String res = + "package " + RPCoreSTApiGenerator.getEndpointKindPackageName(apib.variant) + "\n" + + "\n"; + + // Not needed by select-branch or Case objects // FIXME: refactor back into state-specific builders? + if (s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT + || (s.getStateKind() == EStateKind.POLY_INPUT && !apib.apigen.job.selectApi)) + { + res += apib.makeMessageImports(s, false); + } + + // FIXME: still needed? -- refactor back into state-specific builders? + if (s.getStateKind() == EStateKind.UNARY_INPUT || s.getStateKind() == EStateKind.POLY_INPUT) + { + switch (apib.apigen.mode) + { + case Int: res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; break; + case IntPair: res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE + "\"\n"; break; + default: throw new RuntimeException("Shouldn't get in here:" + apib.apigen.mode); + } + + res += "import \"sync/atomic\"\n"; + res += "import \"reflect\"\n"; + res += "import \"sort\"\n"; + res += "\n"; + + res += "var _ = session2.NewMPChan\n"; + + res += "var _ = atomic.AddUint64\n"; + res += "var _ = reflect.TypeOf\n"; + res += "var _ = sort.Sort\n"; + } + else if (s.getStateKind() == EStateKind.OUTPUT) + { + if (apib.apigen.mode == Mode.IntPair) + { + res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE + "\"\n"; + res += "\n"; + res += "var _ = session2.XY\n"; // For nested states that only use foreach vars (so no session2.XY) + } + } + + // State channel type + res += "\n" + + "type " + scTypeName + " struct {\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" + + //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" + + "id uint64\n" + + + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n"; + + if (apib.apigen.job.parForeach) + { + res += "Thread int\n"; + } + + res += "}\n"; + + return res; + } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java index 971c1b263..6b73f9bd9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -47,7 +47,7 @@ public String getPreamble(STStateChanApiBuilder api, EState s) res += "import \"log\"\n" - + ((RPCoreSTStateChanApiBuilder) api).makeMessageImports(s) + + ((RPCoreSTStateChanApiBuilder) api).makeMessageImports(s, true) + "\n" + "var _ = log.Fatal\n" + "\n" diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 021a1db04..9a19a957b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -398,7 +398,7 @@ protected String getStateChanPremable(EState s) if (s.getStateKind() == EStateKind.OUTPUT || s.getStateKind() == EStateKind.UNARY_INPUT || (s.getStateKind() == EStateKind.POLY_INPUT && !this.apigen.job.selectApi)) { - res += makeMessageImports(s); + res += makeMessageImports(s, true); } // FIXME: still needed? -- refactor back into state-specific builders? @@ -452,29 +452,32 @@ else if (s.getStateKind() == EStateKind.OUTPUT) return res; } - public String makeMessageImports(EState s) + public String makeMessageImports(EState s, boolean pays) { String res = ""; - for (String extSource : (Iterable) s.getAllActions().stream() - .filter(a -> a.mid.isOp()) - .flatMap(a -> a.payload.elems.stream().filter(p -> !(p instanceof GDelegationType)) - .filter(p -> !getExtName((DataType) p).matches("(\\[\\])*(int|string|byte)")) - .filter(p -> !getExtName((DataType) p).matches("(\\*)*(int|string|byte)"))) - .map(p -> getExtSource((DataType) p)) - .distinct()::iterator) - { - res += "import \"" + extSource + "\"\n"; - } - for (PayloadElemType pet : (Iterable>) s.getAllActions().stream() - .filter(a -> a.mid.isOp()) - .flatMap(a -> a.payload.elems.stream().filter(p -> (p instanceof RPCoreGDelegationType)) - //.map(p -> getDelegatedChanPackageName((RPCoreGDelegationType) p)) - ) - .distinct()::iterator) - { - res += "import \"" + this.apigen.packpath + "/" + ((RPCoreGDelegationType) pet).getGlobalProtocol().getSimpleName() - // *pet* gpn name (i.e., for state chan type being delegated) -- cf. *this*.gpn.toString() in getStateChannelFilePath - + "/" + getDelegatedChanPackageName((RPCoreGDelegationType) pet) + "\"\n"; + if (pays) + { + for (String extSource : (Iterable) s.getAllActions().stream() + .filter(a -> a.mid.isOp()) + .flatMap(a -> a.payload.elems.stream().filter(p -> !(p instanceof GDelegationType)) + .filter(p -> !getExtName((DataType) p).matches("(\\[\\])*(int|string|byte)")) + .filter(p -> !getExtName((DataType) p).matches("(\\*)*(int|string|byte)"))) + .map(p -> getExtSource((DataType) p)) + .distinct()::iterator) + { + res += "import \"" + extSource + "\"\n"; + } + for (PayloadElemType pet : (Iterable>) s.getAllActions().stream() + .filter(a -> a.mid.isOp()) + .flatMap(a -> a.payload.elems.stream().filter(p -> (p instanceof RPCoreGDelegationType)) + //.map(p -> getDelegatedChanPackageName((RPCoreGDelegationType) p)) + ) + .distinct()::iterator) + { + res += "import \"" + this.apigen.packpath + "/" + ((RPCoreGDelegationType) pet).getGlobalProtocol().getSimpleName() + // *pet* gpn name (i.e., for state chan type being delegated) -- cf. *this*.gpn.toString() in getStateChannelFilePath + + "/" + getDelegatedChanPackageName((RPCoreGDelegationType) pet) + "\"\n"; + } } for (String extSource : (Iterable) s.getAllActions().stream() .filter(a -> a.mid.isMessageSigName()) From 22de45a5b650c4debbe241d3bd0b1de6e42be96e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Oct 2018 08:32:21 +0100 Subject: [PATCH 416/433] Fixed typo in rp-core family gen. --- .../ext/go/core/cli/RPCoreCommandLine.java | 27 ++++++++++++------- .../src/test/scrib/param/tmp/ParamTest.scr | 12 ++++++++- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 079891ad6..4a748ef52 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -473,9 +473,9 @@ private void minimise() Pair, Set> compressed = new Pair<>(tmp, fam.right); families.add(compressed); // Subsumed variants are neither in left nor right - /*System.out.println("\nFamily:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + System.out.println("\nFamily:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + "\nCovars:\n" + fam.right.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) - + "\nCompacted:\n" + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n")));*/ + + "\nCompacted:\n" + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n"))); if (!tmp.equals(fam.left)) { @@ -713,8 +713,8 @@ private Set, Set>> getFamilies(GoJob job, List cs = new LinkedList<>(); cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations - cs.addAll(cand.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t)).collect(Collectors.toList())); - cs.addAll(coset.stream().map(v -> smt2t.makeNot(makePhiSmt2(v.intervals, v.cointervals, smt2t))).collect(Collectors.toList())); + cs.addAll(cand.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t, false)).collect(Collectors.toList())); + cs.addAll(coset.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t, true)).collect(Collectors.toList())); String smt2 = smt2t.makeAnd(cs); if (!vars.isEmpty()) { @@ -779,7 +779,7 @@ private Set, Set>> getFamilies(GoJob job, .flatMap(Collection::stream) .collect(Collectors.toSet()); - String z3 = makePhiSmt2(cand, coset, smt2t); + String z3 = makePhiSmt2(cand, coset, smt2t, false); List vars = Stream.concat( cand.stream().flatMap(c -> c.getIndexVars().stream()), coset.stream().flatMap(c -> c.getIndexVars().stream()) @@ -809,10 +809,11 @@ private Set, Set>> getFamilies(GoJob job, return variants; } - // Doesn't include "assert", nor exists-bind index vars - private static String makePhiSmt2(Set cand, Set coset, Smt2Translator smt2t) + // Doesn't include "assert", nor exists-bind index vars (but does exists-bind self) + private static String makePhiSmt2(Set cand, Set coset, Smt2Translator smt2t, boolean not) { List cs = new LinkedList<>(); + List dom = new LinkedList<>(); //if (cand.size() > 0) { @@ -826,7 +827,7 @@ private static String makePhiSmt2(Set cand, Set coset, S tmp.add(smt2t.makeLte("self", c.end.toSmt2Formula(smt2t))); if (!c.start.isConstant() || !c.end.isConstant()) { - tmp.add(smt2t.makeLte(c.start.toSmt2Formula(smt2t), c.end.toSmt2Formula(smt2t))); + dom.add(smt2t.makeLte(c.start.toSmt2Formula(smt2t), c.end.toSmt2Formula(smt2t))); } return smt2t.makeAnd(tmp); }) @@ -850,7 +851,7 @@ private static String makePhiSmt2(Set cand, Set coset, S tmp.add(smt2t.makeNot(smt2t.makeAnd(smt2t.makeGte("self", c.start.toSmt2Formula(smt2t)), smt2t.makeLte("self", c.end.toSmt2Formula(smt2t))))); if (!c.start.isConstant() || !c.end.isConstant()) { - tmp.add(smt2t.makeLte(c.start.toSmt2Formula(smt2t), c.end.toSmt2Formula(smt2t))); // CHECKME: Needed? + dom.add(smt2t.makeLte(c.start.toSmt2Formula(smt2t), c.end.toSmt2Formula(smt2t))); // Must be outside the not (if one) } return (tmp.size() == 1) ? tmp.get(0) : smt2t.makeAnd(tmp); }) @@ -866,7 +867,13 @@ private static String makePhiSmt2(Set cand, Set coset, S }*/ String z3 = //"(exists ((self Int))" + z3 + ")"; - smt2t.makeExists(Stream.of("self").collect(Collectors.toList()), smt2t.makeAnd(cs)); + smt2t.makeExists(Stream.of("self").collect(Collectors.toList()), smt2t.makeAnd(cs)); // CHECKME: need explicit self >= 1? + if (not) + { + z3 = smt2t.makeNot(z3); + } + dom.add(z3); + z3 = smt2t.makeAnd(dom); return z3; } diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 94450211c..da6026b11 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,7 +8,17 @@ module param.tmp.ParamTest; -//* +global protocol Proto1(role A, role B, role C) +{ + Foo() from A[1] to C[1]; + Foo() from A[1] to B[1]; + Foo() from A[1] to B[1,K]; + Foo() from A[1] to B[2,K]; + //Foo() from B[1] to B[2,K]; +} + + +/* global protocol Proto1(role A, role B) { foreach B[I:1,K] From fce2d265c5af6e27dc49d6fdead668dbdc810fe8 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Oct 2018 08:54:32 +0100 Subject: [PATCH 417/433] Fixed typo in rp-core run-time family check. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 13 ++++++++----- scribble-go/src/test/scrib/param/tmp/ParamTest.scr | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 0c85d3c66..2ee1c9ee8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -320,12 +320,15 @@ private String makeFamilyCheck(Pair, Set> fff, Function makeIvals = vvv -> { List ivals = new LinkedList<>(); - vvv.intervals.forEach(x -> + for (RPInterval x : vvv.intervals) { - String start = (this.apigen.mode == Mode.Int) ? x.start.toGoString() : makeGoIndexExpr(x.start); - String end = (this.apigen.mode == Mode.Int) ? x.end.toGoString() : makeGoIndexExpr(x.end); - ivals.add("util." + ivalkind + "{" + start + ", " + end + "}"); - }); + if (ivars.containsAll(x.getIndexVars())) + { + String start = (this.apigen.mode == Mode.Int) ? x.start.toGoString() : makeGoIndexExpr(x.start); + String end = (this.apigen.mode == Mode.Int) ? x.end.toGoString() : makeGoIndexExpr(x.end); + ivals.add("util." + ivalkind + "{" + start + ", " + end + "}"); + } + } return "tmp = []util." + ivalkind + "{" + ivals.stream().collect(Collectors.joining(", ")) + "}\n"; }; /*Function makeCoIvals = vvv -> diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index da6026b11..41f5cbc99 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -13,7 +13,7 @@ global protocol Proto1(role A, role B, role C) Foo() from A[1] to C[1]; Foo() from A[1] to B[1]; Foo() from A[1] to B[1,K]; - Foo() from A[1] to B[2,K]; + Foo() from A[1] to B[2,K]; // Testing "domain" clauses, here 2 <= K, put outside neg of neg Phi for family check //Foo() from B[1] to B[2,K]; } From 30c4b6daea0b495f9ac13841dad03fb8063b1d76 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Oct 2018 09:01:31 +0100 Subject: [PATCH 418/433] Minor. --- .../java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 4a748ef52..ad87a311c 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -473,9 +473,9 @@ private void minimise() Pair, Set> compressed = new Pair<>(tmp, fam.right); families.add(compressed); // Subsumed variants are neither in left nor right - System.out.println("\nFamily:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + /*System.out.println("\nFamily:\n" + fam.left.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) + "\nCovars:\n" + fam.right.stream().map(x -> x.toString()).collect(Collectors.joining("\n")) - + "\nCompacted:\n" + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n"))); + + "\nCompacted:\n" + tmp.stream().map(x -> x.toString()).collect(Collectors.joining("\n")));*/ if (!tmp.equals(fam.left)) { From 47a53ac12fceee906fb5c230c2c750e5c55de291 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 17 Oct 2018 11:24:45 +0100 Subject: [PATCH 419/433] Fixed typo in rp-core run-time family check. --- .../statetype3/RPCoreSTSessionApiBuilder.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 2ee1c9ee8..c59d86dda 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -329,7 +329,7 @@ private String makeFamilyCheck(Pair, Set> fff, ivals.add("util." + ivalkind + "{" + start + ", " + end + "}"); } } - return "tmp = []util." + ivalkind + "{" + ivals.stream().collect(Collectors.joining(", ")) + "}\n"; + return ivals.isEmpty() ? null : "tmp = []util." + ivalkind + "{" + ivals.stream().collect(Collectors.joining(", ")) + "}\n"; }; /*Function makeCoIvals = vvv -> { @@ -345,12 +345,16 @@ private String makeFamilyCheck(Pair, Set> fff, for (RPRoleVariant v : fff.left) { - res += makeIvals.apply(v); - //res += makeCoIvals.apply(v); - res += "if util.Isect" + ivalkind + "s(tmp)"//.SubtIntIntervals(tmp2) - + ".IsEmpty() {\n"; - res += makeParamsSelfPanic(ivars); - res += "}\n"; + String tmp = makeIvals.apply(v); + if (tmp != null) + { + res += tmp; + //res += makeCoIvals.apply(v); + res += "if util.Isect" + ivalkind + "s(tmp)"//.SubtIntIntervals(tmp2) + + ".IsEmpty() {\n"; + res += makeParamsSelfPanic(ivars); + res += "}\n"; + } } /*for (RPRoleVariant v : fff.right) { From c0472329a7f5f2b31774b088d6ca0fcfa7a8832f Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Oct 2018 16:35:15 +0100 Subject: [PATCH 420/433] Minor. --- .../java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index ad87a311c..92355c9e9 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -787,6 +787,9 @@ private Set, Set>> getFamilies(GoJob job, if (!vars.isEmpty()) { //z3 = "(exists (" + vars.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + ") " + z3 + ")"; + List tmp = vars.stream().map(v -> smt2t.makeLte(smt2t.getDefaultBaseValue(), v.toSmt2Formula(smt2t))).collect(Collectors.toList()); + tmp.add(z3); + z3 = smt2t.makeAnd(tmp); z3 = smt2t.makeExists(vars.stream().map(v -> v.toSmt2Formula(smt2t)).collect(Collectors.toList()), z3); } //z3 = smt2t.makeExists(Stream.of("self").collect(Collectors.toList()), z3); From e5e3b4029e292dfe5c4bab14cc4638a210996021 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Oct 2018 17:23:46 +0100 Subject: [PATCH 421/433] Fixed rp-core z3-wrapper smt2.tmp file bug. --- .../src/main/java/org/scribble/util/ScribUtil.java | 6 ++++++ .../main/java/org/scribble/ext/go/util/Z3Wrapper.java | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/scribble-core/src/main/java/org/scribble/util/ScribUtil.java b/scribble-core/src/main/java/org/scribble/util/ScribUtil.java index 9d74434d4..accdbb5c1 100644 --- a/scribble-core/src/main/java/org/scribble/util/ScribUtil.java +++ b/scribble-core/src/main/java/org/scribble/util/ScribUtil.java @@ -108,7 +108,13 @@ public static String[] runProcess(String... cmdAndArgs) throws ScribbleException // Warning: doesn't check if file exists public static void writeToFile(String path, String text) throws ScribbleException { + // TODO: add optional file existence check here (e.g., refactor from Z3Wrapper) File file = new File(path); + writeToFile(file, text); + } + + public static void writeToFile(File file, String text) throws ScribbleException + { File parent = file.getParentFile(); if (parent != null) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index 4768045a5..5733ff067 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -40,11 +40,11 @@ else if (irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getInde // Based on CommandLine::runDot, JobContext::runAut, etc public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) //throws ScribbleException { - String tmpName = gpd.header.name + ".smt2.tmp"; + //String tmpName = gpd.header.name + "_" + ".smt2.tmp"; File tmp = null; //= new File(tmpName); - /*if (tmp.exists()) // Factor out with CommandLine.runDot (file exists check) + /*if (tmp.exists()) // Factor out with CommandLine.runDot (file exists check) // Now redundant, using createTempFile { - throw new RuntimeException("Cannot overwrite: " + tmpName); + throw new RuntimeException("Cannot overwrite: " + tmp.getAbsolutePath()); }*/ smt2 = "(declare-datatypes (T1 T2) ((Pair (mk-pair (fst T1) (snd T2)))))\n" + "(define-fun pair_max ((p!1 (Pair Int Int))) Int (ite (< (fst p!1) (snd p!1)) (snd p!1) (fst p!1) ) )\n" @@ -62,8 +62,8 @@ public static boolean checkSat(GoJob job, ProtocolDecl gpd, String smt2) try { tmp = File.createTempFile(gpd.header.name.toString(), ".smt2.tmp"); - ScribUtil.writeToFile(tmpName, smt2); - String[] res = ScribUtil.runProcess("z3", tmpName);//, "-T:60"); + ScribUtil.writeToFile(tmp, smt2); + String[] res = ScribUtil.runProcess("z3", tmp.getAbsolutePath());//, "-T:60"); String trim = res[0].trim(); if (trim.equals("sat")) // FIXME: factor out { From ab2e553f90d9af878d0d67d24403a93fb550ee27 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Oct 2018 20:44:23 +0100 Subject: [PATCH 422/433] Continued on rp-core parforeach. --- .../RPCoreSTBranchActionBuilder.java | 3 +- .../statetype3/RPCoreSTCaseBuilder.java | 3 ++ .../statetype3/RPCoreSTSessionApiBuilder.java | 48 ++++++++++++++----- .../RPCoreSTStateChanApiBuilder.java | 34 ++++++++++--- 4 files changed, 69 insertions(+), 19 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 85edd427f..4ca6a6cd4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -87,7 +87,8 @@ public String buildBody(STStateChanApiBuilder api, EState curr, EAction a, EStat // FIXME: factor out with RPCoreSTStateChanApiBuilder#getSuccStateChan -- don't need terminal check for succ though String ret = RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ": " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ", " - + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; + + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")" + + (rpapi.apigen.job.parForeach ? ", Thread: " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread" : ""); // Duplicated from RPCoreSTReceiveActionBuilder RPInterval d = peer.intervals.iterator().next(); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java index 6b73f9bd9..f841fa9d4 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTCaseBuilder.java @@ -68,8 +68,11 @@ public String getPreamble(STStateChanApiBuilder api, EState s) + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + RPCoreSTApiGenerator.getEndpointKindTypeName(null, rpapi.variant) + "\n" + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n" + (a.mid.isMessageSigName() ? "msg *" + extName + "\n" : "") + + (rpapi.apigen.job.parForeach ? "Thread int\n" : "") + "}\n" + + "\n" + + "func (*" + getOpTypeName(api, s, a.mid) + ") " + casename + "() {}\n"; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index c59d86dda..1aa90e37b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -717,7 +717,7 @@ public int compare(Entry o1, Entry o2) if (this.apigen.job.parForeach) { - epkindFile += "Thread int\n"; + epkindFile += "Thread int\n"; // FIXME: deprecate -- recorded in state chan instead } epkindFile += "}\n" @@ -781,21 +781,27 @@ public int compare(Entry o1, Entry o2) ? Stream.of(n, s.isTerminal() ? "End" : n + "_") // FIXME: factor out with RPCoreSTStateChanApiBuilder#getStateChanName : Stream.of(n); }) - .distinct() + .distinct() // CHECKME: for End's? .map(n -> { // FIXME TODO: case objects? - return ((n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly - ? "ep._End = &End{ nil, 0, " // Now same as below? - : "ep._" + n + " = &" + n + "{ nil," - //+ " new(RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE)," - + (n.equals("Init") ? " 1," : " 0,") - ) - - + " ep" + (this.apigen.job.parForeach ? ", 1" : "") + "}\n"; + return "ep._" + n + " = " + makeStateChanInstance(this.apigen, n, "ep", "1"); // cf. state chan builder // CHECKME: reusing pre-created chan structs OK for Err handling? } - ).collect(Collectors.joining()); + ) + /*.map(s -> + { + String n = this.stateChanNames.get(variant).get(s.id); + String tmp = makeStateChanInstance(this.apigen, n); + if (s.hasNested()) + { + tmp = tmp + (s.isTerminal() + ? makeStateChanInstance(this.apigen, n + "_") + : makeStateChanInstance(this.apigen, "End")); + } + return tmp; + })*/ + .collect(Collectors.joining()); if (this.apigen.job.parForeach) { @@ -932,10 +938,13 @@ public int compare(Entry o1, Entry o2) + "func (ini *" + epkindTypeName + ") Init() *Init {\n" + "ini.Use()\n" // FIXME: int-counter linearity + "ini." + RPCoreSTApiGenConstants.GO_MPCHAN_SESSCHAN + ".CheckConnection()\n" + + // TODO: Factor out with RPCoreSTStateChanApiBuilder#makeReturnSuccStateChan + "return " + ((this.apigen.job.selectApi && this.apigen.variants.get(rname).get(variant).init.getStateKind() == EStateKind.POLY_INPUT) ? "newBranch" + init + "(ini)" : "ini._" + init) + "\n" + + "}"; epkindFile += "\n\n" @@ -952,6 +961,23 @@ public int compare(Entry o1, Entry o2) } } + /*public static String makeStateChanInstance(RPCoreSTApiGenerator apigen, EState s) + { + return makeStateChanInstance(apigen, this.stateChanNames.get(variant).get(s.id)); + }*/ + + public static String makeStateChanInstance(RPCoreSTApiGenerator apigen, String n, String ep, String id) + { + return ((n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly + ? "&End{ nil, 0, " // Now same as below? + : "&" + n + "{ nil, " + //+ " new(RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE)," + + (n.equals("Init") ? " 1," : " 0,") + ) + + + ep + (apigen.job.parForeach ? ", " + id : "") + " }\n"; + } + private String makeDialsAccepts(String indexType, RPRoleVariant variant, Pair, Set> family, Pair, Set> orig, List ivars, String epkindTypeName, String epkindFile, Set peers) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 9a19a957b..affb444d0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -612,10 +612,33 @@ protected String makeReturnSuccStateChan(EState succ, String name) + ": new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")"; // FIXME: EndSocket LinearResource special case } res += " }";*/ - String nextState = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + name; - String res = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" - + nextState + ".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n"; + + String nextState; + if (this.apigen.job.parForeach) + { + nextState = "succ := " + + RPCoreSTSessionApiBuilder.makeStateChanInstance( + this.apigen, + name, + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT, + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread" + ); + String res = nextState + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + + "succ.id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n"; + res += "return succ\n"; + return res; + } + else + { + nextState = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + name; + String res = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync + + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" + + nextState + ".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n"; + res += "return "+ nextState + "\n"; + return res; + } /*if (this.apigen.job.parForeach) { @@ -623,9 +646,6 @@ protected String makeReturnSuccStateChan(EState succ, String name) + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Thread + 1\n" + nextState + ".Thread = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".Thread\n"; }*/ - - res += "return "+ nextState + "\n"; - return res; } } From ce963a8254c61b7ce7e531fc2b477cfa47ad50ba Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Oct 2018 21:50:09 +0100 Subject: [PATCH 423/433] Continued. --- .../RPCoreSTStateChanApiBuilder.java | 64 ++++++++++++++++--- 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index affb444d0..8318b6815 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -316,7 +316,7 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); } - String initState = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + initName; + String initState = sEp + "._" + initName; feach += "\n" + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + ") Foreach(f func(*" + initName + ") " + termName + ") *" + succName + " {\n"; @@ -329,10 +329,15 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + "id != " // Not using atomic.LoadUint64 on id for now //+ "atomic.LoadUint64(&" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin)" - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin" + + sEp + "." + "lin" + " {\n" + "panic(\"Linear resource already used\")\n" // + reflect.TypeOf(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "))\n" + "}\n"; + + if (this.apigen.job.parForeach) + { + feach += "chs := make(map[int]chan int)\n"; + } feach += "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions @@ -341,7 +346,23 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) if (this.apigen.job.parForeach) { - feach += sEp + ".Params[" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread][\"" + p + "\"] = " + p + "\n"; + // inc Ept thread + // copy Ept params for new thread + // make new nested init with new thread + // spawn + + feach += "tid := " + sEp + ".Thread + 1\n"; + feach += sEp + ".Thread = tid\n"; + feach += "tmp := make(map[string]int)\n"; + feach += "for k,v := range " + sEp + ".Params[" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread]" + "{\n"; + feach += "tmp[k] = v\n"; + feach += "}\n"; + feach += sEp + ".Params[tid] = tmp\n"; + } + + if (this.apigen.job.parForeach) + { + feach += "tmp[\"" + p + "\"] = " + p + "\n"; } else { @@ -353,14 +374,37 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) /*+ ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) ? "f(newBranch" + initName + "(ini))\n" : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse*/ - RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" - + initState +".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n" - + "f(" + initState + ")\n" + sEp + ".lin = " // FIXME: sync + + sEp + ".lin + 1\n"; - + "}\n" - //+ "return " + makeCreateSuccStateChan(s, succName) + "\n" - + makeReturnSuccStateChan(s, succName) + "\n" + if (this.apigen.job.parForeach) + { + feach += "nested := " + RPCoreSTSessionApiBuilder.makeStateChanInstance(apigen, initName, sEp, "tid"); + feach += "nested.id = " + sEp + ".lin\n"; + feach += "chs[" + p + "] = make(chan int)\n"; + feach += "go func() {\n"; + feach += "go f(nested)\n"; + feach += "chs[" + p + "] <- 0\n"; + feach += "}()\n"; + } + else + { + feach += initState +".id = " + sEp + ".lin\n"; + feach += "f(" + initState + ")\n"; + } + + feach += "}\n"; + + if (this.apigen.job.parForeach) { + feach += + "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + + p + lte + "; " + p + " = " + inc + "{\n"; + feach += "<- chs[" + p + "]\n"; + feach += "}\n"; + } + + feach += //+ "return " + makeCreateSuccStateChan(s, succName) + "\n" + makeReturnSuccStateChan(s, succName) + "\n" + "}\n"; // Parallel method From fae691413f699803890a46c8adac3b16801fb06e Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Oct 2018 22:21:53 +0100 Subject: [PATCH 424/433] Continued. --- .../RPCoreSTBranchActionBuilder.java | 28 +++++--- .../RPCoreSTBranchStateBuilder.java | 14 ++-- .../statetype3/RPCoreSTSessionApiBuilder.java | 5 +- .../RPCoreSTStateChanApiBuilder.java | 72 +++++++++++++------ 4 files changed, 82 insertions(+), 37 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java index 4ca6a6cd4..7a5f7a34e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchActionBuilder.java @@ -17,7 +17,8 @@ public class RPCoreSTBranchActionBuilder extends STBranchActionBuilder @Override public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME: "overriding" STStateChanAPIBuilder.buildAction to hack around *interface return // FIXME: factor out { - //RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; + + RPCoreSTStateChanApiBuilder rpapi = (RPCoreSTStateChanApiBuilder) api; //String scTypeName = rpapi.getStateChanName(curr); EState succ = curr.getSuccessor(a); @@ -25,26 +26,35 @@ public String build(STStateChanApiBuilder api, EState curr, EAction a) // FIXME String branchComment = "// " + getActionName(api, a) + " is a branch with branch label\n" + "// " + curr.getActions().stream().map(action -> action.mid.toString()).collect(Collectors.joining(" or ")) + "\n"; - return + + String res = branchComment + "func (s *" + getStateChanType(api, curr, a) + ") " + getActionName(api, a) + "(" + buildArgs(null, a) + ") " + getReturnType(api, curr, succ) + " {\n" // HACK: return type is interface, so no need for *return (unlike other state chans) + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" + "panic(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ")\n" - + "}\n" + + "}\n"; - /*+ RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE - + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"*/ - + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + "id != " // Not using atomic.LoadUint64 on id for now + if (rpapi.apigen.job.parForeach) + { + res += RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"; + } + else + { + res += "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + "id != " // Not using atomic.LoadUint64 on id for now //+ "atomic.LoadUint64(&" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin)" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin" - + " {\n" + + " {\n" + "panic(\"Linear resource already used\")\n" // + reflect.TypeOf(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "))\n" - + "}\n" + + "}\n"; + } - + buildBody(api, curr, a, succ) + "\n" + res += buildBody(api, curr, a, succ) + "\n" + "}"; + + return res; } @Override diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java index 4c0612d6e..15cfd2d94 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTBranchStateBuilder.java @@ -93,12 +93,18 @@ else if (s.getStateKind() == EStateKind.OUTPUT) // State channel type res += "\n" + "type " + scTypeName + " struct {\n" - + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n"; - //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" - + "id uint64\n" + if (apib.apigen.job.parForeach) + { + res += RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n"; + } + else + { + res += "id uint64\n"; + } - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n"; + res += RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n"; if (apib.apigen.job.parForeach) { diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 1aa90e37b..78fdf89b7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -971,8 +971,9 @@ public static String makeStateChanInstance(RPCoreSTApiGenerator apigen, String n return ((n.equals("End")) // Terminal foreach will be suffixed (and need linear check) // FIXME: factor out properly ? "&End{ nil, 0, " // Now same as below? : "&" + n + "{ nil, " - //+ " new(RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE)," - + (n.equals("Init") ? " 1," : " 0,") + + (apigen.job.parForeach + ? " new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + ")," + : (n.equals("Init") ? " 1," : " 0,")) ) + ep + (apigen.job.parForeach ? ", " + id : "") + " }\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 8318b6815..5a1afb3d0 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -266,16 +266,26 @@ protected Map buildForeachIntermediaryState(RPCoreEState s) { feach += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_PAIR_SESSION_PACKAGE + "\"\n"; } + else if (this.apigen.job.parForeach) + { + feach += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; + } // State channel type feach += "\n" + "type " + scTypeName + " struct {\n" - + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n"; - //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" - + "id uint64\n" + if (this.apigen.job.parForeach) + { + feach += RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n"; + } + else + { + feach += "id uint64\n"; + } - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n"; + feach += RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n"; if (this.apigen.job.parForeach) { @@ -474,17 +484,27 @@ else if (s.getStateKind() == EStateKind.OUTPUT) res += "\n"; res += "var _ = session2.XY\n"; // For nested states that only use foreach vars (so no session2.XY) } + else if (this.apigen.job.parForeach) + { + res += "import \"" + RPCoreSTApiGenConstants.GO_SCRIBBLERUNTIME_SESSION_PACKAGE + "\"\n"; + } } // State channel type res += "\n" + "type " + scTypeName + " struct {\n" - + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n" + + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " error\n"; - //+ RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE +"\n" - + "id uint64\n" + if (this.apigen.job.parForeach) + { + res += RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + " *" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "\n"; + } + else + { + res += "id uint64\n"; + } - + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n"; + res += RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + " *" + epkindTypeName + "\n"; if (this.apigen.job.parForeach) { @@ -538,7 +558,7 @@ public String makeMessageImports(EState s, boolean pays) public String buildAction(STActionBuilder ab, EState curr, EAction a) { EState succ = curr.getSuccessor(a); - return + String res = "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + ab.getStateChanType(this, curr, a) + ") " + ab.getActionName(this, a) + "(" + ab.buildArgs(this, a) @@ -549,10 +569,18 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) // FIXME: currently redundant for case objects (cf. branch action err handling) + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" + "panic(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ")\n" - + "}\n" + + "}\n"; + if (this.apigen.job.parForeach) + { + res += RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"; + } + else + { + res += // HACK FIXME: pre-create case objects - + ((ab instanceof RPCoreSTCaseActionBuilder) + ((ab instanceof RPCoreSTCaseActionBuilder) ? RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n" : "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + "id != " // Not using atomic.LoadUint64 on id for now @@ -561,12 +589,15 @@ public String buildAction(STActionBuilder ab, EState curr, EAction a) + " {\n" + "panic(\"Linear resource already used\")\n" // + reflect.TypeOf(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "))\n" + "}\n" - ) + ); /*+ "atomic.AddUint64(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin" + ")\n"*/ + } - + ab.buildBody(this, curr, a, succ) + "\n" + res += ab.buildBody(this, curr, a, succ) + "\n" + "}"; + + return res; } // "Base case" -- more specific versions should be overriden in action builders @@ -664,22 +695,19 @@ protected String makeReturnSuccStateChan(EState succ, String name) RPCoreSTSessionApiBuilder.makeStateChanInstance( this.apigen, name, - RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT, + sEp, RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread" ); String res = nextState - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" - + "succ.id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n"; - res += "return succ\n"; + + "return succ\n"; return res; } else { - nextState = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "._" + name; - String res = RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin = " // FIXME: sync - + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin + 1\n" - + nextState + ".id = " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + ".lin\n"; + nextState = sEp + "._" + name; + String res = sEp + ".lin = " // FIXME: sync + + sEp + ".lin + 1\n" + + nextState + ".id = " + sEp + ".lin\n"; res += "return "+ nextState + "\n"; return res; } From 7ce2e46baf15af44137c46c92e90c62f59695520 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Oct 2018 22:34:28 +0100 Subject: [PATCH 425/433] Continued. --- .../RPCoreSTStateChanApiBuilder.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 5a1afb3d0..b6bb98089 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -335,14 +335,22 @@ else if (this.apigen.job.parForeach) feach += "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" + "panic(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ")\n" - + "}\n" + + "}\n"; - + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + "id != " // Not using atomic.LoadUint64 on id for now + if (this.apigen.job.parForeach) + { + feach += RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"; + } + else + { + feach += "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + "id != " // Not using atomic.LoadUint64 on id for now //+ "atomic.LoadUint64(&" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ENDPOINT + "." + "lin)" + sEp + "." + "lin" + " {\n" + "panic(\"Linear resource already used\")\n" // + reflect.TypeOf(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "))\n" + "}\n"; + } if (this.apigen.job.parForeach) { @@ -390,12 +398,12 @@ else if (this.apigen.job.parForeach) if (this.apigen.job.parForeach) { feach += "nested := " + RPCoreSTSessionApiBuilder.makeStateChanInstance(apigen, initName, sEp, "tid"); - feach += "nested.id = " + sEp + ".lin\n"; + //feach += "nested.id = " + sEp + ".lin\n"; feach += "chs[" + p + "] = make(chan int)\n"; - feach += "go func() {\n"; - feach += "go f(nested)\n"; - feach += "chs[" + p + "] <- 0\n"; - feach += "}()\n"; + feach += "go func(ch chan int) {\n"; + feach += "f(nested)\n"; + feach += "ch <- 0\n"; + feach += "}(chs[" + p + "])\n"; } else { From 98738d14d7892920f05f39a86b4cfb61375fd2c6 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Oct 2018 23:10:58 +0100 Subject: [PATCH 426/433] Minor. --- .../go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index b6bb98089..5395cb93b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -369,7 +369,7 @@ else if (this.apigen.job.parForeach) // make new nested init with new thread // spawn - feach += "tid := " + sEp + ".Thread + 1\n"; + feach += "tid := " + sEp + ".Thread + 1\n"; // FIXME: sync (factor up as a sync function in the ep) -- e.g., if a thread spawns more subthreads feach += sEp + ".Thread = tid\n"; feach += "tmp := make(map[string]int)\n"; feach += "for k,v := range " + sEp + ".Params[" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread]" + "{\n"; From d6c7be2f55edf74f8bbfd753df30b0f159fdef44 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Sat, 20 Oct 2018 23:51:58 +0100 Subject: [PATCH 427/433] Continued. --- .../RPCoreSTStateChanApiBuilder.java | 104 +++++++++++------- 1 file changed, 62 insertions(+), 42 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 5395cb93b..68f464f31 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -352,11 +352,6 @@ else if (this.apigen.job.parForeach) + "}\n"; } - if (this.apigen.job.parForeach) - { - feach += "chs := make(map[int]chan int)\n"; - } - feach += "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + p + lte + "; " + p + " = " + inc + "{\n"; @@ -364,11 +359,65 @@ else if (this.apigen.job.parForeach) if (this.apigen.job.parForeach) { + feach += sEp + ".Params[" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread][\"" + p + "\"] = " + p + " \n"; + } + else + { + feach += sEp + ".Params[\"" + p + "\"] = " + p + "\n"; // FIXME: nested Endpoint type/struct? + } + + if (this.apigen.job.parForeach) + { + feach += "nested := " + RPCoreSTSessionApiBuilder.makeStateChanInstance(apigen, initName, sEp, RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread"); + //feach += "nested.id = " + sEp + ".lin\n"; + feach += "f(nested)\n"; + } + else + { + feach += + // Duplicated from RPCoreSTSessionApiBuilder // FIXME: factor out with makeReturnSuccStateChan + /*+ ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) + ? "f(newBranch" + initName + "(ini))\n" + : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse*/ + sEp + ".lin = " // FIXME: sync + + sEp + ".lin + 1\n"; + feach += initState +".id = " + sEp + ".lin\n"; + feach += "f(" + initState + ")\n"; + } + + feach += "}\n"; + + feach += //+ "return " + makeCreateSuccStateChan(s, succName) + "\n" + makeReturnSuccStateChan(s, succName) + "\n" + + "}\n"; + + // Parallel method + if (this.apigen.job.parForeach) + { + feach += "\n" + + "func (" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + " *" + scTypeName + + ") Parallel(f func(*" + initName + ") " + termName + ") *" + succName + " {\n"; + + // Duplicated from buildAction + feach += + "if " + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + " != nil {\n" + + "panic(" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_ERROR + ")\n" + + "}\n"; + + feach += RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + "." + RPCoreSTApiGenConstants.GO_SCHAN_LINEARRESOURCE + + "." + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_USE + "()\n"; + + feach += "chs := make(map[int]chan int)\n"; + + feach += + "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + + p + lte + "; " + p + " = " + inc + "{\n"; + //+ sEp + "." + s.getParam() + "=" + s.getParam() + "\n" // FIXME: nested Endpoint type/struct? + // inc Ept thread // copy Ept params for new thread // make new nested init with new thread // spawn - feach += "tid := " + sEp + ".Thread + 1\n"; // FIXME: sync (factor up as a sync function in the ep) -- e.g., if a thread spawns more subthreads feach += sEp + ".Thread = tid\n"; feach += "tmp := make(map[string]int)\n"; @@ -376,58 +425,29 @@ else if (this.apigen.job.parForeach) feach += "tmp[k] = v\n"; feach += "}\n"; feach += sEp + ".Params[tid] = tmp\n"; - } - - if (this.apigen.job.parForeach) - { - feach += "tmp[\"" + p + "\"] = " + p + "\n"; - } - else - { - feach += sEp + ".Params[\"" + p + "\"] = " + p + "\n"; // FIXME: nested Endpoint type/struct? - } - - feach += - // Duplicated from RPCoreSTSessionApiBuilder // FIXME: factor out with makeReturnSuccStateChan - /*+ ((this.apigen.job.selectApi && init.getStateKind() == EStateKind.POLY_INPUT) - ? "f(newBranch" + initName + "(ini))\n" - : "f(&" + initName + "{ nil, new(" + RPCoreSTApiGenConstants.GO_LINEARRESOURCE_TYPE + "), " + sEp + " })\n") // cf. state chan builder // FIXME: chan struct reuse*/ - sEp + ".lin = " // FIXME: sync - + sEp + ".lin + 1\n"; + + feach += "tmp[\"" + p + "\"] = " + p + "\n"; - if (this.apigen.job.parForeach) - { feach += "nested := " + RPCoreSTSessionApiBuilder.makeStateChanInstance(apigen, initName, sEp, "tid"); - //feach += "nested.id = " + sEp + ".lin\n"; feach += "chs[" + p + "] = make(chan int)\n"; feach += "go func(ch chan int) {\n"; feach += "f(nested)\n"; feach += "ch <- 0\n"; feach += "}(chs[" + p + "])\n"; - } - else - { - feach += initState +".id = " + sEp + ".lin\n"; - feach += "f(" + initState + ")\n"; - } - feach += "}\n"; + feach += "}\n"; - if (this.apigen.job.parForeach) { feach += "for " + p + " := " + generateIndexExpr(s.getInterval().start) + "; " // FIXME: general interval expressions + p + lte + "; " + p + " = " + inc + "{\n"; feach += "<- chs[" + p + "]\n"; feach += "}\n"; + + feach += //+ "return " + makeCreateSuccStateChan(s, succName) + "\n" + makeReturnSuccStateChan(s, succName) + "\n" + + "}\n"; } - feach += //+ "return " + makeCreateSuccStateChan(s, succName) + "\n" - makeReturnSuccStateChan(s, succName) + "\n" - + "}\n"; - - // Parallel method - //feach += "\n"; - res.put(getStateChannelFilePath(scTypeName), feach); From c539f2b396ac93df59718bdc1e8a85cbca54da24 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 24 Oct 2018 18:48:54 +0100 Subject: [PATCH 428/433] Refactoring rp-core API gen run-time family check. --- .../ext/go/core/cli/RPCoreCommandLine.java | 48 +++++++------------ .../statetype3/RPCoreSTSessionApiBuilder.java | 40 ++++++++++++---- .../RPCoreSTStateChanApiBuilder.java | 1 + .../org/scribble/ext/go/util/Z3Wrapper.java | 2 +- 4 files changed, 49 insertions(+), 42 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 92355c9e9..4d9b01ed2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -692,42 +692,13 @@ private Set, Set>> getFamilies(GoJob job, Set coset = all.stream() .filter(x -> !cand.contains(x)).collect(Collectors.toSet()); - /*String smt2 = "(assert "; - if (!vars.isEmpty()) - { - smt2 += "(exists (" + vars.stream().map(x -> "(" + x + " Int)").collect(Collectors.joining(" ")) + ")\n"; // FIXME: factor up -- and factor out with getVariants - smt2 += "(and\n"; - smt2 += vars.stream().map(x -> "(>= " + x + " 1)").collect(Collectors.joining(" ")) + "\n"; // FIXME: generalise, parameter domain annotations - } - smt2 += "(and " + cand.stream() - .map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t)).collect(Collectors.joining(" ")) + ")\n"; - smt2 += (coset.size() > 0) - ? "(and " + coset.stream() - .map(v -> "(not " + makePhiSmt2(v.intervals, v.cointervals, smt2t) + ")").collect(Collectors.joining(" ")) + ")\n" - : ""; - if (!vars.isEmpty()) - { - smt2 += "))"; - } - smt2 += ")";*/ - - List cs = new LinkedList<>(); - cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations - cs.addAll(cand.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t, false)).collect(Collectors.toList())); - cs.addAll(coset.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t, true)).collect(Collectors.toList())); - String smt2 = smt2t.makeAnd(cs); - if (!vars.isEmpty()) - { - smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula(smt2t)).collect(Collectors.toList()), smt2); - } - //smt2 = smt2t.makeExists(Stream.of("self").collect(Collectors.toList()), smt2); - smt2 = smt2t.makeAssert(smt2); + String smt2 = makeFamilyCheck(smt2t, vars, cand, coset); job.debugPrintln("\n[rp-core] Family candidate (" + i++ + "/" + size + "): " + cand); job.debugPrintln("[rp-core] Co-set: " + coset); job.debugPrintln("[rp-core] Running Z3 on:\n" + smt2); - boolean isSat = Z3Wrapper.checkSat(job, this.gpd, smt2); + boolean isSat = Z3Wrapper.checkSat(job, smt2t.global, smt2); if (isSat) { fams.add(new Pair<>(Collections.unmodifiableSet(cand), Collections.unmodifiableSet(coset))); @@ -737,6 +708,21 @@ private Set, Set>> getFamilies(GoJob job, return fams; } + + public static String makeFamilyCheck(Smt2Translator smt2t, Set vars, Set cand, Set coset) + { + List cs = new LinkedList<>(); + cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations + cs.addAll(cand.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t, false)).collect(Collectors.toList())); + cs.addAll(coset.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t, true)).collect(Collectors.toList())); + String smt2 = smt2t.makeAnd(cs); + if (!vars.isEmpty()) + { + smt2 = smt2t.makeExists(vars.stream().map(x -> x.toSmt2Formula(smt2t)).collect(Collectors.toList()), smt2); + } + smt2 = smt2t.makeAssert(smt2); + return smt2; + } private //Map>> Map> diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java index 78fdf89b7..932b1d814 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTSessionApiBuilder.java @@ -15,6 +15,7 @@ import org.scribble.ast.Module; import org.scribble.ast.ProtocolDecl; +import org.scribble.ext.go.core.cli.RPCoreCommandLine; import org.scribble.ext.go.core.codegen.statetype3.RPCoreSTApiGenerator.Mode; import org.scribble.ext.go.core.model.endpoint.RPCoreEState; import org.scribble.ext.go.core.type.RPInterval; @@ -24,6 +25,9 @@ import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexIntPair; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.IntPairSmt2Translator; +import org.scribble.ext.go.util.Smt2Translator; +import org.scribble.ext.go.util.Z3Wrapper; import org.scribble.model.endpoint.EGraph; import org.scribble.model.endpoint.EStateKind; import org.scribble.type.kind.Global; @@ -300,6 +304,22 @@ private void buildProtocolApi(ProtocolDecl gpd, Map res, } private String makeFamilyCheck(Pair, Set> fff, List ivars) + { + switch (this.apigen.mode) + { + case Int: return makeFamilyCheckIntIntervals(fff, ivars); + case IntPair: return makeFamilyCheckIntPairIntervals(fff, ivars); + default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); + } + } + + private String makeFamilyCheckIntPairIntervals(Pair, Set> fff, List ivars) + { + Smt2Translator smt2t = new IntPairSmt2Translator(null, null); // FIXME: factor out, and null arg hacks + return "util.CheckSat(\"" + RPCoreCommandLine.makeFamilyCheck(smt2t, new HashSet<>(ivars), fff.left, fff.right) + "\")\n"; + } + + private String makeFamilyCheckIntIntervals(Pair, Set> fff, List ivars) { if (ivars.isEmpty()) { @@ -311,12 +331,12 @@ private String makeFamilyCheck(Pair, Set> fff, switch (this.apigen.mode) { case Int: ivalkind = "IntInterval"; break; - case IntPair: ivalkind = "IntPairInterval"; break; + case IntPair: ivalkind = "IntPairInterval"; break; // FIXME: now redundant (and etc. below) default: throw new RuntimeException("Shouldn't get in here: " + this.apigen.mode); } res += "var tmp []util." + ivalkind + "\n"; - //res += "var tmp2 []util." + ivalkind + "\n"; + res += "var tmp2 []util." + ivalkind + "\n"; Function makeIvals = vvv -> { List ivals = new LinkedList<>(); @@ -331,7 +351,7 @@ private String makeFamilyCheck(Pair, Set> fff, } return ivals.isEmpty() ? null : "tmp = []util." + ivalkind + "{" + ivals.stream().collect(Collectors.joining(", ")) + "}\n"; }; - /*Function makeCoIvals = vvv -> + Function makeCoIvals = vvv -> { List coivals = new LinkedList<>(); vvv.cointervals.forEach(x -> @@ -341,7 +361,7 @@ private String makeFamilyCheck(Pair, Set> fff, coivals.add("util." + ivalkind + "{" + start + ", " + end + "}"); }); return "tmp2 = []util." + ivalkind + "{" + coivals.stream().collect(Collectors.joining(", ")) + "}\n"; - };*/ + }; for (RPRoleVariant v : fff.left) { @@ -349,22 +369,22 @@ private String makeFamilyCheck(Pair, Set> fff, if (tmp != null) { res += tmp; - //res += makeCoIvals.apply(v); - res += "if util.Isect" + ivalkind + "s(tmp)"//.SubtIntIntervals(tmp2) + res += makeCoIvals.apply(v); + res += "if util.Isect" + ivalkind + "s(tmp).SubIntIntervals(tmp2)" // FIXME: non int intervals + ".IsEmpty() {\n"; res += makeParamsSelfPanic(ivars); res += "}\n"; } } - /*for (RPRoleVariant v : fff.right) + for (RPRoleVariant v : fff.right) { res += makeIvals.apply(v); - //res += makeCoIvals.apply(v); - res += "if !util.Isect" + ivalkind + "s(tmp)"//.SubtIntIntervals(tmp2) + res += makeCoIvals.apply(v); + res += "if !util.Isect" + ivalkind + "s(tmp).SubIntIntervals(tmp2)" + ".IsEmpty() {\n"; res += makeParamsSelfPanic(ivars); res += "}\n"; - }*/ + } return res; } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java index 68f464f31..9bb1f1fe2 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTStateChanApiBuilder.java @@ -421,6 +421,7 @@ else if (this.apigen.job.parForeach) feach += "tid := " + sEp + ".Thread + 1\n"; // FIXME: sync (factor up as a sync function in the ep) -- e.g., if a thread spawns more subthreads feach += sEp + ".Thread = tid\n"; feach += "tmp := make(map[string]int)\n"; + // FIXME: sync (factor up as a sync function in the ep) -- e.g., if a thread spawns more subthreads feach += "for k,v := range " + sEp + ".Params[" + RPCoreSTApiGenConstants.GO_IO_METHOD_RECEIVER + ".Thread]" + "{\n"; feach += "tmp[k] = v\n"; feach += "}\n"; diff --git a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java index 5733ff067..e7852aeb3 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/util/Z3Wrapper.java @@ -22,7 +22,7 @@ public class Z3Wrapper public static Smt2Translator getSmt2Translator(GoJob job, GProtocolDecl gpd, RPCoreGType gt) { Set irs = gt.getIndexedRoles(); - if (irs.isEmpty() || + if (irs.isEmpty() || // FIXME: hardcoded default irs.stream().allMatch(x -> x.intervals.stream().allMatch(y -> y.getIndexVals().stream().noneMatch(z -> z instanceof RPIndexIntPair)))) { return new IntSmt2Translator(job, gpd); From 433d4cdb2b89f60096b2a7cf95cb7fe23f0e3fa9 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 25 Oct 2018 17:38:16 +0100 Subject: [PATCH 429/433] Adding annots. --- .../org/scribble/parser/antlr/ParamScribble.g | 22 ++++- .../org/scribble/ext/go/ast/RPAstFactory.java | 7 ++ .../scribble/ext/go/ast/RPAstFactoryImpl.java | 11 +++ .../ext/go/ast/global/RPGProtocolHeader.java | 91 +++++++++++++++++++ .../parser/scribble/RPAntlrToScribParser.java | 11 ++- .../ast/global/RPAntlrGProtocolHeader.java | 70 ++++++++++++++ .../src/test/scrib/param/tmp/ParamTest.scr | 8 ++ .../ast/global/AntlrGProtocolDecl.java | 4 +- 8 files changed, 217 insertions(+), 7 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGProtocolHeader.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGProtocolHeader.java diff --git a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g index 8f9cff3d6..bcc7230a1 100644 --- a/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g +++ b/scribble-go/src/main/antlr3/org/scribble/parser/antlr/ParamScribble.g @@ -190,6 +190,8 @@ tokens PARAM_FOREACHINTERVAL = 'PARAM_FOREACHINTERVAL'; PARAM_PAIR = 'PARAM_PAIR'; + //PARAM_NOMODS = 'PARAM_NOMODS'; + PARAM_GLOBALPROTOCOLHEADER = 'PARAM_GLOBALPROTOCOLHEADER'; } @@ -340,7 +342,7 @@ IDENTIFIER: fragment SYMBOL: '{' | '}' | '(' | ')' | '[' | ']' | ':' | '/' | '\\' | '.' | '\#' | - '&' | '?' | '!' | UNDERSCORE | '-' | '*' + '&' | '?' | '!' | UNDERSCORE | ',' | '=' | '<' | '>' | '-' | '*' ; // Comes after SYMBOL due to an ANTLR syntax highlighting issue involving @@ -569,7 +571,7 @@ protocoldecl: * Section 3.7 Global Protocol Declarations */ globalprotocoldecl: - globalprotocolheader globalprotocoldefinition + globalprotocolheader globalprotocoldefinition // TODO: refactor into below (e.g., PARAM_NOMODS) -> ^(GLOBALPROTOCOLDECL globalprotocolheader globalprotocoldefinition) | @@ -577,6 +579,16 @@ globalprotocoldecl: -> ^(GLOBALPROTOCOLDECL globalprotocolheader globalprotocoldefinition globalprotocoldeclmodifiers) ; + +/*// CHECKME: refactor to header? cf. Assrt +| + globalprotocolheader '@' EXTIDENTIFIER globalprotocoldefinition +-> + ^(GLOBALPROTOCOLDECL globalprotocolheader globalprotocoldefinition PARAM_NOMODS EXTIDENTIFIER) +| + globalprotocoldeclmodifiers globalprotocolheader '@' EXTIDENTIFIER globalprotocoldefinition +-> + ^(GLOBALPROTOCOLDECL globalprotocolheader globalprotocoldefinition globalprotocoldeclmodifiers EXTIDENTIFIER)*/ globalprotocoldeclmodifiers: AUX_KW EXPLICIT_KW @@ -600,6 +612,12 @@ globalprotocolheader: GLOBAL_KW PROTOCOL_KW simpleprotocolname parameterdecllist roledecllist -> ^(GLOBALPROTOCOLHEADER simpleprotocolname parameterdecllist roledecllist) + +// TODO: parameterdecllist and annot (cf. Assrt) +| + GLOBAL_KW PROTOCOL_KW simpleprotocolname roledecllist '@' EXTIDENTIFIER +-> + ^(PARAM_GLOBALPROTOCOLHEADER simpleprotocolname ^(PARAMETERDECLLIST) roledecllist EXTIDENTIFIER) ; roledecllist: diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java index c68309ec4..8da40599d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactory.java @@ -5,6 +5,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactory; import org.scribble.ast.MessageNode; +import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.RoleDeclList; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; @@ -15,6 +17,7 @@ import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.ast.global.RPGMultiChoices; import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; +import org.scribble.ext.go.ast.global.RPGProtocolHeader; import org.scribble.ext.go.ast.name.simple.RPIndexedRoleNode; import org.scribble.ext.go.type.index.RPForeachVar; import org.scribble.ext.go.type.index.RPIndexExpr; @@ -51,4 +54,8 @@ RPGMultiChoicesTransfer ParamGMultiChoicesTransfer(CommonTree source, RoleNode s RPGDelegationElem RPGDelegationElem(CommonTree source, GProtocolNameNode root, GProtocolNameNode state, RoleNode role); //RPLDelegationElem RPLDelegationElem(CommonTree source, LProtocolNameNode proto); // Delegation currently supported only by core, and just uses RPCoreGDelegationType + + //RPGProtocolDecl RPGProtocolDecl(CommonTree source, List modifiers, GProtocolHeader header, GProtocolDef def, String annot); + + RPGProtocolHeader RPGProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls, String annot); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java index a8fa19049..d67ccb76d 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/RPAstFactoryImpl.java @@ -5,6 +5,8 @@ import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.MessageNode; +import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.RoleDeclList; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; @@ -15,6 +17,7 @@ import org.scribble.ext.go.ast.global.RPGForeach; import org.scribble.ext.go.ast.global.RPGMultiChoices; import org.scribble.ext.go.ast.global.RPGMultiChoicesTransfer; +import org.scribble.ext.go.ast.global.RPGProtocolHeader; import org.scribble.ext.go.ast.name.simple.RPIndexedRoleNode; import org.scribble.ext.go.del.global.RPGChoiceDel; import org.scribble.ext.go.del.global.RPGDelegationElemDel; @@ -149,6 +152,14 @@ public NameNode SimpleNameNode(CommonTree source, K kind, St } }*/ + @Override + public RPGProtocolHeader RPGProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls, String annot) + { + RPGProtocolHeader gph = new RPGProtocolHeader(source, name, roledecls, paramdecls, annot); + gph = del(gph, createDefaultDelegate()); + return gph; + } + // param-core diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGProtocolHeader.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGProtocolHeader.java new file mode 100644 index 000000000..bf0670078 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGProtocolHeader.java @@ -0,0 +1,91 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ext.go.ast.global; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.Constants; +import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.RoleDeclList; +import org.scribble.ast.ScribNodeBase; +import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.local.LProtocolHeader; +import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ast.name.qualified.LProtocolNameNode; +import org.scribble.ast.name.qualified.ProtocolNameNode; +import org.scribble.del.ScribDel; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.main.ScribbleException; +import org.scribble.type.kind.Global; +import org.scribble.type.name.Role; +import org.scribble.visit.AstVisitor; + +public class RPGProtocolHeader extends GProtocolHeader +{ + public final String annot; + + public RPGProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls, String annot) + { + super(source, name, roledecls, paramdecls); + this.annot = annot; + } + + @Override + protected ScribNodeBase copy() + { + return new RPGProtocolHeader(this.source, getNameNode(), this.roledecls, this.paramdecls, this.annot); + } + + @Override + public RPGProtocolHeader clone(AstFactory af) + { + GProtocolNameNode name = getNameNode().clone(af); + RoleDeclList roledecls = this.roledecls.clone(af); + NonRoleParamDeclList paramdecls = this.paramdecls.clone(af); + return ((RPAstFactory) af).RPGProtocolHeader(this.source, name, roledecls, paramdecls, this.annot); + } + + @Override + public RPGProtocolHeader visitChildren(AstVisitor nv) throws ScribbleException + { + RoleDeclList rdl = (RoleDeclList) visitChild(this.roledecls, nv); + NonRoleParamDeclList pdl = (NonRoleParamDeclList) visitChild(this.paramdecls, nv); + return reconstruct((GProtocolNameNode) this.name, rdl, pdl, this.annot); + } + + @Override + public RPGProtocolHeader reconstruct(ProtocolNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + + public RPGProtocolHeader reconstruct(ProtocolNameNode name, RoleDeclList rdl, NonRoleParamDeclList pdl, String annot) + { + ScribDel del = del(); + RPGProtocolHeader gph = new RPGProtocolHeader(this.source, (GProtocolNameNode) name, rdl, pdl, annot); + gph = (RPGProtocolHeader) gph.del(del); + return gph; + } + + public LProtocolHeader project(AstFactory af, Role self, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls) + { + throw new RuntimeException("Shouldn't get in here: " + this); + } + + @Override + public String toString() + { + return Constants.GLOBAL_KW + " " + super.toString() + " @\"" + this.annot + "\""; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java index a4d4c2833..11e1f9024 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/RPAntlrToScribParser.java @@ -9,6 +9,8 @@ import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGChoice; import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGCrossMessageTransfer; import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGDotMessageTransfer; +import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGProtocolDecl; +import org.scribble.ext.go.parser.scribble.ast.global.RPAntlrGProtocolHeader; import org.scribble.ext.go.parser.scribble.ast.global.RPCoreAntlrGForeach; import org.scribble.parser.scribble.AntlrToScribParser; import org.scribble.parser.scribble.ScribbleAntlrConstants; @@ -28,6 +30,8 @@ public class RPAntlrToScribParser extends AntlrToScribParser public static final String PARAM_DELEGATION = "PARAM_DELEGATION"; + public static final String PARAM_GLOBALPROTOCOLHEADER = "PARAM_GLOBALPROTOCOLHEADER"; + public RPAntlrToScribParser() { @@ -46,9 +50,9 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException case ScribbleAntlrConstants.MODULE_NODE_TYPE: return RPCoreAntlrModule.parseModule(this, ct, af); case ScribbleAntlrConstants.PAYLOAD_NODE_TYPE: - { return RPAntlrPayloadElemList.parsePayloadElemList(this, ct, af); - } + /*case ScribbleAntlrConstants.GLOBALPROTOCOLDECL_NODE_TYPE: + return RPAntlrGProtocolDecl.parseGPrototocolDecl(this, ct, af);*/ // "Extensions" @@ -67,7 +71,8 @@ public ScribNode parse(CommonTree ct, AstFactory af) throws ScribParserException return RPCoreAntlrGForeach.parseRPGForeach(this, ct, aaf); /*case PARAM_DELEGDECL_NODE_TYPE: // FIXME: deprecate return RPCoreAntlrDelegDecl.parseDelegDecl(this, ct, aaf);*/ - + case PARAM_GLOBALPROTOCOLHEADER: + return RPAntlrGProtocolHeader.parseGProtocolHeader(this, ct, aaf); default: return super.parse(ct, af); } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGProtocolHeader.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGProtocolHeader.java new file mode 100644 index 000000000..8d3d65356 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGProtocolHeader.java @@ -0,0 +1,70 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ext.go.parser.scribble.ast.global; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.NonRoleParamDeclList; +import org.scribble.ast.RoleDeclList; +import org.scribble.ast.global.GProtocolHeader; +import org.scribble.ast.name.qualified.GProtocolNameNode; +import org.scribble.ext.go.ast.RPAstFactory; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.ast.AntlrExtIdentifier; +import org.scribble.parser.scribble.ast.name.AntlrSimpleName; +import org.scribble.util.ScribParserException; + +public class RPAntlrGProtocolHeader +{ + public static final int ANNOT_CHILD_INDEX = 3; + + public static final int NAME_CHILD_INDEX = 0; + public static final int PARAMETERDECLLIST_CHILD_INDEX = 1; + public static final int ROLEDECLLIST_CHILD_INDEX = 2; + + public static GProtocolHeader parseGProtocolHeader(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException + { + GProtocolNameNode name = AntlrSimpleName.toGProtocolNameNode(getNameChild(ct), af); + RoleDeclList rdl = (RoleDeclList) parser.parse(getRoleDeclListChild(ct), af); + NonRoleParamDeclList pdl = (NonRoleParamDeclList) parser.parse(getParamDeclListChild(ct), af); + String annot = AntlrExtIdentifier.getName(getAnnotChild(ct)); + return ((RPAstFactory) af).RPGProtocolHeader(ct, name, rdl, pdl, annot); + } + + public static CommonTree getNameChild(CommonTree ct) + { + return (CommonTree) ct.getChild(NAME_CHILD_INDEX); + } + + public static CommonTree getRoleDeclListChild(CommonTree ct) + { + return (CommonTree) ct.getChild(ROLEDECLLIST_CHILD_INDEX); + } + + public static CommonTree getParamDeclListChild(CommonTree ct) + { + return (CommonTree) ct.getChild(PARAMETERDECLLIST_CHILD_INDEX); + } + + /*public static boolean hasAnnotChild(CommonTree ct) + { + return ct.getChildCount() == 4; + }*/ + + public static CommonTree getAnnotChild(CommonTree ct) + { + return (CommonTree) ct.getChild(ANNOT_CHILD_INDEX); + } +} + diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 41f5cbc99..bfe48568f 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,6 +8,13 @@ module param.tmp.ParamTest; +global protocol Proto1(role A, role B) @"abc" +{ + Foo() from A[1] to B[1]; +} + + +/* global protocol Proto1(role A, role B, role C) { Foo() from A[1] to C[1]; @@ -16,6 +23,7 @@ global protocol Proto1(role A, role B, role C) Foo() from A[1] to B[2,K]; // Testing "domain" clauses, here 2 <= K, put outside neg of neg Phi for family check //Foo() from B[1] to B[2,K]; } +/*/ /* diff --git a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java index 263dd03d3..372a249bd 100644 --- a/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java +++ b/scribble-parser/src/main/java/org/scribble/parser/scribble/ast/global/AntlrGProtocolDecl.java @@ -43,7 +43,7 @@ public static GProtocolDecl parseGPrototocolDecl(AntlrToScribParser parser, Comm }*/ if (hasModifiersChild(ct)) { - for (CommonTree mod :getModifierChildren(ct)) + for (CommonTree mod : getModifierChildren(ct)) { switch (mod.getText()) { @@ -75,7 +75,7 @@ public static List getModifierChildren(CommonTree ct) { //return (CommonTree) ct.getChild(MODIFIERS_CHILD_INDEX); return ((List) ((CommonTree) ct.getChild(MODIFIERS_CHILD_INDEX)).getChildren()).stream() - .map((c) -> (CommonTree) c).collect(Collectors.toList()); + .map(c -> (CommonTree) c).collect(Collectors.toList()); } /*public static boolean isExplicitConnections(CommonTree ct) From a5b16df62517b72ea305985dc80425916914f204 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 25 Oct 2018 18:45:38 +0100 Subject: [PATCH 430/433] Continued. --- .../ext/go/ast/global/RPGDelegationElem.java | 4 +- .../go/core/ast/global/RPCoreGForeach.java | 4 +- .../ext/go/core/cli/RPCoreCommandLine.java | 14 ++ .../scribble/ast/index/RPAntlrIndexExpr.java | 2 +- .../ext/go/type/annot/RPAnnotExpr.java | 164 ++++++++++++++++++ .../ext/go/type/annot/RPAnnotFactory.java | 34 ++++ .../ext/go/type/annot/RPAnnotInt.java | 85 +++++++++ .../ext/go/type/annot/RPAnnotIntPair.java | 97 +++++++++++ .../ext/go/type/annot/RPAnnotVal.java | 6 + .../ext/go/type/annot/RPAnnotVar.java | 85 +++++++++ .../ext/go/type/annot/RPBinAnnotExpr.java | 125 +++++++++++++ .../ext/go/type/index/RPIndexFactory.java | 2 +- .../src/test/scrib/param/tmp/ParamTest.scr | 4 +- 13 files changed, 618 insertions(+), 8 deletions(-) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotExpr.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotFactory.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotInt.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotIntPair.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotVal.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotVar.java create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPBinAnnotExpr.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java index a01f68a4b..cba287934 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/ast/global/RPGDelegationElem.java @@ -120,8 +120,8 @@ public PayloadElemType toPayloadType() int j = tmp.indexOf("t", i+1); // "to" // HACK FIXME String s = tmp.substring(i+1, j); String e = tmp.substring(j+2); - start = (s.charAt(0) >= '0' && s.charAt(0) <= '9') ? RPIndexFactory.ParamIntVal(Integer.parseInt(s)) : RPIndexFactory.ParamIntVar(s); - end = (e.charAt(0) >= '0' && e.charAt(0) <= '9') ? RPIndexFactory.ParamIntVal(Integer.parseInt(e)) : RPIndexFactory.ParamIntVar(e); + start = (s.charAt(0) >= '0' && s.charAt(0) <= '9') ? RPIndexFactory.ParamIntVal(Integer.parseInt(s)) : RPIndexFactory.ParamIndexVar(s); + end = (e.charAt(0) >= '0' && e.charAt(0) <= '9') ? RPIndexFactory.ParamIntVal(Integer.parseInt(e)) : RPIndexFactory.ParamIndexVar(e); } RPRoleVariant variant = new RPRoleVariant(name, Stream.of(new RPInterval(start, end)).collect(Collectors.toSet()), Collections.emptySet()); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java index 8074b3837..dce8cf85b 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/ast/global/RPCoreGForeach.java @@ -90,7 +90,7 @@ public Set getIndexedRoles() // cf. RPForeachDel#leaveIndexVarCo Set res = new HashSet<>(); for (RPAnnotatedInterval ival : this.ivals) { - RPIndexVar tmp = RPIndexFactory.ParamIntVar(ival.var.toString()); + RPIndexVar tmp = RPIndexFactory.ParamIndexVar(ival.var.toString()); // HACK FIXME: because RPIndexVar and RPForeachVar now distinguished -- unify? Set var = Stream.of(new RPInterval(tmp, tmp)).collect(Collectors.toSet()); @@ -211,7 +211,7 @@ private RPCoreLType project2(RPCoreAstFactory af, Role name, Set tmp = new HashSet<>(ivals); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 4d9b01ed2..99e3e8bff 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -22,6 +22,7 @@ import org.scribble.cli.CLArgFlag; import org.scribble.cli.CommandLine; import org.scribble.cli.CommandLineException; +import org.scribble.ext.go.ast.global.RPGProtocolHeader; import org.scribble.ext.go.core.ast.RPCoreAstFactory; import org.scribble.ext.go.core.ast.RPCoreSyntaxException; import org.scribble.ext.go.core.ast.global.RPCoreGProtocolDeclTranslator; @@ -41,6 +42,7 @@ import org.scribble.ext.go.core.type.RPInterval; import org.scribble.ext.go.core.type.RPRoleVariant; import org.scribble.ext.go.main.GoJob; +import org.scribble.ext.go.type.annot.RPAnnotExpr; import org.scribble.ext.go.type.index.RPIndexSelf; import org.scribble.ext.go.type.index.RPIndexVar; import org.scribble.ext.go.util.IntPairSmt2Translator; @@ -586,6 +588,18 @@ private Map, Set>, Set List cs = new LinkedList<>(); cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations + + if (this.gpd.header instanceof RPGProtocolHeader) + { + RPAnnotExpr annot = RPAnnotExpr.parse(((RPGProtocolHeader) this.gpd.header).annot); + System.out.println("AAA: " + annot + " ,, " + annot.toSmt2Formula(smt2t)); + if (annot.getVars().stream().map(x -> x.toString()).allMatch(x -> + vars.stream().map(y -> y.toString()).anyMatch(y -> x.equals(y)))) // TODO: refactor + { + cs.add(annot.toSmt2Formula(smt2t)); + } + } + for (RPInterval ival : peerVariant.intervals) // Is there a peer index inside all the peer-variant intervals { cs.add(smt2t.makeGte("peer", ival.start.toSmt2Formula(smt2t))); diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java index 8fd3772d5..227dbdf66 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/index/RPAntlrIndexExpr.java @@ -46,7 +46,7 @@ public static RPIndexExpr parseParamIndexExpr(CommonTree ct, AstFactory af) { return isInteger(type) ? RPIndexFactory.ParamIntVal(Integer.parseInt(type)) - : RPIndexFactory.ParamIntVar(type); + : RPIndexFactory.ParamIndexVar(type); } } } diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotExpr.java new file mode 100644 index 000000000..245f110e6 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotExpr.java @@ -0,0 +1,164 @@ +package org.scribble.ext.go.type.annot; + +import java.util.Set; + +import org.scribble.ext.go.type.annot.RPBinAnnotExpr.Op; +import org.scribble.ext.go.util.Smt2Translator; +import org.scribble.util.Pair; + +public abstract class RPAnnotExpr +{ + public boolean isConstant() + { + return false; + } + + public abstract String toGoString(); // As basic Go expressions, but not (necessarily) actual code generation "ouput" + // N.B. "value" expressions -- though may also be used for, e.g., names (e.g., RPCoreSTApiGenerator.getGeneratedNameLabel) + + public abstract Set getVals(); // TODO: factor out a "value" interface + public abstract Set getVars(); // N.B. doesn't include foreach params + + public abstract String toSmt2Formula(Smt2Translator smt2t); // Cf. toString -- but can be useful to separate, for debugging (and printing) + // FIXME: inconsistency with toString + // TODO: factor out Smt2 translation interface + + // N.B. "syntactic" comparison + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPAnnotExpr)) + { + return false; + } + return ((RPAnnotExpr) o).canEqual(this); + } + + protected abstract boolean canEqual(Object o); + + // In case subclasses do super + @Override + public int hashCode() + { + return 5869; + } + + // TODO: parse properly using ANTLR, cf. Assrt + public static RPAnnotExpr parse(String annot) + { + //for (String t = annot.trim(); !t.equals(""); ) + { + RPAnnotExpr left; + RPAnnotExpr right; + String t = annot.trim(); + Pair next = nextToken(t); + t = t.substring(next.right, t.length()).trim(); + left = parseEle(next.left); + Pair op = nextToken(t); + t = t.substring(op.right, t.length()).trim(); + next = nextToken(t); + right = parseEle(next.left); + switch (op.left) + { + case "<": return RPAnnotFactory.ParamBinAnnotExpr(Op.Lt, left, right); + case "<=": return RPAnnotFactory.ParamBinAnnotExpr(Op.Lte, left, right); + case ">": return RPAnnotFactory.ParamBinAnnotExpr(Op.Gt, left, right); + case ">=": return RPAnnotFactory.ParamBinAnnotExpr(Op.Gte, left, right); + default: throw new RuntimeException("Shouldn't get in here: " + annot); + } + } + } + + private static RPAnnotExpr parseEle(String e) + { + if (e.startsWith("(")) + { + int comma = e.indexOf(","); + RPAnnotExpr l = parseEle(e.substring(1, comma)); + RPAnnotExpr r = parseEle(e.substring(comma+1, e.length()-1)); + return RPAnnotFactory.RPAnnotPair(l, r); + } + else + { + try + { + return RPAnnotFactory.ParamIntVal(Integer.parseInt(e)); + } + catch (NumberFormatException x) + { + return RPAnnotFactory.ParamIndexVar(e); + } + } + } + + private static Pair nextToken(String t) + { + for (int i = 0; i < t.length(); i++) + { + char c = t.charAt(i); + if (c == ' ') + { + + } + else if (c == '(') + { + //int comma = t.indexOf(',', i+1); + int j = t.indexOf(')', i+1) + 1; + return new Pair<>(t.substring(i, j), j); + } + else if (c >= '0' && c <= '9') + { + int j = i; + while (j < t.length() && c >= '0' && c <= '9') + { + j++; + if (j == t.length()) + { + break; + } + c = t.charAt(j); + } + return new Pair<>(t.substring(i, j), j); + } + else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) + { + int j = i; + while (j < t.length() && (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) + { + j++; + if (j == t.length()) + { + break; + } + c = t.charAt(j); + } + return new Pair<>(t.substring(i, j), j); + } + else if (c == '<') + { + if (i+1 < t.length() && t.charAt(i+1) == '=') + { + return new Pair<>(t.substring(i, i+2), i+2); + } + return new Pair<>(t.substring(i, i+1), i+1); + } + else if (c == '>') + { + if (i+1 < t.length() && t.charAt(i+1) == '=') + { + return new Pair<>(t.substring(i, i+2), i+2); + } + return new Pair<>(t.substring(i, i+1), i+1); + } + else + { + throw new RuntimeException("TODO: " + t); + } + } + throw new RuntimeException("TODO: " + t); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotFactory.java new file mode 100644 index 000000000..a3813490a --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotFactory.java @@ -0,0 +1,34 @@ +package org.scribble.ext.go.type.annot; + +// Used directly by source ast parsing -- cf. scrib-assrt, AssrtAntlrToFormulaParser +// Would correspond to a "types factory" -- cf. AST factory +public class RPAnnotFactory +{ + + public static RPBinAnnotExpr ParamBinAnnotExpr(RPBinAnnotExpr.Op op, RPAnnotExpr left, RPAnnotExpr right) + { + return new RPBinAnnotExpr(op, left, right); + } + + public static RPAnnotInt ParamIntVal(int i) + { + return new RPAnnotInt(i); + } + + public static RPAnnotVar ParamIndexVar(String text) + { + /*// Check here? Or in API gen + char c = text.charAt(0); + if (c < 'A' || c > 'Z') + { + throw new RuntimeException("[param] Annot variables must be uppercase for Go accessibility: " + text); + // FIXME: return proper parsing error -- refactor as param API gen errors + }*/ + return new RPAnnotVar(text); + } + + public static RPAnnotIntPair RPAnnotPair(RPAnnotExpr left, RPAnnotExpr right) + { + return new RPAnnotIntPair(left, right); + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotInt.java b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotInt.java new file mode 100644 index 000000000..3c57dc28b --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotInt.java @@ -0,0 +1,85 @@ +package org.scribble.ext.go.type.annot; + +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.ext.go.util.Smt2Translator; + +// Integer literal +public class RPAnnotInt extends RPAnnotExpr implements RPAnnotVal +{ + public final int val; + + protected RPAnnotInt(int i) + { + this.val = i; + } + + @Override + public boolean isConstant() + { + return true; + } + + @Override + public String toGoString() + { + return toString(); + } + + @Override + public String toSmt2Formula(Smt2Translator smt2t) + { + return Integer.toString(this.val); + } + + @Override + public Set getVals() + { + return Stream.of(this).collect(Collectors.toSet()); + } + + @Override + public Set getVars() + { + return Collections.emptySet(); + } + + @Override + public String toString() + { + return Integer.toString(this.val); + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPAnnotInt)) + { + return false; + } + return super.equals(this) // Does canEqual + && this.val == ((RPAnnotInt) o).val; + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof RPAnnotInt; + } + + @Override + public int hashCode() + { + int hash = 5897; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.val; + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotIntPair.java b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotIntPair.java new file mode 100644 index 000000000..646a41a76 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotIntPair.java @@ -0,0 +1,97 @@ +package org.scribble.ext.go.type.annot; + +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.scribble.ext.go.util.Smt2Translator; + + +// Currently only considered as a value +public class RPAnnotIntPair extends RPAnnotExpr implements RPAnnotVal +{ + public final RPAnnotExpr left; + public final RPAnnotExpr right; + + protected RPAnnotIntPair(RPAnnotExpr left, RPAnnotExpr right) + { + //if (!isUnaryExpr(left) || !isUnaryExpr(right)) + if (!(left instanceof RPAnnotInt) || !(right instanceof RPAnnotInt)) + { + throw new RuntimeException("TODO: (" + left + ", " + right + ")"); + } + this.left = left; + this.right = right; + } + + /*private static boolean isUnaryExpr(RPAnnotExpr e) + { + return (e instanceof RPAnnotInt) || (e instanceof RPAnnotVar); + }*/ + + @Override + public String toGoString() + { + return "(session2.XY(" + this.left.toGoString() + ", " + this.right.toGoString() + "))"; + } + + @Override + public String toSmt2Formula(Smt2Translator smt2t) + { + String left = this.left.toSmt2Formula(smt2t); + String right = this.right.toSmt2Formula(smt2t); + return "(mk-pair " + left + " " + right + ")"; + } + + @Override + public Set getVals() + { + return Stream.of(this).collect(Collectors.toSet()); + } + + @Override + public Set getVars() + { + //return Stream.of(this.left.getVars(), this.right.getVars()).flatMap(x -> x.stream()).collect(Collectors.toSet()); + return Collections.emptySet(); // Currently only considered as a value + } + + @Override + public String toString() + { + return "(" + this.left.toString() + ", " + this.right.toString() + ")"; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPAnnotIntPair)) + { + return false; + } + RPAnnotIntPair f = (RPAnnotIntPair) o; + return super.equals(this) // Does canEqual + && this.left.equals(f.left) && this.right.equals(f.right); + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof RPAnnotIntPair; + } + + @Override + public int hashCode() + { + int hash = 6311; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.left.hashCode(); + hash = 31 * hash + this.right.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotVal.java b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotVal.java new file mode 100644 index 000000000..3339c0b4e --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotVal.java @@ -0,0 +1,6 @@ +package org.scribble.ext.go.type.annot; + +public interface RPAnnotVal +{ + //public boolean gtEq(RPAnnotVal them); +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotVar.java b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotVar.java new file mode 100644 index 000000000..dffd0e594 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPAnnotVar.java @@ -0,0 +1,85 @@ +package org.scribble.ext.go.type.annot; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.scribble.ext.go.util.Smt2Translator; + +// Variable occurrence +public class RPAnnotVar extends RPAnnotExpr // FIXME: extend AbstractName? cf. Role -- e.g., for compatibility with NameCollector +{ + public final String name; + + protected RPAnnotVar(String name) + { + this.name = name; + } + + @Override + public String toGoString() + { + return toString(); + } + + @Override + public String toSmt2Formula(Smt2Translator smt2t) + { + /*if (this.name.startsWith("_dum")) // FIXME + { + throw new RuntimeException("[assrt] Use squash first: " + this); + }*/ + //return "(" + this.name + ")"; + return this.name; + } + + @Override + public Set getVals() + { + return Collections.emptySet(); + } + + @Override + public Set getVars() + { + Set vars = new HashSet<>(); + vars.add(this); // FIXME: currently may also be a role + return vars; + } + + @Override + public String toString() + { + return this.name; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPAnnotVar)) + { + return false; + } + return super.equals(this) // Does canEqual + && this.name.equals(((RPAnnotVar) o).name); + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof RPAnnotVar; + } + + @Override + public int hashCode() + { + int hash = 5903; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.name.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPBinAnnotExpr.java b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPBinAnnotExpr.java new file mode 100644 index 000000000..1102b7546 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/annot/RPBinAnnotExpr.java @@ -0,0 +1,125 @@ +package org.scribble.ext.go.type.annot; + +import java.util.HashSet; +import java.util.Set; + +import org.scribble.ext.go.util.Smt2Translator; + + +// Binary arithmetic +public class RPBinAnnotExpr extends RPAnnotExpr +{ + public enum Op + { + Gt, + Gte, + Lt, + Lte; + + @Override + public String toString() + { + switch (this) + { + case Gt: return ">"; + case Gte: return ">="; + case Lt: return "<"; + case Lte: return "<="; + default: throw new RuntimeException("[param] Shouldn't get in here: " + this); + } + } + } + + public final Op op; + public final RPAnnotExpr left; + public final RPAnnotExpr right; + + protected RPBinAnnotExpr(Op op, RPAnnotExpr left, RPAnnotExpr right) + { + this.left = left; + this.right = right; + this.op = op; + } + + @Override + public String toGoString() + { + //throw new RuntimeException("[param-core] TODO: " + this); + return toString(); + } + + @Override + public String toSmt2Formula(Smt2Translator smt2t) + { + String left = this.left.toSmt2Formula(smt2t); + String right = this.right.toSmt2Formula(smt2t); + String op; + switch(this.op) + { + case Gt: op = smt2t.getGtOp(); break; + case Gte: op = smt2t.getGteOp(); break; + case Lt: op = smt2t.getLtOp(); break; + case Lte: op = smt2t.getLteOp(); break; + //case Mult: op = "*"; break; + default: throw new RuntimeException("[param] Shouldn't get in here: " + this.op); + } + return "(" + op + " " + left + " " + right + ")"; + } + + @Override + public Set getVals() + { + Set vals = new HashSet<>(this.left.getVals()); + vals.addAll(this.right.getVals()); + return vals; + } + + @Override + public Set getVars() + { + Set vars = new HashSet<>(this.left.getVars()); + vars.addAll(this.right.getVars()); + return vars; + } + + @Override + public String toString() + { + return "(" + this.left.toString() + this.op + this.right.toString() + ")"; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (!(o instanceof RPBinAnnotExpr)) + { + return false; + } + RPBinAnnotExpr f = (RPBinAnnotExpr) o; + return super.equals(this) // Does canEqual + && this.op.equals(f.op) && this.left.equals(f.left) && this.right.equals(f.right); + // Storing left/right as a Set could give commutativity in equals, but not associativity + // Better to keep "syntactic" equality, and do via additional routines for, e.g., normal forms + } + + @Override + protected boolean canEqual(Object o) + { + return o instanceof RPBinAnnotExpr; + } + + @Override + public int hashCode() + { + int hash = 5879; + hash = 31 * hash + super.hashCode(); + hash = 31 * hash + this.op.hashCode(); + hash = 31 * hash + this.left.hashCode(); + hash = 31 * hash + this.right.hashCode(); + return hash; + } +} diff --git a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java index b8a252331..fdb37042e 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/type/index/RPIndexFactory.java @@ -15,7 +15,7 @@ public static RPIndexInt ParamIntVal(int i) return new RPIndexInt(i); } - public static RPIndexVar ParamIntVar(String text) + public static RPIndexVar ParamIndexVar(String text) { /*// Check here? Or in API gen char c = text.charAt(0); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index bfe48568f..7559a83b9 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,9 +8,9 @@ module param.tmp.ParamTest; -global protocol Proto1(role A, role B) @"abc" +global protocol Proto1(role A, role B) @"K<1" { - Foo() from A[1] to B[1]; + Foo() from A[1] to B[K]; } From 8730e37358fa1c892be8de0dde915c016bc200ed Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 25 Oct 2018 18:53:15 +0100 Subject: [PATCH 431/433] Continued WIP. --- .../ext/go/core/cli/RPCoreCommandLine.java | 29 ++++++++++++++++++- .../src/test/scrib/param/tmp/ParamTest.scr | 4 +-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 99e3e8bff..3892b69d7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -591,8 +591,8 @@ private Map, Set>, Set if (this.gpd.header instanceof RPGProtocolHeader) { + // FIXME: WIP RPAnnotExpr annot = RPAnnotExpr.parse(((RPGProtocolHeader) this.gpd.header).annot); - System.out.println("AAA: " + annot + " ,, " + annot.toSmt2Formula(smt2t)); if (annot.getVars().stream().map(x -> x.toString()).allMatch(x -> vars.stream().map(y -> y.toString()).anyMatch(y -> x.equals(y)))) // TODO: refactor { @@ -729,6 +729,21 @@ public static String makeFamilyCheck(Smt2Translator smt2t, Set vars, cs.addAll(vars.stream().map(x -> smt2t.makeGte(x.toSmt2Formula(smt2t), smt2t.getDefaultBaseValue())).collect(Collectors.toList())); // FIXME: generalise, parameter domain annotations cs.addAll(cand.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t, false)).collect(Collectors.toList())); cs.addAll(coset.stream().map(v -> makePhiSmt2(v.intervals, v.cointervals, smt2t, true)).collect(Collectors.toList())); + + if (!vars.isEmpty()) + { + if (smt2t.global.header instanceof RPGProtocolHeader) + { + // FIXME: WIP + RPAnnotExpr annot = RPAnnotExpr.parse(((RPGProtocolHeader) smt2t.global.header).annot); + if (annot.getVars().stream().map(x -> x.toString()).allMatch(x -> + vars.stream().map(y -> y.toString()).anyMatch(y -> x.equals(y)))) // TODO: refactor + { + cs.add(annot.toSmt2Formula(smt2t)); + } + } + } + String smt2 = smt2t.makeAnd(cs); if (!vars.isEmpty()) { @@ -788,6 +803,18 @@ public static String makeFamilyCheck(Smt2Translator smt2t, Set vars, { //z3 = "(exists (" + vars.stream().map(p -> "(" + p + " Int)").collect(Collectors.joining(" ")) + ") " + z3 + ")"; List tmp = vars.stream().map(v -> smt2t.makeLte(smt2t.getDefaultBaseValue(), v.toSmt2Formula(smt2t))).collect(Collectors.toList()); + + if (this.gpd.header instanceof RPGProtocolHeader) + { + // FIXME: WIP + RPAnnotExpr annot = RPAnnotExpr.parse(((RPGProtocolHeader) this.gpd.header).annot); + if (annot.getVars().stream().map(x -> x.toString()).allMatch(x -> + vars.stream().map(y -> y.toString()).anyMatch(y -> x.equals(y)))) // TODO: refactor + { + tmp.add(annot.toSmt2Formula(smt2t)); + } + } + tmp.add(z3); z3 = smt2t.makeAnd(tmp); z3 = smt2t.makeExists(vars.stream().map(v -> v.toSmt2Formula(smt2t)).collect(Collectors.toList()), z3); diff --git a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr index 7559a83b9..be8bf837f 100644 --- a/scribble-go/src/test/scrib/param/tmp/ParamTest.scr +++ b/scribble-go/src/test/scrib/param/tmp/ParamTest.scr @@ -8,9 +8,9 @@ module param.tmp.ParamTest; -global protocol Proto1(role A, role B) @"K<1" +global protocol Proto1(role A, role B) @"K>=(1,1)" { - Foo() from A[1] to B[K]; + Foo() from A[(1,1)] to B[K]; } From 7b60d062f688a000fd3925e44221782163cb6d16 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Wed, 7 Nov 2018 23:51:40 +0000 Subject: [PATCH 432/433] Pass Smt2Translator to RPCoreSTApiGenerator from RPCoreCommandLine. --- .../org/scribble/ext/go/core/cli/RPCoreCommandLine.java | 2 +- .../go/core/codegen/statetype3/RPCoreSTApiGenerator.java | 6 +++++- .../core/codegen/statetype3/RPCoreSTSessionApiBuilder.java | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java index 3892b69d7..765313fc8 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/cli/RPCoreCommandLine.java @@ -205,7 +205,7 @@ else if (this.smt2t instanceof IntPairSmt2Translator) throw new RuntimeException("Shouldn't get in here: " + this.smt2t.getClass()); } Map goClasses = new RPCoreSTApiGenerator(gjob, fullname, - this.L0, this.E0, this.families, this.peers, this.subsum, this.aliases, impath, roles, mode).build(); + this.L0, this.E0, this.families, this.peers, this.subsum, this.aliases, impath, roles, mode, this.smt2t).build(); outputClasses(goClasses); } else diff --git a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java index 6708489f5..69a87fbf7 100644 --- a/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java +++ b/scribble-go/src/main/java/org/scribble/ext/go/core/codegen/statetype3/RPCoreSTApiGenerator.java @@ -22,6 +22,7 @@ import org.scribble.ext.go.type.index.RPIndexInt; import org.scribble.ext.go.type.index.RPIndexIntPair; import org.scribble.ext.go.type.index.RPIndexVar; +import org.scribble.ext.go.util.Smt2Translator; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.EGraph; import org.scribble.type.kind.Global; @@ -58,13 +59,15 @@ public enum Mode { Int, IntPair } // FIXME? just a role name -- cf. CL arg // FIXME: any way to separate Session API (Protocol) from Endpoint/StateChan APIs? + public final Smt2Translator smt2t; + public RPCoreSTApiGenerator(GoJob job, GProtocolName fullname, Map> projections, Map> variants, Set, Set>> families, Map, Set>, Set>> peers, Map, Set>, Pair, Set>> subsum, Map, Set>, RPRoleVariant>> aliases, String packpath, //Role self) - List selfs, Mode mode) + List selfs, Mode mode, Smt2Translator smt2t) { this.job = job; this.proto = fullname; @@ -136,6 +139,7 @@ public int compare(Pair, Set> f1, Pair, Set> fff, private String makeFamilyCheckIntPairIntervals(Pair, Set> fff, List ivars) { - Smt2Translator smt2t = new IntPairSmt2Translator(null, null); // FIXME: factor out, and null arg hacks + Smt2Translator smt2t = this.apigen.smt2t; //new IntPairSmt2Translator(null, null); // FIXME: factor out, and null arg hacks return "util.CheckSat(\"" + RPCoreCommandLine.makeFamilyCheck(smt2t, new HashSet<>(ivars), fff.left, fff.right) + "\")\n"; } From 8e0478923a7507cc6761d7c9aaa7581e3c27df40 Mon Sep 17 00:00:00 2001 From: Ray Hu Date: Thu, 8 Nov 2018 18:44:09 +0000 Subject: [PATCH 433/433] Added missing file (RPAntlrGProtocolDecl.java). --- .../ast/global/RPAntlrGProtocolDecl.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGProtocolDecl.java diff --git a/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGProtocolDecl.java b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGProtocolDecl.java new file mode 100644 index 000000000..fa2900435 --- /dev/null +++ b/scribble-go/src/main/java/org/scribble/ext/go/parser/scribble/ast/global/RPAntlrGProtocolDecl.java @@ -0,0 +1,60 @@ +/** + * Copyright 2008 The Scribble Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.scribble.ext.go.parser.scribble.ast.global; + +import java.util.LinkedList; +import java.util.List; + +import org.antlr.runtime.tree.CommonTree; +import org.scribble.ast.AstFactory; +import org.scribble.ast.global.GProtocolDecl; +import org.scribble.ast.global.GProtocolDef; +import org.scribble.ast.global.GProtocolHeader; +import org.scribble.parser.scribble.AntlrToScribParser; +import org.scribble.parser.scribble.ast.global.AntlrGProtocolDecl; +import org.scribble.util.ScribParserException; + +@Deprecated +public class RPAntlrGProtocolDecl +{ + public static final String NO_MODS = "PARAM_NOMODS"; + + public static final int ANNOT_CHILD_INDEX = 3; + + public static GProtocolDecl parseGPrototocolDecl(AntlrToScribParser parser, CommonTree ct, AstFactory af) throws ScribParserException + { + GProtocolHeader header = (GProtocolHeader) parser.parse(AntlrGProtocolDecl.getHeaderChild(ct), af); + GProtocolDef def = (GProtocolDef) parser.parse(AntlrGProtocolDecl.getBodyChild(ct), af); + List modifiers = new LinkedList<>(); + if (RPAntlrGProtocolDecl.hasModifiersChild(ct)) + { + for (CommonTree mod : AntlrGProtocolDecl.getModifierChildren(ct)) + { + switch (mod.getText()) + { + case "aux": modifiers.add(GProtocolDecl.Modifiers.AUX); break; + case "explicit": modifiers.add(GProtocolDecl.Modifiers.EXPLICIT); break; + default: throw new RuntimeException("TODO: " + mod); + } + } + } + return null;//((RPAstFactory) af).RPGProtocolDecl(ct, modifiers, header, def); + } + + public static boolean hasModifiersChild(CommonTree ct) + { + return ct.getChildCount() > AntlrGProtocolDecl.MODIFIERS_CHILD_INDEX + && !ct.getChild(AntlrGProtocolDecl.MODIFIERS_CHILD_INDEX).getText().equals(NO_MODS); + } +}