pike.git / src / array.c

version» Context lines:

pike.git/src/array.c:1:   /*   || This file is part of Pike. For copyright information see COPYRIGHT.   || Pike is distributed under GPL, LGPL and MPL. See the file COPYING   || for more information. - || $Id: array.c,v 1.214 2008/07/12 10:21:12 grubba Exp $ + || $Id: array.c,v 1.215 2008/07/13 15:18:29 grubba Exp $   */      #include "global.h"   #include "svalue.h"   #include "array.h"   #include "object.h"   #include "las.h"   #include "stralloc.h"   #include "interpret.h"   #include "opcodes.h"
pike.git/src/array.c:2446:    return ret;   }      /** Apply the elements of an array. Arguments the array should be    * applied with should be on the stack before the call and the    * resulting array will be on the stack after the call.    *    * Note that the array a may be modified destructively if it has    * only a single reference.    */ - PMOD_EXPORT void apply_array(struct array *a, INT32 args) + PMOD_EXPORT void apply_array(struct array *a, INT32 args, int flags)   {    INT32 e, hash = 0;    struct svalue *argp = Pike_sp-args;    struct array *cycl;    DECLARE_CYCLIC();       check_stack(args);    check_array_for_destruct(a);    for (e=0; e<args; e++)    hash = hash * 33 + DO_NOT_WARN ((INT32) PTR_TO_INT (Pike_sp[-e-1].u.ptr));       if (!(cycl = (struct array *)BEGIN_CYCLIC(a, (ptrdiff_t)hash))) {    TYPE_FIELD new_types = 0; -  if (a->refs == 1) { +  if ((flags & 1) && (a->refs == 1)) {    /* Destructive operation possible. */    ref_push_array(a);    a->type_field |= BIT_UNFINISHED;    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);    new_types |= 1 << Pike_sp[-1].type;