/* This defines a function that opens up your library. */ SQRESULT sqext_register_axtls (HSQUIRRELVM v) { //add a namespace axtls sq_pushstring(v, SQ_LIBNAME, -1); sq_newtable(v); sq_insert_reg_funcs(v, axtls_obj_funcs); //add constants KeyIntPtrType KeyIntPtr; for (KeyIntPtr = axtls_constants; KeyIntPtr->Str; KeyIntPtr++) { sq_pushstring(v, KeyIntPtr->Str, -1); //first the key sq_pushinteger(v, KeyIntPtr->Val); //then the value sq_newslot(v, -3, SQFalse); //store then } //now create the SSL Context class sq_pushstring(v,ssl_ctx_NAME,-1); sq_newclass(v,SQFalse); sq_settypetag(v,-1,(void*)SSL_CTX_Tag); sq_insert_reg_funcs(v, ssl_ctx_obj_funcs); sq_newslot(v,-3,SQFalse); //now create the SSL class sq_pushstring(v,ssl_NAME,-1); sq_newclass(v,SQFalse); sq_settypetag(v,-1,(void*)SSL_Tag); sq_insert_reg_funcs(v, ssl_obj_funcs); sq_newslot(v,-3,SQFalse); sq_newslot(v,-3,SQFalse); //add axtls table to the root table return SQ_OK; }
SQRESULT sqext_register_MySQL(HSQUIRRELVM v) { sq_pushstring(v,MySQL_TAG,-1); sq_newclass(v,SQFalse); sq_settypetag(v,-1,(void*)MySQL_TAG); sq_insert_reg_funcs(v, sq_mysql_methods); sq_newslot(v,-3,SQTrue); sq_pushstring(v,MySQL_Statement_TAG,-1); sq_newclass(v,SQFalse); sq_settypetag(v,-1,(void*)MySQL_Statement_TAG); sq_insert_reg_funcs(v, sq_mysql_statement_methods); sq_newslot(v,-3,SQTrue); sq_pushstring(v,MySQL_Result_TAG,-1); sq_newclass(v,SQFalse); sq_settypetag(v,-1,(void*)MySQL_Result_TAG); sq_insert_reg_funcs(v, sq_mysql_result_methods); sq_pushstring(v, _curr_row_key, -1); sq_pushnull(v); sq_newslot(v, -3, SQFalse); sq_newslot(v,-3,SQTrue); return 0; }
HSQOBJECT class_init(HSQUIRRELVM v,SQFUNCTION c,const SQChar * p_name) { HSQOBJECT class_id; sq_pushroottable(v); sq_pushstring(v,p_name,-1); sq_newclass(v,SQFalse); sq_getstackobj(v,-1,&class_id); sq_settypetag(v,-1,&class_id); HSQOBJECT string_constructor; sq_pushstring(v,_SC("constructor"),-1); sq_resetobject(&string_constructor); sq_getstackobj(v,-1,&string_constructor); sq_newclosure(v,c,0); sq_newslot(v,-3,false); sq_pushstring(v,_SC("_cloned"),-1); sq_newclosure(v,clone<T>,0); sq_newslot(v,-3,false); sq_newslot(v,-3,false); sq_pop(v,1); return class_id; }
void init_streamclass(HSQUIRRELVM v) { sq_pushregistrytable(v); sq_pushstring(v,_SC("std_stream"),-1); if(SQ_FAILED(sq_get(v,-2))) { sq_pushstring(v,_SC("std_stream"),-1); sq_newclass(v,SQFalse); sq_settypetag(v,-1,(SQUserPointer)SQSTD_STREAM_TYPE_TAG); SQInteger i = 0; while(_stream_methods[i].name != 0) { const SQRegFunction &f = _stream_methods[i]; sq_pushstring(v,f.name,-1); sq_newclosure(v,f.f,0); sq_setparamscheck(v,f.nparamscheck,f.typemask); sq_newslot(v,-3,SQFalse); i++; } sq_newslot(v,-3,SQFalse); sq_pushroottable(v); sq_pushstring(v,_SC("stream"),-1); sq_pushstring(v,_SC("std_stream"),-1); sq_get(v,-4); sq_newslot(v,-3,SQFalse); sq_pop(v,1); } else { sq_pop(v,1); //result } sq_pop(v,1); }
void CSquirrelVM::BeginRegisterScriptClass(const char* className, scriptFunction pfnFunction, void* userPointer, const char* baseClass) { iFuncIndex = 0; #if 1 int n = 0; oldtop = sq_gettop(m_pVM); sq_pushroottable(m_pVM); sq_pushstring(m_pVM, className, -1); if(baseClass) { sq_pushstring(m_pVM, baseClass, -1); if(SQ_FAILED(sq_get(m_pVM, -3))) { // make sure base exists sq_settop(m_pVM, oldtop); return; } } if(SQ_FAILED(sq_newclass(m_pVM, baseClass ? 1 : 0))) { sq_settop(m_pVM, oldtop); return; } sq_pushstring(m_pVM, _SC("constructor"), -1); if (userPointer != nullptr) { sq_pushuserpointer(m_pVM, userPointer); sq_newclosure(m_pVM, (SQFUNCTION) pfnFunction, 1); } else sq_newclosure(m_pVM, (SQFUNCTION)pfnFunction, 0); sq_newslot(m_pVM, -3, false); // Add the constructor method #endif }
SQRESULT sqext_register_ffi(HSQUIRRELVM v) { int saved_top = sq_gettop(v); //add a namespace ffi sq_pushstring(v,_SC("ffi"),-1); sq_newclass(v,SQFalse); sq_settypetag(v,-1,(void*)FFI_LIB_TAG); sq_insert_reg_funcs(v, sq_ffi_methods); int i; for (i = 0; ffi_types_wrap[i].name != 0; i++) { struct FFI_type_name *e = &ffi_types_wrap[i]; sq_pushstring(v, e->name, -1); sq_pushuserpointer(v, e->type); sq_newslot(v, -3, SQFalse); } sq_newslot(v,-3,SQTrue); //add ffi table to the root table sq_create_delegate_table(v, sq_lib_methods, FFI_LIB_LIB_TAG); sq_create_delegate_table(v, sq_func_methods, FFI_LIB_FUNC_TAG); sq_create_delegate_table(v, sq_var_methods, FFI_LIB_VAR_TAG); sq_settop(v, saved_top); return SQ_OK; }
/* * Register new class. * Must be called before loading script files */ void register_class(HSQUIRRELVM v, const char *cname) { sq_pushroottable(v); sq_pushstring(v, cname, -1); sq_newclass(v, false); sq_createslot(v, -3); sq_pop(v, 1); }
BOOL SbuCreateClass(HSQUIRRELVM v,SquirrelClassDecl *cd) { int n = 0; int oldtop = sq_gettop(v); sq_pushroottable(v); sq_pushstring(v,cd->name,-1); if(cd->base) { sq_pushstring(v,cd->base,-1); if(SQ_FAILED(sq_get(v,-3))) { sq_settop(v,oldtop); return FALSE; } } if(SQ_FAILED(sq_newclass(v,cd->base?1:0))) { sq_settop(v,oldtop); return FALSE; } sq_settypetag(v,-1,(SQUserPointer)cd); const ScriptClassMemberDecl *members = cd->members; const ScriptClassMemberDecl *m = NULL; while(members[n].name) { m = &members[n]; sq_pushstring(v,m->name,-1); sq_newclosure(v,m->func,0); sq_setparamscheck(v,m->params,m->typemask); sq_setnativeclosurename(v,-1,m->name); sq_createslot(v,-3); n++; } sq_createslot(v,-3); sq_pop(v,1); return TRUE; }
SQInteger sqstd_register_stringlib( HSQUIRRELVM v ) { sq_pushstring( v, _SC( "regexp" ), -1 ); sq_newclass( v, SQFalse ); SQInteger i = 0; while ( rexobj_funcs[i].name != 0 ) { SQRegFunction &f = rexobj_funcs[i]; sq_pushstring( v, f.name, -1 ); sq_newclosure( v, f.f, 0 ); sq_setparamscheck( v, f.nparamscheck, f.typemask ); sq_setnativeclosurename( v, -1, f.name ); sq_createslot( v, -3 ); i++; } sq_createslot( v, -3 ); i = 0; while ( stringlib_funcs[i].name != 0 ) { sq_pushstring( v, stringlib_funcs[i].name, -1 ); sq_newclosure( v, stringlib_funcs[i].f, 0 ); sq_setparamscheck( v, stringlib_funcs[i].nparamscheck, stringlib_funcs[i].typemask ); sq_setnativeclosurename( v, -1, stringlib_funcs[i].name ); sq_createslot( v, -3 ); i++; } return 1; }
bool SquirrelScriptContext::RegisterUserClass(ClassDesc* desc) { MultiScriptAssert(desc->m_constructor); MultiScriptAssert(desc->m_destructor); SquirrelClassInfo* classInfo = new SquirrelClassInfo(); classInfo->m_desc = desc; classInfo->m_context = this; // Create class sq_pushstring(m_vm, desc->m_name, -1); // TODO: Handle subclass via 2nd parameter sq_newclass(m_vm, SQFalse); // Add methods for (unsigned int i = 0; i < desc->m_methods.size(); ++i) { sq_pushstring(m_vm, desc->m_methods[i].m_name, -1); sq_pushuserpointer(m_vm, classInfo); sq_pushinteger(m_vm, i); sq_newclosure(m_vm, SquirrelClassMethodCallback, 2); sq_createslot(m_vm, -3); } // Add constructor sq_pushstring(m_vm, "constructor", -1); sq_pushuserpointer(m_vm, classInfo); sq_newclosure(m_vm, SquirrelClassConstructorCallback, 1); sq_createslot(m_vm, -3); // Add to-string method sq_pushstring(m_vm, "AsString", -1); sq_pushuserpointer(m_vm, classInfo); sq_newclosure(m_vm, SquirrelClassToStringMethodCallback, 1); sq_createslot(m_vm, -3); // Add optional destructor if (!desc->m_garbageCollect) { // Add destructor sq_pushstring(m_vm, "Destroy", -1); sq_pushuserpointer(m_vm, classInfo); sq_newclosure(m_vm, SquirrelClassDestructorCallback, 1); sq_createslot(m_vm, -3); } else { // TODO: Add garbage collection callback here } // Add class to root table sq_createslot(m_vm, -3); // Add class info m_classes.push_back(classInfo); return true; }
/* This defines a function that opens up your library. */ SQRESULT sqext_register_fossil (HSQUIRRELVM sqvm) { //add a namespace sqmix sq_pushstring(sqvm,_SC("sqfossil"),-1); sq_newclass(sqvm,SQFalse); sq_insert_reg_funcs(sqvm, fossil_obj_funcs); sq_newslot(sqvm,-3,SQTrue); //add sq_fossil table to the root table return SQ_OK; }
SQInteger sqstd_register_stringlib(HSQUIRRELVM v) { sq_pushstring(v,_SC("regexp"),-1); sq_newclass(v,SQFalse,"regexp"); SQInteger i = 0; while(rexobj_funcs[i].name != 0) { SQRegFunction &f = rexobj_funcs[i]; sq_pushstring(v,f.name,-1); sq_newclosure(v,f.f,0); sq_setparamscheck(v,f.nparamscheck,f.typemask); sq_setnativeclosureinfo(v,-1,f.name,f.file); if (f.help) { sq_pushstring(v,f.help,-1); sq_sethelp(v, -2); } sq_createslot(v,-3); i++; } sq_createslot(v,-3); i = 0; while(stringlib_funcs[i].name!=0) { sq_pushstring(v,stringlib_funcs[i].name,-1); sq_newclosure(v,stringlib_funcs[i].f,0); sq_setparamscheck(v,stringlib_funcs[i].nparamscheck,stringlib_funcs[i].typemask); sq_setnativeclosureinfo(v,-1,stringlib_funcs[i].name,stringlib_funcs[i].file); if (stringlib_funcs[i].help) { sq_pushstring(v,stringlib_funcs[i].help,-1); sq_sethelp(v, -2); } sq_createslot(v,-3); i++; } sq_getdefaultdelegate(v, OT_STRING); i = 0; while(stringextdeleg_funcs[i].name!=0) { sq_pushstring(v,stringextdeleg_funcs[i].name,-1); sq_newclosure(v,stringextdeleg_funcs[i].f,0); sq_setparamscheck(v,stringextdeleg_funcs[i].nparamscheck,stringextdeleg_funcs[i].typemask); sq_setnativeclosureinfo(v,-1,stringextdeleg_funcs[i].name,stringextdeleg_funcs[i].file); if (stringextdeleg_funcs[i].help) { sq_pushstring(v,stringextdeleg_funcs[i].help,-1); sq_sethelp(v,-2); } sq_createslot(v,-3); i++; } sq_pop(v, 1); return 1; }
/* * Register new class with namespace. * Must be called before loading script files */ void register_class_with_namespace(HSQUIRRELVM v, const char *nname, const char *cname) { sq_pushroottable(v); sq_pushstring(v, nname, -1); if(SQ_SUCCEEDED(sq_get(v, -2))) { sq_pushstring(v, cname, -1); sq_newclass(v, false); sq_createslot(v, -3); } sq_pop(v, 1); }
SQRESULT sqext_register_libclang(HSQUIRRELVM v) { sq_pushstring(v,LibClang_TAG,-1); sq_newclass(v,SQFalse); sq_settypetag(v,-1,(void*)LibClang_TAG); sq_insert_reg_funcs(v, sq_libclang_methods); sq_newslot(v,-3,SQTrue); return 0; }
/* This defines a function that opens up your library. */ SQRESULT sqext_register_BitVector (HSQUIRRELVM v) { //add a namespace BitVector sq_pushstring(v, SQ_LIBNAME, -1); sq_newclass(v,SQFalse); sq_settypetag(v,-1,(SQUserPointer)BitVector_Tag); sq_insert_reg_funcs(v, BitVector_obj_funcs); sq_newslot(v,-3,SQFalse); //add BitVector table to the root table return SQ_OK; }
void Squirrel::AddClassBegin(const char *class_name, const char *parent_class) { sq_pushroottable(this->vm); sq_pushstring(this->vm, OTTD2SQ(class_name), -1); sq_pushstring(this->vm, OTTD2SQ(parent_class), -1); if (SQ_FAILED(sq_get(this->vm, -3))) { DEBUG(misc, 0, "[squirrel] Failed to initialize class '%s' based on parent class '%s'", class_name, parent_class); DEBUG(misc, 0, "[squirrel] Make sure that '%s' exists before trying to define '%s'", parent_class, class_name); return; } sq_newclass(this->vm, SQTrue); }
SQRESULT declare_stream(HSQUIRRELVM v,const SQChar* name,SQUserPointer typetag,const SQChar* reg_name,const SQRegFunction *methods,const SQRegFunction *globals) { if(sq_gettype(v,-1) != OT_TABLE) return sq_throwerror(v,_SC("table expected")); SQInteger top = sq_gettop(v); //create delegate init_streamclass(v); sq_pushregistrytable(v); sq_pushstring(v,reg_name,-1); sq_pushstring(v,_SC("std_stream"),-1); if(SQ_SUCCEEDED(sq_get(v,-3))) { sq_newclass(v,SQTrue); sq_settypetag(v,-1,typetag); SQInteger i = 0; while(methods[i].name != 0) { const SQRegFunction &f = methods[i]; sq_pushstring(v,f.name,-1); sq_newclosure(v,f.f,0); sq_setparamscheck(v,f.nparamscheck,f.typemask); sq_setnativeclosurename(v,-1,f.name); sq_newslot(v,-3,SQFalse); i++; } sq_newslot(v,-3,SQFalse); sq_pop(v,1); i = 0; while(globals[i].name!=0) { const SQRegFunction &f = globals[i]; sq_pushstring(v,f.name,-1); sq_newclosure(v,f.f,0); sq_setparamscheck(v,f.nparamscheck,f.typemask); sq_setnativeclosurename(v,-1,f.name); sq_newslot(v,-3,SQFalse); i++; } //register the class in the target table sq_pushstring(v,name,-1); sq_pushregistrytable(v); sq_pushstring(v,reg_name,-1); sq_get(v,-2); sq_remove(v,-2); sq_newslot(v,-3,SQFalse); sq_settop(v,top); return SQ_OK; } sq_settop(v,top); return SQ_ERROR; }
bool CResourceScript::CreateClass(SquirrelClassDecl * pClassDecl) { // Get script VM Top int iTop = sq_gettop ( m_pVM ); // Push class name. sq_pushstring ( m_pVM, pClassDecl->name, -1 ); // Check class if ( pClassDecl->base ) { // Push class base name. sq_pushstring ( m_pVM, pClassDecl->base, -1 ); // Check sq_get state. if(SQ_FAILED(sq_get(m_pVM, -3))) { // Set default top. sq_settop(m_pVM, iTop); return false; } } // Register class if ( SQ_FAILED ( sq_newclass ( m_pVM, pClassDecl->base ? 1 : 0 ) ) ) { // If class register failed - back to top. sq_settop ( m_pVM, iTop ); return false; } // Register class functions. const ScriptClassMemberDecl * pMembers = pClassDecl->members; for(int x = 0; pMembers[x].szFunctionName; x++) RegisterFunction(pMembers[x].szFunctionName, pMembers[x].sqFunc, pMembers[x].iParameterCount, pMembers[x].szFunctionTemplate); // Register slot for class. sq_createslot(m_pVM, -3); return true; }
bool CSquirrel::RegisterClass(SquirrelClassDecl * pClassDecl) { // Get the stack top int oldtop = sq_gettop(m_pVM); // Push the class name onto the stack sq_pushstring(m_pVM, pClassDecl->name, -1); // Do we have a base class? if(pClassDecl->base) { // Push the base class name onto the stack sq_pushstring(m_pVM, pClassDecl->base, -1); // Attempt to get the base class if(SQ_FAILED(sq_get(m_pVM, -3))) { // Failed to get the base class sq_settop(m_pVM, oldtop); return false; } } // Create the class if(SQ_FAILED(sq_newclass(m_pVM, pClassDecl->base ? 1 : 0))) { // Failed to create the class, Restore the stack top sq_settop(m_pVM, oldtop); return false; } // Register the class members const ScriptClassMemberDecl * pMembers = pClassDecl->members; for(int x = 0; pMembers[x].szFunctionName; x++) RegisterFunction(pMembers[x].szFunctionName, pMembers[x].sqFunc, pMembers[x].iParameterCount, pMembers[x].szFunctionTemplate); // Create a new slot sq_createslot(m_pVM, -3); return true; }
SQRESULT sqext_register_sq_slave_vm(HSQUIRRELVM v) { const SQChar get_set_validation_mask[] = _SC("x s|n|p s|n|b|a|t|p|o"); sq_pushstring(v,sq_slave_vm_TAG, -1); sq_newclass(v, SQFalse); sq_settypetag(v,-1,(void*)sq_slave_vm_TAG); sq_insertfunc(v, _SC("constructor"), sq_slave_vm_constructor, -1, _SC("xi"), SQFalse); sq_insertfunc(v, _SC("_tostring"), sq_slave_vm__tostring, 1, _SC("x"), SQFalse); sq_insertfunc(v, _SC("close"), sq_slave_vm_close, 1, _SC("x"), SQFalse); sq_insertfunc(v, _SC("set"), sq_slave_vm_set, 3, get_set_validation_mask, SQFalse); sq_insertfunc(v, _SC("_set"), sq_slave_vm_set, 3, get_set_validation_mask, SQFalse); sq_insertfunc(v, _SC("get"), sq_slave_vm_get, -2, get_set_validation_mask, SQFalse); sq_insertfunc(v, _SC("_get"), sq_slave_vm_get, -2, get_set_validation_mask, SQFalse); sq_insertfunc(v, _SC("dofile"), sq_slave_vm_dofile, -2, _SC("xsbbb"), SQFalse); sq_insertfunc(v, _SC("loadfile"), sq_slave_vm_loadfile, -3, _SC("xssbb"), SQFalse); sq_insertfunc(v, _SC("compilestring"), sq_slave_vm_compilestring, -3, _SC("xssbb"), SQFalse); sq_insertfunc(v, _SC("call"), sq_slave_vm_call, -3, _SC("xbs"), SQFalse); sq_newslot(v,-3,SQTrue); //push sq_slave_vm class return 0; }
SQRESULT sqext_register_sq_zlib(HSQUIRRELVM v) { sq_pushliteral(v,_SC("zlib")); sq_newtable(v); INT_CONST(v, Z_DEFAULT_COMPRESSION); INT_CONST(v, Z_BEST_SPEED); INT_CONST(v, Z_BEST_COMPRESSION); sq_insertfunc(v, _SC("version"), sq_zlib_version, 1, _SC("."), SQTrue); sq_insertfunc(v, _SC("deflate"), sq_zlib_deflate, -2, _SC(".si"), SQTrue); sq_insertfunc(v, _SC("inflate"), sq_zlib_inflate, -2, _SC(".si"), SQTrue); sq_pushliteral(v,_SC("Unzip")); sq_newclass(v,SQFalse); sq_settypetag(v,-1,(void*)sq_minizip_unzip_TAG); sq_insert_reg_funcs(v, sq_minizip_unzip_methods); sq_newslot(v,-3,SQTrue); sq_newslot(v,-3,SQTrue); //push zlib table return 0; }
BOOL CreateClass(HSQUIRRELVM v,SquirrelObject & newClass,SQUserPointer classType,const SQChar * name,const SQChar * baseName) { int n = 0; int oldtop = sq_gettop(v); sq_pushroottable(v); sq_pushstring(v,name,-1); if (baseName) { sq_pushstring(v,baseName,-1); if (SQ_FAILED(sq_get(v,-3))) { // Make sure the base exists if specified by baseName. sq_settop(v,oldtop); return FALSE; } // if } // if if (SQ_FAILED(sq_newclass(v,baseName ? 1 : 0))) { // Will inherit from base class on stack from sq_get() above. sq_settop(v,oldtop); return FALSE; } // if newClass.AttachToStackObject(-1); sq_settypetag(v,-1,classType); sq_createslot(v,-3); sq_pop(v,1); return TRUE; } // CreateClass
bool CSquirrel::RegisterClassStart(const char * szClassName, const char * szBaseClassName) { // Get the stack top int oldtop = sq_gettop(m_pVM); // Push the root table onto the stack sq_pushroottable(m_pVM); // Push the class name onto the stack sq_pushstring(m_pVM, szClassName, -1); // Do we have a base class name? if(szBaseClassName) { // Push the base class name onto the stack sq_pushstring(m_pVM, szBaseClassName, -1); // Attempt to get the base class if(SQ_FAILED(sq_get(m_pVM, -3))) { // Failed to get the base class, Restore the stack top sq_settop(m_pVM, oldtop); return false; } } // Create the class if(SQ_FAILED(sq_newclass(m_pVM, (szBaseClassName == NULL) ? 0 : 1))) { // Failed to create the class, Restore the stack top sq_settop(m_pVM, oldtop); return false; } // Set the class type tag //sq_settypetag(m_pVM, -1, NULL); return true; }
SQRESULT sqext_register_sqxml(HSQUIRRELVM v) { sq_pushstring(v,_SC("SQXml"),-1); sq_newclass(v,SQFalse); sq_insert_reg_funcs(v, xml_methods); sq_newslot(v,-3,SQTrue); // register default codes: if(!sv_code) { sv_code=(SQChar**)sq_malloc(sv_code_capacity*sizeof(SQChar*)); sv_code[sv_code_size++]=_SC("&"); sv_code[sv_code_size++]=_SC("&"); sv_code[sv_code_size++]=_SC("<"); sv_code[sv_code_size++]=_SC("<"); sv_code[sv_code_size++]=_SC(">"); sv_code[sv_code_size++]=_SC(">"); sv_code[sv_code_size++]=_SC("\""); sv_code[sv_code_size++]=_SC("""); sv_code[sv_code_size++]=_SC("'"); sv_code[sv_code_size++]=_SC("'"); } return 1; }
bool AIScanner::ImportLibrary(const char *library, const char *class_name, int version, HSQUIRRELVM vm, AIController *controller) { /* Internally we store libraries as 'library.version' */ char library_name[1024]; snprintf(library_name, sizeof(library_name), "%s.%d", library, version); strtolower(library_name); /* Check if the library + version exists */ AILibraryList::iterator iter = this->library_list.find(library_name); if (iter == this->library_list.end()) { char error[1024]; /* Now see if the version doesn't exist, or the library */ iter = this->library_list.find(library); if (iter == this->library_list.end()) { snprintf(error, sizeof(error), "couldn't find library '%s'", library); } else { snprintf(error, sizeof(error), "couldn't find library '%s' version %d. The latest version available is %d", library, version, (*iter).second->GetVersion()); } sq_throwerror(vm, OTTD2SQ(error)); return false; } /* Get the current table/class we belong to */ HSQOBJECT parent; sq_getstackobj(vm, 1, &parent); char fake_class[1024]; int next_number; if (!controller->LoadedLibrary(library_name, &next_number, &fake_class[0], sizeof(fake_class))) { /* Create a new fake internal name */ snprintf(fake_class, sizeof(fake_class), "_internalNA%d", next_number); /* Load the library in a 'fake' namespace, so we can link it to the name the user requested */ sq_pushroottable(vm); sq_pushstring(vm, OTTD2SQ(fake_class), -1); sq_newclass(vm, SQFalse); /* Load the library */ if (!Squirrel::LoadScript(vm, (*iter).second->GetMainScript(), false)) { char error[1024]; snprintf(error, sizeof(error), "there was a compile error when importing '%s' version %d", library, version); sq_throwerror(vm, OTTD2SQ(error)); return false; } /* Create the fake class */ sq_newslot(vm, -3, SQFalse); sq_pop(vm, 1); controller->AddLoadedLibrary(library_name, fake_class); } /* Find the real class inside the fake class (like 'sets.Vector') */ sq_pushroottable(vm); sq_pushstring(vm, OTTD2SQ(fake_class), -1); if (SQ_FAILED(sq_get(vm, -2))) { sq_throwerror(vm, _SC("internal error assigning library class")); return false; } sq_pushstring(vm, OTTD2SQ((*iter).second->GetInstanceName()), -1); if (SQ_FAILED(sq_get(vm, -2))) { char error[1024]; snprintf(error, sizeof(error), "unable to find class '%s' in the library '%s' version %d", (*iter).second->GetInstanceName(), library, version); sq_throwerror(vm, OTTD2SQ(error)); return false; } HSQOBJECT obj; sq_getstackobj(vm, -1, &obj); sq_pop(vm, 3); if (StrEmpty(class_name)) { sq_pushobject(vm, obj); return true; } /* Now link the name the user wanted to our 'fake' class */ sq_pushobject(vm, parent); sq_pushstring(vm, OTTD2SQ(class_name), -1); sq_pushobject(vm, obj); sq_newclass(vm, SQTrue); sq_newslot(vm, -3, SQFalse); sq_pop(vm, 1); sq_pushobject(vm, obj); return true; }
void Squirrel::AddClassBegin(const char *class_name) { sq_pushroottable(this->vm); sq_pushstring(this->vm, OTTD2SQ(class_name), -1); sq_newclass(this->vm, SQFalse); }
/* static */ HSQOBJECT ScriptController::Import(const char *library, const char *class_name, int version) { ScriptController *controller = ScriptObject::GetActiveInstance()->GetController(); Squirrel *engine = ScriptObject::GetActiveInstance()->engine; HSQUIRRELVM vm = engine->GetVM(); /* Internally we store libraries as 'library.version' */ char library_name[1024]; snprintf(library_name, sizeof(library_name), "%s.%d", library, version); strtolower(library_name); ScriptInfo *lib = ScriptObject::GetActiveInstance()->FindLibrary(library, version); if (lib == NULL) { char error[1024]; snprintf(error, sizeof(error), "couldn't find library '%s' with version %d", library, version); throw sq_throwerror(vm, OTTD2SQ(error)); } /* Get the current table/class we belong to */ HSQOBJECT parent; sq_getstackobj(vm, 1, &parent); char fake_class[1024]; LoadedLibraryList::iterator iter = controller->loaded_library.find(library_name); if (iter != controller->loaded_library.end()) { ttd_strlcpy(fake_class, (*iter).second, sizeof(fake_class)); } else { int next_number = ++controller->loaded_library_count; /* Create a new fake internal name */ snprintf(fake_class, sizeof(fake_class), "_internalNA%d", next_number); /* Load the library in a 'fake' namespace, so we can link it to the name the user requested */ sq_pushroottable(vm); sq_pushstring(vm, OTTD2SQ(fake_class), -1); sq_newclass(vm, SQFalse); /* Load the library */ if (!engine->LoadScript(vm, lib->GetMainScript(), false)) { char error[1024]; snprintf(error, sizeof(error), "there was a compile error when importing '%s' version %d", library, version); throw sq_throwerror(vm, OTTD2SQ(error)); } /* Create the fake class */ sq_newslot(vm, -3, SQFalse); sq_pop(vm, 1); controller->loaded_library[strdup(library_name)] = strdup(fake_class); } /* Find the real class inside the fake class (like 'sets.Vector') */ sq_pushroottable(vm); sq_pushstring(vm, OTTD2SQ(fake_class), -1); if (SQ_FAILED(sq_get(vm, -2))) { throw sq_throwerror(vm, _SC("internal error assigning library class")); } sq_pushstring(vm, OTTD2SQ(lib->GetInstanceName()), -1); if (SQ_FAILED(sq_get(vm, -2))) { char error[1024]; snprintf(error, sizeof(error), "unable to find class '%s' in the library '%s' version %d", lib->GetInstanceName(), library, version); throw sq_throwerror(vm, OTTD2SQ(error)); } HSQOBJECT obj; sq_getstackobj(vm, -1, &obj); sq_pop(vm, 3); if (StrEmpty(class_name)) return obj; /* Now link the name the user wanted to our 'fake' class */ sq_pushobject(vm, parent); sq_pushstring(vm, OTTD2SQ(class_name), -1); sq_pushobject(vm, obj); sq_newclass(vm, SQTrue); sq_newslot(vm, -3, SQFalse); sq_pop(vm, 1); return obj; }
void bindTransport(HSQUIRRELVM vm) { // create package table sq_pushstring(vm, "Transport", -1); sq_newtable(vm); // static method schedule sq_pushstring(vm, _SC("schedule"), -1); sq_newclosure(vm, &Transportschedule, 0); sq_newslot(vm, -3, false); // static method start sq_pushstring(vm, _SC("start"), -1); sq_newclosure(vm, &Transportstart, 0); sq_newslot(vm, -3, false); // static method stop sq_pushstring(vm, _SC("stop"), -1); sq_newclosure(vm, &Transportstop, 0); sq_newslot(vm, -3, false); // create class Transport.Master sq_pushstring(vm, "Master", -1); sq_newclass(vm, false); sq_getstackobj(vm, -1, &TransportMasterObject); sq_settypetag(vm, -1, &TransportMasterObject); // ctor for class Master sq_pushstring(vm, _SC("constructor"), -1); sq_newclosure(vm, &TransportMasterCtor, 0); sq_newslot(vm, -3, false); // clone for class Master sq_pushstring(vm, _SC("_cloned"), -1); sq_newclosure(vm, &unclonable, 0); sq_newslot(vm, -3, false); // methods for class Master sq_pushstring(vm, _SC("timeSignature"), -1); sq_newclosure(vm, &TransportMastertimeSignature, 0); sq_newslot(vm, -3, false); // push Master to Transport package table sq_newslot(vm, -3, false); // create class Transport.Position sq_pushstring(vm, "Position", -1); sq_newclass(vm, false); sq_getstackobj(vm, -1, &TransportPositionObject); sq_settypetag(vm, -1, &TransportPositionObject); // ctor for class Position sq_pushstring(vm, _SC("constructor"), -1); sq_newclosure(vm, &TransportPositionCtor, 0); sq_newslot(vm, -3, false); // clone for class Position sq_pushstring(vm, _SC("_cloned"), -1); sq_newclosure(vm, &TransportPositionClone, 0); sq_newslot(vm, -3, false); // methods for class Position sq_pushstring(vm, _SC("bar"), -1); sq_newclosure(vm, &TransportPositionbar, 0); sq_newslot(vm, -3, false); sq_pushstring(vm, _SC("div"), -1); sq_newclosure(vm, &TransportPositiondiv, 0); sq_newslot(vm, -3, false); sq_pushstring(vm, _SC("num"), -1); sq_newclosure(vm, &TransportPositionnum, 0); sq_newslot(vm, -3, false); sq_pushstring(vm, _SC("time"), -1); sq_newclosure(vm, &TransportPositiontime, 0); sq_newslot(vm, -3, false); // push Position to Transport package table sq_newslot(vm, -3, false); // create class Transport.TimeSignature sq_pushstring(vm, "TimeSignature", -1); sq_newclass(vm, false); sq_getstackobj(vm, -1, &TransportTimeSignatureObject); sq_settypetag(vm, -1, &TransportTimeSignatureObject); // ctor for class TimeSignature sq_pushstring(vm, _SC("constructor"), -1); sq_newclosure(vm, &TransportTimeSignatureCtor, 0); sq_newslot(vm, -3, false); // clone for class TimeSignature sq_pushstring(vm, _SC("_cloned"), -1); sq_newclosure(vm, &TransportTimeSignatureClone, 0); sq_newslot(vm, -3, false); // methods for class TimeSignature sq_pushstring(vm, _SC("denominator"), -1); sq_newclosure(vm, &TransportTimeSignaturedenominator, 0); sq_newslot(vm, -3, false); sq_pushstring(vm, _SC("numerator"), -1); sq_newclosure(vm, &TransportTimeSignaturenumerator, 0); sq_newslot(vm, -3, false); // push TimeSignature to Transport package table sq_newslot(vm, -3, false); // push package "Transport" to root table sq_newslot(vm, -3, false); }
/** * クラスの登録 * @param HSQUIRRELVM v */ SQRESULT TJSObject::createTJSClass(HSQUIRRELVM v) { SQInteger top = sq_gettop(v); if (top < 2) { return sq_throwerror(v, _SC("invalid param")); } // クラスを生成 sq_pushobject(v, SQClassType<TJSObject>::ClassObject()); sq_newclass(v, true); // 継承する // メンバ登録 const tjs_char *tjsClassName = NULL; tTJSVariant tjsClassObj; for (SQInteger i=top; i>1; i--) { if ((tjsClassName = sqobject::getString(v,i))) { TVPExecuteExpression(tjsClassName, &tjsClassObj); if (tjsClassObj.Type() == tvtObject && TJS_SUCCEEDED(tjsClassObj.AsObjectClosureNoAddRef().IsInstanceOf(0,NULL,NULL,L"Class",NULL))) { MemberRegister *r = new MemberRegister(v, tjsClassObj); tTJSVariantClosure closure(r); tjsClassObj.AsObjectClosureNoAddRef().EnumMembers(TJS_IGNOREPROP, &closure, NULL); r->Release(); } } } if (tjsClassName) { // コンストラクタ登録 sq_pushstring(v, _SC("constructor"), -1); sq_pushvariant(v, tjsClassObj); sq_newclosure(v, tjsConstructor, 1); sq_createslot(v, -3); // クラス属性に tjsクラスを登録 sq_pushnull(v); sq_newtable(v); if (SQ_SUCCEEDED(sq_setattributes(v,-3))) { sq_pop(v,1); sq_pushnull(v); if (SQ_SUCCEEDED(sq_getattributes(v, -2))) { sq_pushstring(v, tjsClassAttrName, -1); sq_pushvariant(v, tjsClassObj); if (SQ_SUCCEEDED(sq_createslot(v, -3))) { sq_pop(v,1); } else { sq_pop(v,2); } } else { // XXX sq_pop(v,1); } } else { // XXX sq_pop(v,2); } // TJS機能メソッドを登録 sq_pushstring(v, _SC("tjsIsValid"), -1); sq_newclosure(v, TJSObject::tjsIsValid, 0); sq_createslot(v, -3); sq_pushstring(v, _SC("tjsOverride"), -1); sq_newclosure(v, TJSObject::tjsOverride, 0); sq_setparamscheck(v, -2, _SC(".sc")); sq_createslot(v, -3); } return 1; }