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

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

?? things.cpp

?? c-smile 一個語法類似與JS 又有點像C++的 編譯器
?? CPP
字號:
/*
*
* things.cpp
*
* Copyright (c) 2001, 2002
* Andrew Fedoniouk - andrew@terra-informatica.org
* Portions: Serge Kuznetsov -  kuznetsov@deeptown.org
*
* See the file "COPYING" for information on usage 
* and redistribution of this file
*
*/
#include <stdlib.h>
#include "c-smile.h"
#include "vm.h"
#include "mm.h"
#include "compiler.h"

namespace c_smile
{
  void*
    THING::operator new ( size_t size  )
  {
    return memory.alloc_thing ( size );
  }

  void*
    THING::operator new ( size_t size, int moresize  )
  {
    return memory.alloc_thing ( ( size_t ) ( (int ) size + moresize ) );
  }

  void
    THING::operator delete ( void* p )
  {
    /*do nothing*/
  }

  void
    THING::operator delete ( void* p, int moresize )
  {
    /*do nothing*/
  }

  THING::operator VALUE ()
  {
    return VALUE ( this );
  }

  bool
    THING::instance_of ( CLASS *cls )
  {
    CLASS *klass = get_class ();
    while ( klass  )
    {
      if ( klass == cls )
        return true;
      klass = klass->base;
    }
    return false;
  }

  STRING *
    STRING::slice ( int start, int end  )
  {
    int st = start >= 0 ? start : ( size () + start );
    int en = end >= 0 ? end : ( size () + end );

    if ( en > ( int ) size () ) en = size ();

    int length = en - st;

    if ( length <= 0 || st >= ( int ) size () ) return new STRING ();

    STRING *s = new STRING ( _data.substr ( st, length ) );

    return s;
  }

  CLASS *
    STRING::get_class  ()
  {
    return VM::class_string;
  }

  OBJECT::OBJECT ( CLASS *k ) : klass ( k ), tag ( 0 )
  {
    int n = klass->instance_size;
    VALUE *p = members;
    for ( int i = 0; i < n; ++i, ++p )
      p->init ();
  }

  void
    OBJECT::mark ()
  {
      THING::mark ();
      VALUE *p;
      int n;
      p = members;
      n = klass->instance_size;
      while ( --n >= 0 )
        ( p++ )->mark ();
      mark_thing ( klass );

  }

  CLASS *
    OBJECT::get_class  ()
  {
    return klass;
  }

  CODE::CODE ( symbol_t name, BUFFER *bytecode, CLASS *klass )
      : _name ( name ), _klass ( klass )
  {
    _code.bc = bytecode;
    _is_native = false;
  }

  CODE::CODE ( symbol_t name, BUILTIN_FUNC *code, CLASS *klass )
      : _name ( name ), _klass ( klass )
  {
      _code.native = code;
      _is_native = true;
  }

  void
    CODE::mark ()
  {
      THING::mark ();
      mark_thing ( _klass );
  }

  CLASS *
    CODE::get_class  ()
  {
      return 0;
  }

  string
    CODE::full_name ()
  {
      string t;
      t.printf ( "%s::%s", (const char *) _klass->full_name (),
                           VM::voc [ _name ] );
      return t;
  }

    // class
  CLASS::CLASS ( const char *name, CLASS *base, PACKAGE *package )
       : instance_size ( 0 ), ctor_function ( 0 ), item_function ( 0 ),
         cast_function ( 0 ), dtor_function ( 0 )
  {
    this->instance_size = 0;
    this->base = base;
    this->package = package;
    this->name = name ? VM::voc [ name ] : undefined_symbol;

    if ( base  )
    {
      ctor_function = base->ctor_function;
      item_function = base->item_function;
      cast_function = base->cast_function;
    }

    members = new DICTIONARY ();
    if ( package )
    {
      ENTRY e = package->add ( name, ST_SDATA );
      *( e.value () ) = this;
    }
  }

  void
    CLASS::mark ()
  {
    THING::mark ();

    mark_thing ( base );
    mark_thing ( members );
    mark_thing ( package );

    mark_thing ( ctor_function );
    mark_thing ( item_function );
    mark_thing ( cast_function );
    mark_thing ( dtor_function );

  }

