]> Nishi Git Mirror - gwion.git/commitdiff
:art: dissalow return in defer statements
authorfennecdjay <fennecdjay@gmail.com>
Wed, 19 Oct 2022 11:10:16 +0000 (13:10 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Wed, 19 Oct 2022 11:10:16 +0000 (13:10 +0200)
ast
include/emit.h
src/emit/emit.c

diff --git a/ast b/ast
index f6c9ae7feb355a64345da5c99c479a32a310df11..d341be4f3a787e5c4dd80f7ab8bc919a7ca807ec 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit f6c9ae7feb355a64345da5c99c479a32a310df11
+Subproject commit d341be4f3a787e5c4dd80f7ab8bc919a7ca807ec
index 5cbe4241c14acbf1ec95ca4cfb22b895169037f4..942f67d4205bb7df379e78c4f7a5e4067893d5d7 100644 (file)
@@ -50,7 +50,6 @@ typedef struct EmitterStatus {
   uint16_t line;
   uint32_t effect; // offset of last throw effect
   bool in_return;
-  bool in_defer;
 } EmitterStatus;
 
 struct Emitter_ {
index 9f1a497e149ccea900a61b06c374f1941e93451e..f0f8883eda11e20ed67f64ef6b6165814c2c4629 100644 (file)
@@ -194,7 +194,7 @@ ANN static void struct_pop(const Emitter emit, const Type type,
 
 ANN static m_bool emit_stmt(const Emitter emit, const Stmt stmt);
 
-ANN static m_bool _emit_defers(const Emitter emit) {
+ANN static m_bool emit_defers(const Emitter emit) {
   if (!vector_size(&emit->code->frame->defer)) return GW_OK;
   Stmt stmt;
   while ((stmt = (Stmt)vector_pop(&emit->code->frame->defer)))
@@ -202,14 +202,7 @@ ANN static m_bool _emit_defers(const Emitter emit) {
   return GW_OK;
 }
 
-ANN static m_bool emit_defers(const Emitter emit) {
-  emit->status.in_defer = true;
-  const m_bool ret = _emit_defers(emit);
-  emit->status.in_defer = false;
-  return ret;
-}
-
-ANN static m_bool _emit_defers2(const Emitter emit) {
+ANN static m_bool emit_defers2(const Emitter emit) {
   for (m_uint i = vector_size(&emit->code->frame->defer) + 1; --i;) {
     const Stmt stmt = (Stmt)vector_at(&emit->code->frame->defer, i - 1);
     if (!stmt) break;
@@ -218,13 +211,6 @@ ANN static m_bool _emit_defers2(const Emitter emit) {
   return GW_OK;
 }
 
-ANN static m_bool emit_defers2(const Emitter emit) {
-  emit->status.in_defer = true;
-  const m_bool ret = _emit_defers2(emit);
-  emit->status.in_defer = false;
-  return ret;
-}
-
 ANN static m_int _frame_pop(const Emitter emit) {
   Frame *frame = emit->code->frame;
   DECL_OB(const Local *, l, = (Local *)vector_pop(&frame->stack));
@@ -2065,8 +2051,7 @@ ANN static m_bool optimize_tail_call(const Emitter emit, const Exp_Call *e) {
 }
 
 ANN static m_bool emit_stmt_return(const Emitter emit, const Stmt_Exp stmt) {
-  if(!emit->status.in_defer)
-    CHECK_BB(emit_defers2(emit));
+  CHECK_BB(emit_defers2(emit));
   if (stmt->val) {
     if (stmt->val->exp_type == ae_exp_call) {
       const Func f = stmt->val->d.exp_call.func->type->info->func;