亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? engine.cpp.svn-base

?? 這是一段游戲修改工具的源代碼.ring3功能由dephi開發(fā),驅(qū)動是C開發(fā).希望對大家有幫助
?? SVN-BASE
?? 第 1 頁 / 共 4 頁
字號:
};

class ODStack: public VStack<ODS_Record,ODS_STACKSIZE>  // wuz Stack<...
{
private:
    ODS_Record orec;
public:

 void push_object(PClass pc, void* obj)
 {
    orec.m_class = pc;
    orec.m_obj = obj;
    #ifdef DEBUG_ODS
    if (fb == Parser::temp_fun_block()) orec.m_fn = NULL;
    else orec.m_fn = Function::from_fun_block(fb);
    orec.m_offs = current_ip();
    #endif
    push(orec);
 }

 void pop_object(PClass& pc, void*& obj)
 {
   orec = pop();
   pc = orec.m_class;
   obj = orec.m_obj;
 }

 void fetch_object(int idx, PClass& pc, void*& obj)
 {
   orec = get(idx);
   //orec = *ref_to_TOS(-idx);
   pc = orec.m_class;
   obj = orec.m_obj;
 }

 #ifdef DEBUG_ODS
 void current_context(PClass& pc, PFunction& fn, int& offs)
 { // assumes basically that either pop_object() or fetch_object() has been called...
    fn = orec.m_fn;
    offs = orec.m_offs;
	pc = orec.m_class;
 }
 #endif

};

static ODStack mODS;

void end_function();  // forward...

#ifdef DEBUG_ODS
void destruct_error(char *msg)
{
     PFunction fn;
     int ofs;
	 PClass pc;
     mODS.current_context(pc,fn,ofs);
     string name = fn ? fn->name() : string("<temp>");
	 string cname = pc ? pc->name() : string("<none>");
     cerr << "bad ODS entry: class " << cname << " fn " << name << '(' << ofs << ')' << endl;
	 exec_message(msg,true);
}
#else
void destruct_error(char *msg) { exec_message(msg,true); }
#endif

void do_unwind(void *p, ODStack& o_ds)
{
// unwind the Object Destruction Stack (ODS)
  FBlock * old_fb = fb;
  Instruction *old_ppcode = ppcode;
  int *old_baseSP = baseSP;
  int *old_mSP = mSP;
  PClass pc;

  // *fix 0.9.5 Before unwinding, we must check whether this object is in fact on the ODS
  if (p != NULL) {
    bool found = false;
    int n  = o_ds.depth();
    if (!n) return; // ODS empty....
    for(int i = 0; i < n; i++)
    {
      void* s_obj; 
      o_ds.fetch_object(i,pc,s_obj);
      if (s_obj == p) {
        found = true;
        break;
      }
    }
    if (! found)
      return;    
  }

  // the stack unwinding loop
  char *lastOP = mOP;
  void *obj;
  if (o_ds.depth() > 0)
  do {
   o_ds.pop_object(pc,obj);
   mOP = (char *)obj;    
   Function *dfn;
   try {
     dfn = pc->destructor();
   } catch(...) {
       destruct_error("bad ODS entry ");
       break;
   }
   if (dfn != NULL) try {
     if (Engine::execute(dfn->fun_block())==CRASHED) 
	      destruct_error("destructor failed");
   } catch(...) {
     destruct_error("bad destructor");
     return;
   }
  } while (obj != p && o_ds.depth() > 0);
  mOP = lastOP;    
  fb = old_fb;
 // check_fun_block(fb);
  ppcode = old_ppcode;
  baseSP = old_baseSP;
  mSP = old_mSP;
}

#define DEFER_MARKER ((PClass *)(0x777))

