/*
	 * invoke impact event
	 */
	static SQBool invokeImpactEvent(HSQUIRRELVM v, ContactPoint cp) {
		SQBool result = false;
		SQInteger top = sq_gettop(v);
		sq_pushroottable(v);
		sq_pushstring(v, "emo", -1);
		if (SQ_SUCCEEDED(sq_get(v, -2))) {
			sq_pushstring(v, "_onImpact", -1);
			if(SQ_SUCCEEDED(sq_get(v, -2))) {
				sq_pushroottable(v);
				sq_pushuserpointer(v, cp.fixtureA);
				sq_pushuserpointer(v, cp.fixtureB);
				sq_pushuserpointer(v, cp.fixtureA->GetBody());
				sq_pushuserpointer(v, cp.fixtureB->GetBody());
				pushVec2(v, cp.position);
				pushVec2(v, cp.normal);
				sq_pushfloat(v, cp.normalImpulse);
				sq_pushfloat(v, cp.tangentImpulse);

				result = SQ_SUCCEEDED(sq_call(v, 9, SQFalse, SQTrue));
			}
		}
		sq_settop(v,top);

		return result;
	}
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;
}
bool SQDbgServer::Init()
{
	//creates  an environment table for the debugger
	
	sq_newtable(_v);
	sq_getstackobj(_v,-1,&_debugroot);
	sq_addref(_v,&_debugroot);

	//creates a emptyslot to store the watches
	sq_pushstring(_v,_SC("watches"),-1);
	sq_pushnull(_v);
	sq_createslot(_v,-3);

	sq_pushstring(_v,_SC("beginelement"),-1);
	sq_pushuserpointer(_v,this);
	sq_newclosure(_v,beginelement,1);
	sq_setparamscheck(_v,2,_SC(".s"));
	sq_createslot(_v,-3);

	sq_pushstring(_v,_SC("endelement"),-1);
	sq_pushuserpointer(_v,this);
	sq_newclosure(_v,endelement,1);
	sq_setparamscheck(_v,2,_SC(".s"));
	sq_createslot(_v,-3);

	sq_pushstring(_v,_SC("attribute"),-1);
	sq_pushuserpointer(_v,this);
	sq_newclosure(_v,attribute,1);
	sq_setparamscheck(_v,3,_SC(".ss"));
	sq_createslot(_v,-3);

	sq_pop(_v,1);

	//stores debug hook and error handler in the registry
	sq_pushregistrytable(_v);

	sq_pushstring(_v,SQDBG_DEBUG_HOOK,-1);
	sq_pushuserpointer(_v,this);
	sq_newclosure(_v,debug_hook,1);
	sq_createslot(_v,-3);
	
	sq_pushstring(_v,SQDBG_ERROR_HANDLER,-1);
	sq_pushuserpointer(_v,this);
	sq_newclosure(_v,error_handler,1);
	sq_createslot(_v,-3);

	
	sq_pop(_v,1);

	//sets the error handlers
	SetErrorHandlers();
	return true;
}
Beispiel #4
0
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
}
Beispiel #5
0
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;
}
Beispiel #6
0
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;
}
	/*
	 * invoke contact event
	 */
	static SQBool invokeContactEvent(HSQUIRRELVM v, ContactPoint cp) {
		SQBool result = false;
		SQInteger top = sq_gettop(v);
		sq_pushroottable(v);
		sq_pushstring(v, "emo", -1);
		if (SQ_SUCCEEDED(sq_get(v, -2))) {
			sq_pushstring(v, "_onContact", -1);
			if(SQ_SUCCEEDED(sq_get(v, -2))) {
				sq_pushroottable(v);
				switch(cp.state) {
					case b2_addState:
						sq_pushinteger(v, PHYSICS_STATE_ADD);
						break;
					case b2_persistState:
						sq_pushinteger(v, PHYSICS_STATE_PERSIST);
						break;
					case b2_removeState:
						sq_pushinteger(v, PHYSICS_STATE_REMOVE);
						break;
					default:
						sq_pushinteger(v, PHYSICS_STATE_NULL);
				}
				sq_pushuserpointer(v, cp.fixtureA);
				sq_pushuserpointer(v, cp.fixtureB);
				sq_pushuserpointer(v, cp.fixtureA->GetBody());
				sq_pushuserpointer(v, cp.fixtureB->GetBody());
				pushVec2(v, cp.position);
				pushVec2(v, cp.normal);
				sq_pushfloat(v, cp.normalImpulse);
				sq_pushfloat(v, cp.tangentImpulse);
				
				result = SQ_SUCCEEDED(sq_call(v, 10, SQFalse, SQTrue));
			}
		}
		sq_settop(v,top);
		
		return result;
	}
