Skip to content

Commit 2312618

Browse files
committed
[PEx] Several improvements to IR
Revamps IR to store continuation variables within PContinuation class Adds function to get the default value from a PValue object Removes generating get/set/reset functions for PMachine variables. Instead, using reflection in PEx RT. Minor refactoring
1 parent 411d238 commit 2312618

File tree

21 files changed

+308
-100
lines changed

21 files changed

+308
-100
lines changed

Src/PCompiler/CompilerCore/Backend/PExplicit/Continuation.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,16 @@ public void AddParameter(Variable local, Variable store)
2525
var localAccess = new VariableAccessExpr(SourceLocation, local);
2626
var storeAccess = new VariableAccessExpr(SourceLocation, store);
2727
var storeStmt = new AssignStmt(SourceLocation, storeAccess, localAccess);
28-
storeStmts.Add(storeStmt);
2928
storeForLocal.Add(local, store);
3029
}
3130

3231
public IReadOnlyDictionary<PEvent, Function> Cases { get; }
3332
public IPStmt After { get; }
3433
public IEnumerable<Variable> StoreParameters => storeParameters;
3534
public IEnumerable<Variable> LocalParameters => localParameters;
36-
public IEnumerable<AssignStmt> StoreStmts => storeStmts;
3735
public IReadOnlyDictionary<Variable, Variable> StoreForLocal => storeForLocal;
3836
private readonly List<Variable> storeParameters = new List<Variable>();
3937
private readonly List<Variable> localParameters = new List<Variable>();
40-
private readonly List<AssignStmt> storeStmts = new List<AssignStmt>();
4138
private readonly Dictionary<Variable, Variable> storeForLocal = new Dictionary<Variable, Variable>();
4239
}
4340
}

Src/PCompiler/CompilerCore/Backend/PExplicit/PExplicitCodeGenerator.cs

Lines changed: 78 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -307,66 +307,65 @@ private void WriteMachineFields(CompilationContext context, StringWriter output,
307307
}
308308

309309
foreach (var field in machine.Fields)
310-
context.WriteLine(output, $"private {GetPExplicitType(field.Type)} {CompilationContext.GetVar(field.Name)} = {GetDefaultValue(field.Type)};");
311-
312-
context.WriteLine(output);
313-
314-
context.WriteLine(output, "@Generated");
315-
context.WriteLine(output, "@Override");
316-
context.WriteLine(output, "public void reset() {");
317-
context.WriteLine(output, " super.reset();");
318-
foreach (var field in machine.Fields)
319-
context.WriteLine(output, $" {CompilationContext.GetVar(field.Name)} = {GetDefaultValue(field.Type)};");
320-
context.WriteLine(output, "}");
321-
context.WriteLine(output);
322-
323-
context.WriteLine(output, "@Generated");
324-
context.WriteLine(output, "@Override");
325-
context.WriteLine(output, "public List<String> getLocalVarNames() {");
326-
context.WriteLine(output, " List<String> result = super.getLocalVarNames();");
327-
foreach (var field in machine.Fields)
328-
{
329-
context.WriteLine(output, $" result.add(\"{CompilationContext.GetVar(field.Name)}\");");
330-
}
331-
context.WriteLine(output, " return result;");
332-
context.WriteLine(output, "}");
310+
context.WriteLine(output, $"public {GetPExplicitType(field.Type)} {CompilationContext.GetVar(field.Name)} = {GetDefaultValue(field.Type)};");
333311
context.WriteLine(output);
334312

