pike.git
/
src
/
operators.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/operators.c:1568:
*! In Pike 7.0 and earlier the addition order was unspecified. *! *! The treatment of @[UNDEFINED] was new *! in Pike 7.0. *! *! @seealso *! @[`-()], @[lfun::`+()], @[lfun::``+()] */ PMOD_EXPORT void f_add(INT32 args) {
-
INT_TYPE e
,size
;
+
INT_TYPE e;
TYPE_FIELD types=0; if(!args) SIMPLE_WRONG_NUM_ARGS_ERROR("`+", 1); if (args == 1) return; for(e=-args;e<0;e++) types |= 1<<TYPEOF(sp[e]); switch(types)
pike.git/src/operators.c:1628:
o_cast_to_string(); /* free:s old sp[e] */ sp[e-1] = Pike_sp[-1]; Pike_sp--; } } add_strings(args); return; case BIT_INT: {
-
size =
0
;
-
for(e = -
args
; e < 0; e++)
+
INT_TYPE
size =
sp[-args].u.integer
;
+
for(e = -
args+1
; e < 0; e++)
{ if (DO_INT_TYPE_ADD_OVERFLOW(size, sp[e].u.integer, &size)) { convert_svalue_to_bignum(sp-args); f_add(args); return; } } sp-=args; push_int(size); break;
-
+
}
-
+
case BIT_FLOAT: { double res = Pike_sp[-args].u.float_number; for(e=args-1; e>0; e-- ) res += sp[-e].u.float_number; Pike_sp -= args-1; Pike_sp[-1].u.float_number = res; } break;
pike.git/src/operators.c:1666:
for(int i=0;i<args;i++) if (TYPEOF(sp[i-args]) == T_FLOAT) res += Pike_sp[i-args].u.float_number; else res += (double)Pike_sp[i-args].u.integer; Pike_sp-=args; push_float(res); return; }
-
#define ADD_WITH_UNDEFINED(TYPE, T_TYPEID, ADD_FUNC, PUSH_FUNC) do { \
-
int e; \
-
if (TYPEOF(sp[-args]) == T_INT) { \
-
if(IS_UNDEFINED(sp-args)) \
-
{ \
-
struct TYPE *x; \
-
\
-
for(e=1;e<args;e++) \
-
if(TYPEOF(sp[e-args]) != T_TYPEID) \
-
SIMPLE_ARG_TYPE_ERROR("`+", e+1, #TYPE); \
-
\
-
x = ADD_FUNC(sp-args+1,args-1); \
-
pop_n_elems(args); \
-
PUSH_FUNC(x); \
-
return; \
-
} \
-
\
-
for(e=1;e<args;e++) \
-
if (TYPEOF(sp[e-args]) != T_INT) \
-
SIMPLE_ARG_TYPE_ERROR("`+", e+1, "int"); \
-
} \
-
\
-
else { \
-
for(e=1;e<args;e++) \
-
if (TYPEOF(sp[e-args]) != T_TYPEID) \
-
SIMPLE_ARG_TYPE_ERROR("`+", e+1, #TYPE); \
-
} \
-
\
-
DO_IF_DEBUG (Pike_fatal ("Shouldn't be reached.\n")); \
-
break; \
-
} while (0)
-
+
#define ADD(TYPE, ADD_FUNC, PUSH_FUNC) do { \ struct TYPE *x = ADD_FUNC (sp - args, args); \ pop_n_elems (args); \ PUSH_FUNC (x); \ return; \ } while (0)
-
case
BIT
_
ARRAY|BIT
_INT
:
-
ADD
_
WITH_
UNDEFINED (
array
,
T_ARRAY
,
add
_
arrays,
push
_
array
);
-
break
;
+
#define
REMOVE_UNDEFINED(TYPE)
\
+
do { \
+
int to = -args, i=-args; \
+
for(; i<0; i++) \
+
{ \
+
if(TYPEOF(Pike
_
sp[i]) == PIKE
_
T_
INT
) \
+
{ \
+
if(!IS
_
UNDEFINED(Pike
_
sp+i))
\
+
SIMPLE_ARG_TYPE_ERROR
(
"`+"
,
args+i
,
#TYPE); \
+
} \
+
else if(to!=i) \
+
Pike
_
sp[to++]
= Pike
_
sp[i]; \
+
else to++; \
+
} \
+
for(int i=to; i<0; i++
)
\
+
TYPEOF(Pike_sp[i])=PIKE_T_INT
;
\
+
Pike_sp += to
;
\
+
args += to; \
+
} while(0);
-
+
case BIT_ARRAY|BIT_INT:
+
REMOVE_UNDEFINED (array);
+
/* Fallthrough */
case BIT_ARRAY: ADD (array, add_arrays, push_array); break; case BIT_MAPPING|BIT_INT:
-
ADD
_
WITH_
UNDEFINED (mapping
, T_MAPPING, add_mappings, push_mapping
);
-
break;
-
+
REMOVE
_UNDEFINED (mapping);
+
/* Fallthrough */
case BIT_MAPPING: ADD (mapping, add_mappings, push_mapping); break; case BIT_MULTISET|BIT_INT:
-
ADD
_
WITH_
UNDEFINED (multiset
, T_MULTISET, add_multisets, push_multiset
);
-
break;
-
+
REMOVE
_UNDEFINED (multiset);
+
/* Fallthrough */
case BIT_MULTISET: ADD (multiset, add_multisets, push_multiset); break;
-
#undef
ADD
_
WITH_
UNDEFINED
+
#undef
REMOVE
_UNDEFINED
#undef ADD } } static int generate_sum(node *n) { struct compilation *c = THIS_COMPILATION; node **first_arg, **second_arg, **third_arg; switch(count_args(CDR(n))) {