Beispiel #8
0
static SQInteger sq_ffi_load(HSQUIRRELVM v)
{
    const SQChar *fname;
    sq_getstring(v, 2, &fname);
    void *mod = OPEN_LIB(fname);
    if (!mod)
        return sq_throwerror(v, "Cannot load library");
    sq_pushuserpointer(v, mod);
    void **p = (void**)sq_newuserdata(v, sizeof(mod));
    *p = mod;
    sq_push_delegate_table(v, FFI_LIB_LIB_TAG);
    sq_setdelegate(v, -2);
    return 1;
}
bool SquirrelScriptContext::RegisterFunction(FunctionDesc* desc)
{
	SquirrelFunctionInfo* info = new SquirrelFunctionInfo();
	info->m_desc = desc;
	info->m_context = this;

	sq_pushroottable(m_vm);
	sq_pushstring(m_vm, desc->m_name, -1);
	sq_pushuserpointer(m_vm, info);
	sq_newclosure(m_vm, SquirrelFunctionCallback, 1);
	sq_createslot(m_vm, -3);
	sq_pop(m_vm, 1);

	m_functions.push_back(info);
	return true;
}
Beispiel #10
0
int Xml_load (HSQUIRRELVM v) {
    SQ_FUNC_VARS_NO_TOP(v);
    SQ_GET_STRING(v, 2, filename);
	FILE * file=fopen(filename,"r");
	if(!file) return sq_throwerror(v, _SC("SQXml ERROR: \"%s\" file error or file not found!"),filename);

	fseek (file , 0 , SEEK_END);
	size_t sz = ftell (file);
	rewind (file);
	char* buffer = (char*)sq_malloc(sz+1);
	sz = fread (buffer,1,sz,file);
	fclose(file);
	buffer[sz]=0;
	sq_pushuserpointer(v,buffer);
	sq_replace(v,2);
	return Xml_eval(v);
};
Beispiel #11
0
// handle fopen(string path, string mode)
// Open file
// 'mode' may be either one of modes used by fopen() function in libc or one of these values:
//    READ_ONLY  - open for reading only (the file must exist);
//    WRITE_ONLY - open for writing only;
//    READ_WRITE - open for both reading and writing (the file must exist);
//    APPEND     - open for appending (writing data at the end of the file).
static SQInteger FOpen (HSQUIRRELVM)
{
	if (numFiles == MAX_OPENED_FILES)
	{
		PrintError("ERROR: Too many opened files.\n");
		sq_pushnull(sqvm);
		return 1;
	}

	// Find first unopened file
	unsigned i;
	for (i = 0; i < MAX_OPENED_FILES; ++i)
	{
		if (!files[i])
			break;
	}

	const SQChar *path, *mode;
	sq_getstring(sqvm, 2, &path);
	sq_getstring(sqvm, 3, &mode);

	// Binary file I/O isn't provided to scripts
	// FIXME: Wouldn't binary file I/O be useful?
	SQChar* c = (SQChar*)strchr(mode, 'b');
	if (c)
		*c = 0;

#if defined(_MSC_VER) && (_MSC_VER >= 1400)
	if (fopen_s(&files[i], ConvPath(path, SQTrue), mode))
		files[i] = NULL;
#else
	files[i] = fopen(ConvPath(path, SQTrue), mode);
#endif

	FILE* res = files[i];
	if (res)
	{
		sq_pushuserpointer(sqvm, res);
		++numFiles;
		_RPT2(_CRT_WARN, "--- Opened file #%d. %d file(s) are opened.\n", i, numFiles);
	}
	else
		sq_pushnull(sqvm);
	return 1;
}
Beispiel #12
0
// 初期化用
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);
}
Beispiel #13
0
static SQInteger _mod_fopen(HSQUIRRELVM v) {
    const SQChar *fname,*how;
    sq_getstring(v,2,&fname);
    sq_getstring(v,3,&how);
    if(fname) {
        char fullname[512];
        if(fname[0]=='/')
            sprintf(fullname,"%s",fname);
        else
            sprintf(fullname,"%s/%s",__pSQ->ctx()->_dir_home,fname);
        FILE* pf = fopen(fullname, how);
        if(pf) {
            // ::fcntl(fileno(pf), F_SETFD, FD_CLOEXEC);
            sq_pushuserpointer(v,(SQUserPointer)pf);
            return 1;
        }
    }
    // ?? ERROR handling
    return 0;
}
Beispiel #14
0
SQRESULT NitLibCom(HSQUIRRELVM v)
{
	NitLibCom::Register(v);
	NitBindComTypeLib::Register(v);

	NitBindCom* com = new NitBindCom(v);
	sq_pushroottable(v);
	sq_pushstring(v, "com", -1);
	NitBind::push(v, com);
	sq_newslot(v, -3, true);
	sq_poptop(v);

	// Prevent deletion from registry
	sq_pushregistrytable(v);
	sq_pushuserpointer(v, com);
	NitBind::push(v, com);
	sq_newslot(v, -3, true);
	sq_poptop(v);

	return SQ_OK;
}
Beispiel #15
0
SQRESULT sqstd_createfile(HSQUIRRELVM v, SQFILE file,SQBool own)
{
	SQInteger top = sq_gettop(v);
	sq_pushregistrytable(v);
	sq_pushstring(v,_SC("std_file"),-1);
	if(SQ_SUCCEEDED(sq_get(v,-2))) {
		sq_remove(v,-2); //removes the registry
		sq_pushroottable(v); // push the this
		sq_pushuserpointer(v,file); //file
		if(own){
			sq_pushinteger(v,1); //true
		}
		else{
			sq_pushnull(v); //false
		}
		if(SQ_SUCCEEDED( sq_call(v,3,SQTrue,SQFalse) )) {
			sq_remove(v,-2);
			return SQ_OK;
		}
	}
	sq_settop(v,top);
	return SQ_OK;
}
Beispiel #16
0
SQInteger _VwSetTimerInternal(HSQUIRRELVM v, TIMERPROC lpTimerFunc)
{
	SQInteger      nargs         = sq_gettop(v);
	SQInteger      Handle        = 0;
	SQInteger      uElapse       = 0;
	LPCTSTR        pstrFunc      = NULL;
	SetTimerParam* pTimerParam   = NULL;
	SQUserPointer      nRet          = NULL;

	if (!v || 3 + 1 != nargs) {goto _Exit_;}
	if (OT_INTEGER  != sq_gettype(v, 2)) {goto _Exit_;}
	if (OT_STRING   != sq_gettype(v, 3)) {goto _Exit_;}
	if (OT_INSTANCE != sq_gettype(v, 4)) {goto _Exit_;}

	sq_getinteger(v, 2, &uElapse);
	sq_getstring(v, 3, &pstrFunc);

	pTimerParam = new SetTimerParam();
	pTimerParam->v = v;
	pTimerParam->sFunc = pstrFunc;
	sq_getstackobj(v, 4, &pTimerParam->Obj);

	CScriptMgr* pMgr = (CScriptMgr*)sq_getforeignptr(v);
	if (!pMgr) {goto _Exit_;}
	CPaintManagerUI* pPM = pMgr->GetManager();
	if (!pPM) {goto _Exit_;}

	if (NULL != ::SetTimer(pPM->GetPaintWindow(), (UINT_PTR)pTimerParam, uElapse, lpTimerFunc)) {
		nRet = (SQUserPointer)pTimerParam;
	} else {
		nRet = NULL;
	}

_Exit_:
	sq_pushuserpointer(v, nRet);
	return 1;
}
Beispiel #17
0
void Interactive(HSQUIRRELVM v)
{
	
#define MAXINPUT 1024
	SQChar buffer[MAXINPUT];
	SQInteger blocks =0;
	SQInteger string=0;
	SQInteger retval=0;
	SQInteger done=0;
	PrintVersionInfos();
		
	sq_pushroottable(v);
	sq_pushstring(v,_SC("quit"),-1);
	sq_pushuserpointer(v,&done);
	sq_newclosure(v,quit,1);
	sq_setparamscheck(v,1,NULL);
	sq_newslot(v,-3,SQFalse);
	sq_pop(v,1);

	while (!done) 
	{
		SQInteger i = 0;
		scprintf(_SC("\nsq>"));
		for(;;) {
			int c;
			if(done)return;
			c = getchar();
			if (c == _SC('\n')) {
				if (i>0 && buffer[i-1] == _SC('\\'))
				{
					buffer[i-1] = _SC('\n');
				}
				else if(blocks==0)break;
				buffer[i++] = _SC('\n');
			}
			else if (c==_SC('}')) {blocks--; buffer[i++] = (SQChar)c;}
			else if(c==_SC('{') && !string){
					blocks++;
					buffer[i++] = (SQChar)c;
			}
			else if(c==_SC('"') || c==_SC('\'')){
					string=!string;
					buffer[i++] = (SQChar)c;
			}
			else if (i >= MAXINPUT-1) {
				scfprintf(stderr, _SC("sq : input line too long\n"));
				break;
			}
			else{
				buffer[i++] = (SQChar)c;
			}
		}
		buffer[i] = _SC('\0');
		
		if(buffer[0]==_SC('=')){
			scsprintf(sq_getscratchpad(v,MAXINPUT),_SC("return (%s)"),&buffer[1]);
			memcpy(buffer,sq_getscratchpad(v,-1),(scstrlen(sq_getscratchpad(v,-1))+1)*sizeof(SQChar));
			retval=1;
		}
		i=scstrlen(buffer);
		if(i>0){
			SQInteger oldtop=sq_gettop(v);
			if(SQ_SUCCEEDED(sq_compilebuffer(v,buffer,i,_SC("interactive console"),SQTrue))){
				sq_pushroottable(v);
				if(SQ_SUCCEEDED(sq_call(v,1,retval,SQTrue)) &&	retval){
					scprintf(_SC("\n"));
					sq_pushroottable(v);
					sq_pushstring(v,_SC("print"),-1);
					sq_get(v,-2);
					sq_pushroottable(v);
					sq_push(v,-4);
					sq_call(v,2,SQFalse,SQTrue);
					retval=0;
					scprintf(_SC("\n"));
				}
			}
			
			sq_settop(v,oldtop);
		}
	}
}
Beispiel #18
0
	template <> inline int Return<void *>      (HSQUIRRELVM vm, void *res)       { sq_pushuserpointer(vm, res); return 1; }