335-
context.WriteLine(output, "@Generated");
336-
context.WriteLine(output, "@Override");
337-
context.WriteLine(output, "public List<Object> getLocalVarValues() {");
338-
context.WriteLine(output, " List<Object> result = super.getLocalVarValues();");
339-
foreach (var field in machine.Fields)
340-
{
341-
context.WriteLine(output, $" result.add({CompilationContext.GetVar(field.Name)});");
342-
}
343-
context.WriteLine(output, " return result;");
344-
context.WriteLine(output, "}");
345-
context.WriteLine(output);
346-
347-
context.WriteLine(output, "@Generated");
348-
context.WriteLine(output, "@Override");
349-
context.WriteLine(output, "public List<Object> copyLocalVarValues() {");
350-
context.WriteLine(output, " List<Object> result = super.copyLocalVarValues();");
351-
foreach (var field in machine.Fields)
352-
{
353-
context.WriteLine(output, $" result.add({CompilationContext.GetVar(field.Name)});");
354-
}
355-
context.WriteLine(output, " return result;");
356-
context.WriteLine(output, "}");
357-
context.WriteLine(output);
358-
359-
context.WriteLine(output, "@Generated");
360-
context.WriteLine(output, "@Override");
361-
context.WriteLine(output, "protected int setLocalVarValues(List<Object> values) {");
362-
context.WriteLine(output, " int idx = super.setLocalVarValues(values);");
363-
foreach (var field in machine.Fields)
364-
{
365-
context.WriteLine(output, $" {CompilationContext.GetVar(field.Name)} = ({GetPExplicitType(field.Type)}) values.get(idx++);");
366-
}
367-
context.WriteLine(output, " return idx;");
368-
context.WriteLine(output, "}");
369-
context.WriteLine(output);
313+
// context.WriteLine(output, "@Generated");
314+
// context.WriteLine(output, "@Override");
315+
// context.WriteLine(output, "public void reset() {");
316+
// context.WriteLine(output, " super.reset();");
317+
// foreach (var field in machine.Fields)
318+
// context.WriteLine(output, $" {CompilationContext.GetVar(field.Name)} = {GetDefaultValue(field.Type)};");
319+
// context.WriteLine(output, "}");
320+
// context.WriteLine(output);
321+
//
322+
// context.WriteLine(output, "@Generated");
323+
// // context.WriteLine(output, "@Override");
324+
// context.WriteLine(output, "public List<String> getLocalVarNames() {");
325+
// context.WriteLine(output, " List<String> result = super.getLocalVarNames();");
326+
// foreach (var field in machine.Fields)
327+
// {
328+
// context.WriteLine(output, $" result.add(\"{CompilationContext.GetVar(field.Name)}\");");
329+
// }
330+
// context.WriteLine(output, " return result;");
331+
// context.WriteLine(output, "}");
332+
// context.WriteLine(output);
333+
//
334+
// context.WriteLine(output, "@Generated");
335+
// context.WriteLine(output, "@Override");
336+
// context.WriteLine(output, "public List<Object> getLocalVarValues() {");
337+
// context.WriteLine(output, " List<Object> result = super.getLocalVarValues();");
338+
// foreach (var field in machine.Fields)
339+
// {
340+
// context.WriteLine(output, $" result.add({CompilationContext.GetVar(field.Name)});");
341+
// }
342+
// context.WriteLine(output, " return result;");
343+
// context.WriteLine(output, "}");
344+
// context.WriteLine(output);
345+
//
346+
// context.WriteLine(output, "@Generated");
347+
// context.WriteLine(output, "@Override");
348+
// context.WriteLine(output, "public List<Object> copyLocalVarValues() {");
349+
// context.WriteLine(output, " List<Object> result = super.copyLocalVarValues();");
350+
// foreach (var field in machine.Fields)
351+
// {
352+
// context.WriteLine(output, $" result.add({CompilationContext.GetVar(field.Name)});");
353+
// }
354+
// context.WriteLine(output, " return result;");
355+
// context.WriteLine(output, "}");
356+
// context.WriteLine(output);
357+
//
358+
// context.WriteLine(output, "@Generated");
359+
// context.WriteLine(output, "@Override");
360+
// context.WriteLine(output, "protected int setLocalVarValues(List<Object> values) {");
361+
// context.WriteLine(output, " int idx = super.setLocalVarValues(values);");
362+
// foreach (var field in machine.Fields)
363+
// {
364+
// context.WriteLine(output, $" {CompilationContext.GetVar(field.Name)} = ({GetPExplicitType(field.Type)}) values.get(idx++);");
365+
// }
366+
// context.WriteLine(output, " return idx;");
367+
// context.WriteLine(output, "}");
368+
// context.WriteLine(output);
370369
}
371370

