Skip to content

Commit 10d3979

Browse files
committed
Make sure empty blocks return nil
Signed-off-by: Stefan Marr <[email protected]>
1 parent 5e65de2 commit 10d3979

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

src/compiler/GenerationContexts.c

+4
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,7 @@ uint8_t method_genc_compute_stack_depth(method_generation_context* mgenc) {
191191

192192
return max_depth;
193193
}
194+
195+
bool method_genc_has_bytecodes(method_generation_context* mgenc) {
196+
return mgenc->bp != 0;
197+
}

src/compiler/GenerationContexts.h

+1
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,6 @@ bool method_genc_find_var(
8888
bool method_genc_find_field(method_generation_context* mgenc, pString field);
8989
uint8_t method_genc_compute_stack_depth(method_generation_context* mgenc);
9090

91+
bool method_genc_has_bytecodes(method_generation_context* mgenc);
9192

9293
#endif // GENERATIONCONTEXTS_H_

src/compiler/Parser.c

+13-2
Original file line numberDiff line numberDiff line change
@@ -698,11 +698,17 @@ void blockBody(Lexer* l, method_generation_context* mgenc, bool seen_period) {
698698
if(accept(l, Exit))
699699
result(l, mgenc);
700700
else if(l->sym == EndBlock) {
701-
if(seen_period)
701+
if (seen_period) {
702702
// a POP has been generated which must be elided (blocks always
703703
// return the value of the last expression, regardless of whether it
704704
// was terminated with a . or not)
705705
mgenc->bp--;
706+
}
707+
if (mgenc->block_method && !method_genc_has_bytecodes(mgenc)) {
708+
pVMSymbol nilSym = Universe_symbol_for_cstr("nil");
709+
SEND(mgenc->literals, addIfAbsent, nilSym);
710+
emit_PUSH_GLOBAL(mgenc, nilSym);
711+
}
706712
emit_RETURN_LOCAL(mgenc);
707713
mgenc->finished = true;
708714
} else if(l->sym == EndTerm) {
@@ -1118,7 +1124,12 @@ void nestedBlock(Lexer* l, method_generation_context* mgenc) {
11181124

11191125
// if no return has been generated, we can be sure that the last expression
11201126
// in the block was not terminated by ., and can generate a return
1121-
if(!mgenc->finished) {
1127+
if (!mgenc->finished) {
1128+
if (!method_genc_has_bytecodes(mgenc)) {
1129+
pVMSymbol nilSym = Universe_symbol_for_cstr("nil");
1130+
SEND(mgenc->literals, addIfAbsent, nilSym);
1131+
emit_PUSH_GLOBAL(mgenc, nilSym);
1132+
}
11221133
emit_RETURN_LOCAL(mgenc);
11231134
mgenc->finished = true;
11241135
}

0 commit comments

Comments
 (0)