return 1;
}
+static SQInteger base_getconsttable(HSQUIRRELVM v)
+{
+ v->Push(_ss(v)->_consts);
+ return 1;
+}
+
+
static SQInteger base_setroottable(HSQUIRRELVM v)
{
SQObjectPtr &o=stack_get(v,2);
return 1;
}
+static SQInteger base_setconsttable(HSQUIRRELVM v)
+{
+ SQObjectPtr &o=stack_get(v,2);
+ if(SQ_FAILED(sq_setconsttable(v))) return SQ_ERROR;
+ v->Push(o);
+ return 1;
+}
+
static SQInteger base_seterrorhandler(HSQUIRRELVM v)
{
sq_seterrorhandler(v);
{_SC("getstackinfos"),base_getstackinfos,2, _SC(".n")},
{_SC("getroottable"),base_getroottable,1, NULL},
{_SC("setroottable"),base_setroottable,2, NULL},
+ {_SC("getconsttable"),base_getconsttable,1, NULL},
+ {_SC("setconsttable"),base_setconsttable,2, NULL},
{_SC("assert"),base_assert,2, NULL},
{_SC("print"),base_print,2, NULL},
{_SC("compilestring"),base_compilestring,-2, _SC(".ss")},
SQObject &o=stack_get(v,1);
SQObject &idx=stack_get(v,2);
SQObject &val=stack_get(v,3);
- _array(o)->Insert(idx,val);
+ if(!_array(o)->Insert(tointeger(idx),val))
+ return sq_throwerror(v,_SC("index out of range"));
return 0;
}
v->Push(a);
v->Push(b);
if(SQ_FAILED(sq_call(v, 3, SQTrue, SQFalse))) {
- v->Raise_Error(_SC("compare func failed"));
+ if(!sq_isstring( v->_lasterror))
+ v->Raise_Error(_SC("compare func failed"));
return false;
}
sq_getinteger(v, -1, &ret);
return false;
} while( ret <= 0);
do {
- --j;
+ --j;
+ if ( j < 0 ) {
+ v->Raise_Error( _SC("Invalid qsort, probably compare function defect") );
+ return false;
+ }
if(!_qsort_compare(v,arr,a->_values[j],pivot,func,ret))
return false;
}
SQInteger sidx,eidx;
SQObjectPtr o;
if(get_slice_params(v,sidx,eidx,o)==-1)return -1;
- if(sidx<0)sidx=_array(o)->Size()+sidx;
- if(eidx<0)eidx=_array(o)->Size()+eidx;
+ SQInteger alen = _array(o)->Size();
+ if(sidx < 0)sidx = alen + sidx;
+ if(eidx < 0)eidx = alen + eidx;
if(eidx < sidx)return sq_throwerror(v,_SC("wrong indexes"));
+ if(eidx > alen)return sq_throwerror(v,_SC("slice out of range"));
SQArray *arr=SQArray::Create(_ss(v),eidx-sidx);
SQObjectPtr t;
SQInteger count=0;
SQInteger sidx,eidx;
SQObjectPtr o;
if(SQ_FAILED(get_slice_params(v,sidx,eidx,o)))return -1;
- if(sidx<0)sidx=_string(o)->_len+sidx;
- if(eidx<0)eidx=_string(o)->_len+eidx;
- if(eidx<sidx)
- return sq_throwerror(v,_SC("wrong indexes"));
+ SQInteger slen = _string(o)->_len;
+ if(sidx < 0)sidx = slen + sidx;
+ if(eidx < 0)eidx = slen + eidx;
+ if(eidx < sidx) return sq_throwerror(v,_SC("wrong indexes"));
+ if(eidx > slen) return sq_throwerror(v,_SC("slice out of range"));
v->Push(SQString::Create(_ss(v),&_stringval(o)[sidx],eidx-sidx));
return 1;
}
static SQInteger thread_call(HSQUIRRELVM v)
{
+
SQObjectPtr o = stack_get(v,1);
if(type(o) == OT_THREAD) {
SQInteger nparams = sq_gettop(v);
sq_move(_thread(o),v,i);
if(SQ_SUCCEEDED(sq_call(_thread(o),nparams,SQTrue,SQFalse))) {
sq_move(v,_thread(o),-1);
+ sq_pop(_thread(o),1);
return 1;
}
+ v->_lasterror = _thread(o)->_lasterror;
return SQ_ERROR;
}
return sq_throwerror(v,_SC("wrong parameter"));
if(wakeupret) {
sq_move(thread,v,2);
}
- if(SQ_SUCCEEDED(sq_wakeupvm(thread,wakeupret,1,SQFalse))) {
+ if(SQ_SUCCEEDED(sq_wakeupvm(thread,wakeupret,SQTrue,SQFalse))) {
sq_move(v,thread,-1);
- sq_pop(thread,1);
+ sq_pop(thread,1); //pop retval
if(sq_getvmstate(thread) == SQ_VMSTATE_IDLE) {
- sq_pop(thread,1);
+ sq_settop(thread,1); //pop roottable
}
return 1;
}
+ sq_settop(thread,1);
+ v->_lasterror = thread->_lasterror;
return SQ_ERROR;
}
return sq_throwerror(v,_SC("wrong parameter"));