Branch: Tag:

2004-09-20

2004-09-20 12:10:52 by Martin Stjernholm <mast@lysator.liu.se>

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)