pike.git/
src/
operators.c
Branch:
Tag:
Non-build tags
All tags
No tags
2004-09-20
2004-09-20 12:10:52 by Martin Stjernholm <mast@lysator.liu.se>
ef8a140bd6818a9f31b4a45af0b75fa8c47dfce7 (
159
lines) (+
89
/-
70
)
[
Show
|
Annotate
]
Branch:
7.9
Casting a destructed object should behave like casting a zero.
Rev: src/operators.c:1.196
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.
195
2004/09/
18
20:
50
:52
nilsson
Exp $
+
|| $Id: operators.c,v 1.
196
2004/09/
20
12
:
10
:52
mast
Exp $
*/ #include "global.h"
223:
switch(sp[-1].type) { 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 {
{
-
+
struct object *o = sp[-1].u.object;
struct pike_string *s;
-
+
int f = FIND_LFUN(o->prog,LFUN_CAST);
+
if(f == -1)
+
Pike_error("No cast method in object.\n");
REF_MAKE_CONST_STRING(s, "int"); push_string(s);
-
if(!sp[-2].u.object->prog)
-
Pike_error("Cast called on destructed object.\n");
-
if(FIND_LFUN(sp[-2].u.object->prog,LFUN_CAST) == -1)
-
Pike_error("No cast method in object.\n");
-
apply_
lfun
(
sp[-2].u.object
,
LFUN_CAST
, 1);
-
free_svalue(sp-2);
-
sp[-2]=sp[-1];
-
sp--;
-
dmalloc
_
touch
_
svalue
(
sp
);
+
apply_
low
(
o
,
f
, 1);
+
stack
_
pop
_
keep_top
();
}
-
+
if(sp[-1].type != PIKE_T_INT) { if(sp[-1].type == T_OBJECT && sp[-1].u.object->prog)
256:
Pike_error("Cast failed, wanted int, got %s\n", get_name_of_type(sp[-1].type)); }
+
}
+
break; case T_FLOAT:
334:
return; 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 {
{
-
+
struct object *o = sp[-1].u.object;
struct pike_string *s;
-
+
int f = FIND_LFUN(o->prog,LFUN_CAST);
+
if(f == -1)
+
Pike_error("No cast method in object.\n");
REF_MAKE_CONST_STRING(s, "string"); push_string(s);
-
if(!sp[-2].u.object->prog)
-
Pike_error("Cast called on destructed object.\n");
-
if(FIND_LFUN(sp[-2].u.object->prog,LFUN_CAST) == -1)
-
Pike_error("No cast method in object.\n");
-
apply_
lfun
(
sp[-2].u.object
,
LFUN_CAST
, 1);
-
free_svalue(sp-2);
-
sp[-2]=sp[-1];
-
sp--;
-
dmalloc
_
touch
_
svalue
(
sp
);
+
apply_
low
(
o
,
f
, 1);
+
stack
_
pop
_
keep_top
();
}
-
+
if(sp[-1].type != PIKE_T_STRING) { if(sp[-1].type == T_OBJECT && sp[-1].u.object->prog)
368:
get_name_of_type(sp[-1].type)); } return;
+
}
-
+
/* Fall through. */
+
+
case T_INT:
+
sprintf(buf, "%"PRINTPIKEINT"d", sp[-1].u.integer);
+
break;
+
case T_ARRAY: { int i;
441:
} return;
-
case T_INT:
-
sprintf(buf, "%"PRINTPIKEINT"d", sp[-1].u.integer);
-
break;
-
+
case T_FLOAT: sprintf(buf, "%f", (double)sp[-1].u.float_number); break;
464:
if(run_time_type == T_MIXED) return;
+
if (sp[-1].type == T_OBJECT && !sp[-1].u.object->prog) {
+
/* Casting a destructed object should be like casting a zero. */
+
pop_stack();
+
push_int (0);
+
}
+
if(sp[-1].type == T_OBJECT) {
-
+
struct object *o = sp[-1].u.object;
struct pike_string *s;
-
+
int f = FIND_LFUN(o->prog,LFUN_CAST);
+
if(f == -1)
+
Pike_error("No cast method in object.\n");
s=describe_type(type); push_string(s);
-
if(!sp[-2].u.object->prog)
-
Pike_error("Cast called on destructed object.\n");
-
if(FIND_LFUN(sp[-2].u.object->prog,LFUN_CAST) == -1)
-
Pike_error("No cast method in object.\n");
-
apply_lfun(
sp[-2].u.object
,
LFUN_CAST
, 1);
-
free
_
svalue(sp-2);
-
sp[-2]=sp[-1];
-
sp--;
-
dmalloc
_
touch
_
svalue
(
sp
);
+
apply_lfun(
o
,
f
, 1);
+
stack
_
pop
_
keep
_
top
();
}else switch(run_time_type)