  VALUE
    CLASS::create_instance ()
  {
    return VALUE ( new ( ( instance_size - 1 ) * sizeof ( VALUE ) )
                       OBJECT ( this ) );
  }

  string
    CLASS::full_name ()
  {
    string s;
    if ( package )
    {
      s += package->full_name ();
      s += "::";
    }
    s += VM::voc [ name ];
    return s;
  }

  CLASS *
    CLASS::get_class  ()
  {
    return 0;
  }

#define DICT_GRAN 8

  DICTIONARY *
    DICTIONARY::create ( int size )
  {
    int gran_size = ( size / DICT_GRAN + 1 ) * DICT_GRAN - 1;
    DICTIONARY *d = new ( sizeof ( DICTIONARY::item ) * gran_size )
                        DICTIONARY ();
    d->_size = size;
    d->_allocated_size = gran_size + 1;
    for ( int i = 0; i < d->_size; i++ ) d->_items [ i ].init ();
      return d;
  }

  DICTIONARY *
    DICTIONARY::realloc ( int newsize )
  {
    if ( newsize < _allocated_size  )
    {
      _size = newsize;
      return this;
    }
    else
    {
      DICTIONARY * nd = DICTIONARY::create ( newsize );
      for ( int i = 0; i < _size; i++ ) nd->_items [ i ] = _items [ i ];
        return nd;
    }
  }

  void
    DICTIONARY::mark  ()
  {
    THING::mark ();
    for ( int i = 0; i < _size; i++ )
      _items [ i ].value.mark ();
  }

  CLASS *
    DICTIONARY::get_class ()
  {
      return 0;
  }

  ENTRY
    CLASS::add ( const char *name, int type )
  {
    ENTRY e;
    symbol_t sym = VM::voc [ name ];

    if ( members->find ( sym ) >= 0 )
      return ENTRY::undefined (); //already defined

    e.index = members->size ();
    e.klass = this;

    members = members->realloc ( e.index + 1 );
    members->_items [ e.index  ].type = type;
    members->_items [ e.index  ].symbol = sym;

    return e;
  }

  ENTRY
    CLASS::find ( const char *name )
  {
    return find ( VM::voc [ name ] );
  }

  ENTRY
    CLASS::find ( symbol_t sym )
  {
    int idx = members->find ( sym );
    if ( idx < 0 )
      return ENTRY::undefined ();

    ENTRY e;
    e.index = idx;
    e.klass = this;
    return e;
  }

  VALUE
    CLASS::get ( unsigned int idx  )
  {
    const DICTIONARY::item& item = members->get ( idx );
    assert ( item.type != ST_DATA );
    return item.value;
  }

  int
    CLASS::get_type ( unsigned int idx  )
  {
    const DICTIONARY::item& item = members->get ( idx );
    return item.type;
  }

  void
    CLASS::set ( unsigned int idx, const VALUE& v  )
  {
    DICTIONARY::item& item = members->get ( idx );
    assert ( item.type == ST_SDATA );
    item.value = v;
  }

  int
    CLASS::add_function ( const char *name, BUILTIN_FUNC *fcn  )
  {
    VALUE *v = add ( name, ST_FUNCTION ) .value ();
    symbol_t sym = VM::voc [ name ];

    assert ( v );
    CODE *c = new CODE ( sym, fcn, this );
    *v = c;
    check_name ( sym, c, ST_FUNCTION );
    return members->find ( sym );
  }

  void
    CLASS::check_name ( symbol_t ns, CODE *c, int symbol_type )
  {
    switch ( ns  )
    {
    case sym_item:
      if ( symbol_type == ST_FUNCTION )
        item_function = c;
      break;
    case sym_cast:
      if ( symbol_type == ST_SFUNCTION )
        cast_function = c;
      break;
    default:
      if ( ns == name )
        ctor_function = c;
      break;
    }
  }

  int
    CLASS::add_static_function ( const char *name, BUILTIN_FUNC *fcn  )
  {
    VALUE *v = add ( name, ST_SFUNCTION ).value ();
    symbol_t sym = VM::voc [ name ];
    assert ( v );
    CODE *c = new CODE ( sym, fcn, this );
    *v = c;
    check_name ( sym, c, ST_SFUNCTION );
    return members->find ( sym );
  }

