mudos源码分析

错误捕捉相关的代码在simulate.c

 

void throw_error()
{
    if (((current_error_context->save_csp + 1)->framekind & FRAME_MASK) == FRAME_CATCH) {
        LONGJMP(current_error_context->context, 1);
        fatal("Throw_error failed!");
    }
    error("Throw with no catch.\n");
}

static void debug_message_with_location P1(char *, err) {
    if (current_object && current_prog) {
            debug_message("%sprogram: /%s, object: /%s, file: %s\n",
              err,
              current_prog->name,
              current_object->name,
              get_line_number(pc, current_prog));
    } else if (current_object) {
            debug_message("%sprogram: (none), object: /%s, file: (none)\n",
              err,
              current_object->name);
    } else {
            debug_message("%sprogram: (none), object: (none), file: (none)\n",
              err);
    }
}
void fatal P1V(char *, fmt)
{
    static int in_fatal = 0;
    char msg_buf[2049];
    va_list args;
    V_DCL(char *fmt);

    if (in_fatal) {
        debug_message("Fatal error while shutting down.  Aborting.\n");
    } else {
        in_fatal = 1;
        V_START(args, fmt);
        V_VAR(char *, fmt, args);
        vsprintf(msg_buf, fmt, args);
        va_end(args);
        debug_message("******** FATAL ERROR: %s\nMudOS driver attempting to exit gracefully.\n", msg_buf);
        if (current_file)
            debug_message("(occured during compilation of %s at line %d)\n", current_file, current_line);
        if (current_object)
            debug_message("(current object was /%s)\n", current_object->name);
        
        dump_trace(1);
        
#ifdef PACKAGE_MUDLIB_STATS
        save_stat_files();
#endif
        copy_and_push_string(msg_buf);
        if (command_giver) {
            push_object(command_giver);
        } else {
            push_undefined();
        }
        if (current_object) {
            push_object(current_object);
        } else {
            push_undefined();
        }
        apply_master_ob(APPLY_CRASH, 3);
        debug_message("crash() in master called successfully.  Aborting.\n");
    }
    /* Make sure we don't trap our abort() */
#ifdef SIGABRT
    signal(SIGABRT, SIG_DFL);
#endif
#ifdef SIGILL
    signal(SIGILL, SIG_DFL);
#endif
#ifdef SIGIOT
    signal(SIGIOT, SIG_DFL);
#endif
    
#if !defined(DEBUG_NON_FATAL) || !defined(MDEBUG)
#ifdef WIN32
    exit(0);
#endif
    abort();
#endif
    in_fatal = 0;
}

 

posted @ 2017-11-27 01:31  方东信  阅读(603)  评论(0编辑  收藏  举报