#ifdef DEBUG_ODS
void check_ODS()
{
 int n  = mODS.depth();
 if (!n) return;
 for(int i = 0; i < n; i++)
 {
   PClass pc;
   void *obj;
   PFunction fn;
   int ofs;
   
   mODS.fetch_object(i,pc,obj);
   bool fooked = false;
   if (pc->has_VMT()) try {
     PClass *vmt = *VMT(obj);
     if (vmt != DEFER_MARKER) fooked = pc != *vmt;	 
   }
   catch(...) { fooked = true; }
   if (fooked) {
       mODS.current_context(pc,fn,ofs);
       string name = fn ? fn->name() : string("<temp>");
       cerr << "bad ODS: class " << pc->name() << " fn "
	        << name << '(' << ofs << ')' << "ptr " << obj << endl;
       exec_message("bad ODS entry ",true);
     break;
   }  
 }
}
#define CHECK_ODS check_ODS()
#else
#define CHECK_ODS
#endif


int throw_exception(Type t, void *thrown_obj)
// returns a valid offset into the catching function if successful;
// -1 otherwise
{
 try {
 static CatchHandler *curr_except = NULL;
 if (t == t_void) {
  // we are re-raising this exception! (see Parser::do_throw())
   // we assume that the stack has already been unwound past the 
   // try block marker we hit last...
   t = curr_except->thrown_type();
   thrown_obj = curr_except->thrown_object();
 } else curr_except = NULL;
 int n  = mODS.depth();
 if (!n) return -1;
 for(int i = 0; i < n; i++)
 {
   PClass pc;
   void *obj;
   mODS.fetch_object(i,pc,obj);
   if (pc == Parser::try_block_class()) {
     // first field is our catch handler
     curr_except = (CatchHandler *) *(unsigned int *)obj;
     int ip = curr_except->match_thrown_object(t,thrown_obj);
     if (ip != -1) {
        do_unwind(obj,mODS);  // unwind up to (&including) the try block marker  
        while (fb != curr_except->fun_block()) end_function();
        return ip;
     }// if (...we matched a catch block...) 
   } // if (...we hit a try block marker ...)
 } // for(...all entries in ODS .....
 } catch(...) {
   cerr << "bomb out handling exception" << endl;
 }
 // *fix 0.9.5 Will attempt to unwind the stack if the exception is uncaught
 do_unwind(NULL,mODS);
 return -1; // nobody wanted to catch this type!!
}

void *ventry(int slot, int offs)
{
  return (*(void ***)(mOP+offs))[slot];
}


//--------------- THE STACK ENGINE --------------------------
#define REF(T,p)    (*(T *)(p))
#define REFS(T)     (*(T *)pop())
#define REFA(T,p,a) (*((T *)(p)+(a)))
#define REFP(T,p)   (*(T **)(p))
#define NEXT(p)     ((int *)p)+1


int switch_jump(int *sb, int val)
// Switch jump tables look like this:
//  (num. entries) (default jump) (1st val) (1st jmp) .....
{
  int sz = *sb++, def = *sb++;
  while (sz && *sb != val) { sb++; sb++; sz--; }
  if (sz)  return *(sb+1);
      else return def;
}

void Engine::kill(int retcode)
{ 
  ppcode = (Instruction *)end_of_code;
}

void reset_stacks()
{
 if (fs.depth() > 0) {
   cerr << "reseting stacks\n";
   reset_execution_stack();
   fs.clear();   
 }
 // *fix 1.2.8 reset_stacks() will ALWAYS clear out the resume state
 resume_state.m_fb = NULL;  // flag us as NOT paused    
}

// *change 1.2.4 separated out code for determining full function name
string fname_from_fblock(FBlock* fun_block)
{
   if (fun_block == Parser::temp_fun_block()) return "<temp>";
   return Function::from_fun_block(fun_block)->as_str();
}

// *change 1.2.3 Function tracing is now controlled by the XTrace object
// *add 1.2.4 Can switch off default exit behaviour
// *change 1.2.4 Now dumps out full function name when tracing
// *change 1.2.4 No return value for enter() and leave() methods
XTrace::XTrace(bool on_exit)
  : m_on_entry(true), m_on_exit(on_exit) { }

void XTrace::enter(XExecState* xs)
{
   cerr << "*ENTER " << fname_from_fblock(xs->fb) << endl;
}

