pike.git / src / interpret_functions.h

version» Context lines:

pike.git/src/interpret_functions.h:1:   /*   || 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: interpret_functions.h,v 1.189 2006/03/09 14:06:23 grubba Exp $ + || $Id: interpret_functions.h,v 1.190 2006/03/10 17:24:50 grubba Exp $   */      /*    * Opcode definitions for the interpreter.    */      #include "global.h"      #undef CJUMP   #undef AUTO_BIGNUM_LOOP_TEST
pike.git/src/interpret_functions.h:1281:    );    DO_IF_NOT_REAL_DEBUG (    init_recovery (&new_catch_ctx->recovery, 0);    );    new_catch_ctx->save_expendible = Pike_fp->expendible;    JUMP_SET_TO_PC_AT_NEXT (addr);    new_catch_ctx->continue_reladdr = GET_JUMP();    new_catch_ctx->next_addr = addr;    new_catch_ctx->prev = Pike_interpreter.catch_ctx;    Pike_interpreter.catch_ctx = new_catch_ctx; +  DO_IF_DEBUG({ +  TRACE((3,"- Pushed catch context %p\n", new_catch_ctx)); +  });    }       Pike_fp->expendible = Pike_fp->locals + Pike_fp->num_locals;       /* Need to adjust next_addr by sizeof(INT32) to skip past the jump    * address to the continue position after the catch block. */    addr = (PIKE_OPCODE_T *) ((INT32 *) addr + 1);       if (Pike_interpreter.catching_eval_jmpbuf) {    /* There's already a catching_eval_instruction around our    * eval_instruction, so we can just continue. */    debug_malloc_touch_named (Pike_interpreter.catch_ctx, "(1)");    /* We also need to skip past the entry prologue... */    addr += ENTRY_PROLOGUE_SIZE;    SET_PROG_COUNTER(addr);    FETCH; -  +  DO_IF_DEBUG({ +  TRACE((3,"- In active catch; continuing at %p\n", addr)); +  });    JUMP_DONE;    }       else {    debug_malloc_touch_named (Pike_interpreter.catch_ctx, "(2)");    check_c_stack(8192);       while (1) {    /* Loop here every time an exception is caught. Once we've    * gotten here and set things up to run eval_instruction from    * inside catching_eval_instruction, we keep doing it until it's    * time to return. */    -  +  DO_IF_DEBUG({ +  TRACE((3,"- Activating catch; calling %p in context %p\n", +  addr, Pike_interpreter.catch_ctx)); +  }); +     int res = catching_eval_instruction (addr);       if (res != -3) {    /* There was an inter return inside the evaluated code. Just    * propagate it. */ -  DO_IF_DEBUG ( +  DO_IF_DEBUG ({ +  TRACE((3,"- Returning from catch.\n"));    if (res != -1) Pike_fatal ("Unexpected return value from "    "catching_eval_instruction: %d\n", res); -  ); +  });    break;    }       else {    /* Caught an exception. */    struct catch_context *cc = Pike_interpreter.catch_ctx;    -  DO_IF_DEBUG ( +  DO_IF_DEBUG ({ +  TRACE((3,"- Caught exception. catch context: %p\n", cc));    if (!cc) Pike_fatal ("Catch context dropoff.\n");    if (cc->frame != Pike_fp)    Pike_fatal ("Catch context doesn't belong to this frame.\n"); -  ); +  });       debug_malloc_touch_named (cc, "(3)");    UNSETJMP (cc->recovery);    Pike_fp->expendible = cc->save_expendible;    move_svalue (Pike_sp++, &throw_value);    throw_value.type=T_INT;    low_destruct_objects_to_destruct();       if (cc->continue_reladdr < 0)    fast_check_threads_etc(6);    addr = cc->next_addr + cc->continue_reladdr;    -  DO_IF_DEBUG ( +  DO_IF_DEBUG({ +  TRACE((3,"- Popping catch context %p ==> %p\n", +  cc, cc->prev));    if (!addr) Pike_fatal ("Unexpected null continue addr.\n"); -  ); +  });       Pike_interpreter.catch_ctx = cc->prev;    really_free_catch_context (cc);    }    }       INTER_RETURN;    }   });