Branch: Tag:

2013-12-14

2013-12-14 21:32:20 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Runtime: Fixed bug in apply_array() for cyclic arrays.

Also unifies the two branches of apply_array().

2625:       if (!(cycl = (struct array *)BEGIN_CYCLIC(a, (ptrdiff_t)hash))) {    TYPE_FIELD new_types = 0; +  struct array *aa;    if ((flags & 1) && (a->refs == 1)) {    /* Destructive operation possible. */ -  ref_push_array(a); -  a->type_field |= BIT_UNFINISHED; +  add_ref(aa = a); +  aa->type_field |= BIT_UNFINISHED; +  } else { +  aa = allocate_array(a->size); +  } +  SET_CYCLIC_RET(aa); +  push_array(aa);    for (e=0; e < a->size; e++)    {    assign_svalues_no_free(Pike_sp, argp, args, BIT_MIXED);    Pike_sp+=args;    /* FIXME: Don't throw apply errors from apply_svalue here. */ -  apply_svalue(ITEM(a)+e,args); +  apply_svalue(ITEM(a)+e, args);    new_types |= 1 << TYPEOF(Pike_sp[-1]); -  assign_svalue(ITEM(a)+e, &Pike_sp[-1]); +  assign_svalue(ITEM(aa)+e, &Pike_sp[-1]);    pop_stack();    } -  a->type_field = new_types; - #ifdef PIKE_DEBUG -  array_check_type_field(a); - #endif -  } else { -  struct array *aa; -  push_array(aa = allocate_array_no_init(0, a->size)); -  for (e=0; (e<a->size) && (e < aa->malloced_size); e++) -  { -  assign_svalues_no_free(Pike_sp, argp, args, BIT_MIXED); -  Pike_sp+=args; -  /* FIXME: Don't throw apply errors from apply_svalue here. */ -  apply_svalue(ITEM(a)+e,args); -  new_types |= 1 << TYPEOF(Pike_sp[-1]); -  assign_svalue_no_free(ITEM(aa)+e, &Pike_sp[-1]); -  aa->size = e+1; -  pop_stack(); -  } +     aa->type_field = new_types;   #ifdef PIKE_DEBUG    array_check_type_field(aa);   #endif -  } +     stack_pop_n_elems_keep_top(args);    }    else {