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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vm_interpret.cpp

?? c-smile 一個語法類似與JS 又有點像C++的 編譯器
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
        case OP_PUSH:
          CHECKSTACK ( 1 );
          PUSH ( undefined );
          break;

        case OP_NOT:
          SP ( 0 ) = ! ( istrue ( SP ( 0 ) ) );
          break;

        case OP_NEG:
          CHECKTYPE ( 0, DT_INTEGER );
          SP ( 0 ) .v.v_integer = - SP ( 0 ) .v.v_integer;
          break;

        case OP_ADD:
          SP ( 1 ) = op_add ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_SUB:
          SP ( 1 ) = op_sub ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_MUL:
          SP ( 1 ) = op_mul ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_DIV:
          SP ( 1 ) = op_div ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_REM:
          SP ( 1 ) = op_rem ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_MAKEREF:
          CHECKTYPE ( 0, DT_CODE );
          if ( !SP ( 1 ) .is_thing () ) 
          {
            VM::error ( "expecting object" );
          }
          //TODO: test code!!!!
          SP ( 1 ) .set_method ( SP ( 1 ) .v.v_thing, SP ( 0 ) .v.v_code );
          POP;
          break;

        case OP_INC:
          op_inc ( this, SP ( 0 ) );
          break;

        case OP_DEC:
          op_dec ( this, SP ( 0 ) );
          break;

        case OP_BAND:
          SP ( 1 ) = op_band ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_BOR:
          SP ( 1 ) = op_bor ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_XOR:
          SP ( 1 ) = op_bxor ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_BNOT:
          SP ( 0 ) = op_bnot ( this, SP ( 0 ) );
          break;

        case OP_SHL:
          CHECKTYPE ( 0, DT_INTEGER );
          CHECKTYPE ( 1, DT_INTEGER );
          SP ( 1 ).v.v_integer <<= sp->v.v_integer;
          POP;
          break;

        case OP_SHR:
          CHECKTYPE ( 0, DT_INTEGER );
          CHECKTYPE ( 1, DT_INTEGER );
          SP ( 1 ).v.v_integer >>= sp->v.v_integer;
          POP;
          break;

        case OP_LT:
          SP ( 1 ) = op_lt ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_LE:
          SP ( 1 ) = op_le ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_EQ:
          SP ( 1 ) = ( SP ( 1 ) == SP ( 0 ) );
          POP;
          break;

        case OP_NE:
          SP ( 1 ) = op_neq ( this, SP ( 1 ), SP ( 0 ) );
          POP;
          break;

        case OP_GE:
          SP ( 1 ) = op_le ( this, SP ( 0 ), SP ( 1 ) );
          POP;
          break;

        case OP_GT:
          SP ( 1 ) = op_lt ( this, SP ( 0 ), SP ( 1 ) );
          POP;
          break;

        case OP_LIT:
          woperand = getwoperand ();
          SP ( 0 ) = ( *package->literals ) [ woperand ];
          break;

        case OP_POP:
          POP;
          break;

        case OP_COPY:
          SP ( 0 ) = SP ( 1 );
          break;

        case OP_DUP2:
          CHECKSTACK ( 2 );
          PUSHN ( 2 );
          SP ( 0 ) = SP ( 2 );
          SP ( 1 ) = SP ( 3 );
          break;

        case OP_DUP:
          PUSH ( undefined );
          SP ( 0 ) = SP ( 1 );
          break;

        case OP_NEW:
          opNEW ();
          break;

        case OP_LINE:
          line_num = getwoperand ();
          break;

        case OP_EH_PUSH:
          n = getwoperand ();
          assert ( eh_pos < ( eh_size-1 ) ); // critical error
          ++eh_pos;
          {
            error_handler *ep = &eh [ eh_pos ];
            ep->catch_pc = n;
            ep->m_stack_pos = m_stack_pos;
            ep->code = code;
            ep->fp = fp;
            ep->sp = sp;
            ep->thrown = undefined;
          }
          break;

        case OP_EH_POP:
          assert ( eh_pos >= 0 ); // otherwise something wrong
          pc = cbase + getwoperand ();
          --eh_pos;
          break;

        case OP_THROW:
          if ( eh_pos >= 0 ) 
          {
            eh [ eh_pos ] .thrown = SP ( 0 );
            throw VM_RTE ( this, SP ( 0 ) );
          }
          else
          {
            //TODO
            throw VM_RTE ( this, "TODO: ALARM! " );
          }
          break;

        case OP_ENTER:
          {
            if ( SP ( 0 ) .v_type != DT_EXT ||
              SP ( 0 ) .v.v_thing->get_class () != MUTEX::INSTANCE::klass ) 
            {
              error ( "not a mutex" );
            }

            if ( m_stack_pos >= m_stack_size - 1 ) 
            {
              error ( "too many synchronized blocks" );
            }

            MUTEX::INSTANCE *pmi = ( MUTEX::INSTANCE * ) SP ( 0 ) .v.v_thing;
            m_stack [ ++m_stack_pos ] = pmi;

            //POP; !!!!

            pmi->_m.enter ();
          }
          break;

        case OP_LEAVE:
          assert ( m_stack_pos >= 0 ); // otherwise something wrong
          m_stack [ m_stack_pos-- ] ->_m.leave ();
          break;

        case OP_INSTANCEOF:
          if ( !SP ( 1 ).is_thing () ) 
          {
            error ( "instanceof - left side is not an object" );
          }
          if ( !SP ( 0 ) .is_class () ) 
          {
            error ( "instanceof - right side is not a class" );
          }
          SP ( 1 ) = SP ( 1 ) .v.v_thing -> instance_of ( SP ( 0 ) .v.v_class );
          POP;
          break;

        case OP_UNDEFINED:
          SP ( 0 ) = undefined;
          break;

        case OP_ARGUMENT:
          CHECKTYPE ( 0, DT_INTEGER );
          // skip 'this'
          SP ( 0 ) = ARG ( int ( SP ( 0 ) )  + 1 );
          break;

        case OP_ARGUMENTS:
          // without 'this'
          SP ( 0 ) = int ( FP ( FRAME_ARGC ) )  - 1;
          break;

        case OP_TSTORE:
          t_register = SP ( 0 );
          break;

        case OP_TRESTORE:
          SP ( 0 ) = t_register; t_register.init ();
          break;

        default:
          error ( "Bad opcode %02x", pc [ -1 ] );
          break;
        }
      }
      // for
    }
    catch ( VM_RTE& rte ) 
    {
      if ( eh_pos < 0 ) 
      {
        ready_for_gc = true;
        running = false;
        throw rte;
      }
      // uncaught exception

      error_handler *ep = &eh [ eh_pos ];
      n = ep->catch_pc;
      code = ep->code;
      package = code->klass () ->get_package ();
      fp = ep->fp;
      sp = ep->sp;
      int mspos = ep->m_stack_pos;

      if ( ep->thrown.is_null () ) 
      {
        //TODO: create instance of ERROR class
        if ( rte.err_value.is_null () ) 
          SP ( 0 ) = new STRING ( rte.report () );
        else
          SP ( 0 ) = rte.err_value;
      }
      else
      {
        SP ( 0 ) = ep->thrown;
      }
      cbase = ( unsigned char * ) code->bytecode ();
      pc = cbase + n;
      --eh_pos;

      // free synchro locks originated in the function - source of error
      for ( int i = m_stack_pos; i > mspos; i-- ) 
      {
        m_stack [ i ] ->_m.leave ();
      }
      m_stack_pos = mspos;

      goto start;
    }

  STOP:
    ready_for_gc = true;
    running = false;

  }


  //| 0
  //|
  //|
  //|
  //|
  //| fp : pcoff  - old programm counter offset
  //|      fpoff  - old frame pointer
  //|      argc   - arg counter
  //|      argn
  //|      argn-1
  //|      ...
  //|      arg0
  //|      bytecode
  //|
  //|
  //|
  //| stktop

  // opRETURN - RETURN opcode handler
  bool
    VM::opRETURN () 
  {
    int pcoff, n;
    VALUE val = SP ( 0 );
    sp = fp;
    pcoff = FP ( FRAME_PCOFF ) .v.v_integer;
    n = FP ( FRAME_ARGC ) .v.v_integer;
    int ehpos = FP ( FRAME_EHPOS ) .v.v_integer;
    int mspos = FP ( FRAME_MSPOS ) .v.v_integer;
    fp = stkbase + FP ( FRAME_FPOFF ) .v.v_integer;

    // free synchro locks originated in this function
    for ( int i = m_stack_pos; i > mspos; i-- ) m_stack [ i ] ->_m.leave ();
      m_stack_pos = mspos;
    eh_pos = ehpos;

    if ( fp == stkbase ) return false;

    int  coff = FP ( FRAME_ARGC ) .v.v_integer + FRAME_SIZE;
    code = FP ( coff ) .v.v_code;
    package = code->klass () ->get_package ();
    cbase = ( unsigned char * ) code->bytecode ();
    pc = cbase + pcoff;
    POPN ( n + FRAME_SIZE );
    SP ( 0 ) = val;

    return true;
  }

  // opCALL - CALL opcode handler
  void
    VM::opCALL () 
  {
    int     argc = getwoperand ();	/* get argument count */
    VALUE * argv = &SP ( argc-1 );

    VALUE   _ref = SP ( argc );
    VALUE&  _this = SP ( argc-1 );

    switch ( SP ( argc ) .v_type ) 
    {
    case DT_CODE:
      {
        if ( SP ( argc ) .v.v_code->is_native () ) 
        {
          // argc - 1 : without this; argv+1 : skip this
          VALUE v = invoke_native ( SP ( argc ) .v.v_code,  argc - 1, argv + 1 );
          POPN ( argc );
          SP ( 0 ) = v;
        }
        else
        {
          CHECKSTACK ( FRAME_SIZE );
          code = SP ( argc ) .v.v_code;
          package = code->klass () ->get_package ();
          PUSH ( argc );		/* argument count */
          PUSH ( eh_pos );
          PUSH ( m_stack_pos );
          PUSH ( int ( fp - stkbase ) );	/* old fp */
          PUSH ( int ( pc - cbase ) );	/* old pc */
          cbase = pc = ( unsigned char* ) code->bytecode ();
          fp = sp;
        }
      }
      return;
    case DT_CLASS:
      {
        CLASS * cls = _ref.v.v_class;
        if ( cls->cast_function ) 
        {
          _this = cls;
          _ref = cls->cast_function;
          goto gotit;
        }
        VM::error ( "static function %s::cast not found", (const char *) cls->full_name () );
      }
    case DT_OBJECT_METHOD:
      {

        _this = VALUE ( *_ref.v.v_om.thing );
        _ref = _ref.v.v_om.code;
      gotit:
        if ( _ref.v.v_code->is_native () ) 
        {
          VALUE v = invoke_native ( _ref.v.v_code,  argc - 1, argv + 1 );
          POPN ( argc );
          SP ( 0 ) = v;
        }
        else
        {
          CHECKSTACK ( FRAME_SIZE );
          code = _ref.v.v_code;
          package = code->klass () ->get_package ();
          //TODO check it SP ( argc ) 
          SP ( argc ) = code;
          PUSH ( argc );		/* argument count */
          PUSH ( eh_pos );
          PUSH ( m_stack_pos );
          PUSH ( int ( fp - stkbase ) );	/* old fp */
          PUSH ( int ( pc - cbase ) );	/* old pc */
          cbase = pc = ( unsigned char * ) code->bytecode ();
          fp = sp;
        }
        return;
      }

    default:
      error ( "Call to non-procedure,  Type %s", nameoftype ( SP ( argc ) .v_type ) );
      break;
    }
  }


  // opNEW - OP_NEW opcode handler
  void
    VM::opNEW () 
  {
    register int n;

    n = *pc++;

    assert ( SP ( n ) .v_type == DT_CLASS );
    CLASS *klass = SP ( n ) .v.v_class;

    SP ( n-1 ) = SP ( n );

    CODE * ctor = klass->ctor_function;
    if ( !ctor ) 
      error ( "No constructor defined for the class '%s'", (const char *) klass->full_name () );

    int     argc = n;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区中文字幕| 欧美电影免费观看高清完整版在线 | 亚洲黄色av一区| 日韩制服丝袜av| 99视频国产精品| 精品国内二区三区| 亚洲在线观看免费| 不卡高清视频专区| 精品久久久久久久久久久院品网| 亚洲少妇中出一区| 激情久久五月天| 欧美另类一区二区三区| 国产精品第13页| 国产在线麻豆精品观看| 欧美妇女性影城| 亚洲日本乱码在线观看| 成人性生交大合| 精品国产乱码久久久久久牛牛| 亚洲在线成人精品| 91啦中文在线观看| 国产精品区一区二区三| 国产精品456| 久久天天做天天爱综合色| 日韩国产高清影视| 欧美狂野另类xxxxoooo| 亚洲精品视频在线看| 99riav久久精品riav| 国产午夜精品一区二区三区嫩草 | 中文字幕永久在线不卡| 国产高清亚洲一区| 久久综合视频网| 国产麻豆午夜三级精品| 久久综合九色综合97婷婷女人 | 国产精品激情偷乱一区二区∴| 久久精品国产一区二区三区免费看| 欧美日韩三级在线| 亚洲444eee在线观看| 欧美日韩国产电影| 日韩中文字幕91| 日韩欧美一区二区视频| 男男成人高潮片免费网站| 日韩一级大片在线| 狠狠网亚洲精品| 国产欧美视频一区二区| 成人免费高清在线观看| 自拍偷拍欧美精品| 欧亚洲嫩模精品一区三区| 亚洲国产精品视频| 欧美一区日韩一区| 紧缚捆绑精品一区二区| 久久久久久久久久久黄色 | 久久精品国产久精国产爱| 日韩欧美久久一区| 国产精品123区| 亚洲婷婷综合色高清在线| 欧美三级日韩三级| 日韩成人一区二区| 国产欧美一区视频| 色屁屁一区二区| 免费成人在线网站| 国产女主播视频一区二区| 91网站最新地址| 免费在线观看成人| 国产欧美日韩在线视频| 精品污污网站免费看| 国产乱一区二区| 一级女性全黄久久生活片免费| 欧美一区二区三区婷婷月色 | 国产婷婷精品av在线| 在线观看日韩国产| 久久99久久久久| 亚洲欧美日韩成人高清在线一区| 欧美日韩日日骚| 粉嫩av一区二区三区粉嫩| 亚洲国产精品久久久久婷婷884| 精品免费日韩av| 91精彩视频在线| 黑人精品欧美一区二区蜜桃| 亚洲色图在线播放| 久久久久97国产精华液好用吗| 91丨九色丨蝌蚪丨老版| 国产美女在线观看一区| 亚洲一区二区三区在线播放| 久久综合色鬼综合色| 欧美色区777第一页| 国产精品77777竹菊影视小说| 亚洲成人黄色小说| 亚洲图片激情小说| 久久精品一区二区三区av| 在线播放中文一区| 91片黄在线观看| 成人福利在线看| 韩国v欧美v日本v亚洲v| 视频一区欧美日韩| 亚洲柠檬福利资源导航| 国产精品无人区| 精品日韩欧美一区二区| 91精品国产色综合久久不卡电影 | 欧美一区二区大片| 色琪琪一区二区三区亚洲区| 国产成a人亚洲精品| 精品综合免费视频观看| 麻豆国产91在线播放| 丝袜美腿亚洲综合| 天天操天天干天天综合网| 亚洲精品国产第一综合99久久| 国产日韩欧美在线一区| 欧美va亚洲va在线观看蝴蝶网| 欧美性猛交xxxx乱大交退制版| 99re在线视频这里只有精品| 成人性生交大片免费看在线播放| 国产一区二三区好的| 久久99精品久久久久久久久久久久| 日韩一区欧美二区| 日韩成人伦理电影在线观看| 日韩在线一区二区| 蜜桃传媒麻豆第一区在线观看| 秋霞午夜av一区二区三区 | 亚洲综合在线第一页| 亚洲女人小视频在线观看| 国产精品福利一区| 亚洲欧美视频在线观看| 亚洲男人的天堂网| 亚洲激情校园春色| 亚洲一二三专区| 日本三级亚洲精品| 精品中文字幕一区二区| 国产一区二三区好的| 粉嫩绯色av一区二区在线观看| 99久久婷婷国产| 欧美伊人久久大香线蕉综合69 | 亚洲福利电影网| 热久久国产精品| 国产剧情一区二区三区| 成人免费高清在线| 欧美最猛性xxxxx直播| 欧美裸体bbwbbwbbw| 欧美一级片在线| 国产三级三级三级精品8ⅰ区| 国产精品三级在线观看| 亚洲综合精品自拍| 九色|91porny| 欧美三级三级三级爽爽爽| 91精品国产91久久久久久最新毛片| 精品国产乱码久久久久久老虎| 欧美激情一区二区三区蜜桃视频| 亚洲精品少妇30p| 蜜臀99久久精品久久久久久软件| 国产精品自在欧美一区| 色综合天天狠狠| 欧美一级久久久久久久大片| 国产精品久久777777| 日韩精品一二三四| 成人av网站在线| 欧美日韩综合色| 久久久久高清精品| 亚洲h动漫在线| 国产成人精品免费| 欧美日本不卡视频| 国产精品每日更新在线播放网址| 亚洲成人精品一区二区| 福利一区二区在线观看| 欧美日韩亚洲丝袜制服| 国产女人aaa级久久久级 | 欧美影视一区在线| 国产视频亚洲色图| 丝袜美腿一区二区三区| 99国产一区二区三精品乱码| 精品国产乱码久久久久久浪潮| 亚洲欧美另类图片小说| 国产精品亚洲综合一区在线观看| 欧美日本精品一区二区三区| 亚洲三级理论片| 国产成人午夜精品影院观看视频 | 免费成人在线网站| 欧美午夜精品久久久久久孕妇| 国产精品视频看| 国产在线精品免费| 日韩午夜电影av| 午夜伊人狠狠久久| 91色porny在线视频| 久久精品视频在线看| 蜜桃av噜噜一区| 欧美性猛交xxxxxx富婆| 最好看的中文字幕久久| 国产精品456| 国产亚洲婷婷免费| 韩国欧美一区二区| 日韩一二三区不卡| 日韩avvvv在线播放| 欧美色偷偷大香| 亚洲第一二三四区| 欧美吻胸吃奶大尺度电影 | 亚洲欧洲av另类| proumb性欧美在线观看| 国产日产欧美一区二区视频| 国产一区二区精品久久99| www激情久久| 国产精品一色哟哟哟| 欧美精品一区视频|