  int
    CLASS::add_property ( const char *name, BUILTIN_FUNC *fcn  )
  {
    VALUE *v = add ( name, ST_PROPERTY ).value ();
    assert ( v );
    symbol_t sym = VM::voc [ name ];
    *v = new CODE ( sym, fcn, this );
    return members->find ( sym );
  }

  int
    CLASS::add_static_data ( const char *name, const VALUE& vd  )
  {
    symbol_t sym = VM::voc [ name ];
    VALUE *v = add ( name, ST_SDATA ).value ();
    assert ( v );
    *v = vd;
    return members->find ( sym );
  }

  int
    CLASS::add_const ( const char *name, const VALUE& vd  )
  {
    VALUE *v = add ( name, ST_CONST ).value ();
    assert ( v );
    *v = vd;
    return members->find ( VM::voc [ name ] );
  }

  int
    CLASS::add_data ( const char *name, const VALUE& /*not used so far*/ )
  {
    ENTRY en = add ( name, ST_DATA );
    if ( !en.is_valid () )
      VM::error ( "Field '%s' already defined.", (const char *) name );
    VALUE *v = en.value ();
    int n = instance_size++;
    *v = n;
    return n;
  }

  int
    CLASS::add_static_property ( const char *name, BUILTIN_FUNC *fcn )
  {
    VALUE *v = add ( name, ST_SPROPERTY ).value ();
    assert ( v );
    *v = fcn;
    return members->find ( VM::voc [ name ] );
  }

  VALUE
    CLASS::to_string ( const VALUE *v  )
  {
    VM *vm = VM::current ();
    if ( vm )
    {
      return vm->send ( *(const_cast<VALUE *> ( v ) ), sym_to_string );
    }
    else
      return "<toString() undefined>";
  }

  VALUE::VALUE ( const char *c ) : v_type ( DT_STRING  )
  {
    v.v_string = new STRING ( c );
  }

  VALUE::VALUE ( const string& s ) : v_type ( DT_STRING )
  {
    v.v_string = new STRING ( s );
  }

  void
    VALUE::mark ()
  {
    switch ( v_type & 0xF  )
    {
    case DT_CLASS:
    case DT_OBJECT:
    case DT_ARRAY:
    case DT_CODE:
    case DT_STRING:
    case DT_EXT:
      mark_thing ( v.v_thing );
      break;
    case DT_VAR:
      v.v_var.mark ();
      break;
    case DT_OBJECT_METHOD:
      v.v_om.mark ();
    }
  }

  THING *
    VALUE::ext ( CLASS *klass ) const
  {
    if ( ( v_type == DT_EXT ) && ( v.v_thing->get_class () == klass ) )
      return v.v_thing;
    return 0;
  }

  void
    VALUE::OBJECT_METHOD::mark  ()
  {
    mark_thing ( thing );
    mark_thing ( code );
  }

  VALUE::operator bool ()  const
  {
    switch ( v_type )
    {
    case DT_NULL:	return false;
    case DT_STRING: return ( v.v_string->size ()  > 0 );
    case DT_FLOAT:  return ( v.v_float != 0.0 );
    case DT_INTEGER: return ( v.v_integer != 0 );
    }
    return true;
  }

  VALUE *
    ENTRY::value ()
  {
    if ( is_valid ()  )
      return ( &klass->members->get ( index ) .value );
    return 0;
  }

  bool
    ENTRY::is_valid ()
  {
    if ( klass )
      return ( (int) index < klass->members->size () );
    return false;
  }

  int &
    ENTRY::type  ()
  {
    assert ( klass );
    return klass->members->get ( index ) .type;
  }

  symbol_t &
    ENTRY::symbol  ()
  {
    assert ( klass );
    return klass->members->get ( index ).symbol;
  }

  symbol_t
    ENTRY::symbol () const
  {
    assert ( klass );
    return klass->members->get ( index ).symbol;
  }

  void
    ENTRY::mark ()
  {
    mark_thing ( klass );
  }

  // package
  PACKAGE::PACKAGE ( const char *name, const char *src ) : CLASS ( name, 0, 0 ), init_code ( 0 )
  {
    file_name = src? new STRING ( src ) : 0;
    literals = new ARRAY ( 0 );
  }