372371
private void WriteMachineConstructor(CompilationContext context, StringWriter output, Machine machine)
@@ -393,21 +392,7 @@ private void WriteMachineConstructor(CompilationContext context, StringWriter ou
393392
if (method is Continuation)
394393
{
395394
var cont = (Continuation) method;
396-
context.WriteLine(output, "registerContinuation(");
397-
context.WriteLine(output, $"\"{context.GetContinuationName(cont)}\"");
398-
context.WriteLine(output, $", (machine, msg) -> {context.GetContinuationName(cont)}(machine, msg)");
399-
context.WriteLine(output, $", () -> clear_{context.GetContinuationName(cont)}()");
400-
foreach (var (caseEvent, _) in cont.Cases)
401-
{
402-
context.Write(output, $", \"{caseEvent.Name}\"");
403-
}
404-
context.WriteLine(output, ");");
405-
406-
// context.Write(output, $"continuations.put(\"{context.GetContinuationName(cont)}\", ");
407-
// context.Write(output, $"(pc) -> ((continuation_outcome, msg) -> {context.GetContinuationName(cont)}(");
408-
// context.Write(output, "continuation_outcome");
409-
// context.WriteLine(output, $", msg)));");
410-
// context.WriteLine(output, $"clearContinuationVars.add(() -> clear_{context.GetContinuationName(cont)}());");
395+
context.WriteLine(output, $"register_{context.GetContinuationName(cont)}();");
411396
}
412397
}
413398

