Skip to content

Commit 1596b74

Browse files
committed
[PExplicit] Several minor updates
Support goto event handlers with transition functions Correct PTuple constructor Correct status and result when a bug is bound Cleanup return in functions in IR. Start adding pending/unsupported tests in PExplicit test runner
1 parent 22053d3 commit 1596b74

File tree

5 files changed

+63
-128
lines changed

5 files changed

+63
-128
lines changed

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

Lines changed: 39 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ private void WriteMachineConstructor(CompilationContext context, StringWriter ou
431431

432432
private void WriteHandlerUpdate(CompilationContext context, StringWriter output, State state)
433433
{
434-
context.Write(output, $"{context.GetNameForDecl(state)}.registerHandlers(");
434+
context.WriteLine(output, $"{context.GetNameForDecl(state)}.registerHandlers(");
435435
var first = true;
436436
foreach (var handler in state.AllEventHandlers)
437437
{
@@ -536,7 +536,8 @@ private void WriteEventHandler(CompilationContext context, StringWriter output,
536536
if (transitionFunc.Signature.Parameters.Count() == 1)
537537
{
538538
Debug.Assert(!transitionFunc.Signature.Parameters[0].Type.IsSameTypeAs(PrimitiveType.Null));
539-
context.Write(output, $", payload");
539+
var payloadVsType = GetPExplicitType(transitionFunc.Signature.Parameters[0].Type);
540+
context.Write(output, $", ({payloadVsType}) payload");
540541
}
541542
context.WriteLine(output, ");");
542543
context.WriteLine(output, "}");
@@ -573,35 +574,6 @@ internal ControlFlowContext FreshBranchSubContext(CompilationContext context)
573574
}
574575
}
575576

576-
private bool MayExitWithOutcome(Function func)
577-
{
578-
return (func.CanChangeState ?? false) || (func.CanRaiseEvent ?? false);
579-
}
580-
581-
private enum FunctionReturnConvention
582-
{
583-
ReturnValue,
584-
ReturnVoid,
585-
ReturnValueOrExit
586-
}
587-
588-
private FunctionReturnConvention GetReturnConvention(Function function)
589-
{
590-
var mayExit = MayExitWithOutcome(function);
591-
var voidReturn = function.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null);
592-
if (voidReturn)
593-
{
594-
return FunctionReturnConvention.ReturnVoid;
595-
}
596-
else
597-
{
598-
if (mayExit)
599-
return FunctionReturnConvention.ReturnValueOrExit;
600-
else
601-
return FunctionReturnConvention.ReturnValue;
602-
}
603-
}
604-
605577
private void WriteForeignFunction(CompilationContext context, StringWriter output, Function function)
606578
{
607579
var isStatic = function.Owner == null;
@@ -613,15 +585,12 @@ private void WriteForeignFunction(CompilationContext context, StringWriter outpu
613585

614586
string returnType = null;
615587
var returnStatement = "";
616-
switch (GetReturnConvention(function))
617-
{
618-
case FunctionReturnConvention.ReturnValue:
619-
returnType = "Object";
620-
returnStatement = "return ";
621-
break;
622-
case FunctionReturnConvention.ReturnVoid:
623-
returnType = "void";
624-
break;
588+
if (function.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null)) {
589+
returnType = "void";
590+
591+
} else {
592+
returnType = "Object";
593+
returnStatement = "return ";
625594
}
626595

627596
var functionName = $"wrapper__{context.GetNameForDecl(function)}";
@@ -660,17 +629,10 @@ private void WriteFunction(CompilationContext context, StringWriter output, Func
660629
var staticKeyword = isStatic ? "static " : "";
661630

662631
string returnType = null;
663-
switch (GetReturnConvention(function))
664-
{
665-
case FunctionReturnConvention.ReturnValue:
666-
returnType = GetPExplicitType(function.Signature.ReturnType);
667-
break;
668-
case FunctionReturnConvention.ReturnVoid:
669-
returnType = "void";
670-
break;
671-
case FunctionReturnConvention.ReturnValueOrExit:
672-
returnType = GetPExplicitType(function.Signature.ReturnType);
673-
break;
632+
if (function.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null)) {
633+
returnType = "void";
634+
} else {
635+
returnType = GetPExplicitType(function.Signature.ReturnType);
674636
}
675637

676638
context.ReturnType = function.Signature.ReturnType;
@@ -708,15 +670,8 @@ private void WriteFunctionBody(CompilationContext context, StringWriter output,
708670
context.WriteLine(output);
709671
}
710672

711-
var returnConvention = GetReturnConvention(function);
712-
switch (returnConvention)
713-
{
714-
case FunctionReturnConvention.ReturnValue:
715-
case FunctionReturnConvention.ReturnValueOrExit:
716-
context.WriteLine(output, $"{GetPExplicitType(function.Signature.ReturnType)} {CompilationContext.ReturnValue} = new {GetPExplicitType(function.Signature.ReturnType)}({GetDefaultValue(function.Signature.ReturnType)});");
717-
break;
718-
case FunctionReturnConvention.ReturnVoid:
719-
break;
673+
if (!function.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null)) {
674+
context.WriteLine(output, $"{GetPExplicitType(function.Signature.ReturnType)} {CompilationContext.ReturnValue} = new {GetPExplicitType(function.Signature.ReturnType)}({GetDefaultValue(function.Signature.ReturnType)});");
720675
}
721676

722677
if (function is WhileFunction)
@@ -727,18 +682,6 @@ private void WriteFunctionBody(CompilationContext context, StringWriter output,
727682
{
728683
WriteStmt(function, context, output, ControlFlowContext.FreshFuncContext(context), function.Body);
729684
}
730-
731-
switch (returnConvention)
732-
{
733-
case FunctionReturnConvention.ReturnValue:
734-
context.WriteLine(output, $"return {CompilationContext.ReturnValue};");
735-
break;
736-
case FunctionReturnConvention.ReturnVoid:
737-
break;
738-
case FunctionReturnConvention.ReturnValueOrExit:
739-
context.WriteLine(output, $"return {CompilationContext.ReturnValue};");
740-
break;
741-
}
742685
}
743686

744687
private FunCallExpr TryGetCallInAssignment(IPStmt stmt)
@@ -1315,35 +1258,22 @@ private string GetInlineCastPrefix(PLanguageType valueType, PLanguageType locati
13151258

13161259
private void WriteForeignFunCallStmt(CompilationContext context, StringWriter output, Function function, IReadOnlyList<IPExpr> args, IPExpr dest=null)
13171260
{
1318-
var returnConvention = GetReturnConvention(function);
13191261
string returnTemp = null;
1320-
switch (returnConvention)
1321-
{
1322-
case FunctionReturnConvention.ReturnValue:
1323-
returnTemp = context.FreshTempVar();
1324-
context.Write(output, $"{GetPExplicitType(function.Signature.ReturnType)} {returnTemp} = ({GetPExplicitType(function.Signature.ReturnType)})");
1325-
break;
1326-
case FunctionReturnConvention.ReturnVoid:
1327-
break;
1328-
default:
1329-
throw new NotImplementedException("Cannot handle foreign function calls that can exit");
1262+
if (!function.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null)) {
1263+
returnTemp = context.FreshTempVar();
1264+
context.Write(output, $"{GetPExplicitType(function.Signature.ReturnType)} {returnTemp} = ({GetPExplicitType(function.Signature.ReturnType)})");
13301265
}
13311266

13321267
context.Write(output, $"ForeignFunctionInvoker.invoke(");
1333-
switch (returnConvention)
1334-
{
1335-
case FunctionReturnConvention.ReturnValue:
1336-
context.Write(output, $"{GetDefaultValue(function.Signature.ReturnType)}, x -> ");
1337-
context.Write(output, "{ return ");
1338-
context.Write(output, $"wrapper__{context.GetNameForDecl(function)}(x);");
1339-
context.Write(output, " }");
1340-
break;
1341-
case FunctionReturnConvention.ReturnVoid:
1342-
context.Write(output, $"x -> wrapper__{context.GetNameForDecl(function)}(x)");
1343-
break;
1344-
default:
1345-
throw new NotImplementedException("Cannot handle foreign function calls that can exit");
1268+
if (function.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null)) {
1269+
context.Write(output, $"x -> wrapper__{context.GetNameForDecl(function)}(x)");
1270+
} else {
1271+
context.Write(output, $"{GetDefaultValue(function.Signature.ReturnType)}, x -> ");
1272+
context.Write(output, "{ return ");
1273+
context.Write(output, $"wrapper__{context.GetNameForDecl(function)}(x);");
1274+
context.Write(output, " }");
13461275
}
1276+
13471277
for (var i = 0; i < args.Count(); i++)
13481278
{
13491279
var param = args.ElementAt(i);
@@ -1352,17 +1282,11 @@ private void WriteForeignFunCallStmt(CompilationContext context, StringWriter ou
13521282
}
13531283
context.WriteLine(output, ");");
13541284

1355-
switch (returnConvention)
1356-
{
1357-
case FunctionReturnConvention.ReturnValue:
1358-
if (dest != null)
1359-
WriteWithLValueMutationContext(context, output, dest, false, (lhs) => context.WriteLine(output, $"{lhs} = {returnTemp};"));
1360-
break;
1361-
case FunctionReturnConvention.ReturnVoid:
1362-
Debug.Assert(dest == null);
1363-
break;
1364-
default:
1365-
throw new NotImplementedException("Cannot handle foreign function calls that can exit");
1285+
if (function.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null)) {
1286+
Debug.Assert(dest == null);
1287+
} else {
1288+
if (dest != null)
1289+
WriteWithLValueMutationContext(context, output, dest, false, (lhs) => context.WriteLine(output, $"{lhs} = {returnTemp};"));
13661290
}
13671291
}
13681292

@@ -1374,17 +1298,10 @@ private void WriteFunCallStmt(CompilationContext context, StringWriter output, F
13741298
return;
13751299
}
13761300

1377-
var returnConvention = GetReturnConvention(function);
13781301
string returnTemp = null;
1379-
switch (returnConvention)
1380-
{
1381-
case FunctionReturnConvention.ReturnValue:
1382-
case FunctionReturnConvention.ReturnValueOrExit:
1383-
returnTemp = context.FreshTempVar();
1384-
context.Write(output, $"{GetPExplicitType(function.Signature.ReturnType)} {returnTemp} = ");
1385-
break;
1386-
case FunctionReturnConvention.ReturnVoid:
1387-
break;
1302+
if (!function.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null)) {
1303+
returnTemp = context.FreshTempVar();
1304+
context.Write(output, $"{GetPExplicitType(function.Signature.ReturnType)} {returnTemp} = ");
13881305
}
13891306

13901307
context.Write(output, $"{context.GetNameForDecl(function)}({CompilationContext.CurrentMachine}");
@@ -1399,16 +1316,11 @@ private void WriteFunCallStmt(CompilationContext context, StringWriter output, F
13991316

14001317
context.WriteLine(output, ");");
14011318

1402-
switch (returnConvention)
1403-
{
1404-
case FunctionReturnConvention.ReturnValue:
1405-
case FunctionReturnConvention.ReturnValueOrExit:
1406-
if (dest != null)
1407-
WriteWithLValueMutationContext(context, output, dest, false, (lhs) => context.WriteLine(output, $"{lhs} = {returnTemp};"));
1408-
break;
1409-
case FunctionReturnConvention.ReturnVoid:
1410-
Debug.Assert(dest == null);
1411-
break;
1319+
if (function.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null)) {
1320+
Debug.Assert(dest == null);
1321+
} else {
1322+
if (dest != null)
1323+
WriteWithLValueMutationContext(context, output, dest, false, (lhs) => context.WriteLine(output, $"{lhs} = {returnTemp};"));
14121324
}
14131325
}
14141326

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/RuntimeExecutor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ private static void process(boolean resume) throws Exception {
120120
if (PExplicitGlobal.getConfig().getVerbosity() > 0) {
121121
PExplicitLogger.printStackTrace(e, false);
122122
}
123+
throw e;
123124
} catch (InterruptedException e) {
124125
PExplicitGlobal.setStatus("interrupted");
125126
throw new Exception("INTERRUPTED", e);

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/runtime/machine/eventhandlers/GotoEventHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ public GotoEventHandler(PEvent event, State dest) {
2323
this.gotoState = dest;
2424
}
2525

26+
public void transitionFunction(PMachine target, PValue<?> payload) {
27+
}
28+
2629
/**
2730
* Handle the goto event at the target machine.
2831
*
@@ -31,6 +34,7 @@ public GotoEventHandler(PEvent event, State dest) {
3134
*/
3235
@Override
3336
public void handleEvent(PMachine target, PValue<?> payload) {
37+
transitionFunction(target, payload);
3438
target.processStateTransition(gotoState, payload);
3539
}
3640
}

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/values/PTuple.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class PTuple extends PValue<PTuple> {
1313
/**
1414
* Creates a new PTuple with the given fields
1515
*/
16-
public PTuple(PValue<?>[] input_fields) {
16+
public PTuple(PValue<?> ... input_fields) {
1717
this.fields = new PValue<?>[input_fields.length];
1818
for (int i = 0; i < input_fields.length; i++) {
1919
this.fields[i] = PValue.clone(input_fields[i]);

Src/PRuntimes/PExplicitRuntime/src/test/java/pexplicit/TestPExplicit.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,24 @@ private static void setRunArgs() {
5050
}
5151

5252
private static void createExcludeList() {
53+
/**
54+
* TODO: Support type casting
55+
*/
56+
// TODO: Cannot yet handle casting to variable of type (int,int) from value of type any
57+
excluded.add("../../../Tst/RegressionTests/Feature1SMLevelDecls/Correct/bug3");
58+
excluded.add("../../../Tst/RegressionTests/Feature1SMLevelDecls/Correct/bug4");
59+
// TODO: Cannot yet handle casting to variable of type (machine,machine) from value of type any
60+
excluded.add("../../../Tst/RegressionTests/Feature1SMLevelDecls/Correct/PingPong");
61+
62+
/**
63+
* TODO: Null events
64+
*/
65+
// TODO: Null actions are not supported
66+
excluded.add("../../../Tst/RegressionTests/Feature1SMLevelDecls/Correct/BugRepro");
67+
excluded.add("../../../Tst/RegressionTests/Feature1SMLevelDecls/Correct/MoreThan32Events");
68+
69+
70+
5371
}
5472

5573
private static void initialize() {

0 commit comments

Comments
 (0)