Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/vscript/squirrel/COMPILE
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Squirrel 3.1 stable
Squirrel 3.2 stable
--------------------------------------------------------
What is in this distribution?

Expand Down
2 changes: 1 addition & 1 deletion src/vscript/squirrel/COPYRIGHT
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Copyright (c) 2003-2017 Alberto Demichelis
Copyright (c) 2003-2022 Alberto Demichelis

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
6 changes: 4 additions & 2 deletions src/vscript/squirrel/HISTORY
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
***version 3.2 stable***
-added new inline bind env syntax for closures
-added sq_tailcall
-added rawcall keyword
-added post call initializer syntax
-added table.keys() and table.values()
-added table.filter()
-added skipempty in split()
-additional parameters in array.map() and array.apply()
-additional optional initializer in array.reduce()
-added sqstd_pushstringf and sqstd_throwerrorf
-closure.call() is now a "native tailcall" and the invoked function can now be suspended
-fixed sq_newmember and sq_rawnewmember properly pop parameters
-fixed capturing free variable on for loop counter before a break statement
-fixed \u in lexer
-various bugfixes

***version 3.1.1 stable***
-sq_gettypetag doesn't set last error(it's treated as SQBool function but keeps a SQRESULT for backward compatibility)
-fixed _set method in userdata delegates
-fixed some warnings

***2016-03-27 ***
***version 3.1 stable***
-added slice range for tolower and toupper
-added startswith() and endswith() in string lib
Expand Down
2 changes: 1 addition & 1 deletion src/vscript/squirrel/README
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
The programming language SQUIRREL 3.1 stable
The programming language SQUIRREL 3.2 stable

--------------------------------------------------
This project has successfully been compiled and run on
Expand Down
10 changes: 5 additions & 5 deletions src/vscript/squirrel/include/squirrel.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2017 Alberto Demichelis
Copyright (c) 2003-2022 Alberto Demichelis

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down Expand Up @@ -65,10 +65,10 @@ struct SQOuter;

#include "sqconfig.h"

#define SQUIRREL_VERSION _SC("Squirrel 3.1 stable")
#define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2017 Alberto Demichelis")
#define SQUIRREL_VERSION _SC("Squirrel 3.2 stable")
#define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2022 Alberto Demichelis")
#define SQUIRREL_AUTHOR _SC("Alberto Demichelis")
#define SQUIRREL_VERSION_NUMBER 310
#define SQUIRREL_VERSION_NUMBER 320

#define SQ_VMSTATE_IDLE 0
#define SQ_VMSTATE_RUNNING 1
Expand Down Expand Up @@ -280,7 +280,7 @@ SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQInteger *n
SQUIRREL_API SQRESULT sq_getclosurename(HSQUIRRELVM v,SQInteger idx);
SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name);
SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p);
SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);
SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag,SQBool throwerror);
SQUIRREL_API SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize);
SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
Expand Down
10 changes: 5 additions & 5 deletions src/vscript/squirrel/sqstdlib/sqstdblob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

