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

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

?? c-smile-ni.cpp

?? c-smile 一個語法類似與JS 又有點像C++的 編譯器
?? CPP
字號:
#include "c-smile.h"
#include "../c-smile-ni.h"
#include "vm.h"
#include "rtl.h"

namespace c_smile_ni {

using namespace c_smile;

inline cs_value niv(const VALUE& V) 
{
  const cs_value *pv = (const cs_value *)&V; 
  return *pv;
}

inline VALUE& V(cs_value& v) 
{
  VALUE *pv = (VALUE *)&v; 
  return *pv;
}



#define BM_OBJECT_MASK 0x2000000
#define BM_CLASS_MASK  0x1000000
#define BM_MASK        0x3000000

#define BM_INDEX_MASK   0xFFFFFF

//|
//| true if this bookmark is index of the field in instance
//|
inline bool bm_is_object_field(cs_bookmark bm)
{
  return (BM_MASK & bm) == BM_OBJECT_MASK;
}
inline bool bm_is_class_field(cs_bookmark bm)
{
  return (BM_MASK & bm) == BM_CLASS_MASK;
}
//|
//| index of the field in instance or index of the variable in class
//|
inline unsigned int bm_index(cs_bookmark bm)
{
  return (BM_INDEX_MASK & bm);
}

int	CSNICALL get_version() 
{
  return C_SMILE_VERSION_1_0;
}

cs_symbol CSNICALL get_symbol(const char* name)
{
  return VM::voc[name];
}

const char* CSNICALL get_symbol_name(cs_symbol symbol) 
{
  return VM::voc[symbol];
}

cs_type CSNICALL get_value_type(const cs_value* val)
{
  return (cs_type) ((const VALUE *)val)->v_type; 
}

int CSNICALL get_int(const cs_value* val)
{
  return int(*const_cast<VALUE *>((const VALUE *)val)); 
}

double CSNICALL get_float(const cs_value* val)
{
  return double(*const_cast<VALUE *>((const VALUE *)val));  
}


cs_value CSNICALL null_value() 
{
  return niv(VM::null); 
}

cs_value CSNICALL int_value(int i) 
{
  return niv(VALUE(i)); 
}

cs_value CSNICALL float_value(double f)
{
  return niv(VALUE(f)); 
}

cs_value CSNICALL get_var(cs_value object, cs_bookmark bookmark) 
{
  VALUE me = V(object); 
  if(bm_is_object_field(bookmark))
  {
    if( me.is_object() ) 
        return niv(me.v.v_object->get(bm_index(bookmark)));   
    assert(0);
    VM::error("value is an object but bookmark is not."); 
  }
  else if(bm_is_class_field(bookmark))
  {
    unsigned int idx = bm_index(bookmark);
    if( me.is_object() ) 
        return niv(me.v.v_object->get_class()->get(idx));   
    else if( me.is_class() ) 
        return niv(me.v.v_class->get(idx));   
    assert(0);
    VM::error("bookmark is class var reference but value is neither object nor klass."); 
  }
  return niv(VM::null); 
}
void CSNICALL set_var(cs_value object, cs_bookmark bookmark, cs_value value)
{
  VALUE val = V(value); 
  VALUE me = V(object); 
  if(bm_is_object_field(bookmark))
  {
    if( me.is_object() ) { me.v.v_object->set(bm_index(bookmark),val); return; }
    //assert(0);
    VM::error("value is an object but bookmark is not."); 
  }
  else if(bm_is_class_field(bookmark))
  {
    unsigned int idx = bm_index(bookmark);
    if( me.is_object() )  
        { me.v.v_object->get_class()->set(idx,val); return; }  
    else if( me.is_class() ) 
        { me.v.v_class->set(idx,val); return; }  
    //assert(0);
    VM::error("bookmark is class var reference but value is neither object nor klass."); 
  }
  assert(0); // invalid bookmark given
}

void*  CSNICALL  get_object_tag(cs_value    object) 
{
  if(V(object).is_object()) return V(object).v.v_object->tag;  
  return 0;
}

void   CSNICALL  set_object_tag(cs_value    object, void *tag) 
{
  if(V(object).is_object()) V(object).v.v_object->tag = tag;  
  else assert(0);
}

cs_value CSNICALL create_object(cs_value klass,void *tag, int argn, cs_value *argv)
{
  if(!V(klass).is_class())
    VM::error("'klass' is type of %s", nameoftype(V(klass).v_type));
  
  CLASS *cls = V(klass).v.v_class;

  if(argn != cls->instance_size) 
    VM::error("class '%s' has %d instance size, but %d values provided", (const char *)cls->full_name(), cls->instance_size, argn );

  VALUE instance = cls->create_instance(); 
  assert(instance.v.v_object);

  VALUE *pv = &instance.v.v_object->members[0]; 

  for(int i = 0; i < argn; i++)  *pv++ = V(*argv++);
  instance.v.v_object->tag = tag;

  return niv(instance);
    
}

cs_value CSNICALL class_of_object(cs_value object)
{
  VALUE val = V(object); 
  if(val.is_thing())
    return niv(VALUE(val.v.v_thing->get_class()));  
  return null_value();
} 

bool CSNICALL is_instance_of(cs_value object, cs_value klass)
{
  if( !V(object).is_thing()) return false;
  if( !V(klass).is_class()) return false;
  return V(object).v.v_thing->instance_of(V(klass).v.v_class);
} 

cs_value CSNICALL new_string ( const char *chars, int nchars )
{
  tool::string str(chars,nchars);
  return niv(VALUE(new STRING(str)));
}
 
const char * CSNICALL get_string_chars ( cs_value str )
{
  if(V(str).is_string())
    return (const char *) V(str).v.v_string->cstr() ;  
  return 0;
}
int CSNICALL get_string_length ( cs_value str ) 
{
  if(V(str).is_string())
    return V(str).v.v_string->size();  
  return 0;
}

cs_value    CSNICALL  new_array ( int argn, cs_value* argv) 
{
  ARRAY *arr = new ARRAY(argn);
  for(int i = 0; i < argn; i++)
    (*arr)[i] = V(argv[i]);
  return niv(VALUE(arr));
}
int         CSNICALL  get_array_elems ( cs_value arr, cs_value** elements) 
{
  if(V(arr).is_array())
  {
    int sz = V(arr).v.v_vector->size();
    if(sz && elements) {
      *elements =  (cs_value*) &(*V(arr).v.v_vector)[0];
      return sz;
    }
  }
  return 0;  
}

c_smile_vm* CSNICALL get_current_vm()
{
  assert(0); // N/I
  return 0;
} 
c_smile_vm* CSNICALL create_new_vm(int stack_size)
{
  assert(0); // N/I
  return 0;
} 
	
cs_value	CSNICALL  find_class(const char* name)
{
  assert(0); // N/I
  return niv(VM::undefined);
}


cs_value CSNICALL define_class(const char* name) 
{
  string pname(name);
  int pos;
  if( (pos = pname.index_of("::")) >= 0 ) // package::class name
  {
    string cname = pname.substr(pos + 2); 
    pname = pname.substr(0,pos); 
    VALUE pkg = VM::packages->find_value(VM::voc[pname]);   
    if(pkg.is_class()) {
      CLASS *cls = new CLASS(cname,0, ( PACKAGE* )pkg.v.v_class );
      VALUE r(cls); 
      return niv(r);      
    }
    VM::error("package %s not found",(const char *)pname);
  }
  else //just package name
  {
    PACKAGE *pkg = new PACKAGE(pname);
    if(!VM::add_package(pkg))
      VM::error("package %s already exists",(const char *)pname);
    VALUE r((CLASS *)pkg); 
    return niv(r);
  }
  return niv(VM::undefined); 
}

cs_bookmark	CSNICALL define_member(cs_value klass, const char* name, cs_member_type type, cs_value value)
{
   if(V(klass).is_class()) 
   {
      CLASS *cls = V(klass).v.v_class;
      switch(type) 
      {
        case ST_CLASS:
        case ST_FUNCTION:
        case ST_SFUNCTION:
        case ST_PROPERTY:
        case ST_SPROPERTY:
          assert(0); // not valid path
          break;
        case ST_DATA:
          return cls->add_data(name,VM::undefined) | BM_OBJECT_MASK; 
        case ST_SDATA:
          return cls->add_static_data(name,V(value)) | BM_CLASS_MASK; 
        case ST_CONST:
          return cls->add_static_data(name,V(value)) | BM_CLASS_MASK; 
      }
   }
   return 0;
}

cs_bookmark CSNICALL define_function(cs_value klass, const char* name, cs_member_type type, cs_function value)
{
   if(V(klass).is_class()) 
   {
      CLASS *cls = V(klass).v.v_class;
      switch(type) 
      {
        case ST_CLASS:
        case ST_DATA:
        case ST_SDATA:
        case ST_CONST:
          assert(0); // not valid path
          break;
        case ST_FUNCTION:
          return cls->add_function(name, (BUILTIN_FUNC *)value ) | BM_CLASS_MASK; 
        case ST_SFUNCTION:
          return cls->add_static_function(name, (BUILTIN_FUNC *)value ) | BM_CLASS_MASK; 
        case ST_PROPERTY:
          return cls->add_property(name, (BUILTIN_FUNC *)value ) | BM_CLASS_MASK; 
        case ST_SPROPERTY:
          return cls->add_static_property(name, (BUILTIN_FUNC *)value ) | BM_CLASS_MASK; 
      }
   }
   return 0;
}

void CSNICALL throw_error(cs_value err) 
{
  VM::throw_error(V(err));
}

struct c_smile_interface cs_interface =  
{
	get_version,
  get_symbol,
  get_symbol_name,
  
