1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-11-26 02:57:17 +01:00

Dumped the old implementation. Started with a more simple approach.

This commit is contained in:
Sandu Liviu Catalin
2016-02-21 00:25:00 +02:00
parent 96ded94026
commit 06e598acfb
293 changed files with 37439 additions and 92564 deletions

View File

@@ -13,7 +13,7 @@
#include "sqfuncstate.h"
#include "sqclass.h"
bool sq_aux_gettypedarg(HSQUIRRELVM v,SQInteger idx,SQObjectType type,SQObjectPtr **o)
static bool sq_aux_gettypedarg(HSQUIRRELVM v,SQInteger idx,SQObjectType type,SQObjectPtr **o)
{
*o = &stack_get(v,idx);
if(type(**o) != type){
@@ -34,7 +34,8 @@ bool sq_aux_gettypedarg(HSQUIRRELVM v,SQInteger idx,SQObjectType type,SQObjectPt
SQInteger sq_aux_invalidtype(HSQUIRRELVM v,SQObjectType type)
{
scsprintf(_ss(v)->GetScratchPad(100), 100 *sizeof(SQChar), _SC("unexpected type %s"), IdType2Name(type));
SQUnsignedInteger buf_size = 100 *sizeof(SQChar);
scsprintf(_ss(v)->GetScratchPad(buf_size), buf_size, _SC("unexpected type %s"), IdType2Name(type));
return sq_throwerror(v, _ss(v)->GetScratchPad(-1));
}
@@ -179,6 +180,12 @@ SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po)
#endif
}
SQUnsignedInteger sq_getvmrefcount(HSQUIRRELVM v, const HSQOBJECT *po)
{
if (!ISREFCOUNTED(type(*po))) return 0;
return po->_unVal.pRefCounted->_uiRef;
}
const SQChar *sq_objtostring(const HSQOBJECT *o)
{
if(sq_type(*o) == OT_STRING) {
@@ -251,6 +258,11 @@ void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p)
v->Push(p);
}
void sq_pushthread(HSQUIRRELVM v, HSQUIRRELVM thread)
{
v->Push(thread);
}
SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size)
{
SQUserData *ud = SQUserData::Create(_ss(v), size + SQ_ALIGNMENT);
@@ -443,6 +455,7 @@ SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx)
return sq_throwerror(v,_SC("the target is not a closure"));
SQObjectPtr &env = stack_get(v,-1);
if(!sq_istable(env) &&
!sq_isarray(env) &&
!sq_isclass(env) &&
!sq_isinstance(env))
return sq_throwerror(v,_SC("invalid environment"));
@@ -880,29 +893,30 @@ SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx)
SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr &self = stack_get(v, idx);
if(type(v->GetUp(-2)) == OT_NULL) {
SQObjectPtr &key = v->GetUp(-2);
if(type(key) == OT_NULL) {
v->Pop(2);
return sq_throwerror(v, _SC("null key"));
}
switch(type(self)) {
case OT_TABLE:
_table(self)->NewSlot(v->GetUp(-2), v->GetUp(-1));
_table(self)->NewSlot(key, v->GetUp(-1));
v->Pop(2);
return SQ_OK;
break;
case OT_CLASS:
_class(self)->NewSlot(_ss(v), v->GetUp(-2), v->GetUp(-1),false);
_class(self)->NewSlot(_ss(v), key, v->GetUp(-1),false);
v->Pop(2);
return SQ_OK;
break;
case OT_INSTANCE:
if(_instance(self)->Set(v->GetUp(-2), v->GetUp(-1))) {
if(_instance(self)->Set(key, v->GetUp(-1))) {
v->Pop(2);
return SQ_OK;
}
break;
case OT_ARRAY:
if(v->Set(self, v->GetUp(-2), v->GetUp(-1),false)) {
if(v->Set(self, key, v->GetUp(-1),false)) {
v->Pop(2);
return SQ_OK;
}
@@ -918,8 +932,9 @@ SQRESULT sq_newmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic)
{
SQObjectPtr &self = stack_get(v, idx);
if(type(self) != OT_CLASS) return sq_throwerror(v, _SC("new member only works with classes"));
if(type(v->GetUp(-3)) == OT_NULL) return sq_throwerror(v, _SC("null key"));
if(!v->NewSlotA(self,v->GetUp(-3),v->GetUp(-2),v->GetUp(-1),bstatic?true:false,false))
SQObjectPtr &key = v->GetUp(-3);
if(type(key) == OT_NULL) return sq_throwerror(v, _SC("null key"));
if(!v->NewSlotA(self,key,v->GetUp(-2),v->GetUp(-1),bstatic?true:false,false))
return SQ_ERROR;
return SQ_OK;
}
@@ -928,8 +943,9 @@ SQRESULT sq_rawnewmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic)
{
SQObjectPtr &self = stack_get(v, idx);
if(type(self) != OT_CLASS) return sq_throwerror(v, _SC("new member only works with classes"));
if(type(v->GetUp(-3)) == OT_NULL) return sq_throwerror(v, _SC("null key"));
if(!v->NewSlotA(self,v->GetUp(-3),v->GetUp(-2),v->GetUp(-1),bstatic?true:false,true))
SQObjectPtr &key = v->GetUp(-3);
if(type(key) == OT_NULL) return sq_throwerror(v, _SC("null key"));
if(!v->NewSlotA(self,key,v->GetUp(-2),v->GetUp(-1),bstatic?true:false,true))
return SQ_ERROR;
return SQ_OK;
}
@@ -999,7 +1015,8 @@ SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx)
SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr &self=stack_get(v,idx);
if(v->Get(self,v->GetUp(-1),v->GetUp(-1),false,DONT_FALL_BACK))
SQObjectPtr &obj = v->GetUp(-1);
if(v->Get(self,obj,obj,false,DONT_FALL_BACK))
return SQ_OK;
v->Pop();
return SQ_ERROR;
@@ -1008,23 +1025,23 @@ SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx)
SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr &self=stack_get(v,idx);
SQObjectPtr &obj = v->GetUp(-1);
switch(type(self)) {
case OT_TABLE:
if(_table(self)->Get(v->GetUp(-1),v->GetUp(-1)))
if(_table(self)->Get(obj,obj))
return SQ_OK;
break;
case OT_CLASS:
if(_class(self)->Get(v->GetUp(-1),v->GetUp(-1)))
if(_class(self)->Get(obj,obj))
return SQ_OK;
break;
case OT_INSTANCE:
if(_instance(self)->Get(v->GetUp(-1),v->GetUp(-1)))
if(_instance(self)->Get(obj,obj))
return SQ_OK;
break;
case OT_ARRAY:{
SQObjectPtr& key = v->GetUp(-1);
if(sq_isnumeric(key)){
if(_array(self)->Get(tointeger(key),v->GetUp(-1))) {
if(sq_isnumeric(obj)){
if(_array(self)->Get(tointeger(obj),obj)) {
return SQ_OK;
}
}
@@ -1037,7 +1054,7 @@ SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx)
default:
v->Pop();
return sq_throwerror(v,_SC("rawget works only on array/table/instance and class"));
}
}
v->Pop();
return sq_throwerror(v,_SC("the index doesn't exist"));
}
@@ -1120,9 +1137,10 @@ SQRESULT sq_reservestack(HSQUIRRELVM v,SQInteger nsize)
SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror)
{
if(type(v->GetUp(-1))==OT_GENERATOR){
if (type(v->GetUp(-1)) == OT_GENERATOR)
{
v->PushNull(); //retval
if(!v->Execute(v->GetUp(-2),0,v->_top,v->GetUp(-1),raiseerror,SQVM::ET_RESUME_GENERATOR))
if (!v->Execute(v->GetUp(-2), 0, v->_top, v->GetUp(-1), raiseerror, SQVM::ET_RESUME_GENERATOR))
{v->Raise_Error(v->_lasterror); return SQ_ERROR;}
if(!retval)
v->Pop();
@@ -1192,6 +1210,20 @@ void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook)
}
}
SQRELEASEHOOK sq_getreleasehook(HSQUIRRELVM v,SQInteger idx)
{
if(sq_gettop(v) >= 1){
SQObjectPtr &ud=stack_get(v,idx);
switch( type(ud) ) {
case OT_USERDATA: return _userdata(ud)->_hook; break;
case OT_INSTANCE: return _instance(ud)->_hook; break;
case OT_CLASS: return _class(ud)->_hook; break;
default: break; //shutup compiler
}
}
return NULL;
}
void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f)
{
_ss(v)->_compilererrorhandler = f;