#define SETUP_BLOB(v) \
SQBlob *self = NULL; \
{ if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) \
{ if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_BLOB_TYPE_TAG,SQFalse))) \
return sq_throwerror(v,_SC("invalid type tag")); } \
if(!self || !self->IsValid()) \
return sq_throwerror(v,_SC("the blob is invalid"));
Expand Down Expand Up @@ -152,7 +152,7 @@ static SQInteger _blob__cloned(HSQUIRRELVM v)
{
SQBlob *other = NULL;
{
if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&other,(SQUserPointer)SQSTD_BLOB_TYPE_TAG)))
if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&other,(SQUserPointer)SQSTD_BLOB_TYPE_TAG,SQFalse)))
return SQ_ERROR;
}
//SQBlob *thisone = new SQBlob(other->Len());
Expand Down Expand Up @@ -242,7 +242,7 @@ static const SQRegFunction bloblib_funcs[]={
SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr)
{
SQBlob *blob;
if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG)))
if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG,SQTrue)))
return -1;
*ptr = blob->GetBuf();
return SQ_OK;
Expand All @@ -251,7 +251,7 @@ SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr)
SQInteger sqstd_getblobsize(HSQUIRRELVM v,SQInteger idx)
{
SQBlob *blob;
if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG)))
if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG,SQTrue)))
return -1;
return blob->Len();
}
Expand All @@ -267,7 +267,7 @@ SQUserPointer sqstd_createblob(HSQUIRRELVM v, SQInteger size)
sq_pushinteger(v,size); //size
SQBlob *blob = NULL;
if(SQ_SUCCEEDED(sq_call(v,2,SQTrue,SQFalse))
&& SQ_SUCCEEDED(sq_getinstanceup(v,-1,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) {
&& SQ_SUCCEEDED(sq_getinstanceup(v,-1,(SQUserPointer *)&blob,(SQUserPointer)SQSTD_BLOB_TYPE_TAG,SQTrue))) {
sq_remove(v,-2);
return blob->GetBuf();
}
Expand Down
4 changes: 2 additions & 2 deletions src/vscript/squirrel/sqstdlib/sqstdio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ static SQInteger _file_constructor(HSQUIRRELVM v)
static SQInteger _file_close(HSQUIRRELVM v)
{
SQFile *self = NULL;
if(SQ_SUCCEEDED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_FILE_TYPE_TAG))
if(SQ_SUCCEEDED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_FILE_TYPE_TAG, SQTrue))
&& self != NULL)
{
self->Close();
Expand Down Expand Up @@ -200,7 +200,7 @@ SQRESULT sqstd_createfile(HSQUIRRELVM v, SQFILE file,SQBool own)
SQRESULT sqstd_getfile(HSQUIRRELVM v, SQInteger idx, SQFILE *file)
{
SQFile *fileobj = NULL;
if(SQ_SUCCEEDED(sq_getinstanceup(v,idx,(SQUserPointer*)&fileobj,(SQUserPointer)SQSTD_FILE_TYPE_TAG))) {
if(SQ_SUCCEEDED(sq_getinstanceup(v,idx,(SQUserPointer*)&fileobj,(SQUserPointer)SQSTD_FILE_TYPE_TAG,SQFalse))) {
*file = fileobj->GetHandle();
return SQ_OK;
}
Expand Down
2 changes: 1 addition & 1 deletion src/vscript/squirrel/sqstdlib/sqstdstream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

#define SETUP_STREAM(v) \
SQStream *self = NULL; \
if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)((SQUnsignedInteger)SQSTD_STREAM_TYPE_TAG)))) \
if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)((SQUnsignedInteger)SQSTD_STREAM_TYPE_TAG),SQFalse))) \
return sq_throwerror(v,_SC("invalid type tag")); \
if(!self || !self->IsValid()) \
return sq_throwerror(v,_SC("the stream is invalid"));
Expand Down
4 changes: 2 additions & 2 deletions src/vscript/squirrel/sqstdlib/sqstdstring.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@ static SQInteger _string_endswith(HSQUIRRELVM v)

#define SETUP_REX(v) \
SQRex *self = NULL; \
if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer *)&self,rex_typetag))) { \
if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer *)&self,rex_typetag,SQFalse))) { \
return sq_throwerror(v,_SC("invalid type tag")); \
}