  get_value_type,
  get_int,
  get_float,

  null_value, 
  int_value,
  float_value, 
  
  get_var,
  set_var,

  get_object_tag,
  set_object_tag,

  create_object,
  class_of_object,
  is_instance_of,

  new_string,
  get_string_chars,
  get_string_length,

  new_array,
  get_array_elems,

  get_current_vm, 
  create_new_vm,
	
	find_class,

  define_class,
  define_member,
  define_function,

  throw_error

} ;


};


bool load_ni_extension(const char *dl_path) 
{

  // Get a handle to the DLL module.
#ifdef _WIN32
  HINSTANCE hinstLib = ::LoadLibrary(dl_path);  
#else
  void* hinstLib = ::dlopen ( dl_path, RTLD_LAZY );
#endif
  c_smile_ni_attach_t proc_addr; 
 
  // If the handle is valid, try to get the function address.
  if (hinstLib) 
  { 
#ifdef _WIN32
      // try canonical form
      proc_addr = (c_smile_ni_attach_t) GetProcAddress(hinstLib, "c_smile_ni_attach"); 
      if( !proc_addr ) // try mangled
        proc_addr = (c_smile_ni_attach_t) GetProcAddress(hinstLib, "_c_smile_ni_attach@4"); 
#else
      proc_addr = (c_smile_ni_attach_t) ::dlsym ( hinstLib, "c_smile_ni_attach" );
#endif
      // If the function address is valid, call the function.
      if (proc_addr) 
       {
          return (*proc_addr)(&c_smile_ni::cs_interface); 
       }
      // Free the DLL module.
#ifdef _WIN32
	::FreeLibrary(hinstLib); 
#else
	::dlclose ( hinstLib );
#endif
  } 
   // If unable to call the DLL function, use an alternative.
  return false;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看亚洲精品| av福利精品导航| 精品sm捆绑视频| 国产东北露脸精品视频| 一区二区三区在线观看欧美| 欧美日韩成人在线| 成人高清视频在线| 免费观看日韩电影| 亚洲国产日日夜夜| 亚洲欧美怡红院| 精品国产乱码久久久久久夜甘婷婷 | 欧美韩日一区二区三区四区| 国产ts人妖一区二区| 久久精品国产77777蜜臀| 日韩电影在线一区| 国内精品视频666| 夜夜揉揉日日人人青青一国产精品| 欧美电影免费提供在线观看| 91在线丨porny丨国产| 久久99精品国产.久久久久久| 欧美又粗又大又爽| 国产一区二区三区四| 视频一区欧美精品| 一区二区免费在线播放| 亚洲影视在线观看| 亚洲精品日产精品乱码不卡| 久久精品一二三| 精品国产凹凸成av人导航| 国产欧美一区二区精品久导航| 欧美一区二区在线免费播放| 欧美日韩一区久久| 91久久一区二区| 色婷婷综合久久久中文一区二区| 国产凹凸在线观看一区二区| 欧美视频精品在线观看| 日韩免费视频一区| 亚洲综合久久久久| 国产精品一区二区久激情瑜伽 | 97精品久久久午夜一区二区三区| 在线精品视频一区二区| 久久综合av免费| 中文字幕免费一区| 日韩激情中文字幕| 95精品视频在线| 久久久三级国产网站| 欧美激情一区二区| 日韩成人午夜电影| 欧美曰成人黄网| 国产精品国产三级国产有无不卡| 国产精品久久久久三级| 美女www一区二区| 国产iv一区二区三区| 欧美日韩国产色站一区二区三区| 国产精品视频第一区| 亚洲欧美欧美一区二区三区| 亚洲国产一区二区视频| 成人av影视在线观看| 精品国产自在久精品国产| 青青草国产成人av片免费| 在线观看日韩毛片| 樱桃视频在线观看一区| 99re这里都是精品| 国产精品久久久99| 国产不卡视频一区| 中文av一区特黄| 国产精品一区一区三区| 久久亚洲一区二区三区四区| 热久久久久久久| 日韩视频一区二区| 中文字幕一区视频| 成人av网址在线观看| 国产亚洲精品bt天堂精选| 激情久久久久久久久久久久久久久久| 欧美三级三级三级| 丝袜国产日韩另类美女| 91麻豆精品久久久久蜜臀| 国产精品卡一卡二卡三| 国产成人av福利| 国产网站一区二区三区| 成人综合日日夜夜| 91精品久久久久久久久99蜜臂| 亚洲sss视频在线视频| 国产不卡视频在线观看| 国产精品视频观看| 色综合久久久久综合体桃花网| 一区二区三国产精华液| 51久久夜色精品国产麻豆| 久久狠狠亚洲综合| 久久久久久久久久久久电影 | 国产夜色精品一区二区av| 国产乱对白刺激视频不卡| 国产欧美精品一区| 色综合久久66| 七七婷婷婷婷精品国产| 久久久99精品久久| 在线观看精品一区| 男女男精品网站| 国产精品人成在线观看免费| 99久久精品国产麻豆演员表| 亚洲国产精品影院| 国产三级一区二区三区| 色狠狠桃花综合| 精品一区二区在线观看| 综合色天天鬼久久鬼色| 成人一级视频在线观看| 亚洲bt欧美bt精品777| 久久久久久久网| 欧美日韩专区在线| 国产九色sp调教91| 五月综合激情婷婷六月色窝| 欧美日韩国产天堂| 国产suv精品一区二区6| 日韩 欧美一区二区三区| 国产视频视频一区| 8v天堂国产在线一区二区| 粉嫩绯色av一区二区在线观看| 亚洲最大色网站| 国产精品三级视频| 精品成人免费观看| 欧美日韩黄色一区二区| 99视频超级精品| 精品无码三级在线观看视频| 亚洲激情男女视频| 国产欧美日韩在线视频| 91精品国产综合久久婷婷香蕉| 99久久国产综合精品女不卡| 狠狠色丁香久久婷婷综合丁香| 亚洲自拍与偷拍| 亚洲视频免费在线| 国产日韩v精品一区二区| 欧美成人一级视频| 成人免费视频国产在线观看| 久久精品噜噜噜成人av农村| 亚洲综合丝袜美腿| 亚洲欧美国产高清| 亚洲欧洲精品一区二区三区| 精品国产电影一区二区| 欧美一卡2卡3卡4卡| 欧美日韩成人在线| 欧美午夜一区二区三区 | 日韩二区三区四区| 香蕉影视欧美成人| 亚洲不卡一区二区三区| 亚洲大片在线观看| 亚洲国产精品一区二区久久恐怖片| 中文字幕在线一区| 国产精品久久久久久久久免费相片| 久久久亚洲精华液精华液精华液 | 国产精品福利av| 中文字幕久久午夜不卡| 欧美国产日韩精品免费观看| 国产亚洲美州欧州综合国| 欧美激情在线看| 国产女人18毛片水真多成人如厕| 国产日韩欧美高清在线| 国产精品三级av| 一区二区三区免费| 日韩精品五月天| 国产在线播放一区| 成人免费的视频| 欧洲激情一区二区| 91精品麻豆日日躁夜夜躁| 精品av综合导航| 中文字幕一区二区三区不卡| 亚洲精品国产无天堂网2021 | 国内精品国产成人国产三级粉色| 久久精品噜噜噜成人88aⅴ| 国产精品一区免费在线观看| av在线不卡电影| 欧美性xxxxxxxx| 久久只精品国产| 亚洲靠逼com| 美女性感视频久久| 成人99免费视频| 日韩一区国产二区欧美三区| 亚洲精品在线网站| 中文字幕在线免费不卡| 日韩高清一级片| 成人app网站| 日韩欧美三级在线| 一区精品在线播放| 日本欧洲一区二区| av资源网一区| 欧美电影免费观看高清完整版在| 国产精品网曝门| 日本91福利区| 色综合欧美在线| 国产亚洲欧美在线| 午夜精品福利一区二区三区av | 自拍视频在线观看一区二区| 亚洲综合一区二区精品导航| 极品少妇一区二区三区精品视频| 国产91精品免费| 日韩欧美在线综合网| 国产精品国产a| 国产一区欧美日韩| 欧美日韩美少妇| 伊人婷婷欧美激情| 国产传媒欧美日韩成人| 精品少妇一区二区三区免费观看|