@@ -431,7 +431,7 @@ private void WriteMachineConstructor(CompilationContext context, StringWriter ou
431
431
432
432
private void WriteHandlerUpdate ( CompilationContext context , StringWriter output , State state )
433
433
{
434
- context . Write ( output , $ "{ context . GetNameForDecl ( state ) } .registerHandlers(") ;
434
+ context . WriteLine ( output , $ "{ context . GetNameForDecl ( state ) } .registerHandlers(") ;
435
435
var first = true ;
436
436
foreach ( var handler in state . AllEventHandlers )
437
437
{
@@ -536,7 +536,8 @@ private void WriteEventHandler(CompilationContext context, StringWriter output,
536
536
if ( transitionFunc . Signature . Parameters . Count ( ) == 1 )
537
537
{
538
538
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") ;
540
541
}
541
542
context . WriteLine ( output , ");" ) ;
542
543
context . WriteLine ( output , "}" ) ;
@@ -573,35 +574,6 @@ internal ControlFlowContext FreshBranchSubContext(CompilationContext context)
573
574
}
574
575
}
575
576
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
-
605
577
private void WriteForeignFunction ( CompilationContext context , StringWriter output , Function function )
606
578
{
607
579
var isStatic = function . Owner == null ;
@@ -613,15 +585,12 @@ private void WriteForeignFunction(CompilationContext context, StringWriter outpu
613
585
614
586
string returnType = null ;
615
587
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 " ;
625
594
}
626
595
627
596
var functionName = $ "wrapper__{ context . GetNameForDecl ( function ) } ";
@@ -660,17 +629,10 @@ private void WriteFunction(CompilationContext context, StringWriter output, Func
660
629
var staticKeyword = isStatic ? "static " : "" ;
661
630
662
631
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 ) ;
674
636
}
675
637
676
638
context . ReturnType = function . Signature . ReturnType ;
@@ -708,15 +670,8 @@ private void WriteFunctionBody(CompilationContext context, StringWriter output,
708
670
context . WriteLine ( output ) ;
709
671
}
710
672
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 ) } );") ;
720
675
}
721
676
722
677
if ( function is WhileFunction )
@@ -727,18 +682,6 @@ private void WriteFunctionBody(CompilationContext context, StringWriter output,
727
682
{
728
683
WriteStmt ( function , context , output , ControlFlowContext . FreshFuncContext ( context ) , function . Body ) ;
729
684
}
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
- }
742
685
}
743
686
744
687
private FunCallExpr TryGetCallInAssignment ( IPStmt stmt )
@@ -1315,35 +1258,22 @@ private string GetInlineCastPrefix(PLanguageType valueType, PLanguageType locati
1315
1258
1316
1259
private void WriteForeignFunCallStmt ( CompilationContext context , StringWriter output , Function function , IReadOnlyList < IPExpr > args , IPExpr dest = null )
1317
1260
{
1318
- var returnConvention = GetReturnConvention ( function ) ;
1319
1261
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 ) } )") ;
1330
1265
}
1331
1266
1332
1267
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 , " }" ) ;
1346
1275
}
1276
+
1347
1277
for ( var i = 0 ; i < args . Count ( ) ; i ++ )
1348
1278
{
1349
1279
var param = args . ElementAt ( i ) ;
@@ -1352,17 +1282,11 @@ private void WriteForeignFunCallStmt(CompilationContext context, StringWriter ou
1352
1282
}
1353
1283
context . WriteLine ( output , ");" ) ;
1354
1284
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 } ;") ) ;
1366
1290
}
1367
1291
}
1368
1292
@@ -1374,17 +1298,10 @@ private void WriteFunCallStmt(CompilationContext context, StringWriter output, F
1374
1298
return ;
1375
1299
}
1376
1300
1377
- var returnConvention = GetReturnConvention ( function ) ;
1378
1301
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 } = ") ;
1388
1305
}
1389
1306
1390
1307
context . Write ( output , $ "{ context . GetNameForDecl ( function ) } ({ CompilationContext . CurrentMachine } ") ;
@@ -1399,16 +1316,11 @@ private void WriteFunCallStmt(CompilationContext context, StringWriter output, F
1399
1316
1400
1317
context . WriteLine ( output , ");" ) ;
1401
1318
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 } ;") ) ;
1412
1324
}
1413
1325
}
1414
1326
0 commit comments