Expand Down Expand Up @@ -471,7 +471,7 @@ static SQInteger _regexp_subexpcount(HSQUIRRELVM v)
static SQInteger _regexp_constructor(HSQUIRRELVM v)
{
SQRex *self = NULL;
if (SQ_FAILED(sq_getinstanceup(v, 1, (SQUserPointer *)&self, rex_typetag))) {
if (SQ_FAILED(sq_getinstanceup(v, 1, (SQUserPointer *)&self, rex_typetag, SQFalse))) {
return sq_throwerror(v, _SC("invalid type tag"));
}
if (self != NULL) {
Expand Down
30 changes: 15 additions & 15 deletions src/vscript/squirrel/squirrel/sqapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -807,21 +807,21 @@ SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize)
}


SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag)
{
SQObjectPtr &o = stack_get(v,idx);
if(sq_type(o) != OT_INSTANCE) return sq_throwerror(v,_SC("the object is not a class instance"));
(*p) = _instance(o)->_userpointer;
if(typetag != 0) {
SQClass *cl = _instance(o)->_class;
do{
if(cl->_typetag == typetag)
return SQ_OK;
cl = cl->_base;
}while(cl != NULL);
return sq_throwerror(v,_SC("invalid type tag"));
}
return SQ_OK;
SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p, SQUserPointer typetag, SQBool throwerror)
{
SQObjectPtr &o = stack_get(v, idx);
if (sq_type(o) != OT_INSTANCE) return throwerror ? sq_throwerror(v, _SC("the object is not a class instance")) : SQ_ERROR;
(*p) = _instance(o)->_userpointer;
if (typetag != 0) {
SQClass *cl = _instance(o)->_class;
do {
if (cl->_typetag == typetag)
return SQ_OK;
cl = cl->_base;
} while (cl != NULL);
return throwerror ? sq_throwerror(v, _SC("invalid type tag")) : SQ_ERROR;
}
return SQ_OK;
}

SQInteger sq_gettop(HSQUIRRELVM v)
Expand Down
27 changes: 27 additions & 0 deletions src/vscript/squirrel/squirrel/sqbaselib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,32 @@ static SQInteger table_filter(HSQUIRRELVM v)
return 1;
}

static SQInteger table_map(HSQUIRRELVM v)
{
SQObject &o = stack_get(v, 1);
SQTable *tbl = _table(o);
SQInteger nitr, n = 0;
SQInteger nitems = tbl->CountUsed();
SQObjectPtr ret = SQArray::Create(_ss(v), nitems);
SQObjectPtr itr, key, val;
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;
}
_array(ret)->Set(n, v->GetUp(-1));
v->Pop();
n++;
}

v->Push(ret);
return 1;
}

#define TABLE_TO_ARRAY_FUNC(_funcname_,_valname_) static SQInteger _funcname_(HSQUIRRELVM v) \
{ \
SQObject &o = stack_get(v, 1); \
Expand Down Expand Up @@ -536,6 +562,7 @@ const SQRegFunction SQSharedState::_table_default_delegate_funcz[]={
{_SC("setdelegate"),table_setdelegate,2, _SC(".t|o")},
{_SC("getdelegate"),table_getdelegate,1, _SC(".")},
{_SC("filter"),table_filter,2, _SC("tc")},
{_SC("map"),table_map,2, _SC("tc") },
{_SC("keys"),table_keys,1, _SC("t") },
{_SC("values"),table_values,1, _SC("t") },
{NULL,(SQFUNCTION)0,0,NULL}
Expand Down
60 changes: 45 additions & 15 deletions src/vscript/squirrel/squirrel/sqcompiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -842,8 +842,8 @@ class SQCompiler
_fs->AddInstruction(_OP_NEWOBJ, _fs->PushTarget(),0,NOT_TABLE);
Lex();ParseTableOrClass(_SC(','),_SC('}'));
break;
case TK_FUNCTION: FunctionExp(_token);break;
case _SC('@'): FunctionExp(_token,true);break;
case TK_FUNCTION: FunctionExp();break;
case _SC('@'): FunctionExp(true);break;
case TK_CLASS: Lex(); ClassExp();break;
case _SC('-'):
Lex();
Expand Down Expand Up @@ -989,10 +989,15 @@ class SQCompiler
SQInteger tk = _token;
Lex();
SQObject id = tk == TK_FUNCTION ? Expect(TK_IDENTIFIER) : _fs->CreateString(_SC("constructor"));
_fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id));
SQInteger boundtarget = 0xFF;
if (_token == _SC('[')) {
boundtarget = ParseBindEnv();
}
Expect(_SC('('));
_fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id));
CreateFunction(id);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0);

CreateFunction(id, boundtarget);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, boundtarget);
}
break;
case _SC('['):
Expand Down Expand Up @@ -1034,11 +1039,15 @@ class SQCompiler
SQObject varname;
Lex();
if( _token == TK_FUNCTION) {
SQInteger boundtarget = 0xFF;
Lex();
varname = Expect(TK_IDENTIFIER);
varname = Expect(TK_IDENTIFIER);
if (_token == _SC('[')) {
boundtarget = ParseBindEnv();
}
Expect(_SC('('));
CreateFunction(varname,false);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0);
CreateFunction(varname,0xFF,false);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, boundtarget);
_fs->PopTarget();
_fs->PushLocalVariable(varname);
return;
Expand Down Expand Up @@ -1310,9 +1319,13 @@ class SQCompiler
_fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(id));
if(_token == TK_DOUBLE_COLON) Emit2ArgsOP(_OP_GET);
}
SQInteger boundtarget = 0xFF;
if (_token == _SC('[')) {
boundtarget = ParseBindEnv();
}
Expect(_SC('('));
CreateFunction(id);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, 0);
CreateFunction(id, boundtarget);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, boundtarget);
EmitDerefOp(_OP_NEWSLOT);
_fs->PopTarget();
}
Expand Down Expand Up @@ -1438,12 +1451,26 @@ class SQCompiler
END_SCOPE();
}
}
void FunctionExp(SQInteger ftype,bool lambda = false)
SQInteger ParseBindEnv()
{
SQInteger boundtarget;
Lex();
Expression();
boundtarget = _fs->TopTarget();
Expect(_SC(']'));
return boundtarget;
}
void FunctionExp(bool lambda = false)
{
Lex(); Expect(_SC('('));
Lex();
SQInteger boundtarget = 0xFF;
if (_token == _SC('[')) {
boundtarget = ParseBindEnv();
}
Expect(_SC('('));
SQObjectPtr dummy;
CreateFunction(dummy,lambda);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, ftype == TK_FUNCTION?0:1);
CreateFunction(dummy, boundtarget, lambda);
_fs->AddInstruction(_OP_CLOSURE, _fs->PushTarget(), _fs->_functions.size() - 1, boundtarget);
}
void ClassExp()
{
Expand Down Expand Up @@ -1508,7 +1535,7 @@ class SQCompiler
}
_es = es;
}
void CreateFunction(SQObject &name,bool lambda = false)
void CreateFunction(SQObject &name,SQInteger boundtarget,bool lambda = false)
{
SQFuncState *funcstate = _fs->PushChildState(_ss(_vm));
funcstate->_name = name;
Expand Down Expand Up @@ -1542,6 +1569,9 @@ class SQCompiler
}
}
Expect(_SC(')'));
if (boundtarget != 0xFF) {
_fs->PopTarget();
}
for(SQInteger n = 0; n < defparams; n++) {
_fs->PopTarget();
}
Expand Down
11 changes: 6 additions & 5 deletions src/vscript/squirrel/squirrel/sqstring.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@

inline SQHash _hashstr (const SQChar *s, size_t l)
{
SQHash h = (SQHash)l; /* seed */
size_t step = (l>>5)|1; /* if string is too long, don't hash all its chars */
for (; l>=step; l-=step)
h = h ^ ((h<<5)+(h>>2)+(unsigned short)*(s++));
return h;
SQHash h = (SQHash)l; /* seed */
size_t step = (l >> 5) + 1; /* if string is too long, don't hash all its chars */
size_t l1;
for (l1 = l; l1 >= step; l1 -= step)
h = h ^ ((h << 5) + (h >> 2) + ((unsigned short)s[l1 - 1]));
return h;
}

struct SQString : public SQRefCounted
Expand Down
Loading
Loading