static SQRESULT sq_mysql_constructor(HSQUIRRELVM v) { SQ_FUNC_VARS(v); SQ_GET_STRING(v, 2, host); SQ_GET_STRING(v, 3, username); SQ_GET_STRING(v, 4, password); SQ_GET_STRING(v, 5, sourcename); SQ_OPT_INTEGER(v, 6, port, 3306); SQ_OPT_STRING(v, 7, sockname, NULL); SQ_OPT_INTEGER(v, 8, optflags, 0); MYSQL *self=0; if(load_libmysqlclient(dynamicLibName)) { self = dlmysql_init(NULL); if (!self) return sq_throwerror(v, _SC("error connecting: Out of memory.")); if (!dlmysql_real_connect(self, host, username, password, sourcename, port, sockname, optflags)) { SQRESULT res = sq_throwerror(v, _SC("error connecting to database. MySQL: %s"), dlmysql_error(self)); dlmysql_close (self); /* Close conn if connect failed */ return res; } } else return sq_throwerror(v, _SC("Failed to load libmysqlclient !")); sq_setinstanceup(v, 1, self); sq_setreleasehook(v,1, sq_mysql_releasehook); //save a weakref to allow statement return it's db sq_pushuserpointer(v, self); sq_weakref(v, 1); sq_setonregistrytable(v); return 1; }
int SquirrelScriptContext::SquirrelClassConstructorCallback(HSQUIRRELVM vm) { MultiScriptAssert( sq_gettype(vm, -1) == OT_USERPOINTER ); // Get class info void* userPtr = NULL; sq_getuserpointer(vm, -1, &userPtr); sq_pop(vm, 1); SquirrelClassInfo* classInfo = (SquirrelClassInfo*) userPtr; // Construct object SquirrelScriptObject* scriptObject = new SquirrelScriptObject(); scriptObject->m_classInfo = classInfo; SquirrelScriptStack stack(classInfo->m_context, false); classInfo->m_desc->m_constructor(&stack, scriptObject); MultiScriptAssert( scriptObject->m_objectPtr ); MultiScriptAssert( stack.m_numPushed == 0 ); // There is already an instance on the stack (pushed automatically when constructor was invoked from script) // Attach our object to created instance sq_setinstanceup(vm, -1, scriptObject); // Set garbage collection callback for this instance sq_setreleasehook(vm, -1, SquirrelClassGCCallback); return 0; }
static SQRESULT sq_mysql_exec_query(HSQUIRRELVM v){ SQ_FUNC_VARS_NO_TOP(v); GET_mysql_INSTANCE(); SQ_GET_STRING(v, 2, szSQL); if (dlmysql_real_query(self, szSQL, szSQL_size)) /* error executing query */ return sq_throwerror(v, _SC("error executing query. MySQL: %s"), dlmysql_error(self)); MYSQL_RES *qres = dlmysql_store_result(self); sq_pushroottable(v); sq_pushstring(v, MySQL_Result_TAG, -1); if(sq_get(v, -2) == SQ_OK){ if(sq_createinstance(v, -1) == SQ_OK){ sq_setinstanceup(v, -1, qres); sq_setreleasehook(v, -1, sq_mysql_result_releasehook); sq_pushstring(v, _curr_row_key, -1); sq_pushinteger(v, -1); sq_set(v, -3); return 1; } } return SQ_ERROR; }
/* * create a instance */ SQInteger createSQObject(HSQUIRRELVM v, const char* package_name, const char* name, SQUserPointer ptr, SQRELEASEHOOK releaseHook) { sq_pushroottable(v); sq_pushstring(v, package_name, -1); if (!SQ_SUCCEEDED(sq_get(v, -2))) { sq_pop(v, 1); return 0; } if (name != NULL) { sq_pushstring(v, name, -1); if (!SQ_SUCCEEDED(sq_get(v, -2))) { sq_pop(v, 2); return 0; } } sq_createinstance(v, -1); sq_setinstanceup(v, -1, ptr); if (releaseHook != NULL) { sq_setreleasehook(v, -1, releaseHook); } sq_remove(v, -2); sq_remove(v, -2); return 1; }
static SQInteger _file_constructor(HSQUIRRELVM v) { const SQChar *filename,*mode; bool owns = true; SQFile *f; SQFILE newf; if(sq_gettype(v,2) == OT_STRING && sq_gettype(v,3) == OT_STRING) { sq_getstring(v, 2, &filename); sq_getstring(v, 3, &mode); newf = sqstd_fopen(filename, mode); if(!newf) return sq_throwerror(v, _SC("cannot open file")); } else if(sq_gettype(v,2) == OT_USERPOINTER) { owns = !(sq_gettype(v,3) == OT_NULL); sq_getuserpointer(v,2,&newf); } else { return sq_throwerror(v,_SC("wrong parameter")); } f = new SQFile(newf,owns); if(SQ_FAILED(sq_setinstanceup(v,1,f))) { delete f; return sq_throwerror(v, _SC("cannot create blob with negative size")); } sq_setreleasehook(v,1,_file_releasehook); return 0; }
// // Transport.Position class // SQInteger TransportPositionPush(HSQUIRRELVM vm, TimePosition *obj) { sq_pushobject(vm, TransportPositionObject); sq_createinstance(vm, -1); sq_remove(vm, -2); sq_setinstanceup(vm, -1, new TimePosition(*obj)); sq_setreleasehook(vm, -1, &TransportPositionRelease); }
static SQRESULT sq_BitVector_constructor(HSQUIRRELVM v){ SQ_FUNC_VARS_NO_TOP(v); SQ_GET_INTEGER(v, 2, int_size); // Bitvec *sqlite3BitvecCreate(u32) Bitvec *bv = sqlite3BitvecCreate((u32)int_size); SQInteger rc = sq_setinstanceup(v, 1, bv); sq_setreleasehook(v,1, BitVector_release_hook); return rc; }
static SQInteger _regexp_constructor( HSQUIRRELVM v ) { const SQChar *error, *pattern; sq_getstring( v, 2, &pattern ); SQRex *rex = sqstd_rex_compile( pattern, &error ); if ( !rex ) return sq_throwerror( v, error ); sq_setinstanceup( v, 1, rex ); sq_setreleasehook( v, 1, _rexobj_releasehook ); return 0; }
SQInteger cross(HSQUIRRELVM v){ T * lhs,* rhs; sq_getinstanceup(v,2,(SQUserPointer*)&lhs, 0); sq_getinstanceup(v,3,(SQUserPointer*)&rhs, 0); T * instance = new T( glm::cross(*lhs,*rhs) ); sq_setinstanceup(v, 3, instance); sq_setreleasehook(v,3, delete_instance<T>); return 1; }
SQInteger TransportTimeSignatureClone(HSQUIRRELVM vm) { // get instance ptr of original SQUserPointer userPtr; sq_getinstanceup(vm, 2, &userPtr, 0); // set instance ptr to a copy sq_setinstanceup(vm, 1, new TimeSignature(*(TimeSignature*)userPtr)); sq_setreleasehook(vm, 1, &TransportTimeSignatureRelease); return 0; }
SQInteger constructor<glm::vec2>(HSQUIRRELVM v){ SQChar const * key; sq_getstring(v,2,(SQChar const**)&key); SQFloat x,y; SQInteger error = 0; error = with_assert_sq_getfloat(v,2,x);if(error) return error; error = with_assert_sq_getfloat(v,3,y);if(error) return error; glm::vec2 * instance = new glm::vec2(x,y); sq_setinstanceup(v, 1, instance); sq_setreleasehook(v,1, delete_instance<glm::vec2>); return 0; }
void CSquirrelVM::SetClassInstance(const char* szClassName, void * pInstance) { sq_setinstanceup(m_pVM, 1, (SQUserPointer *) pInstance); sq_setreleasehook(m_pVM, 1, deleteClassInstance); HSQOBJECT instance; sq_resetobject(&instance); sq_getstackobj(m_pVM, 1, &instance); sq_addref(m_pVM, &instance); m_Instances.insert(std::pair<void*, HSQOBJECT>(pInstance, instance)); }
SQInteger div_v(HSQUIRRELVM v) { SQChar const * buff; sq_getstring(v,2,(SQChar const**)&buff); T* lhs; sq_getinstanceup(v,1,(SQUserPointer*)&lhs, 0); T* rhs; sq_getinstanceup(v,2,(SQUserPointer*)&rhs, 0); T * instance = new T(*lhs / *rhs); sq_setinstanceup(v, 2, instance); sq_setreleasehook(v,2, delete_instance<T>); return 1; }
static SQRESULT sq_minizip_unzip_constructor(HSQUIRRELVM v) { SQ_FUNC_VARS_NO_TOP(v); SQ_GET_STRING(v, 2, zip_fname); unzFile zip_archive = unzOpen64(zip_fname); if(!zip_archive) { return sq_throwerror(v, _SC("Cannot open %s\n"),zip_fname); } sq_setinstanceup(v, 1, zip_archive); sq_setreleasehook(v,1, sq_minizip_unzip_releasehook); return 1; }
static SQRESULT sq_ssl_ctx_constructor(HSQUIRRELVM v) { SQInteger options, num_sessions; sq_getinteger(v, 2, &options); sq_getinteger(v, 3, &num_sessions); SSL_CTX *ssl_ctx = ssl_ctx_new(options, num_sessions); if(!ssl_ctx) return sq_throwerror(v, _SC("Could'nt create an ssl context.")); sq_setinstanceup(v, 1, ssl_ctx); sq_setreleasehook(v,1, ssl_ctx_release_hook); return 1; }
static SQRESULT sq_libclang_constructor(HSQUIRRELVM v) { //SQ_FUNC_VARS_NO_TOP(v); if(!load_dynamicLib(dynamicLibName)) return sq_throwerror(v, _SC("Failed to load libclang !")); MyLibClang *self = (MyLibClang *)sq_malloc(sizeof(MyLibClang)); memset(self, 0, sizeof(MyLibClang)); self->v = v; self->index = dlclang_createIndex(0, 0); sq_setinstanceup(v, 1, self); sq_setreleasehook(v,1, sq_libclang_releasehook); return 1; }
inline SQInteger DefSQConstructorCallback(HSQUIRRELVM vm) { /* Find the amount of params we got */ int nparam = sq_gettop(vm); try { /* Create the real instance */ Tcls *instance = HelperT<Tmethod>::SQConstruct((Tcls *)NULL, (Tmethod)NULL, vm); sq_setinstanceup(vm, -Tnparam, instance); sq_setreleasehook(vm, -Tnparam, DefSQDestructorCallback<Tcls>); instance->AddRef(); return 0; } catch (SQInteger e) { sq_pop(vm, nparam); return e; } }
static SQRESULT ssl_constructor(HSQUIRRELVM v, SSL *ssl, int free_on_gc) { if(!ssl) return sq_throwerror(v, _SC("Could'nt create an ssl object.")); sq_pushstring(v, SQ_LIBNAME, -1); if(sq_getonroottable(v) == SQ_OK){ sq_pushstring(v, ssl_NAME, -1); if(sq_get(v, -2) == SQ_OK){ if(sq_createinstance(v, -1) == SQ_OK){ sq_setinstanceup(v, -1, ssl); if(free_on_gc) sq_setreleasehook(v,-1, ssl_release_hook); return 1; } } } return SQ_ERROR; }
SQInteger TransportPositionCtor(HSQUIRRELVM vm) { SQInteger numargs = sq_gettop(vm); // check parameter count if(numargs > 4) { return sq_throwerror(vm, "too many parameters, expected at most 3"); } if(numargs < 4) { return sq_throwerror(vm, "insufficient parameters, expected at least 3"); } // get parameter 1 "bar" as integer SQInteger bar; if (SQ_FAILED(sq_getinteger(vm, 2, &bar))){ return sq_throwerror(vm, "argument 1 \"bar\" is not of type integer"); } // get parameter 2 "position" as integer SQInteger position; if (SQ_FAILED(sq_getinteger(vm, 3, &position))){ return sq_throwerror(vm, "argument 2 \"position\" is not of type integer"); } // get parameter 3 "division" as integer SQInteger division; if (SQ_FAILED(sq_getinteger(vm, 4, &division))){ return sq_throwerror(vm, "argument 3 \"division\" is not of type integer"); } TimePosition *obj; // call the implementation try { obj = new TimePosition(bar, position, division); } catch(std::exception const& e) { return sq_throwerror(vm, e.what()); } // return pointer to new object sq_setinstanceup(vm, 1, (SQUserPointer*)obj); sq_setreleasehook(vm, 1, TransportPositionRelease); return 1; }
void CSquirrelVM::PushInstance(const char* szClassName, void * pInstance) { // TODO:: remove instances when they are destoryed if (m_Instances.find(pInstance) != m_Instances.end()) { sq_pushobject(m_pVM, m_Instances.find(pInstance)->second); } else { CreateConstructNativeClassInstance(m_pVM, szClassName); sq_setinstanceup(m_pVM, -1, (SQUserPointer *) pInstance); sq_setreleasehook(m_pVM, -1, deleteClassInstance); HSQOBJECT instance; sq_resetobject(&instance); sq_getstackobj(m_pVM, -1, &instance); sq_addref(m_pVM, &instance); m_Instances.insert(std::pair<void*, HSQOBJECT>(pInstance, instance)); } }
/** * TJSオブジェクトのコンストラクタ * 引数1 オブジェクト * 引数2〜 引数 * 自由変数1 TJSクラスオブジェクト */ SQRESULT TJSObject::tjsConstructor(HSQUIRRELVM v) { // クラスを生成する tTJSVariant tjsClassObj; if (SQ_SUCCEEDED(sq_getvariant(v, -1, &tjsClassObj)) && tjsClassObj.Type() == tvtObject) { FuncInfo info(v, tjsClassObj, 2); tTJSVariant variant; SQRESULT ret = info.create(variant); if (SQ_SUCCEEDED(ret)) { TJSObject *self = new TJSObject(v, 1, variant); if (SQ_SUCCEEDED(sq_setinstanceup(v, 1, self))) { sq_setreleasehook(v, 1, release); } else { delete self; } } return ret; } return ERROR_CREATE(v); }
bool CreateNativeClassInstance(HSQUIRRELVM v, const SQChar *classname, SQUserPointer ud, SQRELEASEHOOK hook) { // If we don't do this, SquirrelVM keeps an old pointer around and this // will be used by SquirrelObject. That crashes when using several VMs. int oldtop = sq_gettop(v); sq_pushroottable(v); sq_pushstring(v, classname, -1); if (SQ_FAILED(sq_rawget(v, -2))){ //Get the class (created with sq_newclass()). sq_settop(v, oldtop); return false; } //sq_pushroottable(v); if (SQ_FAILED(sq_createinstance(v, -1))) { sq_settop(v, oldtop); return false; } #ifdef SQ_USE_CLASS_INHERITANCE HSQOBJECT ho; sq_getstackobj(v, -1, &ho); // OT_INSTANCE SquirrelObject instance(ho); SqPlus::PopulateAncestry(v, instance, ud); #endif sq_remove(v, -3); //removes the root table sq_remove(v, -2); //removes the class if (SQ_FAILED(sq_setinstanceup(v, -1, ud))) { sq_settop(v, oldtop); return false; } sq_setreleasehook(v, -1, hook); return true; }
static SQRESULT sq_mysql_prepare(HSQUIRRELVM v){ SQ_FUNC_VARS_NO_TOP(v); GET_mysql_INSTANCE(); SQ_GET_STRING(v, 2, szSQL); MYSQL_STMT *stmt = dlmysql_stmt_init(self); if (!stmt) return sq_throwerror(v, _SC(" mysql_stmt_init(), out of memory\n")); if (dlmysql_stmt_prepare(stmt, szSQL, szSQL_size)) { SQRESULT res = sq_throwerror(v, dlmysql_stmt_error(stmt)); dlmysql_stmt_close(stmt); return res; } unsigned long expected_params = dlmysql_stmt_param_count(stmt); size_t bind_params_info_size = sizeof(MYSQL_BIND) * expected_params; size_t bind_params_data_size = sizeof(double) * expected_params; size_t bind_data_buffer_size = bind_params_info_size + bind_params_data_size; size_t st_mysq_stmt_size = sizeof(SQ_MysqlStatement) + bind_data_buffer_size; SQ_MysqlStatement *sq_stmt = (SQ_MysqlStatement*)sq_malloc(st_mysq_stmt_size); sq_stmt->stmt = stmt; sq_stmt->bind_data_buffer_size = bind_data_buffer_size; sq_stmt->param_count = expected_params; sq_stmt->bind_params_info = (MYSQL_BIND*)sq_stmt->bind_data_buffer; sq_stmt->bind_params_data = ((char*)sq_stmt->bind_params_info) + bind_params_info_size; sq_pushroottable(v); sq_pushstring(v, MySQL_Statement_TAG, -1); if(sq_get(v, -2) == SQ_OK){ if(sq_createinstance(v, -1) == SQ_OK){ sq_setinstanceup(v, -1, sq_stmt); sq_setreleasehook(v, -1, sq_mysql_statement_releasehook); return 1; } } return SQ_ERROR; }
BOOL SbuCreateNativeClassInstance(HSQUIRRELVM v,const SQChar *classname,SQUserPointer ud,SQRELEASEHOOK hook) { int oldtop = sq_gettop(v); sq_pushroottable(v); sq_pushstring(v,classname,-1); if(SQ_FAILED(sq_rawget(v,-2))){ sq_settop(v,oldtop); return FALSE; } //sq_pushroottable(v); if(SQ_FAILED(sq_createinstance(v,-1))) { sq_settop(v,oldtop); return FALSE; } sq_remove(v,-3); //removes the root table sq_remove(v,-2); //removes the the class if(SQ_FAILED(sq_setinstanceup(v,-1,ud))) { sq_settop(v,oldtop); return FALSE; } sq_setreleasehook(v,-1,hook); return TRUE; }
/* static */ bool Squirrel::CreateClassInstanceVM(HSQUIRRELVM vm, const char *class_name, void *real_instance, HSQOBJECT *instance, SQRELEASEHOOK release_hook) { int oldtop = sq_gettop(vm); /* First, find the class */ sq_pushroottable(vm); sq_pushstring(vm, OTTD2SQ(class_name), -1); if (SQ_FAILED(sq_get(vm, -2))) { DEBUG(misc, 0, "[squirrel] Failed to find class by the name '%s'", class_name); sq_settop(vm, oldtop); return false; } /* Create the instance */ if (SQ_FAILED(sq_createinstance(vm, -1))) { DEBUG(misc, 0, "[squirrel] Failed to create instance for class '%s'", class_name); sq_settop(vm, oldtop); return false; } if (instance != NULL) { /* Find our instance */ sq_getstackobj(vm, -1, instance); /* Add a reference to it, so it survives for ever */ sq_addref(vm, instance); } sq_remove(vm, -2); // Class-name sq_remove(vm, -2); // Root-table /* Store it in the class */ sq_setinstanceup(vm, -1, real_instance); if (release_hook != NULL) sq_setreleasehook(vm, -1, release_hook); if (instance != NULL) sq_settop(vm, oldtop); return true; }
SQInteger TransportTimeSignatureCtor(HSQUIRRELVM vm) { SQInteger numargs = sq_gettop(vm); // check parameter count if(numargs > 3) { return sq_throwerror(vm, "too many parameters, expected at most 2"); } if(numargs < 3) { return sq_throwerror(vm, "insufficient parameters, expected at least 2"); } // get parameter 1 "numerator" as integer SQInteger numerator; if (SQ_FAILED(sq_getinteger(vm, 2, &numerator))){ return sq_throwerror(vm, "argument 1 \"numerator\" is not of type integer"); } // get parameter 2 "denominator" as integer SQInteger denominator; if (SQ_FAILED(sq_getinteger(vm, 3, &denominator))){ return sq_throwerror(vm, "argument 2 \"denominator\" is not of type integer"); } TimeSignature *obj; // call the implementation try { obj = new TimeSignature(numerator, denominator); } catch(std::exception const& e) { return sq_throwerror(vm, e.what()); } // return pointer to new object sq_setinstanceup(vm, 1, (SQUserPointer*)obj); sq_setreleasehook(vm, 1, TransportTimeSignatureRelease); return 1; }
/* ** Creates a new SQuirrel vm. */ static SQRESULT sq_slave_vm_constructor (HSQUIRRELVM v) { SQ_FUNC_VARS(v); SQ_OPT_INTEGER(v, 2, stack_size, 1024); HSQUIRRELVM self = sq_open(stack_size); /* Initialize environment */ sq_setprintfunc(self,sq_getprintfunc(v),sq_geterrorfunc(v)); /* load base libraries */ sq_pushroottable(self); sqstd_register_bloblib(self); sqstd_register_iolib(self); sqstd_register_systemlib(self); sqstd_register_mathlib(self); sqstd_register_stringlib(self); sq_poptop(self); //remove root table sq_setinstanceup(v, 1, self); sq_setreleasehook(v, 1, sq_slave_vm_release_hook); return 1; }
SQInteger construct_RefCounted(IUnknown *p) { sq_setinstanceup(SquirrelVM::GetVMPtr(),1,p); sq_setreleasehook(SquirrelVM::GetVMPtr(),1,refcounted_release_hook); return 1; }
int construct_RefCounted(HSQUIRRELVM v,IUnknown *p) { sq_setinstanceup(v,1,p); sq_setreleasehook(v,1,refcounted_release_hook); return 1; }
/* static */ bool Squirrel::CreateClassInstanceVM(HSQUIRRELVM vm, const char *class_name, void *real_instance, HSQOBJECT *instance, SQRELEASEHOOK release_hook, bool prepend_API_name) { Squirrel *engine = (Squirrel *)sq_getforeignptr(vm); int oldtop = sq_gettop(vm); /* First, find the class */ sq_pushroottable(vm); if (prepend_API_name) { size_t len = strlen(class_name) + strlen(engine->GetAPIName()) + 1; char *class_name2 = (char *)alloca(len); seprintf(class_name2, class_name2 + len - 1, "%s%s", engine->GetAPIName(), class_name); sq_pushstring(vm, class_name2, -1); } else { sq_pushstring(vm, class_name, -1); } if (SQ_FAILED(sq_get(vm, -2))) { DEBUG(misc, 0, "[squirrel] Failed to find class by the name '%s%s'", prepend_API_name ? engine->GetAPIName() : "", class_name); sq_settop(vm, oldtop); return false; } /* Create the instance */ if (SQ_FAILED(sq_createinstance(vm, -1))) { DEBUG(misc, 0, "[squirrel] Failed to create instance for class '%s%s'", prepend_API_name ? engine->GetAPIName() : "", class_name); sq_settop(vm, oldtop); return false; } if (instance != NULL) { /* Find our instance */ sq_getstackobj(vm, -1, instance); /* Add a reference to it, so it survives for ever */ sq_addref(vm, instance); } sq_remove(vm, -2); // Class-name sq_remove(vm, -2); // Root-table /* Store it in the class */ sq_setinstanceup(vm, -1, real_instance); if (release_hook != NULL) sq_setreleasehook(vm, -1, release_hook); if (instance != NULL) sq_settop(vm, oldtop); return true; }