pike.git / src / interpret.c

version» Context lines:

pike.git/src/interpret.c:1:   /*\   ||| This file a part of Pike, and is copyright by Fredrik Hubinette   ||| Pike is distributed as GPL (General Public License)   ||| See the files COPYING and DISCLAIMER for more information.   \*/   /**/   #include "global.h" - RCSID("$Id: interpret.c,v 1.254 2001/12/16 02:49:39 mast Exp $"); + RCSID("$Id: interpret.c,v 1.255 2001/12/19 23:48:41 mast Exp $");   #include "interpret.h"   #include "object.h"   #include "program.h"   #include "svalue.h"   #include "array.h"   #include "mapping.h"   #include "pike_error.h"   #include "language.h"   #include "stralloc.h"   #include "constants.h"
pike.git/src/interpret.c:1570:   }      PMOD_EXPORT void safe_apply(struct object *o, char *fun ,INT32 args)   {   #ifdef PIKE_DEBUG    if(!o->prog) fatal("Apply safe on destructed object.\n");   #endif    safe_apply_low2(o, find_identifier(fun, o->prog), args, 1);   }    + /* Returns nonzero if the function was called in some handler. */ + PMOD_EXPORT int low_unsafe_apply_handler(const char *fun, +  struct object *handler, +  struct object *compat, +  INT32 args) + { +  int i; + #if 0 +  fprintf(stderr, "low_unsafe_apply_handler(\"%s\", 0x%08p, 0x%08p, %d)\n", +  fun, handler, compat, args); + #endif /* 0 */ +  if (handler && handler->prog && +  (i = find_identifier(fun, handler->prog)) != -1) { +  apply_low(handler, i, args); +  } else if (compat && compat->prog && +  (i = find_identifier(fun, compat->prog)) != -1) { +  apply_low(compat, i, args); +  } else { +  struct object *master_obj = master(); +  if ((i = find_identifier(fun, master_obj->prog)) != -1) +  apply_low(master_obj, i, args); +  else { +  pop_n_elems(args); +  push_undefined(); +  return 0; +  } +  } +  return 1; + } +    PMOD_EXPORT void low_safe_apply_handler(const char *fun,    struct object *handler,    struct object *compat,    INT32 args)   {    int i;   #if 0    fprintf(stderr, "low_safe_apply_handler(\"%s\", 0x%08p, 0x%08p, %d)\n",    fun, handler, compat, args);   #endif /* 0 */
pike.git/src/interpret.c:1619:       Pike_sp-=args;    free_svalue(& throw_value);    throw_value.type=T_INT;       if (SETJMP(recovery))    ret = 0;    else {    Pike_sp += args;    -  if (handler && handler->prog && -  (i = find_identifier(fun, handler->prog)) != -1) { -  apply_low(handler, i, args); -  } else if (compat && compat->prog && -  (i = find_identifier(fun, compat->prog)) != -1) { -  apply_low(compat, i, args); -  } else { -  struct object *master_obj = master(); -  if ((i = find_identifier(fun, master_obj->prog)) != -1) -  apply_low(master_obj, i, args); -  else { -  pop_n_elems(args); -  push_undefined(); -  goto dont_check_ret_type; -  } -  } -  -  if (rettypes && +  if (low_unsafe_apply_handler (fun, handler, compat, args) && +  rettypes &&    !(((1 << Pike_sp[-1].type) & rettypes) ||    ((rettypes & BIT_ZERO) &&    Pike_sp[-1].type == T_INT &&    Pike_sp[-1].u.integer == 0))) {    push_constant_text("Invalid return value from %s: %O\n");    push_text(fun);    push_svalue(Pike_sp - 3);    f_sprintf(3);    if (!Pike_sp[-1].u.string->size_shift)    Pike_error("%s", Pike_sp[-1].u.string->str);    else    Pike_error("Invalid return value from %s\n", fun);    }    -  dont_check_ret_type: +     ret = 1;    }       UNSETJMP(recovery);    return ret;   }      PMOD_EXPORT void apply_lfun(struct object *o, int fun, int args)   {   #ifdef PIKE_DEBUG