10
#include <sqstdstring.h>
12
#include <sqstdblob.h>
15
#define STRLEN(n) _tcslen(n)
17
#define STRLEN(n) strlen(n)
20
HSQUIRRELVM SquirrelVM::_VM = NULL;
21
SQInteger SquirrelVM::_CallState = -1;
22
SquirrelObject * SquirrelVM::_root = NULL;
24
SquirrelError::SquirrelError()
27
sq_getlasterror(SquirrelVM::_VM);
28
sq_getstring(SquirrelVM::_VM,-1,&s);
33
desc = sqT("unknown error");
37
// C::B patch: Add additional initilisation flags
38
void SquirrelVM::Init(SquirrelInitFlags flags)
41
sq_setprintfunc(_VM,SquirrelVM::PrintFunc);
42
sq_pushroottable(_VM);
43
// C::B patch: Add additional initilisation flags
44
if (flags & sqifIO) sqstd_register_iolib(_VM);
45
if (flags & sqifBlob) sqstd_register_bloblib(_VM);
46
if (flags & sqifMath) sqstd_register_mathlib(_VM);
47
if (flags & sqifString) sqstd_register_stringlib(_VM);
48
sqstd_seterrorhandlers(_VM);
49
_root = new SquirrelObject();
50
_root->AttachToStackObject(-1);
52
//TODO error handler, compiler error handler
55
BOOL SquirrelVM::Update()
57
//update remote debugger
61
void SquirrelVM::Cleanup()
63
//cleans the root table
68
void SquirrelVM::Shutdown()
73
sq_release(_VM,&_root->_o);
74
sq_resetobject(&_root->_o);
84
void SquirrelVM::PrintFunc(HSQUIRRELVM v,const SQChar* s,...)
86
static SQChar temp[2048];
89
scvsprintf( temp,s, vl);
94
SquirrelObject SquirrelVM::CompileScript(const SQChar *s)
96
#define MAX_EXPANDED_PATH 1023
98
if(SQ_SUCCEEDED(sqstd_loadfile(_VM,s,1))) {
99
ret.AttachToStackObject(-1);
103
throw SquirrelError();
106
SquirrelObject SquirrelVM::CompileBuffer(const SQChar *s,const SQChar * debugInfo)
109
if(SQ_SUCCEEDED(sq_compilebuffer(_VM,s,(int)STRLEN(s)*sizeof(SQChar),debugInfo,1))) {
110
ret.AttachToStackObject(-1);
114
throw SquirrelError();
117
SquirrelObject SquirrelVM::RunScript(const SquirrelObject &o,SquirrelObject *_this)
120
sq_pushobject(_VM,o._o);
122
sq_pushobject(_VM,_this->_o);
125
sq_pushroottable(_VM);
127
if(SQ_SUCCEEDED(sq_call(_VM,1,SQTrue,SQ_CALL_RAISE_ERROR))) {
128
ret.AttachToStackObject(-1);
133
throw SquirrelError();
138
BOOL SquirrelVM::BeginCall(const SquirrelObject &func)
143
sq_pushobject(_VM,func._o);
144
sq_pushroottable(_VM);
148
BOOL SquirrelVM::BeginCall(const SquirrelObject &func,SquirrelObject &_this)
151
throw SquirrelError(sqT("call already initialized"));
153
sq_pushobject(_VM,func._o);
154
sq_pushobject(_VM,_this._o);
158
#define _CHECK_CALL_STATE \
159
if(_CallState == -1) \
160
throw SquirrelError(sqT("call not initialized"));
162
void SquirrelVM::PushParam(const SquirrelObject &o)
165
sq_pushobject(_VM,o._o);
169
void SquirrelVM::PushParam(const SQChar *s)
172
sq_pushstring(_VM,s,-1);
176
void SquirrelVM::PushParam(SQInteger n)
179
sq_pushinteger(_VM,n);
183
void SquirrelVM::PushParam(SQFloat f)
190
void SquirrelVM::PushParamNull()
197
void SquirrelVM::PushParam(SQUserPointer up)
200
sq_pushuserpointer(_VM,up);
204
SquirrelObject SquirrelVM::EndCall()
207
if(_CallState >= 0) {
208
SQInteger oldtop = sq_gettop(_VM);
209
SQInteger nparams = _CallState;
211
if(SQ_SUCCEEDED(sq_call(_VM,nparams,SQTrue,SQ_CALL_RAISE_ERROR))) {
212
ret.AttachToStackObject(-1);
215
sq_settop(_VM,oldtop-(nparams+1));
216
throw SquirrelError();
223
SquirrelObject SquirrelVM::CreateInstance(SquirrelObject &oclass)
226
SQInteger oldtop = sq_gettop(_VM);
227
sq_pushobject(_VM,oclass._o);
228
if(SQ_FAILED(sq_createinstance(_VM,-1))) {
229
sq_settop(_VM,oldtop);
230
throw SquirrelError();
232
ret.AttachToStackObject(-1);
237
SquirrelObject SquirrelVM::CreateTable()
241
ret.AttachToStackObject(-1);
246
SquirrelObject SquirrelVM::CreateString(const SQChar *s)
249
sq_pushstring(_VM,s,-1);
250
ret.AttachToStackObject(-1);
256
SquirrelObject SquirrelVM::CreateArray(SQInteger size)
259
sq_newarray(_VM,size);
260
ret.AttachToStackObject(-1);
265
SquirrelObject SquirrelVM::CreateFunction(SQFUNCTION func)
268
sq_newclosure(_VM,func,0);
269
ret.AttachToStackObject(-1);
274
SquirrelObject SquirrelVM::CreateUserData(SQInteger size) {
276
sq_newuserdata(_VM,size);
277
ret.AttachToStackObject(-1);
282
const SquirrelObject &SquirrelVM::GetRootTable()
287
void SquirrelVM::PushRootTable(void) {
288
sq_pushroottable(_VM);
289
} // SquirrelVM::PushRootTable
291
// Creates a function in the table or class currently on the stack.
292
//void CreateFunction(HSQUIRRELVM v,const SQChar * scriptFuncName,SQFUNCTION func,SQInteger numParams=0,const SQChar * typeMask=0) {
293
SquirrelObject SquirrelVM::CreateFunction(SQFUNCTION func,const SQChar * scriptFuncName,const SQChar * typeMask) {
294
sq_pushstring(_VM,scriptFuncName,-1);
295
sq_newclosure(_VM,func,0);
297
ret.AttachToStackObject(-1);
300
SQInteger numParams = SQ_MATCHTYPEMASKSTRING;
302
if (typeMask[0] == '*') {
303
ptm = 0; // Variable args: don't check parameters.
304
numParams = 0; // Clear SQ_MATCHTYPEMASKSTRING (does not mean match 0 params. See sq_setparamscheck()).
306
if (SCSNPRINTF(tm,sizeof(tm),sqT("t|y|x%s"),typeMask) < 0) {
307
// sq_throwerror(_VM,sqT("CreateFunction: typeMask string too long."));
308
throw SquirrelError(sqT("CreateFunction: typeMask string too long."));
311
} else { // <TODO> Need to check object type on stack: table, class, instance, etc.
312
SCSNPRINTF(tm,sizeof(tm),sqT("%s"),sqT("t|y|x")); // table, class, instance.
317
sq_setparamscheck(_VM,numParams+1,ptm); // Parameters are table+args (thus, the +1).
320
sq_setparamscheck(_VM,numParams,ptm); // Determine arg count from type string.
324
sq_setnativeclosurename(_VM,-1,scriptFuncName); // For debugging only.
326
sq_createslot(_VM,-3); // Create slot in table or class (assigning function to slot at scriptNameFunc).
328
} // SquirrelVM::CreateFunction
330
SquirrelObject SquirrelVM::CreateFunction(SquirrelObject & so,SQFUNCTION func,const SQChar * scriptFuncName,const SQChar * typeMask) {
332
SquirrelObject ret = CreateFunction(func,scriptFuncName,typeMask);
335
} // SquirrelVM::CreateFunction
337
// Create a Global function on the root table.
338
//void CreateFunctionGlobal(HSQUIRRELVM v,const SQChar * scriptFuncName,SQFUNCTION func,SQInteger numParams=0,const SQChar * typeMask=0) {
339
SquirrelObject SquirrelVM::CreateFunctionGlobal(SQFUNCTION func,const SQChar * scriptFuncName,const SQChar * typeMask) {
340
PushRootTable(); // Push root table.
341
// CreateFunction(scriptFuncName,func,numParams,typeMask);
342
SquirrelObject ret = CreateFunction(func,scriptFuncName,typeMask);
343
Pop(1); // Pop root table.
345
} // SquirrelVM::CreateFunctionGlobal