void XTrace::leave(XExecState* xs)
{
   cerr << "*LEAVE " << fname_from_fblock(xs->fb) << endl;
}

void get_stack_frame(int fi, ExecutionState& xs);

XExecState* get_exec_state()
{
  static XExecState xs;
  ExecutionState exs;
  get_stack_frame(1,exs);
  xs.fb = fb;
  xs.ip = ppcode;
  xs.op = mOP;
  xs.sp = mSP;
  xs.bp = baseSP;
  xs.last_fb = exs.m_fb;
  xs.last_ip = exs.m_ppcode;
  xs.last_bp = exs.m_baseSP;
  return &xs;
}

// *add 1.2.4 Can switch tracing on & off globally
static bool gCanTrace = true;

void engine_set_tracing(bool yesno)
{ gCanTrace = yesno; }

void start_function(FBlock *_fb)
{
#ifdef _DEBUG
 if (gFunBlock == fb)
      __break(3);
#endif
  fs.push(ppcode);
  if (fs.depth() > FUNCTION_STACK_DEPTH) {
      reset_stacks();
      throw Exception("Function Stack Overflow");
  }
  fs.push(fb);
  ppcode = _fb->pstart;
  fb = _fb;
  fs.push(baseSP);  
  if (ppcode == NULL) { // *add 1.2.4 report full function name
      static string tmps = fname_from_fblock(_fb) + " is not defined yet";
      throw Exception(tmps.c_str());   // shd be cool for a _static_ string...
  }
  if (resume_state.m_fb == NULL) baseSP = mSP;
  else if (_fb->nlocal == 100) { baseSP = resume_state.m_baseSP; return; } //fiddle!
  else baseSP = mSP;
  mSP -= _fb->nlocal;
  // *add 0.9.4 Stack Overflow check in start_function
  if ((long)mSP < (long)_stack_) throw Exception("Exec Stack overflow");

  ptr_check = Parser::debug.ptr_check;

// *add 1.2.4 Can control default entry behaviour for trace
  if (gCanTrace && _fb->trace && _fb->trace->do_enter()) {
     // suppress tracing while in custom trace method
	  XExecState* xs = get_exec_state();
      gCanTrace = false;
      _fb->trace->enter(xs);
	  gCanTrace = true;
     // and copy function state back to allow for re-dispatching
	  fb = xs->fb;
	  ppcode = (Instruction*)xs->ip;
	  mSP = xs->sp;
      baseSP = xs->bp;
  }
}

// *add 1.2.4 Can switch off default exit behaviour for trace
void end_function()
{
#ifdef _DEBUG
 if (gFunBlock == fb)
      __break(3);
#endif
 if (fb->trace && gCanTrace && fb->trace->do_leave()) {
      gCanTrace = false;
      fb->trace->leave(get_exec_state());
	  gCanTrace = true;
 }
 baseSP = (int *)fs.pop();
 fb = (FBlock *)fs.pop();
 ppcode = (Instruction *)fs.pop();  
}

void *fs_ptr(int offs)
{
    return *fs.ref_to_TOS(offs);
}


// *add 1.1.1 Dumping the stack frame after a breakpoint halt
void get_stack_frame(int fi, ExecutionState& xs)
{
  if (fi == 0) {
    xs.m_baseSP = baseSP;
    xs.m_fb = fb;
    xs.m_ppcode = ppcode;
  } else {
    int offs = -3*(fi-1);
    xs.m_baseSP = (int *)fs_ptr(offs);
    xs.m_fb     = (FBlock *)fs_ptr(offs-1);
    xs.m_ppcode = (Instruction *)fs_ptr(offs-2);
  }
}

int stack_frame_depth()
{ return fs.depth()/3 - 1; }  // i.e. not interested in <temp>!

