pike.git
/
src
/
operators.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/operators.c:39:
/* This calculation should always give some margin based on the size. */ /* It utilizes that log10(256) ~= 2.4 < 5/2. */ /* One extra char for the sign and one for the \0 terminator. */ #define MAX_INT_SPRINTF_LEN (2 + (SIZEOF_INT_TYPE * 5 + 1) / 2) /* Enough to hold a Pike float or int in textform */ #define MAX_NUM_BUF (MAXIMUM(MAX_INT_SPRINTF_LEN,MAX_FLOAT_SPRINTF_LEN))
+
static int has_lfun( enum LFUN lfun, int arg );
+
static int call_lhs_lfun( enum LFUN lfun, int arg );
+
void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind) { switch(TYPEOF(*what)) { case T_ARRAY: simple_array_index_no_free(to,what->u.array,ind); break; case T_MAPPING: mapping_index_no_free(to,what->u.mapping,ind);
pike.git/src/operators.c:201:
PMOD_EXPORT void o_cast_to_int(void) { 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_int (0); }
-
-
else
{
+
else
{
-
struct object *o =
sp[-1].u.object
;
-
struct program *p = o
->prog
->inherits[SUBTYPEOF(sp[-1])].prog;
-
int f
=
FIND
_
LFUN(p,
LFUN_CAST
)
;
-
if(f == -1)
-
Pike_error("No cast method in object.\n")
;
+
if(
sp[-1].u.object->prog =
=
bignum
_
program
)
+
return;
+
ref_push_string(literal_int_string);
-
apply
_
low
(
o,
f,
1
);
-
stack_pop_keep_top();
-
}
+
if(!call_lhs_lfun(LFUN_CAST,2))
+
Pike
_
error
(
"No
cast
method in object <2>.\n"
);
+
stack_pop_keep_top();
/*
pop
object.
*/
if(TYPEOF(sp[-1]) != PIKE_T_INT) {
-
if(TYPEOF(sp[-1]) == T_OBJECT
&& sp[-1].u.object->prog
)
+
if(TYPEOF(sp[-1]) == T_OBJECT)
{ struct object *o = sp[-1].u.object;
-
int f = FIND_LFUN
(o->prog
->inherits[SUBTYPEOF(sp[-1])].prog,
-
LFUN__IS_TYPE)
;
-
if(
f !=
-
1
)
+
if(
o->prog
==
bignum_program
)
+
return
;
+
else
if(
o->prog
)
{ ref_push_string(literal_int_string);
-
apply
_
low
(
o
,
f, 1
)
;
-
f=
!UNSAFE_IS_ZERO(sp-1)
;
+
if( call
_
lhs_lfun
(
LFUN__IS_TYPE
,
2)
)
+
if(
!UNSAFE_IS_ZERO(sp-1)
)
+
{
pop_stack();
-
if(f)
return;
+
return;
}
-
+
pop_stack();
}
-
+
}
Pike_error("Cast failed, wanted int, got %s\n", get_name_of_type(TYPEOF(sp[-1]))); } else if(SUBTYPEOF(sp[-1]) == NUMBER_UNDEFINED) Pike_error("Cannot cast this object to int.\n"); } break; case T_FLOAT: { FLOAT_TYPE f = sp[-1].u.float_number;
pike.git/src/operators.c:288:
{ 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
{
+
} else
{
-
struct object *o = sp[-1].u.object;
-
int f = FIND_LFUN(o->prog->inherits[SUBTYPEOF(sp[-1])].prog, LFUN_CAST);
-
if(f == -1)
-
Pike_error("No cast method in object.\n");
+
ref_push_string(literal_string_string);
-
apply
_
low
(
o,
f,
1
);
+
if(!call_lhs_lfun(LFUN_CAST,2))
+
Pike
_
error
(
"No
cast
method in object.\n"
);
stack_pop_keep_top();
-
}
+
if(TYPEOF(sp[-1]) != PIKE_T_STRING) { if(TYPEOF(sp[-1])==PIKE_T_INT && SUBTYPEOF(sp[-1])==NUMBER_UNDEFINED) Pike_error("Cannot cast this object to string.\n"); 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)
-
{
+
ref_push_string(literal_string_string);
-
apply
_
low
(
o,
f
,
1
)
;
-
f=
!UNSAFE_IS_ZERO(sp-1)
;
+
if(
call
_
lhs_lfun
(
LFUN__IS_TYPE
,
2
)
)
+
if(
!UNSAFE_IS_ZERO(sp-1)
)
+
{
pop_stack();
-
if(f)
return;
+
return;
}
-
+
pop_stack();
} Pike_error("Cast failed, wanted string, got %s\n", get_name_of_type(TYPEOF(sp[-1]))); } } return; case T_ARRAY: { int i, alen;
pike.git/src/operators.c:2215:
{ ref_push_type_value(float_type_string); stack_swap(); f_cast(); return 1; } return 0; }
+
static int has_lfun(enum LFUN lfun, int arg)
+
{
+
struct program *p;
+
+
if(TYPEOF(sp[-arg]) == T_OBJECT && (p = sp[-arg].u.object->prog))
+
return FIND_LFUN(p->inherits[SUBTYPEOF(sp[-arg])].prog, lfun);
+
return -1;
+
}
+
+
static int call_lhs_lfun( enum LFUN lfun, int arg )
+
{
+
int i = has_lfun(lfun,arg);
+
+
if(i != -1)
+
{
+
apply_low(Pike_sp[-arg].u.object, i, arg-1);
+
return 1;
+
}
+
return 0;
+
}
+
static int call_lfun(enum LFUN left, enum LFUN right) { struct object *o; struct program *p; int i; if(TYPEOF(sp[-2]) == T_OBJECT && (p = (o = sp[-2].u.object)->prog) && (i = FIND_LFUN(p->inherits[SUBTYPEOF(sp[-2])].prog, left)) != -1) {