|
@@ -156,7 +156,14 @@ static SQInteger base_getstackinfos(HSQUIRRELVM v)
|
|
static SQInteger base_assert(HSQUIRRELVM v)
|
|
static SQInteger base_assert(HSQUIRRELVM v)
|
|
{
|
|
{
|
|
if(SQVM::IsFalse(stack_get(v,2))){
|
|
if(SQVM::IsFalse(stack_get(v,2))){
|
|
- return sq_throwerror(v,_SC("assertion failed"));
|
|
|
|
|
|
+ SQInteger top = sq_gettop(v);
|
|
|
|
+ if (top>2 && SQ_SUCCEEDED(sq_tostring(v,3))) {
|
|
|
|
+ const SQChar *str = 0;
|
|
|
|
+ if (SQ_SUCCEEDED(sq_getstring(v,-1,&str))) {
|
|
|
|
+ return sq_throwerror(v, str);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return sq_throwerror(v, _SC("assertion failed"));
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -283,7 +290,7 @@ static const SQRegFunction base_funcs[]={
|
|
{_SC("setroottable"),base_setroottable,2, NULL},
|
|
{_SC("setroottable"),base_setroottable,2, NULL},
|
|
{_SC("getconsttable"),base_getconsttable,1, NULL},
|
|
{_SC("getconsttable"),base_getconsttable,1, NULL},
|
|
{_SC("setconsttable"),base_setconsttable,2, NULL},
|
|
{_SC("setconsttable"),base_setconsttable,2, NULL},
|
|
- {_SC("assert"),base_assert,2, NULL},
|
|
|
|
|
|
+ {_SC("assert"),base_assert,-2, NULL},
|
|
{_SC("print"),base_print,2, NULL},
|
|
{_SC("print"),base_print,2, NULL},
|
|
{_SC("error"),base_error,2, NULL},
|
|
{_SC("error"),base_error,2, NULL},
|
|
{_SC("compilestring"),base_compilestring,-2, _SC(".ss")},
|
|
{_SC("compilestring"),base_compilestring,-2, _SC(".ss")},
|
|
@@ -465,6 +472,34 @@ static SQInteger table_getdelegate(HSQUIRRELVM v)
|
|
return SQ_SUCCEEDED(sq_getdelegate(v,-1))?1:SQ_ERROR;
|
|
return SQ_SUCCEEDED(sq_getdelegate(v,-1))?1:SQ_ERROR;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static SQInteger table_filter(HSQUIRRELVM v)
|
|
|
|
+{
|
|
|
|
+ SQObject &o = stack_get(v,1);
|
|
|
|
+ SQTable *tbl = _table(o);
|
|
|
|
+ SQObjectPtr ret = SQTable::Create(_ss(v),0);
|
|
|
|
+
|
|
|
|
+ SQObjectPtr itr, key, val;
|
|
|
|
+ SQInteger nitr;
|
|
|
|
+ while((nitr = tbl->Next(false, itr, key, val)) != -1) {
|
|
|
|
+ itr = (SQInteger)nitr;
|
|
|
|
+
|
|
|
|
+ v->Push(o);
|
|
|
|
+ v->Push(key);
|
|
|
|
+ v->Push(val);
|
|
|
|
+ if(SQ_FAILED(sq_call(v,3,SQTrue,SQFalse))) {
|
|
|
|
+ return SQ_ERROR;
|
|
|
|
+ }
|
|
|
|
+ if(!SQVM::IsFalse(v->GetUp(-1))) {
|
|
|
|
+ _table(ret)->NewSlot(key, val);
|
|
|
|
+ }
|
|
|
|
+ v->Pop();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ v->Push(ret);
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
const SQRegFunction SQSharedState::_table_default_delegate_funcz[]={
|
|
const SQRegFunction SQSharedState::_table_default_delegate_funcz[]={
|
|
{_SC("len"),default_delegate_len,1, _SC("t")},
|
|
{_SC("len"),default_delegate_len,1, _SC("t")},
|
|
{_SC("rawget"),container_rawget,2, _SC("t")},
|
|
{_SC("rawget"),container_rawget,2, _SC("t")},
|
|
@@ -476,6 +511,7 @@ const SQRegFunction SQSharedState::_table_default_delegate_funcz[]={
|
|
{_SC("clear"),obj_clear,1, _SC(".")},
|
|
{_SC("clear"),obj_clear,1, _SC(".")},
|
|
{_SC("setdelegate"),table_setdelegate,2, _SC(".t|o")},
|
|
{_SC("setdelegate"),table_setdelegate,2, _SC(".t|o")},
|
|
{_SC("getdelegate"),table_getdelegate,1, _SC(".")},
|
|
{_SC("getdelegate"),table_getdelegate,1, _SC(".")},
|
|
|
|
+ {_SC("filter"),table_filter,2, _SC("tc")},
|
|
{NULL,(SQFUNCTION)0,0,NULL}
|
|
{NULL,(SQFUNCTION)0,0,NULL}
|
|
};
|
|
};
|
|
|
|
|
|
@@ -542,9 +578,13 @@ static SQInteger array_resize(HSQUIRRELVM v)
|
|
SQObject &nsize = stack_get(v, 2);
|
|
SQObject &nsize = stack_get(v, 2);
|
|
SQObjectPtr fill;
|
|
SQObjectPtr fill;
|
|
if(sq_isnumeric(nsize)) {
|
|
if(sq_isnumeric(nsize)) {
|
|
|
|
+ SQInteger sz = tointeger(nsize);
|
|
|
|
+ if (sz<0)
|
|
|
|
+ return sq_throwerror(v, _SC("resizing to negative length"));
|
|
|
|
+
|
|
if(sq_gettop(v) > 2)
|
|
if(sq_gettop(v) > 2)
|
|
fill = stack_get(v, 3);
|
|
fill = stack_get(v, 3);
|
|
- _array(o)->Resize(tointeger(nsize),fill);
|
|
|
|
|
|
+ _array(o)->Resize(sz,fill);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
return sq_throwerror(v, _SC("size must be a number"));
|
|
return sq_throwerror(v, _SC("size must be a number"));
|
|
@@ -885,7 +925,12 @@ static SQInteger closure_pcall(HSQUIRRELVM v)
|
|
|
|
|
|
static SQInteger closure_call(HSQUIRRELVM v)
|
|
static SQInteger closure_call(HSQUIRRELVM v)
|
|
{
|
|
{
|
|
- return SQ_SUCCEEDED(sq_call(v,sq_gettop(v)-1,SQTrue,SQTrue))?1:SQ_ERROR;
|
|
|
|
|
|
+ SQObjectPtr &c = stack_get(v, -1);
|
|
|
|
+ if (sq_type(c) == OT_CLOSURE && (_closure(c)->_function->_bgenerator == false))
|
|
|
|
+ {
|
|
|
|
+ return sq_tailcall(v, sq_gettop(v) - 1);
|
|
|
|
+ }
|
|
|
|
+ return SQ_SUCCEEDED(sq_call(v, sq_gettop(v) - 1, SQTrue, SQTrue)) ? 1 : SQ_ERROR;
|
|
}
|
|
}
|
|
|
|
|
|
static SQInteger _closure_acall(HSQUIRRELVM v,SQBool raiseerror)
|
|
static SQInteger _closure_acall(HSQUIRRELVM v,SQBool raiseerror)
|