pike.git/
src/
operators.c
Branch:
Tag:
Non-build tags
All tags
No tags
2008-07-08
2008-07-08 13:34:53 by Henrik Grubbström (Grubba) <grubba@grubba.org>
eba42b175c6f4599df21b24d7c1bef049368339c (
35
lines) (+
30
/-
5
)
[
Show
|
Annotate
]
Branch:
7.9
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;