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) { 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_createslot(v,-3); i++; } sq_createslot(v,-3); sq_pushroottable(v); sq_pushstring(v,_SC("stream"),-1); sq_pushstring(v,_SC("std_stream"),-1); sq_get(v,-4); sq_createslot(v,-3); sq_pop(v,1); } else { sq_pop(v,1); //result } 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; }
void sq_base_register(HSQUIRRELVM v) { SQInteger i=0; sq_pushroottable(v); while(base_funcs[i].name!=0) { sq_pushstring(v,base_funcs[i].name,-1); sq_newclosure(v,base_funcs[i].f,0); sq_setnativeclosurename(v,-1,base_funcs[i].name); sq_setparamscheck(v,base_funcs[i].nparamscheck,base_funcs[i].typemask); sq_createslot(v,-3); i++; } sq_pushstring(v,_SC("_version_"),-1); sq_pushstring(v,SQUIRREL_VERSION,-1); sq_createslot(v,-3); sq_pushstring(v,_SC("_charsize_"),-1); sq_pushinteger(v,sizeof(SQChar)); sq_createslot(v,-3); sq_pushstring(v,_SC("_intsize_"),-1); sq_pushinteger(v,sizeof(SQInteger)); sq_createslot(v,-3); sq_pushstring(v,_SC("_floatsize_"),-1); sq_pushinteger(v,sizeof(SQFloat)); sq_createslot(v,-3); sq_pop(v,1); }
SQInteger CSystemNatives::Date( SQVM * pVM ) { // Get the current time SQInteger iTime = SharedUtility::GetTime (); // Get the current time and date time_t t = time( NULL ); const struct tm * tm = localtime( &t ); // Create a new table sq_newtable( pVM ); sq_pushstring( pVM, "day", strlen("day") ); sq_pushinteger( pVM, tm->tm_mday ); sq_createslot( pVM, -3 ); sq_pushstring( pVM, "month", strlen("month") ); sq_pushinteger( pVM, (tm->tm_mon + 1) ); sq_createslot( pVM, -3 ); sq_pushstring( pVM, "year", strlen("year") ); sq_pushinteger( pVM, (tm->tm_year + 1900) ); sq_createslot( pVM, -3 ); sq_pushstring( pVM, "yearday", strlen("yearday") ); sq_pushinteger( pVM, tm->tm_yday ); sq_createslot( pVM, -3 ); return 1; }
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; }
// getCheckpointTargetPosition(checkpointid) SQInteger CCheckpointNatives::GetTargetPosition(SQVM * pVM) { EntityId checkpointId; sq_getentity(pVM, -1, &checkpointId); CCheckpoint * pCheckpoint = g_pCheckpointManager->Get(checkpointId); if(pCheckpoint) { CVector3 vecTargetPosition; pCheckpoint->GetTargetPosition(vecTargetPosition); sq_newtable(pVM); sq_pushinteger(pVM, 0); sq_pushfloat(pVM, vecTargetPosition.fX); sq_createslot(pVM, -3); sq_pushinteger(pVM, 1); sq_pushfloat(pVM, vecTargetPosition.fY); sq_createslot(pVM, -3); sq_pushinteger(pVM, 2); sq_pushfloat(pVM, vecTargetPosition.fZ); sq_createslot(pVM, -3); return 1; } sq_pushbool(pVM, false); 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; }
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; }
SQRESULT declare_stream(HSQUIRRELVM v,const SQChar* name,SQUserPointer typetag,const SQChar* reg_name,SQRegFunction *methods,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) { 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_createslot(v,-3); i++; } sq_createslot(v,-3); sq_pop(v,1); i = 0; while(globals[i].name!=0) { 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_createslot(v,-3); 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_createslot(v,-3); sq_settop(v,top); return SQ_OK; } sq_settop(v,top); return SQ_ERROR; }
BOOL SbuCreateStaticNamespace(HSQUIRRELVM v,ScriptNamespaceDecl *sn) { int n = 0; sq_pushroottable(v); sq_pushstring(v,sn->name,-1); sq_newtable(v); const ScriptClassMemberDecl *members = sn->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++; } const ScriptConstantDecl *consts = sn->constants; const ScriptConstantDecl *c = NULL; n = 0; while(consts[n].name) { c = &consts[n]; sq_pushstring(v,c->name,-1); switch(c->type) { case OT_STRING: sq_pushstring(v,c->val.s,-1);break; case OT_INTEGER: sq_pushinteger(v,c->val.i);break; case OT_FLOAT: sq_pushfloat(v,c->val.f);break; } sq_createslot(v,-3); n++; } if(sn->delegate) { const ScriptClassMemberDecl *members = sn->delegate; const ScriptClassMemberDecl *m = NULL; sq_newtable(v); 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_setdelegate(v,-2); } sq_createslot(v,-3); sq_pop(v,1); return TRUE; }
void store_bool(HSQUIRRELVM vm, const char* name, bool val) { sq_pushstring(vm, name, -1); sq_pushbool(vm, val ? SQTrue : SQFalse); if(SQ_FAILED(sq_createslot(vm, -3))) throw scripting::SquirrelError(vm, "Couldn't add float value to table"); }
void store_string(HSQUIRRELVM vm, const char* name, const std::string& val) { sq_pushstring(vm, name, -1); sq_pushstring(vm, val.c_str(), val.length()); if(SQ_FAILED(sq_createslot(vm, -3))) throw scripting::SquirrelError(vm, "Couldn't add float value to table"); }
void store_int(HSQUIRRELVM vm, const char* name, int val) { sq_pushstring(vm, name, -1); sq_pushinteger(vm, val); if(SQ_FAILED(sq_createslot(vm, -3))) throw scripting::SquirrelError(vm, "Couldn't add int value to table"); }
void CSquirrel::RegisterFunction(const char * szFunctionName, SQFUNCTION pfnFunction, int iParameterCount, const char * szFunctionTemplate, bool bPushRootTable) { // Push the root table onto the stack if needed if(bPushRootTable) sq_pushroottable(m_pVM); // Push the function name onto the stack sq_pushstring(m_pVM, szFunctionName, -1); // Create a new function sq_newclosure(m_pVM, pfnFunction, 0); // Set the function parameter template and count if(iParameterCount != -1) { char szTemp[128]; if(szFunctionTemplate) sprintf(szTemp, ".%s", szFunctionTemplate); sq_setparamscheck(m_pVM, (iParameterCount + 1), (szFunctionTemplate) ? szTemp : NULL); } // Create a new slot sq_createslot(m_pVM, -3); // Pop the root table from the stack if needed if(bPushRootTable) sq_pop(m_pVM, 1); }
void SQDbgServer::SerializeState() { sq_pushnull(_v); sq_setdebughook(_v); sq_pushnull(_v); sq_seterrorhandler(_v); const SQChar *sz; sq_pushobject(_v,_serializefunc); sq_pushobject(_v,_debugroot); sq_pushstring(_v,_SC("watches"),-1); sq_newtable(_v); for(WatchSetItor i=_watches.begin(); i!=_watches.end(); ++i) { sq_pushinteger(_v,i->_id); sq_pushstring(_v,i->_exp.c_str(),(int)i->_exp.length()); sq_createslot(_v,-3); } sq_rawset(_v,-3); if(SQ_SUCCEEDED(sq_call(_v,1,SQTrue,SQTrue))){ if(SQ_SUCCEEDED(sqstd_getblob(_v,-1,(SQUserPointer*)&sz))) SendChunk(sz); } sq_pop(_v,2); SetErrorHandlers(); }
/* * Register new table. * Must be called before loading script files */ void register_table(HSQUIRRELVM v, const char *name) { sq_pushroottable(v); sq_pushstring(v, name, -1); sq_newtable(v); sq_createslot(v, -3); sq_pop(v, 1); }
/* * Register global function. * Must be called before loading script files */ void register_global_func(HSQUIRRELVM v, SQFUNCTION func, const char *fname) { sq_pushroottable(v); sq_pushstring(v, fname, -1); sq_newclosure(v, func, 0); sq_createslot(v, -3); sq_pop(v,1); }
/* * 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); }
void RegisterFunction(HSQUIRRELVM pVM, const char * szName, SQFUNCTION pfnFunction) { sq_pushroottable(pVM); sq_pushstring(pVM, szName, -1); sq_newclosure(pVM, pfnFunction, 0); sq_createslot(pVM, -3); sq_pop(pVM, 1); }
void CSquirrel::RegisterClassFinish() { // Create a new slot sq_createslot(m_pVM, -3); // Pop the root table from the stack sq_pop(m_pVM, 1); }
void sqstd_seterrorhandlers(HSQUIRRELVM v) { sq_setcompilererrorhandler(v,_sqstd_compiler_error); sq_newclosure(v,_sqstd_aux_printerror,0); sq_seterrorhandler(v); // additional functions sq_pushroottable(v); sq_pushstring(v, _SC("printCallStack"), -1); sq_newclosure(v, printCallStack, 0); sq_createslot(v, -3); sq_pushstring(v, _SC("notifyAllExceptions"), -1); sq_newclosure(v, notifyAllExceptions, 0); sq_setparamscheck(v, 2, _SC(".n|b")); sq_createslot(v, -3); sq_pop(v,1); }
void register_global(HSQUIRRELVM v,SQFUNCTION f,const char *fname) { sq_pushroottable(v); sq_pushstring(v,fname,-1); sq_newclosure(v,f,0); //create a new function sq_createslot(v,-3); sq_pop(v,1); //pops the root table }
SQRESULT sqstd_register_mathlib(HSQUIRRELVM v) { SQInteger i=0; while(mathlib_funcs[i].name!=0) { sq_pushstring(v,mathlib_funcs[i].name,-1); sq_newclosure(v,mathlib_funcs[i].f,0); sq_setparamscheck(v,mathlib_funcs[i].nparamscheck,mathlib_funcs[i].typemask); sq_setnativeclosurename(v,-1,mathlib_funcs[i].name); sq_createslot(v,-3); i++; } sq_pushstring(v,_SC("RAND_MAX"),-1); sq_pushinteger(v,RAND_MAX); sq_createslot(v,-3); sq_pushstring(v,_SC("PI"),-1); sq_pushfloat(v,(SQFloat)M_PI); sq_createslot(v,-3); return SQ_OK; }
// 初期化用 void TJSObject::init(HSQUIRRELVM vm) { // squirrel インスタンスを TJS側で保持するためのIDを取得 classId = TJSRegisterNativeClass(L"SquirrelClass"); // TJSObjectクラスを定義 SQTemplate<TJSObject, sqobject::Object> cls(vm); // メソッド登録 sq_pushroottable(vm); sq_pushstring(vm, _SC("createTJSClass"), -1); sq_newclosure(vm, createTJSClass, 0); sq_createslot(vm, -3); sq_pushstring(vm, _SC("tjsNull"), -1); sq_pushuserpointer(vm, NULL); sq_createslot(vm, -3); sq_pop(vm, 1); }
/* * Register new table with namespace. * Must be called before loading script files */ void register_table_with_namespace(HSQUIRRELVM v, const char *nname, const char *tname) { sq_pushroottable(v); sq_pushstring(v, nname, -1); if(SQ_SUCCEEDED(sq_get(v, -2))) { sq_pushstring(v, tname, -1); sq_newtable(v); sq_createslot(v, -3); } sq_pop(v, 1); }
void CSquirrel::RegisterConstant(String strConstantName, CSquirrelArgument value) { // Push the constant name onto the stack sq_pushstring(m_pVM, strConstantName.Get(), -1); // Push the constant value onto the stack value.push(m_pVM); // Create a new slot sq_createslot(m_pVM, -3); }
void CResourceScript::RegisterVarible ( CString strName, CSquirrelArguments* pArguments ) { // Push varible name. sq_pushstring ( m_pVM, strName.Get(), -1 ); // Push arguments. pArguments->toVM(m_pVM); // Create new slot for varible. sq_createslot ( m_pVM, -3 ); }
void CSquirrelVM::PushTable(const CScriptArguments &table) { sq_newtable(m_pVM); for(auto iter = table.m_Arguments.begin(); iter != table.m_Arguments.end(); iter++) { (*iter)->Push(this); ++iter; (*iter)->Push(this); sq_createslot(m_pVM, -3); } }
void RegisterFunction(HSQUIRRELVM pVM, char * szFunc, SQFUNCTION func, int params, const char * szTemplate) { sq_pushroottable(pVM); sq_pushstring(pVM, szFunc, -1); sq_newclosure(pVM, func, 0); if(params != -1) { sq_setparamscheck(pVM, params, szTemplate); } sq_createslot(pVM, -3); }
SQRESULT sqstd_register_mathlib(HSQUIRRELVM v) { SQInteger i=0; while(mathlib_funcs[i].name!=0) { sq_pushstring(v,mathlib_funcs[i].name,-1); sq_newclosure(v,mathlib_funcs[i].f,0); sq_setparamscheck(v,mathlib_funcs[i].nparamscheck,mathlib_funcs[i].typemask); sq_setnativeclosurename(v,-1,mathlib_funcs[i].name); sq_createslot(v,-3); i++; } #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS sq_pushstring(v,"RAND_MAX",-1); sq_pushinteger(v,RAND_MAX); sq_createslot(v,-3); #endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */ sq_pushstring(v,"PI",-1); sq_pushfloat(v,(SQFloat)M_PI); sq_createslot(v,-3); return SQ_OK; }