@@ -18,11 +18,13 @@ public class LeekReturnInstruction extends LeekInstruction {
18
18
19
19
private final Token token ;
20
20
private final Expression expression ;
21
+ private final boolean optional ;
21
22
private Type returnType ;
22
23
23
- public LeekReturnInstruction (Token token , Expression exp ) {
24
+ public LeekReturnInstruction (Token token , Expression exp , boolean optional ) {
24
25
this .token = token ;
25
26
this .expression = exp ;
27
+ this .optional = optional ;
26
28
}
27
29
28
30
@ Override
@@ -70,7 +72,9 @@ public void analyze(WordCompiler compiler) throws LeekCompilerException {
70
72
71
73
@ Override
72
74
public void writeJavaCode (MainLeekBlock mainblock , JavaWriter writer ) {
73
- mainblock .writeBeforeReturn (writer );
75
+ if (writer .currentBlock == mainblock ) {
76
+ mainblock .writeBeforeReturn (writer );
77
+ }
74
78
if (expression == null ) {
75
79
writer .addPosition (token );
76
80
writer .addCode ("return null;" );
@@ -79,19 +83,26 @@ public void writeJavaCode(MainLeekBlock mainblock, JavaWriter writer) {
79
83
if (finalExpression .getOperations () > 0 ) {
80
84
writer .addCode ("ops(" + finalExpression .getOperations () + "); " );
81
85
}
82
- writer .addCode ("return " );
83
- if (mainblock .getWordCompiler ().getVersion () == 1 ) {
84
- finalExpression .compileL (mainblock , writer );
85
- } else {
86
+ if (optional ) {
87
+ String r = "r" + mainblock .getCount ();
88
+ writer .addCode (returnType .getJavaName (mainblock .getVersion ()) + " " + r + " = " );
86
89
writer .compileConvert (mainblock , 0 , finalExpression , returnType );
90
+ writer .addLine ("; if (bool(" + r + ")) return " + r + ";" , getLocation ());
91
+ } else {
92
+ writer .addCode ("return " );
93
+ if (mainblock .getWordCompiler ().getVersion () == 1 ) {
94
+ finalExpression .compileL (mainblock , writer );
95
+ } else {
96
+ writer .compileConvert (mainblock , 0 , finalExpression , returnType );
97
+ }
98
+ writer .addLine (";" , getLocation ());
87
99
}
88
- writer .addLine (";" , getLocation ());
89
100
}
90
101
}
91
102
92
103
@ Override
93
104
public int getEndBlock () {
94
- return 1 ;
105
+ return optional ? 0 : 1 ;
95
106
}
96
107
97
108
@ Override
0 commit comments