Beispiel #19
0
/*
** Copies values from State src to State dst.
*/
static SQRESULT copy_values_between_vms (HSQUIRRELVM dst, HSQUIRRELVM src, int argc, int argIdx)
{
    SQRESULT _rc_;
    sq_reservestack(dst, argc + 20);
    argc += argIdx; //we will work with argc args starting at argIdx
    for (; argIdx < argc; argIdx++)
    {
        switch (sq_gettype(src, argIdx))
        {
        case OT_INTEGER:
            SQ_GET_INTEGER(src, argIdx, vint);
            sq_pushinteger(dst, vint);
            break;

        case OT_FLOAT:
            SQ_GET_FLOAT(src, argIdx, vfloat);
            sq_pushfloat (dst, vfloat);
            break;

        case OT_BOOL:
            SQ_GET_BOOL(src, argIdx, vbool);
            sq_pushbool (dst, vbool);
            break;

        case OT_STRING:
        {
            SQ_GET_STRING(src, argIdx, vstr)
            sq_pushstring (dst, vstr, vstr_size);
        }
        break;

        case OT_ARRAY:
        {
            SQInteger size = sq_getsize(src, argIdx);
            sq_newarray(dst, size);
            for(SQInteger i=0; i<size; ++i)
            {
                sq_pushinteger(src, i);
                sq_get(src, -2);
                sq_pushinteger(dst, i);
                if(copy_values_between_vms(dst, src, 1, sq_gettop(src)) != SQ_OK) return SQ_ERROR;
                sq_poptop(src);
                sq_set(dst, -3);
            }
        }
        break;

        case OT_TABLE:
        {
            sq_newtable(dst);
            sq_pushnull(src);
            while(sq_next(src, -2) == SQ_OK)
            {
                SQInteger src_top = sq_gettop(src);
                if(copy_values_between_vms(dst, src, 1, src_top-1) != SQ_OK
                        || copy_values_between_vms(dst, src, 1, src_top) != SQ_OK) return SQ_ERROR;
                sq_newslot(dst, -3, SQFalse);
                sq_pop(src, 2);
            }
            sq_pop(src,1);
        }
        break;

        case OT_USERPOINTER:
        {
            SQUserPointer ptr;
            sq_getuserpointer(src, argIdx, &ptr);
            sq_pushuserpointer(dst, ptr);
        }
        break;

        case OT_NULL:
            sq_pushnull(dst);
            break;

        default:
            return SQ_ERROR;
        }
    }
    return SQ_OK;
}
Beispiel #20
0
void SquirrelVM::PushParam(SQUserPointer up)
{
	_CHECK_CALL_STATE
	sq_pushuserpointer(_VM,up);
	_CallState++;
}
Beispiel #21
0
void sq_pushentity(SQVM* pVM, CEntity* pEntity)
{
	sq_pushuserpointer(pVM,(SQUserPointer)pEntity->GetID());
}