  // package
  PACKAGE::PACKAGE ( symbol_t t ) : CLASS ( t ), init_code ( 0 )
  {
    file_name = 0;
    literals = 0;
  }

  void
    PACKAGE::mark ()
  {
    CLASS::mark ();
    mark_thing ( literals );
    mark_thing ( file_name );
    mark_thing ( init_code );
  }

  int
    PACKAGE::add_literal ( const char *vs  )
  {
    size_t len = strlen ( vs );
    for ( int i = 0; i < literals->size (); i++  )
    {
      VALUE& v = ( *literals ) [ i ];
      if ( v.v_type == DT_STRING )
        if ( CSTR ( v.v.v_string ) == vs )
          return i;
    }

    return literals->push ( VALUE ( new STRING ( vs ) ) );
  }

  int
    PACKAGE::add_literal ( symbol_t vs  )
  {
    for ( int i = 0; i < literals->size (); i++  )
    {
      VALUE& v = ( *literals ) [ i ];
      if ( v.v_type == DT_SYMBOL && v.v.v_symbol == vs )
        return i;
    }

    VALUE v;
    v.set_symbol ( vs );
    return literals->push ( v );
  }

  int
    PACKAGE::add_literal ( const VALUE& vv  )
  {
    for ( int i = 0; i < literals->size (); i++  )
    {
      VALUE& v = ( *literals ) [ i ];
      if ( vv == v )
        return i;
    }

    return literals->push ( vv );
  }

