Branch: Tag:

2008-07-08

2008-07-08 13:34:53 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Attempt to make destructive merges on multisets when possible.

Rev: src/operators.c:1.236

2:   || 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: operators.c,v 1.235 2008/06/28 22:05:04 mast Exp $ + || $Id: operators.c,v 1.236 2008/07/08 13:34:53 grubba Exp $   */      #include "global.h"
2254:    case T_MULTISET:    {    struct multiset *l; -  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, PIKE_ARRAY_OP_SUB); +  if (sp[-2].u.multiset->refs == 1) { +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, +  PIKE_ARRAY_OP_SUB | PIKE_MERGE_DESTR_A); +  } else { +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, +  PIKE_ARRAY_OP_SUB); +  }    pop_n_elems(2);    push_multiset(l);    return;
2516:    case T_MULTISET:    {    struct multiset *l; -  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, PIKE_ARRAY_OP_AND); +  if (sp[-2].u.multiset->refs == 1) { +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, +  PIKE_ARRAY_OP_AND | PIKE_MERGE_DESTR_A); +  } else { +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, +  PIKE_ARRAY_OP_AND); +  }    pop_n_elems(2);    push_multiset(l);    return;
2809:    case T_MULTISET:    {    struct multiset *l; -  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, PIKE_ARRAY_OP_OR_LEFT); +  if (sp[-2].u.multiset->refs == 1) { +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, +  PIKE_ARRAY_OP_OR_LEFT | PIKE_MERGE_DESTR_A); +  } else { +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, +  PIKE_ARRAY_OP_OR_LEFT); +  }    pop_n_elems(2);    push_multiset(l);    return;
3045:    case T_MULTISET:    {    struct multiset *l; -  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, PIKE_ARRAY_OP_XOR); +  if (sp[-2].u.multiset->refs == 1) { +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, +  PIKE_ARRAY_OP_XOR | PIKE_MERGE_DESTR_A); +  } else { +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, +  PIKE_ARRAY_OP_XOR); +  }    pop_n_elems(2);    push_multiset(l);    return;