// *change 1.2.8 write out full name of function....
// the report is now in a more parser-friendly format.
void dump_fun_frame(int i, const ExecutionState& xs)
{  
	LineInfo li;
    FBlock *this_fb = xs.m_fb;
    if (this_fb == START_FB) cmsg << i << " <DLL> 0 <function>" << endl;
    else {
      FunctionContext *fcxt = (FunctionContext *)this_fb->context;
      li.ip_offset = (xs.m_ppcode - this_fb->pstart)/sizeof(Instruction);
      if (fcxt && fcxt->ip_to_line(li)) 
          ;           
      else {
          li.file = "<none>";
          li.line = -2;
      }
      cmsg << i << ' ' << li.file << ' ' << li.line+2 << ' '
           << fname_from_fblock(this_fb) << endl;
    }
}

void dump_fun_stack()
{
    ExecutionState xs;

    for(int i = 0, n = stack_frame_depth(); i < n; i++) {
       get_stack_frame(i,xs);
	   dump_fun_frame(i,xs);
    }
}

int *find_main_baseSP(char *fct)
{
   ExecutionState xs;

   for(int i = 0, n = stack_frame_depth(); i < n; i++) {
       get_stack_frame(i,xs);
	   if (xs.m_fb->function->name()==fct) {
		   get_stack_frame(i-1,xs);
		   cout << "called from main: " << xs.m_fb->function->name() << endl;
		   return xs.m_baseSP;
       }
   }
   return NULL;
}

void Engine::attach_main_context(char *fct)
{
	Table *cntxt = Function::lookup(fct)->context();
	Parser::state.push_context(cntxt);
	baseSP = find_main_baseSP(fct);
}

