]> Nishi Git Mirror - gwion.git/commitdiff
:art: defer in defer
authorfennecdjay <fennecdjay@gmail.com>
Mon, 17 Oct 2022 17:53:58 +0000 (19:53 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Mon, 17 Oct 2022 17:53:58 +0000 (19:53 +0200)
include/emit.h
src/emit/emit.c

index 942f67d4205bb7df379e78c4f7a5e4067893d5d7..5cbe4241c14acbf1ec95ca4cfb22b895169037f4 100644 (file)
@@ -50,6 +50,7 @@ typedef struct EmitterStatus {
   uint16_t line;
   uint32_t effect; // offset of last throw effect
   bool in_return;
+  bool in_defer;
 } EmitterStatus;
 
 struct Emitter_ {
index f0f8883eda11e20ed67f64ef6b6165814c2c4629..9f1a497e149ccea900a61b06c374f1941e93451e 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,7 +202,14 @@ ANN static m_bool emit_defers(const Emitter emit) {
   return GW_OK;
 }
 
-ANN static m_bool emit_defers2(const Emitter emit) {
+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) {
   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;
@@ -211,6 +218,13 @@ 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));
@@ -2051,7 +2065,8 @@ 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) {
-  CHECK_BB(emit_defers2(emit));
+  if(!emit->status.in_defer)
+    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;