pike.git
/
src
/
operators.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/operators.c:32:
#include "pike_security.h" #include "pike_compiler.h" #define sp Pike_sp #define OP_DIVISION_BY_ZERO_ERROR(FUNC) \ math_error(FUNC, sp-2, 2, 0, "Division by zero.\n") #define OP_MODULO_BY_ZERO_ERROR(FUNC) \ math_error(FUNC, sp-2, 2, 0, "Modulo by zero.\n")
+
/* These calculations should always give some margin based on the size. */
+
/* One extra char for the sign. */
+
#define MAX_INT_SPRINTF_LEN (1 + (SIZEOF_INT_TYPE * 5 + 1) / 2)
+
/* The destructive multiset merge code is broken. * l->msd gets -1 refs. * * Disable it for now. * /grubba 2008-07-08 */ #undef PIKE_MERGE_DESTR_A #define PIKE_MERGE_DESTR_A 0 /* This calculation should always give some margin based on the size. */
pike.git/src/operators.c:322:
break; default: Pike_error("Cannot cast %s to int.\n", get_name_of_type(TYPEOF(sp[-1]))); } } /* Special case for casting to string. */ PMOD_EXPORT void o_cast_to_string(void) {
-
char
buf[MAX
_
NUM_BUF]
;
+
struct
pike
_
string *s
;
+
switch(TYPEOF(sp[-1])) { case T_OBJECT: if(!sp[-1].u.object->prog) { /* Casting a destructed object should be like casting a zero. */ pop_stack(); push_constant_text("0"); } else { { struct object *o = sp[-1].u.object;
pike.git/src/operators.c:350:
if(TYPEOF(sp[-1]) != PIKE_T_STRING) { if(TYPEOF(sp[-1]) == T_OBJECT && sp[-1].u.object->prog) { struct object *o = sp[-1].u.object; int f = FIND_LFUN(o->prog->inherits[SUBTYPEOF(sp[-1])].prog, LFUN__IS_TYPE); if( f != -1) {
-
struct pike_string *s;
+
REF_MAKE_CONST_STRING(s, "string"); push_string(s); apply_low(o, f, 1); f=!UNSAFE_IS_ZERO(sp-1); pop_stack(); if(f) return; } } Pike_error("Cast failed, wanted string, got %s\n", get_name_of_type(TYPEOF(sp[-1]))); } } return; case T_ARRAY: { int i, alen; struct array *a = sp[-1].u.array;
-
struct pike_string *s;
+
int shift = 0; alen = a->size; for(i = 0; i<alen; i++) { INT_TYPE val; if (TYPEOF(a->item[i]) != T_INT) { Pike_error( "Can only cast array(int) to string, item %d is not an integer: %O\n", i, a->item + i); }
pike.git/src/operators.c:433:
break; case 2: { p_wchar2 *str2 = STR2(s); for(i = a->size; i--; ) { str2[i] = (p_wchar2) a->item[i].u.integer; } } break; }
-
s = end_shared_string(s);
+
pop_stack();
-
push_string(s);
+
push_string(
end_shared_string(
s)
)
;
} return; default: Pike_error("Cannot cast %s to string.\n", get_name_of_type(TYPEOF(sp[-1]))); case PIKE_T_STRING: return; case T_FLOAT:
-
+
{
+
char buf[MAX_FLOAT_SPRINTF_LEN+1];
format_pike_float (buf, sp[-1].u.float_number);
-
+
s = make_shared_string(buf);
break;
-
+
}
case T_INT:
-
sprintf(
buf
,
"%"PRINTPIKEINT"d",
sp[-1].u.integer);
+
{
+
INT_TYPE org;
+
char
buf
[MAX_INT_SPRINTF_LEN];
+
register char*b = buf+sizeof buf-1;
+
register unsigned INT_TYPE i;
+
org =
sp[-1].u.integer
;
+
*b-- = '\0';
+
i = org;
+
+
if( org < 0
)
+
i = -i
;
+
+
goto jin; /* C as a macro assembler :-) */
+
do
+
{
+
i /= 10;
+
jin: *b-- = '0'+(i%10);
+
}
+
while( i >= 10 );
+
+
if( org < 0 )
+
*b = '-';
+
else
+
b++;
+
s = make_shared_string(b);
+
}
break; }
-
SET_SVAL(sp[-1], PIKE_T_STRING, 0, string,
make_shared_string(buf
)
)
;
+
SET_SVAL(sp[-1], PIKE_T_STRING, 0, string,
s
);
} PMOD_EXPORT void o_cast(struct pike_type *type, INT32 run_time_type) { if(run_time_type != TYPEOF(sp[-1])) { if(run_time_type == T_MIXED) return; if (TYPEOF(sp[-1]) == T_OBJECT && !sp[-1].u.object->prog) {