// *add 1.1.1 Selecting a stack frame while halted
void Engine::set_frame(int i, bool verbose)
{
    ExecutionState xs;
    LineInfo li;
    Parser::state.pop_context();

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区不卡在线| 亚洲精品一线二线三线无人区| 国产精品无圣光一区二区| 国产一区二区精品久久91| 国产人成亚洲第一网站在线播放| 麻豆精品视频在线观看视频| 精品人在线二区三区| 国产成人超碰人人澡人人澡| 国产精品丝袜黑色高跟| 色老汉一区二区三区| 亚洲国产精品一区二区久久恐怖片| 欧美私模裸体表演在线观看| 天堂精品中文字幕在线| 精品播放一区二区| av欧美精品.com| 亚洲国产综合色| 精品国产乱码久久久久久蜜臀| 国产精品中文字幕欧美| 亚洲人妖av一区二区| 欧美精品第1页| 国产精品996| 亚洲综合免费观看高清在线观看| 欧美一区二区三区视频在线| 国产精品1区2区| 亚洲黄色片在线观看| 精品欧美乱码久久久久久| 成人性生交大合| 偷拍与自拍一区| 国产精品日日摸夜夜摸av| 欧美日韩电影在线播放| 国产精品资源在线看| 亚洲国产精品视频| 欧美极品美女视频| 91精品国产高清一区二区三区蜜臀| 国产成人综合精品三级| 一级女性全黄久久生活片免费| 日韩精品自拍偷拍| 91成人网在线| 国产成人av资源| 欧美aaaaaa午夜精品| 国产精品久久久一本精品| 91精品欧美福利在线观看| 99久久伊人精品| 久久电影网电视剧免费观看| 亚洲裸体在线观看| 中文字幕的久久| 精品国产一区久久| 欧美色倩网站大全免费| 91亚洲午夜精品久久久久久| 国产精品一区在线| 午夜精彩视频在线观看不卡| 最新成人av在线| 久久精品视频在线免费观看| 日韩一区二区高清| 欧美视频一区二区三区四区| www.日韩在线| 成人自拍视频在线观看| 九色porny丨国产精品| 午夜精品久久久久久久久久久 | 97成人超碰视| 国产九色sp调教91| 国产一区二区在线视频| 日韩成人av影视| 爽爽淫人综合网网站| 亚洲一区在线看| 亚洲精品高清视频在线观看| 一区免费观看视频| 国产精品白丝在线| 亚洲国产精品激情在线观看| 国产午夜精品一区二区| 精品国产伦一区二区三区观看体验 | 欧美日韩一区二区三区四区| 99精品黄色片免费大全| 丰满亚洲少妇av| 成人福利视频网站| 国产91丝袜在线18| 国产成人精品一区二区三区四区| 国产精品99久久不卡二区| 国产精品资源在线| 国产91丝袜在线播放九色| 成人深夜在线观看| 99精品久久只有精品| 91免费观看国产| 在线亚洲+欧美+日本专区| 欧美亚洲一区三区| 91精品国产手机| 日韩精品一区二区三区老鸭窝| 欧美精品一区二区三区一线天视频 | 免费人成网站在线观看欧美高清| 三级亚洲高清视频| 久久精品免费观看| 国产精品主播直播| 不卡的电视剧免费网站有什么| 91在线观看下载| 欧美日韩在线精品一区二区三区激情| 欧美日韩激情在线| 日韩精品资源二区在线| 亚洲国产精品传媒在线观看| 国产精品国产精品国产专区不片| 一区二区久久久久| 美女久久久精品| 国产精品99久久久久久久vr| 一本到不卡精品视频在线观看| 精品视频免费在线| 精品久久久三级丝袜| 综合网在线视频| 午夜精品在线视频一区| 韩国三级电影一区二区| 色婷婷精品大在线视频| 欧美一区二区三区精品| 国产日韩欧美一区二区三区综合| 最新热久久免费视频| 婷婷亚洲久悠悠色悠在线播放| 久久精品av麻豆的观看方式| av在线不卡免费看| 5566中文字幕一区二区电影| 国产亚洲短视频| 亚洲高清在线精品| 大胆欧美人体老妇| 欧美电影一区二区三区| 日本一区二区在线不卡| 亚洲chinese男男1069| 国产成人亚洲综合a∨婷婷| 欧美亚洲国产一区二区三区 | 五月天亚洲精品| 国产精品一区在线| 91精品国产欧美一区二区成人| 欧美韩国日本综合| 毛片一区二区三区| 色综合久久天天| 久久色中文字幕| 午夜精品免费在线| 色婷婷精品大在线视频| www成人在线观看| 亚洲午夜精品网| 成a人片国产精品| 欧美va亚洲va在线观看蝴蝶网| 一区二区三区四区激情| caoporm超碰国产精品| 精品乱人伦小说| 日av在线不卡| 欧美精品乱码久久久久久按摩| 欧美极品另类videosde| 国产在线播放一区三区四| 在线成人免费观看| 亚洲影视在线观看| 99久久99精品久久久久久| 久久精品人人做人人综合 | 日本不卡一区二区| 欧美在线视频日韩| 亚洲人成7777| 成人国产精品免费观看动漫| 欧美成人免费网站| 人人狠狠综合久久亚洲| 欧美日韩精品系列| 亚洲成人一区二区| 欧美日韩精品免费| 丝袜a∨在线一区二区三区不卡| 9i在线看片成人免费| 国产亚洲欧洲一区高清在线观看| 精品在线亚洲视频| 日韩视频一区二区| 青青草国产成人99久久| 91精品国产色综合久久不卡电影 | 中文字幕va一区二区三区| 紧缚奴在线一区二区三区| 欧美一级片在线| 午夜精品免费在线| 日韩一区二区在线看片| 日本美女视频一区二区| 欧美一区二区三区视频在线| 免费成人在线观看| 精品福利视频一区二区三区| 久久精品国产99国产精品| 日韩美女一区二区三区| 国产精品一级黄| 国产精品久久久久久久久免费相片| 成人激情小说乱人伦| 国产精品国产三级国产普通话三级| 成人av动漫网站| 一区二区三区在线观看网站| 日本高清免费不卡视频| 午夜精品爽啪视频| 精品国产一区二区精华| 国产精品一区二区无线| 国产午夜精品一区二区| 97久久人人超碰| 亚洲国产精品久久不卡毛片| 欧美一区二区三区免费| 国产成人精品网址| 亚洲人成网站精品片在线观看| 色综合久久66| 日韩 欧美一区二区三区| 久久中文字幕电影| av综合在线播放| 五月天精品一区二区三区| 日韩午夜小视频| 成人ar影院免费观看视频| 一区二区成人在线| www国产亚洲精品久久麻豆|