]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve emit_instantiate_object
authorfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 16 Jul 2019 12:45:43 +0000 (14:45 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 16 Jul 2019 12:45:43 +0000 (14:45 +0200)
include/emit.h
src/emit/emit.c

index fd7c8c4dd4a1fe633e3de28a7ba9b2f0407cb4f0..ba1822ef9bc458e4449d59721d0323ca10c5938e 100644 (file)
@@ -37,5 +37,5 @@ ANN m_bool emit_array_extend(const Emitter, const Type, const Exp);
 ANN void emit_class_finish(const Emitter, const Nspc);
 ANN void emit_ext_ctor(const Emitter, const VM_Code);
 ANN void emit_union_offset(Decl_List, const m_uint);
-ANN2(1,2) m_bool emit_instantiate_object(const Emitter, const Type, const Array_Sub, const uint);
+ANN2(1,2) m_bool emit_instantiate_object(const Emitter, const Type, const Array_Sub, const m_bool);
 #endif
index e3771af87867d9e6ddb68b81a63d37d56ae76666..ed868e06f14e49face98d5d6b6bd2c9600017876 100644 (file)
@@ -237,26 +237,23 @@ ANN static inline void emit_notpure(const Emitter emit) {
   ++VPTR(&emit->pure, VLEN(&emit->pure));
 }
 
+ANN static Array_Sub instantiate_typedef(MemPool p, const m_uint depth) {
+  const Exp base = new_exp_prim_int(p, 0, new_loc(p, __LINE__));
+  Exp e = base;
+  for(m_uint i = 0; i < depth; ++i)
+     e = (e->next = new_exp_prim_int(p, 0, new_loc(p, __LINE__)));
+  return new_array_sub(p, base);
+}
+
 ANN2(1,2) m_bool emit_instantiate_object(const Emitter emit, const Type type,
-    const Array_Sub arr, const uint is_ref) {
-  Array_Sub array = arr;
+      const Array_Sub arr, const m_bool is_ref) {
   if(type->array_depth) {
-    if(!array || array->depth < type->array_depth) { // from typeof xxx[]...
-      Exp base = new_exp_prim_int(emit->gwion->mp, 0, new_loc(emit->gwion->mp, __LINE__)), e = base;
-      for(m_uint i = (array ? array->depth : 0); i < type->array_depth; ++i)
-        e = (e->next = new_exp_prim_int(emit->gwion->mp, 0, new_loc(emit->gwion->mp, __LINE__)));
-      if(array) {
-        Exp array_base = array->exp;
-        while(array_base->next)
-          array_base = array_base->next;
-        array_base->next = base;
-      } else
-        array = new_array_sub(emit->gwion->mp, base);
-    }
+    assert(!arr || arr->depth == type->array_depth);
+    const Array_Sub array = arr ?: instantiate_typedef(emit->gwion->mp, type->array_depth);
     assert(array->exp);
     DECL_OB(ArrayInfo*, info, = emit_array_extend_inner(emit, type, array->exp))
-    info->is_ref = !!is_ref;
-    if(array != arr)
+    info->is_ref = is_ref;
+    if(!arr)
       free_array_sub(emit->gwion->mp, array);
   } else if(!is_ref) {
     const Instr instr = emit_add_instr(emit, ObjectInstantiate);