  bool
    PACKAGE::has_reference_to ( symbol_t package_symbol )
  {
    for ( int i = 0; i < literals->size (); i++  )
    {
      VALUE& v = ( *literals ) [ i ];
      if ( v.v_type == DT_CLASS &&
           v.v.v_class->get_package ()  == 0 && // this is a package
           v.v.v_class->name == package_symbol  )
        return true;
    }
    return false;
  }

};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美肥胖老妇做爰| 色综合色狠狠综合色| 日韩欧美国产精品一区| 久久综合综合久久综合| 日韩欧美中文字幕精品| 激情五月播播久久久精品| 久久理论电影网| 成人在线一区二区三区| 依依成人精品视频| 4438成人网| 国产一区二区日韩精品| 国产精品美日韩| 91福利在线观看| 日韩二区三区四区| 日本一区二区成人在线| 91日韩精品一区| 免费观看91视频大全| 久久精品一级爱片| 日本乱码高清不卡字幕| 麻豆精品在线播放| 中文字幕一区三区| 在线不卡一区二区| 成人app在线观看| 五月开心婷婷久久| 久久综合久久综合亚洲| 在线观看视频91| 激情综合色综合久久综合| 国产精品家庭影院| 欧美一区二区视频在线观看2020| 成熟亚洲日本毛茸茸凸凹| 亚洲最大成人综合| 国产情人综合久久777777| 欧美性大战久久久久久久| 国产麻豆视频精品| 亚洲bt欧美bt精品| 久久精品国产一区二区三区免费看| 久久精品人人做人人综合| 在线精品国精品国产尤物884a| 九色综合狠狠综合久久| 亚洲一区二区三区小说| 国产午夜亚洲精品羞羞网站| 7878成人国产在线观看| 国产米奇在线777精品观看| 国产欧美一区二区三区沐欲| 欧美日韩卡一卡二| a级精品国产片在线观看| 精品一区二区在线播放| 一区二区三区鲁丝不卡| 欧美国产1区2区| 精品国产精品网麻豆系列| 欧美私模裸体表演在线观看| 成人蜜臀av电影| 久久国产精品72免费观看| 亚洲综合一区二区精品导航| 国产欧美日韩在线| 日韩免费视频线观看| 在线观看免费亚洲| 99天天综合性| 国产夫妻精品视频| 国产一区二区在线视频| 日韩黄色一级片| 亚洲国产三级在线| 亚洲欧美日韩人成在线播放| 久久久三级国产网站| 日韩欧美在线一区二区三区| 欧美日韩一区二区三区视频| 91国在线观看| 日本久久一区二区三区| 色老头久久综合| 91网上在线视频| 99久久久免费精品国产一区二区| 国产成人aaa| 国产成人免费在线视频| 国产一区二区三区免费看| 免费高清不卡av| 捆绑调教美女网站视频一区| 日本不卡1234视频| 日韩和欧美的一区| 日韩av不卡在线观看| 视频在线观看一区| 奇米影视一区二区三区| 男人的j进女人的j一区| 免费观看30秒视频久久| 精品一区二区三区久久| 国产一区二区影院| 国产精品1024久久| 不卡视频免费播放| 91在线免费看| 欧美视频中文字幕| 欧美电影影音先锋| 日韩欧美激情一区| 国产亚洲一区二区三区| 国产精品激情偷乱一区二区∴| 18涩涩午夜精品.www| 亚洲制服欧美中文字幕中文字幕| 亚洲一二三四区| 免费xxxx性欧美18vr| 精品在线视频一区| 丁香五精品蜜臀久久久久99网站| 成人午夜又粗又硬又大| 色哟哟欧美精品| 欧美日韩国产综合久久| 欧美一级久久久久久久大片| 精品福利视频一区二区三区| 中文字幕国产一区| 亚洲一区欧美一区| 日本亚洲免费观看| 国产91精品露脸国语对白| 色婷婷久久99综合精品jk白丝 | 欧美精品一二三| 337p日本欧洲亚洲大胆精品| 国产精品成人网| 图片区小说区国产精品视频| 紧缚捆绑精品一区二区| 色婷婷综合久久久中文字幕| 在线不卡一区二区| 国产精品三级电影| 热久久免费视频| 国产成人精品1024| 欧美日韩日日夜夜| 中文字幕高清一区| 日本不卡视频在线| 色综合久久久久综合99| 日韩精品一区在线观看| 亚洲精品菠萝久久久久久久| 国产一区在线精品| 欧美日韩国产首页| 国产精品日韩成人| 蜜臀av性久久久久蜜臀av麻豆| 成人精品亚洲人成在线| 91精品国产欧美一区二区18| 中文字幕一区二区三区不卡| 麻豆精品视频在线观看免费| 色综合久久久网| 国产日韩欧美激情| 日本系列欧美系列| 日本精品视频一区二区三区| 国产欧美日韩久久| 奇米综合一区二区三区精品视频| 91激情五月电影| 中文字幕欧美三区| 韩国成人精品a∨在线观看| 欧美人成免费网站| 亚洲美女在线国产| 成人免费观看av| 久久老女人爱爱| 韩国精品在线观看| 日韩午夜电影av| 日欧美一区二区| 欧美最新大片在线看 | 欧美zozozo| 亚洲成av人**亚洲成av**| 波多野结衣在线一区| 久久奇米777| 精品一区二区三区在线观看| 欧美精品粉嫩高潮一区二区| 亚洲国产成人av网| 欧美艳星brazzers| 一区二区三区**美女毛片| 色哟哟一区二区在线观看| 亚洲天堂av老司机| 成人精品一区二区三区四区 | 91美女在线视频| 国产精品美女www爽爽爽| 国产精品中文字幕日韩精品| 欧美va在线播放| 久久国产人妖系列| 精品裸体舞一区二区三区| 久久99在线观看| 欧美精品一区二区精品网| 国产在线视频精品一区| 久久久久99精品一区| 国产精品一二三在| 国产精品三级久久久久三级| gogogo免费视频观看亚洲一| 一色屋精品亚洲香蕉网站| 色综合久久99| 亚洲图片欧美视频| 欧美精品在欧美一区二区少妇| 日韩高清一区在线| 欧美精品一区二区三区蜜桃| 国产美女一区二区三区| 国产嫩草影院久久久久| 99久久国产综合精品色伊| 一区二区成人在线| 91精品国产综合久久久蜜臀图片| 久久aⅴ国产欧美74aaa| 国产精品视频免费| 久久综合久久鬼色| 国产精品亚洲а∨天堂免在线| 久久久久久影视| 成人av网站免费观看| 亚洲精品国产一区二区三区四区在线| 欧美专区日韩专区| 蜜桃一区二区三区四区| 久久人人爽爽爽人久久久| 色婷婷综合中文久久一本| 美女视频网站久久| 国产精品―色哟哟| 欧美视频在线观看一区|