From 6c5ee537782970797700c99a79293b9590580817 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Tue, 22 Nov 2022 17:54:00 +0100 Subject: compiler: ensure that arrow functions with block bodies return no value Follow ES6 semantics and ensure that arrow functions with a block body don't implicitly return the value of the last executed statement. Signed-off-by: Jo-Philipp Wich --- compiler.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) (limited to 'compiler.c') diff --git a/compiler.c b/compiler.c index 35b07a1..6c336ae 100644 --- a/compiler.c +++ b/compiler.c @@ -1330,19 +1330,15 @@ uc_compiler_compile_arrowfn(uc_compiler_t *compiler, uc_value_t *args, bool rest if (uc_compiler_parse_match(&fncompiler, TK_LBRACE)) { while (!uc_compiler_parse_check(&fncompiler, TK_RBRACE) && !uc_compiler_parse_check(&fncompiler, TK_EOF)) - last_statement_type = uc_compiler_compile_declaration(&fncompiler); + uc_compiler_compile_declaration(&fncompiler); uc_compiler_parse_consume(&fncompiler, TK_RBRACE); - /* overwrite last pop result with return */ - if (last_statement_type == TK_SCOL) - uc_chunk_pop(&fn->chunk); - - /* else load implicit null */ - else + /* emit final return */ + if (last_statement_type != TK_RETURN) { uc_compiler_emit_insn(&fncompiler, 0, I_LNULL); - - uc_compiler_emit_insn(&fncompiler, 0, I_RETURN); + uc_compiler_emit_insn(&fncompiler, 0, I_RETURN); + } } else { uc_compiler_parse_precedence(&fncompiler, P_ASSIGN); -- cgit v1.2.3