@@ -1021,7 +1006,13 @@ private bool WriteStmt(Function function, CompilationContext context, StringWrit
10211006
context.WriteLine(output, ");");
10221007
break;
10231008
case ReceiveSplitStmt splitStmt:
1024-
context.WriteLine(output, $"{CompilationContext.CurrentMachine}.blockUntil(\"{context.GetContinuationName(splitStmt.Cont)}\");");
1009+
Continuation continuation = splitStmt.Cont;
1010+
context.WriteLine(output, $"PContinuation {context.GetContinuationName(continuation)} = getContinuation(\"{context.GetContinuationName(continuation)}\");");
1011+
foreach (var local in continuation.LocalParameters)
1012+
{
1013+
context.WriteLine(output, $"{context.GetContinuationName(continuation)}.setVar(\"{continuation.StoreForLocal[local].Name}\", {CompilationContext.GetVar(local.Name)});");
1014+
}
1015+
context.WriteLine(output, $"{CompilationContext.CurrentMachine}.blockUntil(\"{context.GetContinuationName(continuation)}\");");
10251016
context.Write(output, "return;");
10261017
exited = true;
10271018
break;
@@ -1039,11 +1030,20 @@ private void WriteContinuation(CompilationContext context, StringWriter output,
10391030
throw new NotImplementedException($"Receive statement in a function with non-void return type is not supported. Found in function named {continuation.ParentFunction.Name}.");
10401031
}
10411032

1042-
context.Write(output, $"void clear_{context.GetContinuationName(continuation)}() ");
1033+
context.Write(output, $"void register_{context.GetContinuationName(continuation)}() ");
10431034
context.WriteLine(output, "{");
1035+
context.Write(output, $"PContinuation {context.GetContinuationName(continuation)} = registerContinuation(");
1036+
context.WriteLine(output, $"\"{context.GetContinuationName(continuation)}\"");
1037+
context.WriteLine(output, $", (machine, msg) -> {context.GetContinuationName(continuation)}(machine, msg)");
1038+
foreach (var (caseEvent, _) in continuation.Cases)
1039+
{
1040+
context.Write(output, $", \"{caseEvent.Name}\"");
1041+
}
1042+
context.WriteLine(output, ");");
1043+
10441044
foreach (var param in continuation.StoreParameters)
10451045
{
1046-
context.WriteLine(output, $"{GetPExplicitType(param.Type)} {CompilationContext.GetVar(param.Name)} = {GetDefaultValue(param.Type)};");
1046+
context.WriteLine(output, $"{context.GetContinuationName(continuation)}.addVar(\"{param.Name}\", {GetDefaultValue(param.Type)});");
10471047
}
10481048
context.WriteLine(output, "}");
10491049

@@ -1063,11 +1063,12 @@ private void WriteContinuation(CompilationContext context, StringWriter output,
10631063
context.WriteLine(output, "{");
10641064

10651065
var continuationLocalParams = new HashSet<string>();
1066+
context.WriteLine(output, $"PContinuation {context.GetContinuationName(continuation)} = getContinuation(\"{context.GetContinuationName(continuation)}\");");
10661067
foreach (var local in continuation.LocalParameters)
10671068
{
10681069
continuationLocalParams.Add(local.Name);
10691070
context.Write(output, $"{GetPExplicitType(local.Type)} {CompilationContext.GetVar(local.Name)}");
1070-
context.WriteLine(output, $"= {CompilationContext.GetVar(continuation.StoreForLocal[local].Name)};");
1071+
context.WriteLine(output, $" = ({GetPExplicitType(local.Type)}) {context.GetContinuationName(continuation)}.getVar(\"{continuation.StoreForLocal[local].Name}\");");
10711072
}
10721073

10731074
context.WriteLine(output, $"switch ({messageName}.getEvent().toString())");

Src/PCompiler/CompilerCore/Backend/PExplicit/TransformASTPass.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -712,14 +712,6 @@ private static IPStmt HandleReceives(IPStmt statement, Function function, Machin
712712
}
713713
var continuation = GetContinuation(function, cases, after, recv.SourceLocation);
714714
if (machine != null) machine.AddMethod(continuation);
715-
foreach (var v in continuation.StoreParameters)
716-
{
717-
machine.AddField(v);
718-
}
719-
foreach (var store in continuation.StoreStmts)
720-
{
721-
result.Add(store);
722-
}
723715
var split = new ReceiveSplitStmt(compound.SourceLocation, continuation);
724716
result.Add(split);
725717
break;

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/runtime/machine/PMachine.java

Lines changed: 99 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
import pexplicit.utils.exceptions.BugFoundException;
1111
import pexplicit.utils.misc.Assert;
1212
import pexplicit.utils.serialize.SerializableBiFunction;
13-
import pexplicit.utils.serialize.SerializableRunnable;
1413
import pexplicit.values.PEvent;
1514
import pexplicit.values.PMachineValue;
1615
import pexplicit.values.PMessage;
1716
import pexplicit.values.PValue;
1817

1918
import java.io.Serializable;
19+
import java.lang.reflect.Field;
2020
import java.util.*;
2121
import java.util.function.Function;
2222

@@ -132,6 +132,24 @@ public void reset() {
132132
this.blockedStateExit = null;
133133
this.blockedNewStateEntry = null;
134134
this.blockedNewStateEntryPayload = null;
135+
136+
for (PContinuation continuation : continuationMap.values()) {
137+
continuation.clearVars();
138+
}
139+
140+
Field[] declaredFields = this.getClass().getDeclaredFields();
141+
for (Field field : declaredFields) {
142+
if (!java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
143+
try {
144+
Object curr = field.get(this);
145+
if (curr != null) {
146+
field.set(this, ((PValue<?>) curr).getDefault());
147+
}
148+
} catch (IllegalAccessException e) {
149+
throw new RuntimeException(e);
150+
}
151+
}
152+
}
135153
}
136154

137155
/**
@@ -155,6 +173,19 @@ public List<String> getLocalVarNames() {
155173
result.add("_blockedNewStateEntry");
156174
result.add("_blockedNewStateEntryPayload");
157175

176+
for (PContinuation continuation : continuationMap.values()) {
177+
for (Map.Entry<String, PValue<?>> entry : continuation.getVars().entrySet()) {
178+
result.add(entry.getKey());
179+
}
180+
}
181+
182+
Field[] declaredFields = this.getClass().getDeclaredFields();
183+
for (Field field : declaredFields) {
184+
if (!java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
185+
result.add(field.getName());
186+
}
187+
}
188+
158189
return result;
159190
}
160191

@@ -179,6 +210,23 @@ public List<Object> getLocalVarValues() {
179210
result.add(blockedNewStateEntry);
180211
result.add(blockedNewStateEntryPayload);
181212

213+
for (PContinuation continuation : continuationMap.values()) {
214+
for (Map.Entry<String, PValue<?>> entry : continuation.getVars().entrySet()) {
215+
result.add(entry.getValue());
216+
}
217+
}
218+
219+
Field[] declaredFields = this.getClass().getDeclaredFields();
220+
for (Field field : declaredFields) {
221+
if (!java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
222+
try {
223+
result.add(field.get(this));
224+
} catch (IllegalAccessException e) {
225+
throw new RuntimeException(e);
226+
}
227+
}
228+
}
229+
182230
return result;
183231
}
184232

@@ -203,6 +251,23 @@ public List<Object> copyLocalVarValues() {
203251
result.add(blockedNewStateEntry);
204252
result.add(blockedNewStateEntryPayload);
205253

254+
for (PContinuation continuation : continuationMap.values()) {
255+
for (Map.Entry<String, PValue<?>> entry : continuation.getVars().entrySet()) {
256+
result.add(entry.getValue());
257+
}
258+
}
259+
260+
Field[] declaredFields = this.getClass().getDeclaredFields();
261+
for (Field field : declaredFields) {
262+
if (!java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
263+
try {
264+
result.add(field.get(this));
265+
} catch (IllegalAccessException e) {
266+
throw new RuntimeException(e);
267+
}
268+
}
269+
}
270+
206271
return result;
207272
}
208273

@@ -228,6 +293,23 @@ protected int setLocalVarValues(List<Object> values) {
228293
blockedNewStateEntry = (State) values.get(idx++);
229294
blockedNewStateEntryPayload = (PValue<?>) values.get(idx++);
230295

296+
for (PContinuation continuation : continuationMap.values()) {
297+
for (Map.Entry<String, PValue<?>> entry : continuation.getVars().entrySet()) {
298+
entry.setValue((PValue<?>) values.get(idx++));
299+
}
300+
}
301+
302+
Field[] declaredFields = this.getClass().getDeclaredFields();
303+
for (Field field : declaredFields) {
304+
if (!java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
305+
try {
306+
field.set(this, values.get(idx++));
307+
} catch (IllegalAccessException e) {
308+
throw new RuntimeException(e);
309+
}
310+
}
311+
}
312+
231313
return idx;
232314
}
233315

@@ -306,14 +388,26 @@ public void gotoState(State state, PValue<?> payload) {
306388
*
307389
* @param name Name of the continuation
308390
* @param handleFun Function executed when unblocking
309-
* @param clearFun Function that clears corresponding continuation variables
391+
* @return New PContinuation
310392
*/
311-
protected void registerContinuation(
393+
protected PContinuation registerContinuation(
312394
String name,
313395
SerializableBiFunction<PMachine, PMessage> handleFun,
314-
SerializableRunnable clearFun,
315396
String... caseEvents) {
316-
continuationMap.put(name, new PContinuation(handleFun, clearFun, caseEvents));
397+
PContinuation continuation = new PContinuation(handleFun, caseEvents);
398+
continuationMap.put(name, continuation);
399+
return continuation;
400+
}
401+
402+
/**
403+
* Get a continuation
404+
*
405+
* @param name Name of the continuation
406+
* @return Corresponding PContinuation
407+
*/
408+
protected PContinuation getContinuation(String name) {
409+
assert (continuationMap.containsKey(name));
410+
return continuationMap.get(name);
317411
}
318412

319413
/**

0 commit comments

Comments
 (0)