pike.git
/
src
/
pike_types.cmod
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/pike_types.cmod:13906:
Pike_fatal("Not implemented!\n"); } } struct pike_type *low_type_int_op(enum PIKE_TYPE op, struct pike_type *arg1, struct pike_type *arg2) { INT64 min1 = CAR_TO_INT(arg1), min2 = CAR_TO_INT(arg2); INT64 max1 = CDR_TO_INT(arg1), max2 = CDR_TO_INT(arg2);
-
INT64 minres, maxres;
+
INT64 minres
= MIN_INT32
, maxres
= MAX_INT32, tmp
;
switch(op) { case PIKE_T_INT_OP_SUB: if ((min1 == MIN_INT32) || (max2 == MAX_INT32)) { minres = MIN_INT32; } else { minres = min1 - max2; } if ((max1 == MAX_INT32) || (min2 == MIN_INT32)) { maxres = MAX_INT32; } else { maxres = max1 - min2; } break;
-
+
+
case PIKE_T_INT_OP_MUL:
+
maxres = minres = min1 * min2;
+
tmp = min1 * max2;
+
if (tmp > maxres) {
+
maxres = tmp;
+
} else {
+
minres = tmp;
+
}
+
tmp = max1 * min2;
+
if (tmp > maxres) {
+
maxres = tmp;
+
} else if (tmp < minres) {
+
minres = tmp;
+
}
+
tmp = max1 * max2;
+
if (tmp > maxres) {
+
maxres = tmp;
+
} else if (tmp < minres) {
+
minres = tmp;
+
}
+
break;
+
case PIKE_T_INT_OP_AND: case PIKE_T_INT_OP_XOR: minres = (INT32)evaluate_binop_min(op, (unsigned INT32)min1, (unsigned INT32)max1, (unsigned INT32)min2, (unsigned INT32)max2); maxres = (INT32)evaluate_binop_max(op, (unsigned INT32)min1, (unsigned INT32)max1,
pike.git/src/pike_types.cmod:14042:
struct call_state cs; INIT_CALL_STATE(cs, NULL); res = low_new_check_call(arg1, arg2, 0, &cs, NULL); FREE_CALL_STATE(cs); } break; case PIKE_T_FIND_LFUN: res = find_lfun_type(arg1, (ptrdiff_t)(void*)arg2); break; case PIKE_T_INT_OP_SUB:
+
case PIKE_T_INT_OP_MUL:
case PIKE_T_INT_OP_AND: case PIKE_T_INT_OP_XOR: case PIKE_T_INT_OP_RANGE: res = type_int_op(op, arg1, arg2); break; case PIKE_T_SET_CAR: if (!arg1) return NULL; switch(arg1->type) { case PIKE_T_FUNCTION: case PIKE_T_MANY: