]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve emit_op
authorfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 28 May 2019 20:04:06 +0000 (22:04 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 28 May 2019 20:04:06 +0000 (22:04 +0200)
src/parse/operator.c

index a29062bbc5001ec6b9686572d8cc04f1b3a34da3..f765fcf1b19d4b1a80be23e7200d1b5c89547d98 100644 (file)
@@ -211,22 +211,24 @@ ANN static Nspc get_nspc(const struct Op_Import* opi) {
 }
 
 ANN m_bool op_emit(const Emitter emit, const struct Op_Import* opi) {
-  const Nspc nspc = get_nspc(opi);
-  Type l = opi->lhs;
+  Nspc nspc = get_nspc(opi);
   do {
-    Type r = opi->rhs;
+    Type l = opi->lhs;
     do {
-      if(!nspc->info->op_map.ptr)
-        continue;
-      const Vector v = (Vector)map_get(&nspc->info->op_map, (vtype)opi->op);
-      const M_Operator* mo = operator_find(v, l, r);
-      if(mo) {
-        if(mo->em)
-          return mo->em(emit, (void*)opi->data);
-        return handle_instr(emit, mo);
-      }
-    } while(r && (r = op_parent(emit->env, r)));
-  } while(l && (l = op_parent(emit->env, l)));
+      Type r = opi->rhs;
+      do {
+        if(!nspc->info->op_map.ptr)
+          continue;
+        const Vector v = (Vector)map_get(&nspc->info->op_map, (vtype)opi->op);
+        const M_Operator* mo = operator_find(v, l, r);
+        if(mo) {
+          if(mo->em)
+            return mo->em(emit, (void*)opi->data);
+          return handle_instr(emit, mo);
+        }
+      } while(r && (r = op_parent(emit->env, r)));
+    } while(l && (l = op_parent(emit->env, l)));
+  } while((nspc = nspc->parent));
 // probably deserves err_msg here
   return GW_ERROR;
 }