[DEV] continue rework: buid and work again

This commit is contained in:
Edouard DUPIN 2018-07-01 15:49:34 +02:00
parent ff85991e11
commit ad27afec61
66 changed files with 1883 additions and 1546 deletions

View File

@ -163,7 +163,7 @@ int getargs(rabbit::VirtualMachine* v,int argc, char* argv[],int64_t *retval)
//sq_createslot(v,-3); //sq_createslot(v,-3);
//sq_pop(v,1); //sq_pop(v,1);
if(compiles_only) { if(compiles_only) {
if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,SQTrue))){ if(SQ_SUCCEEDED(rabbit::std::loadfile(v,filename,SQTrue))){
const rabbit::Char *outfile = _SC("out.karrot"); const rabbit::Char *outfile = _SC("out.karrot");
if(output) { if(output) {
#ifdef SQUNICODE #ifdef SQUNICODE
@ -174,15 +174,15 @@ int getargs(rabbit::VirtualMachine* v,int argc, char* argv[],int64_t *retval)
outfile = output; outfile = output;
#endif #endif
} }
if(SQ_SUCCEEDED(sqstd_writeclosuretofile(v,outfile))) if(SQ_SUCCEEDED(rabbit::std::writeclosuretofile(v,outfile)))
return _DONE; return _DONE;
} }
} }
else { else {
//if(SQ_SUCCEEDED(sqstd_dofile(v,filename,SQFalse,SQTrue))) { //if(SQ_SUCCEEDED(rabbit::std::dofile(v,filename,SQFalse,SQTrue))) {
//return _DONE; //return _DONE;
//} //}
if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,SQTrue))) { if(SQ_SUCCEEDED(rabbit::std::loadfile(v,filename,SQTrue))) {
int callargs = 1; int callargs = 1;
sq_pushroottable(v); sq_pushroottable(v);
for(i=arg;i<argc;i++) for(i=arg;i<argc;i++)
@ -321,20 +321,20 @@ int main(int argc, char* argv[])
_CrtsetAllocHook(MemAllocHook); _CrtsetAllocHook(MemAllocHook);
#endif #endif
v=sq_open(1024); v=rabbit::sq_open(1024);
sq_setprintfunc(v,printfunc,errorfunc); sq_setprintfunc(v,printfunc,errorfunc);
sq_pushroottable(v); sq_pushroottable(v);
sqstd_register_bloblib(v); rabbit::std::register_bloblib(v);
sqstd_register_iolib(v); rabbit::std::register_iolib(v);
sqstd_register_systemlib(v); rabbit::std::register_systemlib(v);
sqstd_register_mathlib(v); rabbit::std::register_mathlib(v);
sqstd_register_stringlib(v); rabbit::std::register_stringlib(v);
//aux library //aux library
//sets error handlers //sets error handlers
sqstd_seterrorhandlers(v); rabbit::std::seterrorhandlers(v);
//gets arguments //gets arguments
switch(getargs(v,argc,argv,&retval)) switch(getargs(v,argc,argv,&retval))

View File

@ -56,17 +56,17 @@ int main(int argc, char* argv[])
//REGISTRATION OF STDLIB //REGISTRATION OF STDLIB
//sq_pushroottable(v); //push the root table where the std function will be registered //sq_pushroottable(v); //push the root table where the std function will be registered
//sqstd_register_iolib(v); //registers a library //rabbit::std::register_iolib(v); //registers a library
// ... call here other stdlibs string,math etc... // ... call here other stdlibs string,math etc...
//sq_pop(v,1); //pops the root table //sq_pop(v,1); //pops the root table
//END REGISTRATION OF STDLIB //END REGISTRATION OF STDLIB
sqstd_seterrorhandlers(v); //registers the default error handlers rabbit::std::seterrorhandlers(v); //registers the default error handlers
sq_setprintfunc(v, printfunc,errorfunc); //sets the print function sq_setprintfunc(v, printfunc,errorfunc); //sets the print function
sq_pushroottable(v); //push the root table(were the globals of the script will be stored) sq_pushroottable(v); //push the root table(were the globals of the script will be stored)
if(SQ_SUCCEEDED(sqstd_dofile(v, _SC("test.nut"), SQFalse, SQTrue))) // also prints syntax errors if any if(SQ_SUCCEEDED(rabbit::std::dofile(v, _SC("test.nut"), SQFalse, SQTrue))) // also prints syntax errors if any
{ {
call_foo(v,1,2.5,_SC("teststring")); call_foo(v,1,2.5,_SC("teststring"));
} }

View File

@ -62,6 +62,7 @@ def configure(target, my_module):
'rabbit/String.cpp', 'rabbit/String.cpp',
'rabbit/StringTable.cpp', 'rabbit/StringTable.cpp',
'rabbit/Table.cpp', 'rabbit/Table.cpp',
'rabbit/UserData.cpp',
'rabbit/VirtualMachine.cpp', 'rabbit/VirtualMachine.cpp',
'rabbit/WeakRef.cpp', 'rabbit/WeakRef.cpp',
'rabbit/sqapi.cpp', 'rabbit/sqapi.cpp',

View File

@ -11,7 +11,7 @@
#include <assert.h> #include <assert.h>
#include <rabbit/StackInfos.hpp> #include <rabbit/StackInfos.hpp>
void sqstd_printcallstack(rabbit::VirtualMachine* v) void rabbit::std::printcallstack(rabbit::VirtualMachine* v)
{ {
SQPRINTFUNCTION pf = sq_geterrorfunc(v); SQPRINTFUNCTION pf = sq_geterrorfunc(v);
if(pf) { if(pf) {
@ -90,11 +90,12 @@ void sqstd_printcallstack(rabbit::VirtualMachine* v)
case rabbit::OT_WEAKREF: case rabbit::OT_WEAKREF:
pf(v,_SC("[%s] WEAKREF\n"),name); pf(v,_SC("[%s] WEAKREF\n"),name);
break; break;
case rabbit::OT_BOOL:{ case rabbit::OT_BOOL:
rabbit::Bool bval; {
sq_getbool(v,-1,&bval); rabbit::Bool bval;
pf(v,_SC("[%s] %s\n"),name,bval == SQTrue ? _SC("true"):_SC("false")); sq_getbool(v,-1,&bval);
} pf(v,_SC("[%s] %s\n"),name,bval == SQTrue ? _SC("true"):_SC("false"));
}
break; break;
default: assert(0); break; default: assert(0); break;
} }
@ -104,35 +105,38 @@ void sqstd_printcallstack(rabbit::VirtualMachine* v)
} }
} }
static int64_t _sqstd_aux_printerror(rabbit::VirtualMachine* v) namespace rabbit {
{ namespace std {
SQPRINTFUNCTION pf = sq_geterrorfunc(v); static int64_t aux_printerror(rabbit::VirtualMachine* v) {
if(pf) { SQPRINTFUNCTION pf = sq_geterrorfunc(v);
const rabbit::Char *sErr = 0; if(pf) {
if(sq_gettop(v)>=1) { const rabbit::Char *sErr = 0;
if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) { if(sq_gettop(v)>=1) {
pf(v,_SC("\nAN ERROR HAS OCCURRED [%s]\n"),sErr); if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
pf(v,_SC("\nAN ERROR HAS OCCURRED [%s]\n"),sErr);
}
else{
pf(v,_SC("\nAN ERROR HAS OCCURRED [unknown]\n"));
}
rabbit::std::printcallstack(v);
}
} }
else{ return 0;
pf(v,_SC("\nAN ERROR HAS OCCURRED [unknown]\n")); }
void compiler_error(rabbit::VirtualMachine* v,const rabbit::Char *sErr,const rabbit::Char *sSource,int64_t line,int64_t column) {
SQPRINTFUNCTION pf = sq_geterrorfunc(v);
if(pf) {
pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr);
} }
sqstd_printcallstack(v);
} }
} }
return 0;
} }
void _sqstd_compiler_error(rabbit::VirtualMachine* v,const rabbit::Char *sErr,const rabbit::Char *sSource,int64_t line,int64_t column)
{
SQPRINTFUNCTION pf = sq_geterrorfunc(v);
if(pf) {
pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr);
}
}
void sqstd_seterrorhandlers(rabbit::VirtualMachine* v) void rabbit::std::seterrorhandlers(rabbit::VirtualMachine* v)
{ {
sq_setcompilererrorhandler(v,_sqstd_compiler_error); sq_setcompilererrorhandler(v,rabbit::std::compiler_error);
sq_newclosure(v,_sqstd_aux_printerror,0); sq_newclosure(v,rabbit::std::aux_printerror,0);
sq_seterrorhandler(v); sq_seterrorhandler(v);
} }

View File

@ -7,5 +7,10 @@
*/ */
#pragma once #pragma once
RABBIT_API void sqstd_seterrorhandlers(rabbit::VirtualMachine* v); namespace rabbit {
RABBIT_API void sqstd_printcallstack(rabbit::VirtualMachine* v); namespace std {
void seterrorhandlers(rabbit::VirtualMachine* v);
void printcallstack(rabbit::VirtualMachine* v);
}
}

View File

@ -13,20 +13,20 @@
#define SETUP_BLOB(v) \ #define SETUP_BLOB(v) \
SQBlob *self = NULL; \ rabbit::std::Blob *self = NULL; \
{ if(SQ_FAILED(sq_getinstanceup(v,1,(rabbit::UserPointer*)&self,(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG))) \ { if(SQ_FAILED(rabbit::sq_getinstanceup(v,1,(rabbit::UserPointer*)&self,(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG))) \
return sq_throwerror(v,_SC("invalid type tag")); } \ return rabbit::sq_throwerror(v,_SC("invalid type tag")); } \
if(!self || !self->IsValid()) \ if(!self || !self->IsValid()) \
return sq_throwerror(v,_SC("the blob is invalid")); return rabbit::sq_throwerror(v,_SC("the blob is invalid"));
static int64_t _blob_resize(rabbit::VirtualMachine* v) static int64_t _blob_resize(rabbit::VirtualMachine* v)
{ {
SETUP_BLOB(v); SETUP_BLOB(v);
int64_t size; int64_t size;
sq_getinteger(v,2,&size); rabbit::sq_getinteger(v,2,&size);
if(!self->resize(size)) if(!self->resize(size))
return sq_throwerror(v,_SC("resize failed")); return rabbit::sq_throwerror(v,_SC("resize failed"));
return 0; return 0;
} }
@ -69,12 +69,12 @@ static int64_t _blob__set(rabbit::VirtualMachine* v)
{ {
SETUP_BLOB(v); SETUP_BLOB(v);
int64_t idx,val; int64_t idx,val;
sq_getinteger(v,2,&idx); rabbit::sq_getinteger(v,2,&idx);
sq_getinteger(v,3,&val); rabbit::sq_getinteger(v,3,&val);
if(idx < 0 || idx >= self->Len()) if(idx < 0 || idx >= self->Len())
return sq_throwerror(v,_SC("index out of range")); return rabbit::sq_throwerror(v,_SC("index out of range"));
((unsigned char *)self->getBuf())[idx] = (unsigned char) val; ((unsigned char *)self->getBuf())[idx] = (unsigned char) val;
sq_push(v,3); rabbit::sq_push(v,3);
return 1; return 1;
} }
@ -83,87 +83,87 @@ static int64_t _blob__get(rabbit::VirtualMachine* v)
SETUP_BLOB(v); SETUP_BLOB(v);
int64_t idx; int64_t idx;
if ((sq_gettype(v, 2) & SQOBJECT_NUMERIC) == 0) if ((rabbit::sq_gettype(v, 2) & SQOBJECT_NUMERIC) == 0)
{ {
sq_pushnull(v); rabbit::sq_pushnull(v);
return sq_throwobject(v); return rabbit::sq_throwobject(v);
} }
sq_getinteger(v,2,&idx); rabbit::sq_getinteger(v,2,&idx);
if(idx < 0 || idx >= self->Len()) if(idx < 0 || idx >= self->Len())
return sq_throwerror(v,_SC("index out of range")); return rabbit::sq_throwerror(v,_SC("index out of range"));
sq_pushinteger(v,((unsigned char *)self->getBuf())[idx]); rabbit::sq_pushinteger(v,((unsigned char *)self->getBuf())[idx]);
return 1; return 1;
} }
static int64_t _blob__nexti(rabbit::VirtualMachine* v) static int64_t _blob__nexti(rabbit::VirtualMachine* v)
{ {
SETUP_BLOB(v); SETUP_BLOB(v);
if(sq_gettype(v,2) == rabbit::OT_NULL) { if(rabbit::sq_gettype(v,2) == rabbit::OT_NULL) {
sq_pushinteger(v, 0); rabbit::sq_pushinteger(v, 0);
return 1; return 1;
} }
int64_t idx; int64_t idx;
if(SQ_SUCCEEDED(sq_getinteger(v, 2, &idx))) { if(SQ_SUCCEEDED(rabbit::sq_getinteger(v, 2, &idx))) {
if(idx+1 < self->Len()) { if(idx+1 < self->Len()) {
sq_pushinteger(v, idx+1); rabbit::sq_pushinteger(v, idx+1);
return 1; return 1;
} }
sq_pushnull(v); rabbit::sq_pushnull(v);
return 1; return 1;
} }
return sq_throwerror(v,_SC("internal error (_nexti) wrong argument type")); return rabbit::sq_throwerror(v,_SC("internal error (_nexti) wrong argument type"));
} }
static int64_t _blob__typeof(rabbit::VirtualMachine* v) static int64_t _blob__typeof(rabbit::VirtualMachine* v)
{ {
sq_pushstring(v,_SC("blob"),-1); rabbit::sq_pushstring(v,_SC("blob"),-1);
return 1; return 1;
} }
static int64_t _blob_releasehook(rabbit::UserPointer p, int64_t SQ_UNUSED_ARG(size)) static int64_t _blob_releasehook(rabbit::UserPointer p, int64_t SQ_UNUSED_ARG(size))
{ {
SQBlob *self = (SQBlob*)p; rabbit::std::Blob *self = (rabbit::std::Blob*)p;
self->~SQBlob(); self->~Blob();
sq_free(self,sizeof(SQBlob)); rabbit::sq_free(self,sizeof(rabbit::std::Blob));
return 1; return 1;
} }
static int64_t _blob_constructor(rabbit::VirtualMachine* v) static int64_t _blob_constructor(rabbit::VirtualMachine* v)
{ {
int64_t nparam = sq_gettop(v); int64_t nparam = rabbit::sq_gettop(v);
int64_t size = 0; int64_t size = 0;
if(nparam == 2) { if(nparam == 2) {
sq_getinteger(v, 2, &size); rabbit::sq_getinteger(v, 2, &size);
} }
if(size < 0) return sq_throwerror(v, _SC("cannot create blob with negative size")); if(size < 0) return rabbit::sq_throwerror(v, _SC("cannot create blob with negative size"));
//SQBlob *b = new SQBlob(size); //rabbit::std::Blob *b = new rabbit::std::Blob(size);
SQBlob *b = new (sq_malloc(sizeof(SQBlob)))SQBlob(size); rabbit::std::Blob *b = new (rabbit::sq_malloc(sizeof(rabbit::std::Blob)))rabbit::std::Blob(size);
if(SQ_FAILED(sq_setinstanceup(v,1,b))) { if(SQ_FAILED(rabbit::sq_setinstanceup(v,1,b))) {
b->~SQBlob(); b->~Blob();
sq_free(b,sizeof(SQBlob)); rabbit::sq_free(b,sizeof(rabbit::std::Blob));
return sq_throwerror(v, _SC("cannot create blob")); return rabbit::sq_throwerror(v, _SC("cannot create blob"));
} }
sq_setreleasehook(v,1,_blob_releasehook); rabbit::sq_setreleasehook(v,1,_blob_releasehook);
return 0; return 0;
} }
static int64_t _blob__cloned(rabbit::VirtualMachine* v) static int64_t _blob__cloned(rabbit::VirtualMachine* v)
{ {
SQBlob *other = NULL; rabbit::std::Blob *other = NULL;
{ {
if(SQ_FAILED(sq_getinstanceup(v,2,(rabbit::UserPointer*)&other,(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG))) if(SQ_FAILED(rabbit::sq_getinstanceup(v,2,(rabbit::UserPointer*)&other,(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG)))
return SQ_ERROR; return SQ_ERROR;
} }
//SQBlob *thisone = new SQBlob(other->Len()); //rabbit::std::Blob *thisone = new rabbit::std::Blob(other->Len());
SQBlob *thisone = new (sq_malloc(sizeof(SQBlob)))SQBlob(other->Len()); rabbit::std::Blob *thisone = new (rabbit::sq_malloc(sizeof(rabbit::std::Blob)))rabbit::std::Blob(other->Len());
memcpy(thisone->getBuf(),other->getBuf(),thisone->Len()); memcpy(thisone->getBuf(),other->getBuf(),thisone->Len());
if(SQ_FAILED(sq_setinstanceup(v,1,thisone))) { if(SQ_FAILED(rabbit::sq_setinstanceup(v,1,thisone))) {
thisone->~SQBlob(); thisone->~Blob();
sq_free(thisone,sizeof(SQBlob)); rabbit::sq_free(thisone,sizeof(rabbit::std::Blob));
return sq_throwerror(v, _SC("cannot clone blob")); return rabbit::sq_throwerror(v, _SC("cannot clone blob"));
} }
sq_setreleasehook(v,1,_blob_releasehook); rabbit::sq_setreleasehook(v,1,_blob_releasehook);
return 0; return 0;
} }
@ -188,44 +188,44 @@ static const rabbit::RegFunction _blob_methods[] = {
static int64_t _g_blob_casti2f(rabbit::VirtualMachine* v) static int64_t _g_blob_casti2f(rabbit::VirtualMachine* v)
{ {
int64_t i; int64_t i;
sq_getinteger(v,2,&i); rabbit::sq_getinteger(v,2,&i);
sq_pushfloat(v,*((const float_t *)&i)); rabbit::sq_pushfloat(v,*((const float_t *)&i));
return 1; return 1;
} }
static int64_t _g_blob_castf2i(rabbit::VirtualMachine* v) static int64_t _g_blob_castf2i(rabbit::VirtualMachine* v)
{ {
float_t f; float_t f;
sq_getfloat(v,2,&f); rabbit::sq_getfloat(v,2,&f);
sq_pushinteger(v,*((const int64_t *)&f)); rabbit::sq_pushinteger(v,*((const int64_t *)&f));
return 1; return 1;
} }
static int64_t _g_blob_swap2(rabbit::VirtualMachine* v) static int64_t _g_blob_swap2(rabbit::VirtualMachine* v)
{ {
int64_t i; int64_t i;
sq_getinteger(v,2,&i); rabbit::sq_getinteger(v,2,&i);
short s=(short)i; short s=(short)i;
sq_pushinteger(v,(s<<8)|((s>>8)&0x00FF)); rabbit::sq_pushinteger(v,(s<<8)|((s>>8)&0x00FF));
return 1; return 1;
} }
static int64_t _g_blob_swap4(rabbit::VirtualMachine* v) static int64_t _g_blob_swap4(rabbit::VirtualMachine* v)
{ {
int64_t i; int64_t i;
sq_getinteger(v,2,&i); rabbit::sq_getinteger(v,2,&i);
unsigned int t4 = (unsigned int)i; unsigned int t4 = (unsigned int)i;
__swap_dword(&t4); __swap_dword(&t4);
sq_pushinteger(v,(int64_t)t4); rabbit::sq_pushinteger(v,(int64_t)t4);
return 1; return 1;
} }
static int64_t _g_blob_swapfloat(rabbit::VirtualMachine* v) static int64_t _g_blob_swapfloat(rabbit::VirtualMachine* v)
{ {
float_t f; float_t f;
sq_getfloat(v,2,&f); rabbit::sq_getfloat(v,2,&f);
__swap_dword((unsigned int *)&f); __swap_dword((unsigned int *)&f);
sq_pushfloat(v,f); rabbit::sq_pushfloat(v,f);
return 1; return 1;
} }
@ -239,44 +239,44 @@ static const rabbit::RegFunction bloblib_funcs[]={
{NULL,(SQFUNCTION)0,0,NULL} {NULL,(SQFUNCTION)0,0,NULL}
}; };
rabbit::Result sqstd_getblob(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer *ptr) rabbit::Result rabbit::std::getblob(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer *ptr)
{ {
SQBlob *blob; rabbit::std::Blob *blob;
if(SQ_FAILED(sq_getinstanceup(v,idx,(rabbit::UserPointer *)&blob,(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG))) if(SQ_FAILED(rabbit::sq_getinstanceup(v,idx,(rabbit::UserPointer *)&blob,(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG)))
return -1; return -1;
*ptr = blob->getBuf(); *ptr = blob->getBuf();
return SQ_OK; return SQ_OK;
} }
int64_t sqstd_getblobsize(rabbit::VirtualMachine* v,int64_t idx) int64_t rabbit::std::getblobsize(rabbit::VirtualMachine* v,int64_t idx)
{ {
SQBlob *blob; rabbit::std::Blob *blob;
if(SQ_FAILED(sq_getinstanceup(v,idx,(rabbit::UserPointer *)&blob,(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG))) if(SQ_FAILED(rabbit::sq_getinstanceup(v,idx,(rabbit::UserPointer *)&blob,(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG)))
return -1; return -1;
return blob->Len(); return blob->Len();
} }
rabbit::UserPointer sqstd_createblob(rabbit::VirtualMachine* v, int64_t size) rabbit::UserPointer rabbit::std::createblob(rabbit::VirtualMachine* v, int64_t size)
{ {
int64_t top = sq_gettop(v); int64_t top = rabbit::sq_gettop(v);
sq_pushregistrytable(v); rabbit::sq_pushregistrytable(v);
sq_pushstring(v,_SC("std_blob"),-1); rabbit::sq_pushstring(v,_SC("std_blob"),-1);
if(SQ_SUCCEEDED(sq_get(v,-2))) { if(SQ_SUCCEEDED(rabbit::sq_get(v,-2))) {
sq_remove(v,-2); //removes the registry rabbit::sq_remove(v,-2); //removes the registry
sq_push(v,1); // push the this rabbit::sq_push(v,1); // push the this
sq_pushinteger(v,size); //size rabbit::sq_pushinteger(v,size); //size
SQBlob *blob = NULL; rabbit::std::Blob *blob = NULL;
if(SQ_SUCCEEDED(sq_call(v,2,SQTrue,SQFalse)) if(SQ_SUCCEEDED(rabbit::sq_call(v,2,SQTrue,SQFalse))
&& SQ_SUCCEEDED(sq_getinstanceup(v,-1,(rabbit::UserPointer *)&blob,(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG))) { && SQ_SUCCEEDED(rabbit::sq_getinstanceup(v,-1,(rabbit::UserPointer *)&blob,(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG))) {
sq_remove(v,-2); rabbit::sq_remove(v,-2);
return blob->getBuf(); return blob->getBuf();
} }
} }
sq_settop(v,top); rabbit::sq_settop(v,top);
return NULL; return NULL;
} }
rabbit::Result sqstd_register_bloblib(rabbit::VirtualMachine* v) rabbit::Result rabbit::std::register_bloblib(rabbit::VirtualMachine* v)
{ {
return declare_stream(v,_SC("blob"),(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG,_SC("std_blob"),_blob_methods,bloblib_funcs); return declare_stream(v,_SC("blob"),(rabbit::UserPointer)SQSTD_BLOB_TYPE_TAG,_SC("std_blob"),_blob_methods,bloblib_funcs);
} }

View File

@ -7,9 +7,13 @@
*/ */
#pragma once #pragma once
RABBIT_API rabbit::UserPointer sqstd_createblob(rabbit::VirtualMachine* v, int64_t size); namespace rabbit {
RABBIT_API rabbit::Result sqstd_getblob(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer *ptr); namespace std {
RABBIT_API int64_t sqstd_getblobsize(rabbit::VirtualMachine* v,int64_t idx); rabbit::UserPointer createblob(rabbit::VirtualMachine* v, int64_t size);
rabbit::Result getblob(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer *ptr);
int64_t getblobsize(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sqstd_register_bloblib(rabbit::VirtualMachine* v); rabbit::Result register_bloblib(rabbit::VirtualMachine* v);
}
}

View File

@ -7,9 +7,11 @@
*/ */
#pragma once #pragma once
struct SQBlob : public SQStream namespace rabbit {
namespace std {
struct Blob : public SQStream
{ {
SQBlob(int64_t size) { Blob(int64_t size) {
_size = size; _size = size;
_allocated = size; _allocated = size;
_buf = (unsigned char *)sq_malloc(size); _buf = (unsigned char *)sq_malloc(size);
@ -17,7 +19,7 @@ struct SQBlob : public SQStream
_ptr = 0; _ptr = 0;
_owns = true; _owns = true;
} }
virtual ~SQBlob() { virtual ~Blob() {
sq_free(_buf, _allocated); sq_free(_buf, _allocated);
} }
int64_t Write(void *buffer, int64_t size) { int64_t Write(void *buffer, int64_t size) {
@ -110,3 +112,5 @@ private:
bool _owns; bool _owns;
}; };
}
}

View File

@ -14,27 +14,27 @@
#define SQSTD_FILE_TYPE_TAG ((uint64_t)(SQSTD_STREAM_TYPE_TAG | 0x00000001)) #define SQSTD_FILE_TYPE_TAG ((uint64_t)(SQSTD_STREAM_TYPE_TAG | 0x00000001))
//basic API //basic API
SQFILE sqstd_fopen(const rabbit::Char *filename ,const rabbit::Char *mode) rabbit::std::SQFILE rabbit::std::fopen(const rabbit::Char *filename ,const rabbit::Char *mode)
{ {
#ifndef SQUNICODE #ifndef SQUNICODE
return (SQFILE)fopen(filename,mode); return (SQFILE)::fopen(filename,mode);
#else #else
return (SQFILE)_wfopen(filename,mode); return (SQFILE)::_wfopen(filename,mode);
#endif #endif
} }
int64_t sqstd_fread(void* buffer, int64_t size, int64_t count, SQFILE file) int64_t rabbit::std::fread(void* buffer, int64_t size, int64_t count, SQFILE file)
{ {
int64_t ret = (int64_t)fread(buffer,size,count,(FILE *)file); int64_t ret = (int64_t)::fread(buffer,size,count,(FILE *)file);
return ret; return ret;
} }
int64_t sqstd_fwrite(const rabbit::UserPointer buffer, int64_t size, int64_t count, SQFILE file) int64_t rabbit::std::fwrite(const rabbit::UserPointer buffer, int64_t size, int64_t count, SQFILE file)
{ {
return (int64_t)fwrite(buffer,size,count,(FILE *)file); return (int64_t)::fwrite(buffer,size,count,(FILE *)file);
} }
int64_t sqstd_fseek(SQFILE file, int64_t offset, int64_t origin) int64_t rabbit::std::fseek(SQFILE file, int64_t offset, int64_t origin)
{ {
int64_t realorigin; int64_t realorigin;
switch(origin) { switch(origin) {
@ -43,79 +43,82 @@ int64_t sqstd_fseek(SQFILE file, int64_t offset, int64_t origin)
case SQ_SEEK_SET: realorigin = SEEK_SET; break; case SQ_SEEK_SET: realorigin = SEEK_SET; break;
default: return -1; //failed default: return -1; //failed
} }
return fseek((FILE *)file,(long)offset,(int)realorigin); return ::fseek((FILE *)file,(long)offset,(int)realorigin);
} }
int64_t sqstd_ftell(SQFILE file) int64_t rabbit::std::ftell(SQFILE file)
{ {
return ftell((FILE *)file); return ::ftell((FILE *)file);
} }
int64_t sqstd_fflush(SQFILE file) int64_t rabbit::std::fflush(SQFILE file)
{ {
return fflush((FILE *)file); return ::fflush((FILE *)file);
} }
int64_t sqstd_fclose(SQFILE file) int64_t rabbit::std::fclose(SQFILE file)
{ {
return fclose((FILE *)file); return ::fclose((FILE *)file);
} }
int64_t sqstd_feof(SQFILE file) int64_t rabbit::std::feof(SQFILE file)
{ {
return feof((FILE *)file); return ::feof((FILE *)file);
} }
namespace rabbit {
//File namespace std {
struct SQFile : public SQStream { //File
SQFile() { _handle = NULL; _owns = false;} struct File : public rabbit::std::SQStream {
SQFile(SQFILE file, bool owns) { _handle = file; _owns = owns;} File() { _handle = NULL; _owns = false;}
virtual ~SQFile() { close(); } File(SQFILE file, bool owns) { _handle = file; _owns = owns;}
bool Open(const rabbit::Char *filename ,const rabbit::Char *mode) { virtual ~File() { close(); }
close(); bool Open(const rabbit::Char *filename ,const rabbit::Char *mode) {
if( (_handle = sqstd_fopen(filename,mode)) ) { close();
_owns = true; if( (_handle = rabbit::std::fopen(filename,mode)) ) {
return true; _owns = true;
} return true;
return false; }
return false;
}
void close() {
if(_handle && _owns) {
rabbit::std::fclose(_handle);
_handle = NULL;
_owns = false;
}
}
int64_t Read(void *buffer,int64_t size) {
return rabbit::std::fread(buffer,1,size,_handle);
}
int64_t Write(void *buffer,int64_t size) {
return rabbit::std::fwrite(buffer,1,size,_handle);
}
int64_t Flush() {
return rabbit::std::fflush(_handle);
}
int64_t Tell() {
return rabbit::std::ftell(_handle);
}
int64_t Len() {
int64_t prevpos=Tell();
Seek(0,SQ_SEEK_END);
int64_t size=Tell();
Seek(prevpos,SQ_SEEK_SET);
return size;
}
int64_t Seek(int64_t offset, int64_t origin) {
return rabbit::std::fseek(_handle,offset,origin);
}
bool IsValid() { return _handle?true:false; }
bool EOS() { return Tell()==Len()?true:false;}
SQFILE getHandle() {return _handle;}
private:
SQFILE _handle;
bool _owns;
};
} }
void close() { }
if(_handle && _owns) {
sqstd_fclose(_handle);
_handle = NULL;
_owns = false;
}
}
int64_t Read(void *buffer,int64_t size) {
return sqstd_fread(buffer,1,size,_handle);
}
int64_t Write(void *buffer,int64_t size) {
return sqstd_fwrite(buffer,1,size,_handle);
}
int64_t Flush() {
return sqstd_fflush(_handle);
}
int64_t Tell() {
return sqstd_ftell(_handle);
}
int64_t Len() {
int64_t prevpos=Tell();
Seek(0,SQ_SEEK_END);
int64_t size=Tell();
Seek(prevpos,SQ_SEEK_SET);
return size;
}
int64_t Seek(int64_t offset, int64_t origin) {
return sqstd_fseek(_handle,offset,origin);
}
bool IsValid() { return _handle?true:false; }
bool EOS() { return Tell()==Len()?true:false;}
SQFILE getHandle() {return _handle;}
private:
SQFILE _handle;
bool _owns;
};
static int64_t _file__typeof(rabbit::VirtualMachine* v) static int64_t _file__typeof(rabbit::VirtualMachine* v)
{ {
sq_pushstring(v,_SC("file"),-1); sq_pushstring(v,_SC("file"),-1);
@ -124,9 +127,9 @@ static int64_t _file__typeof(rabbit::VirtualMachine* v)
static int64_t _file_releasehook(rabbit::UserPointer p, int64_t SQ_UNUSED_ARG(size)) static int64_t _file_releasehook(rabbit::UserPointer p, int64_t SQ_UNUSED_ARG(size))
{ {
SQFile *self = (SQFile*)p; rabbit::std::File *self = (rabbit::std::File*)p;
self->~SQFile(); self->~File();
sq_free(self,sizeof(SQFile)); rabbit::sq_free(self,sizeof(rabbit::std::File));
return 1; return 1;
} }
@ -134,34 +137,34 @@ static int64_t _file_constructor(rabbit::VirtualMachine* v)
{ {
const rabbit::Char *filename,*mode; const rabbit::Char *filename,*mode;
bool owns = true; bool owns = true;
SQFile *f; rabbit::std::File *f;
SQFILE newf; rabbit::std::SQFILE newf;
if(sq_gettype(v,2) == rabbit::OT_STRING && sq_gettype(v,3) == rabbit::OT_STRING) { if(rabbit::sq_gettype(v,2) == rabbit::OT_STRING && sq_gettype(v,3) == rabbit::OT_STRING) {
sq_getstring(v, 2, &filename); rabbit::sq_getstring(v, 2, &filename);
sq_getstring(v, 3, &mode); rabbit::sq_getstring(v, 3, &mode);
newf = sqstd_fopen(filename, mode); newf = rabbit::std::fopen(filename, mode);
if(!newf) return sq_throwerror(v, _SC("cannot open file")); if(!newf) return rabbit::sq_throwerror(v, _SC("cannot open file"));
} else if(sq_gettype(v,2) == rabbit::OT_USERPOINTER) { } else if(rabbit::sq_gettype(v,2) == rabbit::OT_USERPOINTER) {
owns = !(sq_gettype(v,3) == rabbit::OT_NULL); owns = !(rabbit::sq_gettype(v,3) == rabbit::OT_NULL);
sq_getuserpointer(v,2,&newf); rabbit::sq_getuserpointer(v,2,&newf);
} else { } else {
return sq_throwerror(v,_SC("wrong parameter")); return rabbit::sq_throwerror(v,_SC("wrong parameter"));
} }
f = new (sq_malloc(sizeof(SQFile)))SQFile(newf,owns); f = new (rabbit::sq_malloc(sizeof(rabbit::std::File)))rabbit::std::File(newf,owns);
if(SQ_FAILED(sq_setinstanceup(v,1,f))) { if(SQ_FAILED(rabbit::sq_setinstanceup(v,1,f))) {
f->~SQFile(); f->~File();
sq_free(f,sizeof(SQFile)); rabbit::sq_free(f,sizeof(rabbit::std::File));
return sq_throwerror(v, _SC("cannot create blob with negative size")); return rabbit::sq_throwerror(v, _SC("cannot create blob with negative size"));
} }
sq_setreleasehook(v,1,_file_releasehook); rabbit::sq_setreleasehook(v,1,_file_releasehook);
return 0; return 0;
} }
static int64_t _file_close(rabbit::VirtualMachine* v) static int64_t _file_close(rabbit::VirtualMachine* v)
{ {
SQFile *self = NULL; rabbit::std::File *self = NULL;
if(SQ_SUCCEEDED(sq_getinstanceup(v,1,(rabbit::UserPointer*)&self,(rabbit::UserPointer)SQSTD_FILE_TYPE_TAG)) if(SQ_SUCCEEDED(rabbit::sq_getinstanceup(v,1,(rabbit::UserPointer*)&self,(rabbit::UserPointer)SQSTD_FILE_TYPE_TAG))
&& self != NULL) && self != NULL)
{ {
self->close(); self->close();
@ -180,7 +183,7 @@ static const rabbit::RegFunction _file_methods[] = {
rabbit::Result sqstd_createfile(rabbit::VirtualMachine* v, SQFILE file,rabbit::Bool own) rabbit::Result rabbit::std::createfile(rabbit::VirtualMachine* v, SQFILE file,rabbit::Bool own)
{ {
int64_t top = sq_gettop(v); int64_t top = sq_gettop(v);
sq_pushregistrytable(v); sq_pushregistrytable(v);
@ -204,9 +207,9 @@ rabbit::Result sqstd_createfile(rabbit::VirtualMachine* v, SQFILE file,rabbit::B
return SQ_ERROR; return SQ_ERROR;
} }
rabbit::Result sqstd_getfile(rabbit::VirtualMachine* v, int64_t idx, SQFILE *file) rabbit::Result rabbit::std::getfile(rabbit::VirtualMachine* v, int64_t idx, SQFILE *file)
{ {
SQFile *fileobj = NULL; rabbit::std::File *fileobj = NULL;
if(SQ_SUCCEEDED(sq_getinstanceup(v,idx,(rabbit::UserPointer*)&fileobj,(rabbit::UserPointer)SQSTD_FILE_TYPE_TAG))) { if(SQ_SUCCEEDED(sq_getinstanceup(v,idx,(rabbit::UserPointer*)&fileobj,(rabbit::UserPointer)SQSTD_FILE_TYPE_TAG))) {
*file = fileobj->getHandle(); *file = fileobj->getHandle();
return SQ_OK; return SQ_OK;
@ -221,7 +224,7 @@ struct IOBuffer {
unsigned char buffer[IO_BUFFER_SIZE]; unsigned char buffer[IO_BUFFER_SIZE];
int64_t size; int64_t size;
int64_t ptr; int64_t ptr;
SQFILE file; rabbit::std::SQFILE file;
}; };
int64_t _read_byte(IOBuffer *iobuffer) int64_t _read_byte(IOBuffer *iobuffer)
@ -233,7 +236,7 @@ int64_t _read_byte(IOBuffer *iobuffer)
return ret; return ret;
} }
else { else {
if( (iobuffer->size = sqstd_fread(iobuffer->buffer,1,IO_BUFFER_SIZE,iobuffer->file )) > 0 ) if( (iobuffer->size = rabbit::std::fread(iobuffer->buffer,1,IO_BUFFER_SIZE,iobuffer->file )) > 0 )
{ {
int64_t ret = iobuffer->buffer[0]; int64_t ret = iobuffer->buffer[0];
iobuffer->ptr = 1; iobuffer->ptr = 1;
@ -253,7 +256,7 @@ int64_t _read_two_bytes(IOBuffer *iobuffer)
return ret; return ret;
} }
else { else {
if( (iobuffer->size = sqstd_fread(iobuffer->buffer,1,IO_BUFFER_SIZE,iobuffer->file )) > 0 ) if( (iobuffer->size = rabbit::std::fread(iobuffer->buffer,1,IO_BUFFER_SIZE,iobuffer->file )) > 0 )
{ {
if(iobuffer->size < 2) return 0; if(iobuffer->size < 2) return 0;
int64_t ret = *((const wchar_t*)&iobuffer->buffer[0]); int64_t ret = *((const wchar_t*)&iobuffer->buffer[0]);
@ -335,33 +338,33 @@ static int64_t _io_file_lexfeed_UCS2_BE(rabbit::UserPointer iobuf)
int64_t file_read(rabbit::UserPointer file,rabbit::UserPointer buf,int64_t size) int64_t file_read(rabbit::UserPointer file,rabbit::UserPointer buf,int64_t size)
{ {
int64_t ret; int64_t ret;
if( ( ret = sqstd_fread(buf,1,size,(SQFILE)file ))!=0 )return ret; if( ( ret = rabbit::std::fread(buf,1,size,(rabbit::std::SQFILE)file ))!=0 )return ret;
return -1; return -1;
} }
int64_t file_write(rabbit::UserPointer file,rabbit::UserPointer p,int64_t size) int64_t file_write(rabbit::UserPointer file,rabbit::UserPointer p,int64_t size)
{ {
return sqstd_fwrite(p,1,size,(SQFILE)file); return rabbit::std::fwrite(p,1,size,(rabbit::std::SQFILE)file);
} }
rabbit::Result sqstd_loadfile(rabbit::VirtualMachine* v,const rabbit::Char *filename,rabbit::Bool printerror) rabbit::Result rabbit::std::loadfile(rabbit::VirtualMachine* v,const rabbit::Char *filename,rabbit::Bool printerror)
{ {
SQFILE file = sqstd_fopen(filename,_SC("rb")); SQFILE file = rabbit::std::fopen(filename,_SC("rb"));
int64_t ret; int64_t ret;
unsigned short us; unsigned short us;
unsigned char uc; unsigned char uc;
SQLEXREADFUNC func = _io_file_lexfeed_PLAIN; SQLEXREADFUNC func = _io_file_lexfeed_PLAIN;
if(file){ if(file){
ret = sqstd_fread(&us,1,2,file); ret = rabbit::std::fread(&us,1,2,file);
if(ret != 2) { if(ret != 2) {
//probably an empty file //probably an empty file
us = 0; us = 0;
} }
if(us == SQ_BYTECODE_STREAM_TAG) { //BYTECODE if(us == SQ_BYTECODE_STREAM_TAG) { //BYTECODE
sqstd_fseek(file,0,SQ_SEEK_SET); rabbit::std::fseek(file,0,SQ_SEEK_SET);
if(SQ_SUCCEEDED(sq_readclosure(v,file_read,file))) { if(SQ_SUCCEEDED(sq_readclosure(v,file_read,file))) {
sqstd_fclose(file); rabbit::std::fclose(file);
return SQ_OK; return SQ_OK;
} }
} }
@ -373,12 +376,12 @@ rabbit::Result sqstd_loadfile(rabbit::VirtualMachine* v,const rabbit::Char *file
case 0xFFFE: func = _io_file_lexfeed_UCS2_BE; break;//UTF-16 little endian; case 0xFFFE: func = _io_file_lexfeed_UCS2_BE; break;//UTF-16 little endian;
case 0xFEFF: func = _io_file_lexfeed_UCS2_LE; break;//UTF-16 big endian; case 0xFEFF: func = _io_file_lexfeed_UCS2_LE; break;//UTF-16 big endian;
case 0xBBEF: case 0xBBEF:
if(sqstd_fread(&uc,1,sizeof(uc),file) == 0) { if(rabbit::std::fread(&uc,1,sizeof(uc),file) == 0) {
sqstd_fclose(file); rabbit::std::fclose(file);
return sq_throwerror(v,_SC("io error")); return sq_throwerror(v,_SC("io error"));
} }
if(uc != 0xBF) { if(uc != 0xBF) {
sqstd_fclose(file); rabbit::std::fclose(file);
return sq_throwerror(v,_SC("Unrecognized encoding")); return sq_throwerror(v,_SC("Unrecognized encoding"));
} }
#ifdef SQUNICODE #ifdef SQUNICODE
@ -387,30 +390,30 @@ rabbit::Result sqstd_loadfile(rabbit::VirtualMachine* v,const rabbit::Char *file
func = _io_file_lexfeed_PLAIN; func = _io_file_lexfeed_PLAIN;
#endif #endif
break;//UTF-8 ; break;//UTF-8 ;
default: sqstd_fseek(file,0,SQ_SEEK_SET); break; // ascii default: rabbit::std::fseek(file,0,SQ_SEEK_SET); break; // ascii
} }
IOBuffer buffer; IOBuffer buffer;
buffer.ptr = 0; buffer.ptr = 0;
buffer.size = 0; buffer.size = 0;
buffer.file = file; buffer.file = file;
if(SQ_SUCCEEDED(sq_compile(v,func,&buffer,filename,printerror))){ if(SQ_SUCCEEDED(sq_compile(v,func,&buffer,filename,printerror))){
sqstd_fclose(file); rabbit::std::fclose(file);
return SQ_OK; return SQ_OK;
} }
} }
sqstd_fclose(file); rabbit::std::fclose(file);
return SQ_ERROR; return SQ_ERROR;
} }
return sq_throwerror(v,_SC("cannot open the file")); return sq_throwerror(v,_SC("cannot open the file"));
} }
rabbit::Result sqstd_dofile(rabbit::VirtualMachine* v,const rabbit::Char *filename,rabbit::Bool retval,rabbit::Bool printerror) rabbit::Result rabbit::std::dofile(rabbit::VirtualMachine* v,const rabbit::Char *filename,rabbit::Bool retval,rabbit::Bool printerror)
{ {
//at least one entry must exist in order for us to push it as the environment //at least one entry must exist in order for us to push it as the environment
if(sq_gettop(v) == 0) if(sq_gettop(v) == 0)
return sq_throwerror(v,_SC("environment table expected")); return sq_throwerror(v,_SC("environment table expected"));
if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,printerror))) { if(SQ_SUCCEEDED(rabbit::std::loadfile(v,filename,printerror))) {
sq_push(v,-2); sq_push(v,-2);
if(SQ_SUCCEEDED(sq_call(v,1,retval,SQTrue))) { if(SQ_SUCCEEDED(sq_call(v,1,retval,SQTrue))) {
sq_remove(v,retval?-2:-1); //removes the closure sq_remove(v,retval?-2:-1); //removes the closure
@ -421,15 +424,15 @@ rabbit::Result sqstd_dofile(rabbit::VirtualMachine* v,const rabbit::Char *filena
return SQ_ERROR; return SQ_ERROR;
} }
rabbit::Result sqstd_writeclosuretofile(rabbit::VirtualMachine* v,const rabbit::Char *filename) rabbit::Result rabbit::std::writeclosuretofile(rabbit::VirtualMachine* v,const rabbit::Char *filename)
{ {
SQFILE file = sqstd_fopen(filename,_SC("wb+")); SQFILE file = rabbit::std::fopen(filename,_SC("wb+"));
if(!file) return sq_throwerror(v,_SC("cannot open the file")); if(!file) return sq_throwerror(v,_SC("cannot open the file"));
if(SQ_SUCCEEDED(sq_writeclosure(v,file_write,file))) { if(SQ_SUCCEEDED(sq_writeclosure(v,file_write,file))) {
sqstd_fclose(file); rabbit::std::fclose(file);
return SQ_OK; return SQ_OK;
} }
sqstd_fclose(file); rabbit::std::fclose(file);
return SQ_ERROR; //forward the error return SQ_ERROR; //forward the error
} }
@ -441,7 +444,7 @@ int64_t _g_io_loadfile(rabbit::VirtualMachine* v)
if(sq_gettop(v) >= 3) { if(sq_gettop(v) >= 3) {
sq_getbool(v,3,&printerror); sq_getbool(v,3,&printerror);
} }
if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,printerror))) if(SQ_SUCCEEDED(rabbit::std::loadfile(v,filename,printerror)))
return 1; return 1;
return SQ_ERROR; //propagates the error return SQ_ERROR; //propagates the error
} }
@ -450,7 +453,7 @@ int64_t _g_io_writeclosuretofile(rabbit::VirtualMachine* v)
{ {
const rabbit::Char *filename; const rabbit::Char *filename;
sq_getstring(v,2,&filename); sq_getstring(v,2,&filename);
if(SQ_SUCCEEDED(sqstd_writeclosuretofile(v,filename))) if(SQ_SUCCEEDED(rabbit::std::writeclosuretofile(v,filename)))
return 1; return 1;
return SQ_ERROR; //propagates the error return SQ_ERROR; //propagates the error
} }
@ -464,7 +467,7 @@ int64_t _g_io_dofile(rabbit::VirtualMachine* v)
sq_getbool(v,3,&printerror); sq_getbool(v,3,&printerror);
} }
sq_push(v,1); //repush the this sq_push(v,1); //repush the this
if(SQ_SUCCEEDED(sqstd_dofile(v,filename,SQTrue,printerror))) if(SQ_SUCCEEDED(rabbit::std::dofile(v,filename,SQTrue,printerror)))
return 1; return 1;
return SQ_ERROR; //propagates the error return SQ_ERROR; //propagates the error
} }
@ -477,19 +480,19 @@ static const rabbit::RegFunction iolib_funcs[]={
{NULL,(SQFUNCTION)0,0,NULL} {NULL,(SQFUNCTION)0,0,NULL}
}; };
rabbit::Result sqstd_register_iolib(rabbit::VirtualMachine* v) rabbit::Result rabbit::std::register_iolib(rabbit::VirtualMachine* v)
{ {
int64_t top = sq_gettop(v); int64_t top = sq_gettop(v);
//create delegate //create delegate
declare_stream(v,_SC("file"),(rabbit::UserPointer)SQSTD_FILE_TYPE_TAG,_SC("std_file"),_file_methods,iolib_funcs); declare_stream(v,_SC("file"),(rabbit::UserPointer)SQSTD_FILE_TYPE_TAG,_SC("std_file"),_file_methods,iolib_funcs);
sq_pushstring(v,_SC("stdout"),-1); sq_pushstring(v,_SC("stdout"),-1);
sqstd_createfile(v,stdout,SQFalse); rabbit::std::createfile(v,stdout,SQFalse);
sq_newslot(v,-3,SQFalse); sq_newslot(v,-3,SQFalse);
sq_pushstring(v,_SC("stdin"),-1); sq_pushstring(v,_SC("stdin"),-1);
sqstd_createfile(v,stdin,SQFalse); rabbit::std::createfile(v,stdin,SQFalse);
sq_newslot(v,-3,SQFalse); sq_newslot(v,-3,SQFalse);
sq_pushstring(v,_SC("stderr"),-1); sq_pushstring(v,_SC("stderr"),-1);
sqstd_createfile(v,stderr,SQFalse); rabbit::std::createfile(v,stderr,SQFalse);
sq_newslot(v,-3,SQFalse); sq_newslot(v,-3,SQFalse);
sq_settop(v,top); sq_settop(v,top);
return SQ_OK; return SQ_OK;

View File

@ -7,6 +7,8 @@
*/ */
#pragma once #pragma once
namespace rabbit {
namespace std {
#define SQSTD_STREAM_TYPE_TAG 0x80000000 #define SQSTD_STREAM_TYPE_TAG 0x80000000
struct SQStream { struct SQStream {
@ -25,24 +27,26 @@ struct SQStream {
#define SQ_SEEK_END 1 #define SQ_SEEK_END 1
#define SQ_SEEK_SET 2 #define SQ_SEEK_SET 2
typedef void* SQFILE; using SQFILE = void*;
RABBIT_API SQFILE sqstd_fopen(const rabbit::Char *,const rabbit::Char *); SQFILE fopen(const rabbit::Char *,const rabbit::Char *);
RABBIT_API int64_t sqstd_fread(rabbit::UserPointer, int64_t, int64_t, SQFILE); int64_t fread(rabbit::UserPointer, int64_t, int64_t, SQFILE);
RABBIT_API int64_t sqstd_fwrite(const rabbit::UserPointer, int64_t, int64_t, SQFILE); int64_t fwrite(const rabbit::UserPointer, int64_t, int64_t, SQFILE);
RABBIT_API int64_t sqstd_fseek(SQFILE , int64_t , int64_t); int64_t fseek(SQFILE , int64_t , int64_t);
RABBIT_API int64_t sqstd_ftell(SQFILE); int64_t ftell(SQFILE);
RABBIT_API int64_t sqstd_fflush(SQFILE); int64_t fflush(SQFILE);
RABBIT_API int64_t sqstd_fclose(SQFILE); int64_t fclose(SQFILE);
RABBIT_API int64_t sqstd_feof(SQFILE); int64_t feof(SQFILE);
RABBIT_API rabbit::Result sqstd_createfile(rabbit::VirtualMachine* v, SQFILE file,rabbit::Bool own); rabbit::Result createfile(rabbit::VirtualMachine* v, SQFILE file,rabbit::Bool own);
RABBIT_API rabbit::Result sqstd_getfile(rabbit::VirtualMachine* v, int64_t idx, SQFILE *file); rabbit::Result getfile(rabbit::VirtualMachine* v, int64_t idx, SQFILE *file);
//compiler helpers //compiler helpers
RABBIT_API rabbit::Result sqstd_loadfile(rabbit::VirtualMachine* v,const rabbit::Char *filename,rabbit::Bool printerror); rabbit::Result loadfile(rabbit::VirtualMachine* v,const rabbit::Char *filename,rabbit::Bool printerror);
RABBIT_API rabbit::Result sqstd_dofile(rabbit::VirtualMachine* v,const rabbit::Char *filename,rabbit::Bool retval,rabbit::Bool printerror); rabbit::Result dofile(rabbit::VirtualMachine* v,const rabbit::Char *filename,rabbit::Bool retval,rabbit::Bool printerror);
RABBIT_API rabbit::Result sqstd_writeclosuretofile(rabbit::VirtualMachine* v,const rabbit::Char *filename); rabbit::Result writeclosuretofile(rabbit::VirtualMachine* v,const rabbit::Char *filename);
RABBIT_API rabbit::Result sqstd_register_iolib(rabbit::VirtualMachine* v); rabbit::Result register_iolib(rabbit::VirtualMachine* v);
}
}

View File

@ -93,7 +93,7 @@ static const rabbit::RegFunction mathlib_funcs[] = {
#define M_PI (3.14159265358979323846) #define M_PI (3.14159265358979323846)
#endif #endif
rabbit::Result sqstd_register_mathlib(rabbit::VirtualMachine* v) rabbit::Result rabbit::std::register_mathlib(rabbit::VirtualMachine* v)
{ {
int64_t i=0; int64_t i=0;
while(mathlib_funcs[i].name!=0) { while(mathlib_funcs[i].name!=0) {

View File

@ -10,5 +10,8 @@
#include <rabbit/rabbit.hpp> #include <rabbit/rabbit.hpp>
#include <rabbit/RegFunction.hpp> #include <rabbit/RegFunction.hpp>
RABBIT_API rabbit::Result sqstd_register_mathlib(rabbit::VirtualMachine* v); namespace rabbit {
namespace std {
rabbit::Result register_mathlib(rabbit::VirtualMachine* v);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -17,11 +17,11 @@
#include <rabbit-std/sqstdblobimpl.hpp> #include <rabbit-std/sqstdblobimpl.hpp>
#define SETUP_STREAM(v) \ #define SETUP_STREAM(v) \
SQStream *self = NULL; \ rabbit::std::SQStream *self = NULL; \
if(SQ_FAILED(sq_getinstanceup(v,1,(rabbit::UserPointer*)&self,(rabbit::UserPointer)((uint64_t)SQSTD_STREAM_TYPE_TAG)))) \ if(SQ_FAILED(sq_getinstanceup(v,1,(rabbit::UserPointer*)&self,(rabbit::UserPointer)((uint64_t)SQSTD_STREAM_TYPE_TAG)))) \
return sq_throwerror(v,_SC("invalid type tag")); \ return rabbit::sq_throwerror(v,_SC("invalid type tag")); \
if(!self || !self->IsValid()) \ if(!self || !self->IsValid()) \
return sq_throwerror(v,_SC("the stream is invalid")); return rabbit::sq_throwerror(v,_SC("the stream is invalid"));
int64_t _stream_readblob(rabbit::VirtualMachine* v) int64_t _stream_readblob(rabbit::VirtualMachine* v)
{ {
@ -36,7 +36,7 @@ int64_t _stream_readblob(rabbit::VirtualMachine* v)
res = self->Read(data,size); res = self->Read(data,size);
if(res <= 0) if(res <= 0)
return sq_throwerror(v,_SC("no data left to read")); return sq_throwerror(v,_SC("no data left to read"));
blobp = sqstd_createblob(v,res); blobp = rabbit::std::createblob(v,res);
memcpy(blobp,data,res); memcpy(blobp,data,res);
return 1; return 1;
} }
@ -109,9 +109,9 @@ int64_t _stream_writeblob(rabbit::VirtualMachine* v)
rabbit::UserPointer data; rabbit::UserPointer data;
int64_t size; int64_t size;
SETUP_STREAM(v); SETUP_STREAM(v);
if(SQ_FAILED(sqstd_getblob(v,2,&data))) if(SQ_FAILED(rabbit::std::getblob(v,2,&data)))
return sq_throwerror(v,_SC("invalid parameter")); return sq_throwerror(v,_SC("invalid parameter"));
size = sqstd_getblobsize(v,2); size = rabbit::std::getblobsize(v,2);
if(self->Write(data,size) != size) if(self->Write(data,size) != size)
return sq_throwerror(v,_SC("io error")); return sq_throwerror(v,_SC("io error"));
sq_pushinteger(v,size); sq_pushinteger(v,size);
@ -290,7 +290,7 @@ void init_streamclass(rabbit::VirtualMachine* v)
sq_pop(v,1); sq_pop(v,1);
} }
rabbit::Result declare_stream(rabbit::VirtualMachine* v,const rabbit::Char* name,rabbit::UserPointer typetag,const rabbit::Char* reg_name,const rabbit::RegFunction *methods,const rabbit::RegFunction *globals) rabbit::Result rabbit::std::declare_stream(rabbit::VirtualMachine* v,const rabbit::Char* name,rabbit::UserPointer typetag,const rabbit::Char* reg_name,const rabbit::RegFunction *methods,const rabbit::RegFunction *globals)
{ {
if(sq_gettype(v,-1) != rabbit::OT_TABLE) if(sq_gettype(v,-1) != rabbit::OT_TABLE)
return sq_throwerror(v,_SC("table expected")); return sq_throwerror(v,_SC("table expected"));

View File

@ -9,16 +9,20 @@
#include <rabbit/RegFunction.hpp> #include <rabbit/RegFunction.hpp>
int64_t _stream_readblob(rabbit::VirtualMachine* v); namespace rabbit {
int64_t _stream_readline(rabbit::VirtualMachine* v); namespace std {
int64_t _stream_readn(rabbit::VirtualMachine* v); int64_t _stream_readblob(rabbit::VirtualMachine* v);
int64_t _stream_writeblob(rabbit::VirtualMachine* v); int64_t _stream_readline(rabbit::VirtualMachine* v);
int64_t _stream_writen(rabbit::VirtualMachine* v); int64_t _stream_readn(rabbit::VirtualMachine* v);
int64_t _stream_seek(rabbit::VirtualMachine* v); int64_t _stream_writeblob(rabbit::VirtualMachine* v);
int64_t _stream_tell(rabbit::VirtualMachine* v); int64_t _stream_writen(rabbit::VirtualMachine* v);
int64_t _stream_len(rabbit::VirtualMachine* v); int64_t _stream_seek(rabbit::VirtualMachine* v);
int64_t _stream_eos(rabbit::VirtualMachine* v); int64_t _stream_tell(rabbit::VirtualMachine* v);
int64_t _stream_flush(rabbit::VirtualMachine* v); int64_t _stream_len(rabbit::VirtualMachine* v);
int64_t _stream_eos(rabbit::VirtualMachine* v);
int64_t _stream_flush(rabbit::VirtualMachine* v);
#define _DECL_STREAM_FUNC(name,nparams,typecheck) {_SC(#name),_stream_##name,nparams,typecheck} #define _DECL_STREAM_FUNC(name,nparams,typecheck) {_SC(#name),_stream_##name,nparams,typecheck}
rabbit::Result declare_stream(rabbit::VirtualMachine* v,const rabbit::Char* name,rabbit::UserPointer typetag,const rabbit::Char* reg_name,const rabbit::RegFunction *methods,const rabbit::RegFunction *globals); rabbit::Result declare_stream(rabbit::VirtualMachine* v,const rabbit::Char* name,rabbit::UserPointer typetag,const rabbit::Char* reg_name,const rabbit::RegFunction *methods,const rabbit::RegFunction *globals);
}
}

View File

@ -21,7 +21,12 @@
static rabbit::Bool isfmtchr(rabbit::Char ch) static rabbit::Bool isfmtchr(rabbit::Char ch)
{ {
switch(ch) { switch(ch) {
case '-': case '+': case ' ': case '#': case '0': return SQTrue; case '-':
case '+':
case ' ':
case '#':
case '0':
return SQTrue;
} }
return SQFalse; return SQFalse;
} }
@ -71,7 +76,7 @@ static int64_t validate_format(rabbit::VirtualMachine* v, rabbit::Char *fmt, con
return n; return n;
} }
rabbit::Result sqstd_format(rabbit::VirtualMachine* v,int64_t nformatstringidx,int64_t *outlen,rabbit::Char **output) rabbit::Result rabbit::std::format(rabbit::VirtualMachine* v,int64_t nformatstringidx,int64_t *outlen,rabbit::Char **output)
{ {
const rabbit::Char *format; const rabbit::Char *format;
rabbit::Char *dest; rabbit::Char *dest;
@ -164,7 +169,7 @@ static int64_t _string_printf(rabbit::VirtualMachine* v)
{ {
rabbit::Char *dest = NULL; rabbit::Char *dest = NULL;
int64_t length = 0; int64_t length = 0;
if(SQ_FAILED(sqstd_format(v,2,&length,&dest))) if(SQ_FAILED(rabbit::std::format(v,2,&length,&dest)))
return -1; return -1;
SQPRINTFUNCTION printfunc = sq_getprintfunc(v); SQPRINTFUNCTION printfunc = sq_getprintfunc(v);
@ -177,7 +182,7 @@ static int64_t _string_format(rabbit::VirtualMachine* v)
{ {
rabbit::Char *dest = NULL; rabbit::Char *dest = NULL;
int64_t length = 0; int64_t length = 0;
if(SQ_FAILED(sqstd_format(v,2,&length,&dest))) if(SQ_FAILED(rabbit::std::format(v,2,&length,&dest)))
return -1; return -1;
sq_pushstring(v,dest,length); sq_pushstring(v,dest,length);
return 1; return 1;
@ -370,13 +375,13 @@ static int64_t _string_endswith(rabbit::VirtualMachine* v)
} }
#define SETUP_REX(v) \ #define SETUP_REX(v) \
SQRex *self = NULL; \ rabbit::std::SQRex *self = NULL; \
sq_getinstanceup(v,1,(rabbit::UserPointer *)&self,0); rabbit::sq_getinstanceup(v,1,(rabbit::UserPointer *)&self,0);
static int64_t _rexobj_releasehook(rabbit::UserPointer p, int64_t SQ_UNUSED_ARG(size)) static int64_t _rexobj_releasehook(rabbit::UserPointer p, int64_t SQ_UNUSED_ARG(size))
{ {
SQRex *self = ((SQRex *)p); rabbit::std::SQRex *self = ((rabbit::std::SQRex *)p);
sqstd_rex_free(self); rabbit::std::rex_free(self);
return 1; return 1;
} }
@ -385,7 +390,7 @@ static int64_t _regexp_match(rabbit::VirtualMachine* v)
SETUP_REX(v); SETUP_REX(v);
const rabbit::Char *str; const rabbit::Char *str;
sq_getstring(v,2,&str); sq_getstring(v,2,&str);
if(sqstd_rex_match(self,str) == SQTrue) if(rabbit::std::rex_match(self,str) == SQTrue)
{ {
sq_pushbool(v,SQTrue); sq_pushbool(v,SQTrue);
return 1; return 1;
@ -412,7 +417,7 @@ static int64_t _regexp_search(rabbit::VirtualMachine* v)
int64_t start = 0; int64_t start = 0;
sq_getstring(v,2,&str); sq_getstring(v,2,&str);
if(sq_gettop(v) > 2) sq_getinteger(v,3,&start); if(sq_gettop(v) > 2) sq_getinteger(v,3,&start);
if(sqstd_rex_search(self,str+start,&begin,&end) == SQTrue) { if(rabbit::std::rex_search(self,str+start,&begin,&end) == SQTrue) {
_addrexmatch(v,str,begin,end); _addrexmatch(v,str,begin,end);
return 1; return 1;
} }
@ -426,12 +431,12 @@ static int64_t _regexp_capture(rabbit::VirtualMachine* v)
int64_t start = 0; int64_t start = 0;
sq_getstring(v,2,&str); sq_getstring(v,2,&str);
if(sq_gettop(v) > 2) sq_getinteger(v,3,&start); if(sq_gettop(v) > 2) sq_getinteger(v,3,&start);
if(sqstd_rex_search(self,str+start,&begin,&end) == SQTrue) { if(rabbit::std::rex_search(self,str+start,&begin,&end) == SQTrue) {
int64_t n = sqstd_rex_getsubexpcount(self); int64_t n = rabbit::std::rex_getsubexpcount(self);
SQRexMatch match; rabbit::std::SQRexMatch match;
sq_newarray(v,0); sq_newarray(v,0);
for(int64_t i = 0;i < n; i++) { for(int64_t i = 0;i < n; i++) {
sqstd_rex_getsubexp(self,i,&match); rabbit::std::rex_getsubexp(self,i,&match);
if(match.len > 0) if(match.len > 0)
_addrexmatch(v,str,match.begin,match.begin+match.len); _addrexmatch(v,str,match.begin,match.begin+match.len);
else else
@ -446,7 +451,7 @@ static int64_t _regexp_capture(rabbit::VirtualMachine* v)
static int64_t _regexp_subexpcount(rabbit::VirtualMachine* v) static int64_t _regexp_subexpcount(rabbit::VirtualMachine* v)
{ {
SETUP_REX(v); SETUP_REX(v);
sq_pushinteger(v,sqstd_rex_getsubexpcount(self)); sq_pushinteger(v,rabbit::std::rex_getsubexpcount(self));
return 1; return 1;
} }
@ -454,7 +459,7 @@ static int64_t _regexp_constructor(rabbit::VirtualMachine* v)
{ {
const rabbit::Char *error,*pattern; const rabbit::Char *error,*pattern;
sq_getstring(v,2,&pattern); sq_getstring(v,2,&pattern);
SQRex *rex = sqstd_rex_compile(pattern,&error); rabbit::std::SQRex *rex = rabbit::std::rex_compile(pattern,&error);
if(!rex) return sq_throwerror(v,error); if(!rex) return sq_throwerror(v,error);
sq_setinstanceup(v,1,rex); sq_setinstanceup(v,1,rex);
sq_setreleasehook(v,1,_rexobj_releasehook); sq_setreleasehook(v,1,_rexobj_releasehook);
@ -495,7 +500,7 @@ static const rabbit::RegFunction stringlib_funcs[]={
#undef _DECL_FUNC #undef _DECL_FUNC
int64_t sqstd_register_stringlib(rabbit::VirtualMachine* v) int64_t rabbit::std::register_stringlib(rabbit::VirtualMachine* v)
{ {
sq_pushstring(v,_SC("regexp"),-1); sq_pushstring(v,_SC("regexp"),-1);
sq_newclass(v,SQFalse); sq_newclass(v,SQFalse);

View File

@ -9,23 +9,27 @@
#include <rabbit/RegFunction.hpp> #include <rabbit/RegFunction.hpp>
typedef unsigned int SQRexBool; namespace rabbit {
typedef struct SQRex SQRex; namespace std {
using SQRexBool = unsigned int;
using SQRex = struct SQRex;
typedef struct { typedef struct {
const rabbit::Char *begin; const rabbit::Char *begin;
int64_t len; int64_t len;
} SQRexMatch; } SQRexMatch;
RABBIT_API SQRex *sqstd_rex_compile(const rabbit::Char *pattern,const rabbit::Char **error); SQRex *rex_compile(const rabbit::Char *pattern,const rabbit::Char **error);
RABBIT_API void sqstd_rex_free(SQRex *exp); void rex_free(SQRex *exp);
RABBIT_API rabbit::Bool sqstd_rex_match(SQRex* exp,const rabbit::Char* text); rabbit::Bool rex_match(SQRex* exp,const rabbit::Char* text);
RABBIT_API rabbit::Bool sqstd_rex_search(SQRex* exp,const rabbit::Char* text, const rabbit::Char** out_begin, const rabbit::Char** out_end); rabbit::Bool rex_search(SQRex* exp,const rabbit::Char* text, const rabbit::Char** out_begin, const rabbit::Char** out_end);
RABBIT_API rabbit::Bool sqstd_rex_searchrange(SQRex* exp,const rabbit::Char* text_begin,const rabbit::Char* text_end,const rabbit::Char** out_begin, const rabbit::Char** out_end); rabbit::Bool rex_searchrange(SQRex* exp,const rabbit::Char* text_begin,const rabbit::Char* text_end,const rabbit::Char** out_begin, const rabbit::Char** out_end);
RABBIT_API int64_t sqstd_rex_getsubexpcount(SQRex* exp); int64_t rex_getsubexpcount(SQRex* exp);
RABBIT_API rabbit::Bool sqstd_rex_getsubexp(SQRex* exp, int64_t n, SQRexMatch *subexp); rabbit::Bool rex_getsubexp(SQRex* exp, int64_t n, SQRexMatch *subexp);
RABBIT_API rabbit::Result sqstd_format(rabbit::VirtualMachine* v,int64_t nformatstringidx,int64_t *outlen,rabbit::Char **output); rabbit::Result format(rabbit::VirtualMachine* v,int64_t nformatstringidx,int64_t *outlen,rabbit::Char **output);
RABBIT_API rabbit::Result sqstd_register_stringlib(rabbit::VirtualMachine* v); rabbit::Result register_stringlib(rabbit::VirtualMachine* v);
}
}

View File

@ -139,7 +139,7 @@ static const rabbit::RegFunction systemlib_funcs[]={
}; };
#undef _DECL_FUNC #undef _DECL_FUNC
int64_t sqstd_register_systemlib(rabbit::VirtualMachine* v) int64_t rabbit::std::register_systemlib(rabbit::VirtualMachine* v)
{ {
int64_t i=0; int64_t i=0;
while(systemlib_funcs[i].name!=0) while(systemlib_funcs[i].name!=0)

View File

@ -7,4 +7,8 @@
*/ */
#pragma once #pragma once
RABBIT_API int64_t sqstd_register_systemlib(rabbit::VirtualMachine* v); namespace rabbit {
namespace std {
int64_t register_systemlib(rabbit::VirtualMachine* v);
}
}

View File

@ -6,6 +6,8 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#include <rabbit/Array.hpp> #include <rabbit/Array.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/WeakRef.hpp>
@ -18,3 +20,119 @@ void rabbit::Array::extend(const rabbit::Array *a){
} }
} }
} }
rabbit::Array::Array(rabbit::SharedState* _ss,
int64_t _nsize) {
m_data.resize(_nsize);
}
rabbit::Array::~Array() {
// TODO: Clean DATA ...
}
// TODO : remove this ETK_ALLOC can do it natively ...
rabbit::Array* rabbit::Array::create(rabbit::SharedState* _ss,
int64_t _ninitialsize) {
Array *newarray=(Array*)SQ_MALLOC(sizeof(Array));
new ((char*)newarray) Array(_ss, _ninitialsize);
return newarray;
}
void rabbit::Array::finalize() {
m_data.resize(0);
}
bool rabbit::Array::get(const int64_t _nidx,
rabbit::ObjectPtr& _val) {
if( _nidx >= 0
&& _nidx < (int64_t)m_data.size()){
rabbit::ObjectPtr &o = m_data[_nidx];
_val = _realval(o);
return true;
}
return false;
}
bool rabbit::Array::set(const int64_t _nidx,const rabbit::ObjectPtr& _val) {
if(_nidx>=0 && _nidx<(int64_t)m_data.size()){
m_data[_nidx] = _val;
return true;
}
return false;
}
int64_t rabbit::Array::next(const rabbit::ObjectPtr& _refpos,
rabbit::ObjectPtr& _outkey,
rabbit::ObjectPtr& _outval) {
uint64_t idx=translateIndex(_refpos);
while(idx<m_data.size()){
//first found
_outkey=(int64_t)idx;
rabbit::ObjectPtr& o = m_data[idx];
_outval = _realval(o);
//return idx for the next iteration
return ++idx;
}
//nothing to iterate anymore
return -1;
}
rabbit::Array* rabbit::Array::clone() {
Array *anew = create(NULL,0);
anew->m_data = m_data;
return anew;
}
int64_t rabbit::Array::size() const {
return m_data.size();
}
void rabbit::Array::resize(int64_t _size) {
rabbit::ObjectPtr empty;
resize(_size, empty);
}
void rabbit::Array::resize(int64_t _size,
rabbit::ObjectPtr& _fill) {
m_data.resize(_size, _fill);
shrinkIfNeeded();
}
void rabbit::Array::reserve(int64_t _size) {
m_data.reserve(_size);
}
void rabbit::Array::append(const rabbit::Object& _o) {
m_data.pushBack(_o);
}
rabbit::ObjectPtr& rabbit::Array::top(){
return m_data.back();
}
void rabbit::Array::pop() {
m_data.popBack();
shrinkIfNeeded();
}
bool rabbit::Array::insert(int64_t _idx,const rabbit::Object& _val) {
if( _idx < 0
|| _idx > (int64_t)m_data.size()) {
return false;
}
m_data.insert(_idx, _val);
return true;
}
void rabbit::Array::shrinkIfNeeded() {
// TODO: Check this. No real need with etk ==> automatic ...
/*
if(m_data.size() <= m_data.capacity()>>2) {
//shrink the array
m_data.shrinktofit();
}
*/
}
bool rabbit::Array::remove(int64_t _idx) {
if( _idx < 0
|| _idx >= (int64_t)m_data.size()) {
return false;
}
m_data.remove(_idx);
shrinkIfNeeded();
return true;
}
void rabbit::Array::release() {
sq_delete(this, Array);
}
rabbit::ObjectPtr& rabbit::Array::operator[] (const size_t _pos) {
return m_data[_pos];
}
const rabbit::ObjectPtr& rabbit::Array::operator[] (const size_t _pos) const {
return m_data[_pos];
}

View File

@ -9,128 +9,42 @@
#include <rabbit/RefCounted.hpp> #include <rabbit/RefCounted.hpp>
#include <rabbit/ObjectPtr.hpp> #include <rabbit/ObjectPtr.hpp>
#include <etk/Vector.hpp>
namespace rabbit { namespace rabbit {
class SharedState; class SharedState;
class Array : public rabbit::RefCounted class Array : public rabbit::RefCounted {
{
private: private:
Array(rabbit::SharedState* _ss, Array(rabbit::SharedState* _ss,
int64_t _nsize) { int64_t _nsize);
m_data.resize(_nsize); ~Array();
}
~Array() {
// TODO: Clean DATA ...
}
public: public:
// TODO : remove this ETK_ALLOC can do it natively ... // TODO : remove this ETK_ALLOC can do it natively ...
static Array* create(rabbit::SharedState* _ss, static Array* create(rabbit::SharedState* _ss,
int64_t _ninitialsize) { int64_t _ninitialsize);
Array *newarray=(Array*)SQ_MALLOC(sizeof(Array)); void finalize();
new (newarray) Array(_ss, _ninitialsize);
return newarray;
}
void finalize() {
m_data.resize(0);
}
bool get(const int64_t _nidx, bool get(const int64_t _nidx,
rabbit::ObjectPtr& _val) { rabbit::ObjectPtr& _val);
if( _nidx >= 0 bool set(const int64_t _nidx,const rabbit::ObjectPtr& _val);
&& _nidx < (int64_t)m_data.size()){
rabbit::ObjectPtr &o = m_data[_nidx];
_val = _realval(o);
return true;
}
return false;
}
bool set(const int64_t _nidx,const rabbit::ObjectPtr& _val) {
if(_nidx>=0 && _nidx<(int64_t)m_data.size()){
m_data[_nidx] = _val;
return true;
}
return false;
}
int64_t next(const rabbit::ObjectPtr& _refpos, int64_t next(const rabbit::ObjectPtr& _refpos,
rabbit::ObjectPtr& _outkey, rabbit::ObjectPtr& _outkey,
rabbit::ObjectPtr& _outval) { rabbit::ObjectPtr& _outval);
uint64_t idx=translateIndex(_refpos); Array* clone();
while(idx<m_data.size()){ int64_t size() const;
//first found void resize(int64_t _size);
_outkey=(int64_t)idx;
rabbit::ObjectPtr& o = m_data[idx];
_outval = _realval(o);
//return idx for the next iteration
return ++idx;
}
//nothing to iterate anymore
return -1;
}
Array* clone() {
Array *anew = create(NULL,0);
anew->m_data = m_data;
return anew;
}
int64_t size() const {
return m_data.size();
}
void resize(int64_t _size) {
rabbit::ObjectPtr empty;
resize(_size, empty);
}
void resize(int64_t _size, void resize(int64_t _size,
rabbit::ObjectPtr& _fill) { rabbit::ObjectPtr& _fill);
m_data.resize(_size, _fill); void reserve(int64_t _size);
shrinkIfNeeded(); void append(const rabbit::Object& _o);
}
void reserve(int64_t _size) {
m_data.reserve(_size);
}
void append(const rabbit::Object& _o) {
m_data.pushBack(_o);
}
void extend(const Array* _a); void extend(const Array* _a);
rabbit::ObjectPtr &top(){ rabbit::ObjectPtr &top();
return m_data.back(); void pop();
} bool insert(int64_t _idx,const rabbit::Object& _val);
void pop() { void shrinkIfNeeded();
m_data.popBack(); bool remove(int64_t _idx);
shrinkIfNeeded(); void release();
} rabbit::ObjectPtr& operator[] (const size_t _pos);
bool insert(int64_t _idx,const rabbit::Object& _val) { const rabbit::ObjectPtr& operator[] (const size_t _pos) const;
if( _idx < 0
|| _idx > (int64_t)m_data.size()) {
return false;
}
m_data.insert(_idx, _val);
return true;
}
void shrinkIfNeeded() {
// TODO: Check this. No real need with etk ==> automatic ...
/*
if(m_data.size() <= m_data.capacity()>>2) {
//shrink the array
m_data.shrinktofit();
}
*/
}
bool remove(int64_t _idx) {
if( _idx < 0
|| _idx >= (int64_t)m_data.size()) {
return false;
}
m_data.remove(_idx);
shrinkIfNeeded();
return true;
}
void release() {
sq_delete(this, Array);
}
rabbit::ObjectPtr& operator[] (const size_t _pos) {
return m_data[_pos];
}
const rabbit::ObjectPtr& operator[] (const size_t _pos) const {
return m_data[_pos];
}
private: private:
etk::Vector<rabbit::ObjectPtr> m_data; etk::Vector<rabbit::ObjectPtr> m_data;
}; };

View File

@ -9,7 +9,11 @@
#include <rabbit/Instance.hpp> #include <rabbit/Instance.hpp>
#include <rabbit/Table.hpp> #include <rabbit/Table.hpp>
#include <rabbit/SharedState.hpp> #include <rabbit/SharedState.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/VirtualMachine.hpp>
#include <rabbit/WeakRef.hpp>
#include <rabbit/Closure.hpp>
rabbit::Class::Class(rabbit::SharedState *ss, rabbit::Class *base) { rabbit::Class::Class(rabbit::SharedState *ss, rabbit::Class *base) {
_base = base; _base = base;
@ -47,7 +51,7 @@ rabbit::Class::~Class() {
rabbit::Class* rabbit::Class::create(rabbit::SharedState *ss, Class *base) { rabbit::Class* rabbit::Class::create(rabbit::SharedState *ss, Class *base) {
rabbit::Class *newclass = (Class *)SQ_MALLOC(sizeof(Class)); rabbit::Class *newclass = (Class *)SQ_MALLOC(sizeof(Class));
new (newclass) Class(ss, base); new ((char*)newclass) Class(ss, base);
return newclass; return newclass;
} }

View File

@ -11,8 +11,8 @@
#include <rabbit/VirtualMachine.hpp> #include <rabbit/VirtualMachine.hpp>
#include <rabbit/sqfuncproto.hpp>
#include <rabbit/sqclosure.hpp>
#include <rabbit/ClassMember.hpp> #include <rabbit/ClassMember.hpp>
namespace rabbit { namespace rabbit {

View File

@ -6,11 +6,26 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#include <rabbit/Closure.hpp> #include <rabbit/Closure.hpp>
#include <rabbit/VirtualMachine.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/ObjectPtr.hpp>
#include <rabbit/WeakRef.hpp>
#include <rabbit/FunctionProto.hpp>
#include <rabbit/LocalVarInfo.hpp>
#include <rabbit/LineInfo.hpp>
#include <rabbit/OuterVar.hpp>
#include <rabbit/String.hpp>
#include <rabbit/SharedState.hpp>
#include <rabbit/Table.hpp>
#include <rabbit/Class.hpp>
#include <rabbit/RefCounted.hpp>
#include <rabbit/squtils.hpp>
#define _CHECK_IO(exp) { if(!exp)return false; } bool rabbit::SafeWrite(rabbit::VirtualMachine* v,SQWRITEFUNC write,rabbit::UserPointer up,rabbit::UserPointer dest,int64_t size)
bool SafeWrite(rabbit::VirtualMachine* v,SQWRITEFUNC write,rabbit::UserPointer up,rabbit::UserPointer dest,int64_t size)
{ {
if(write(up,dest,size) != size) { if(write(up,dest,size) != size) {
v->raise_error(_SC("io error (write function failure)")); v->raise_error(_SC("io error (write function failure)"));
@ -19,7 +34,7 @@ bool SafeWrite(rabbit::VirtualMachine* v,SQWRITEFUNC write,rabbit::UserPointer u
return true; return true;
} }
bool SafeRead(rabbit::VirtualMachine* v,SQWRITEFUNC read,rabbit::UserPointer up,rabbit::UserPointer dest,int64_t size) bool rabbit::SafeRead(rabbit::VirtualMachine* v,SQWRITEFUNC read,rabbit::UserPointer up,rabbit::UserPointer dest,int64_t size)
{ {
if(size && read(up,dest,size) != size) { if(size && read(up,dest,size) != size) {
v->raise_error(_SC("io error, read function failure, the origin stream could be corrupted/trucated")); v->raise_error(_SC("io error, read function failure, the origin stream could be corrupted/trucated"));
@ -28,12 +43,12 @@ bool SafeRead(rabbit::VirtualMachine* v,SQWRITEFUNC read,rabbit::UserPointer up,
return true; return true;
} }
bool WriteTag(rabbit::VirtualMachine* v,SQWRITEFUNC write,rabbit::UserPointer up,uint32_t tag) bool rabbit::WriteTag(rabbit::VirtualMachine* v,SQWRITEFUNC write,rabbit::UserPointer up,uint32_t tag)
{ {
return SafeWrite(v,write,up,&tag,sizeof(tag)); return SafeWrite(v,write,up,&tag,sizeof(tag));
} }
bool CheckTag(rabbit::VirtualMachine* v,SQWRITEFUNC read,rabbit::UserPointer up,uint32_t tag) bool rabbit::CheckTag(rabbit::VirtualMachine* v,SQWRITEFUNC read,rabbit::UserPointer up,uint32_t tag)
{ {
uint32_t t; uint32_t t;
_CHECK_IO(SafeRead(v,read,up,&t,sizeof(t))); _CHECK_IO(SafeRead(v,read,up,&t,sizeof(t)));
@ -44,7 +59,7 @@ bool CheckTag(rabbit::VirtualMachine* v,SQWRITEFUNC read,rabbit::UserPointer up,
return true; return true;
} }
bool WriteObject(rabbit::VirtualMachine* v,rabbit::UserPointer up,SQWRITEFUNC write,rabbit::ObjectPtr &o) bool rabbit::WriteObject(rabbit::VirtualMachine* v,rabbit::UserPointer up,SQWRITEFUNC write,rabbit::ObjectPtr &o)
{ {
uint32_t _type = (uint32_t)sq_type(o); uint32_t _type = (uint32_t)sq_type(o);
_CHECK_IO(SafeWrite(v,write,up,&_type,sizeof(_type))); _CHECK_IO(SafeWrite(v,write,up,&_type,sizeof(_type)));
@ -67,7 +82,7 @@ bool WriteObject(rabbit::VirtualMachine* v,rabbit::UserPointer up,SQWRITEFUNC wr
return true; return true;
} }
bool ReadObject(rabbit::VirtualMachine* v,rabbit::UserPointer up,SQREADFUNC read,rabbit::ObjectPtr &o) bool rabbit::ReadObject(rabbit::VirtualMachine* v,rabbit::UserPointer up,SQREADFUNC read,rabbit::ObjectPtr &o)
{ {
uint32_t _type; uint32_t _type;
_CHECK_IO(SafeRead(v,read,up,&_type,sizeof(_type))); _CHECK_IO(SafeRead(v,read,up,&_type,sizeof(_type)));
@ -142,7 +157,7 @@ rabbit::Closure::Closure(rabbit::SharedState *ss,rabbit::FunctionProto *func){
rabbit::Closure *rabbit::Closure::create(rabbit::SharedState *ss,rabbit::FunctionProto *func,rabbit::WeakRef *root){ rabbit::Closure *rabbit::Closure::create(rabbit::SharedState *ss,rabbit::FunctionProto *func,rabbit::WeakRef *root){
int64_t size = _CALC_CLOSURE_SIZE(func); int64_t size = _CALC_CLOSURE_SIZE(func);
rabbit::Closure *nc=(rabbit::Closure*)SQ_MALLOC(size); rabbit::Closure *nc=(rabbit::Closure*)SQ_MALLOC(size);
new (nc) rabbit::Closure(ss,func); new ((char*)nc) rabbit::Closure(ss,func);
nc->_outervalues = (rabbit::ObjectPtr *)(nc + 1); nc->_outervalues = (rabbit::ObjectPtr *)(nc + 1);
nc->_defaultparams = &nc->_outervalues[func->_noutervalues]; nc->_defaultparams = &nc->_outervalues[func->_noutervalues];
nc->_root = root; nc->_root = root;
@ -168,7 +183,7 @@ void rabbit::Closure::setRoot(rabbit::WeakRef *r) {
__ObjaddRef(_root); __ObjaddRef(_root);
} }
Closure* rabbit::Closure::clone() { rabbit::Closure* rabbit::Closure::clone() {
rabbit::FunctionProto *f = _function; rabbit::FunctionProto *f = _function;
rabbit::Closure * ret = rabbit::Closure::create(NULL,f,_root); rabbit::Closure * ret = rabbit::Closure::create(NULL,f,_root);
ret->_env = _env; ret->_env = _env;

View File

@ -10,6 +10,7 @@
#include <rabbit/RefCounted.hpp> #include <rabbit/RefCounted.hpp>
#include <rabbit/sqconfig.hpp> #include <rabbit/sqconfig.hpp>
#include <rabbit/rabbit.hpp> #include <rabbit/rabbit.hpp>
#include <rabbit/squtils.hpp>
namespace rabbit { namespace rabbit {
class SharedState; class SharedState;
@ -41,9 +42,15 @@ namespace rabbit {
rabbit::ObjectPtr *_outervalues; rabbit::ObjectPtr *_outervalues;
rabbit::ObjectPtr *_defaultparams; rabbit::ObjectPtr *_defaultparams;
}; };
bool SafeWrite(rabbit::VirtualMachine* v,SQWRITEFUNC write,rabbit::UserPointer up,rabbit::UserPointer dest,int64_t size);
bool SafeRead(rabbit::VirtualMachine* v,SQWRITEFUNC read,rabbit::UserPointer up,rabbit::UserPointer dest,int64_t size);
bool WriteTag(rabbit::VirtualMachine* v,SQWRITEFUNC write,rabbit::UserPointer up,uint32_t tag);
bool CheckTag(rabbit::VirtualMachine* v,SQWRITEFUNC read,rabbit::UserPointer up,uint32_t tag);
bool WriteObject(rabbit::VirtualMachine* v,rabbit::UserPointer up,SQWRITEFUNC write,rabbit::ObjectPtr &o);
bool ReadObject(rabbit::VirtualMachine* v,rabbit::UserPointer up,SQREADFUNC read,rabbit::ObjectPtr &o);
} }
#define _CHECK_IO(exp) { if(!exp)return false; }
#define SQ_CLOSURESTREAM_HEAD (('S'<<24)|('Q'<<16)|('I'<<8)|('R')) #define SQ_CLOSURESTREAM_HEAD (('S'<<24)|('Q'<<16)|('I'<<8)|('R'))
#define SQ_CLOSURESTREAM_PART (('P'<<24)|('A'<<16)|('R'<<8)|('T')) #define SQ_CLOSURESTREAM_PART (('P'<<24)|('A'<<16)|('R'<<8)|('T'))
#define SQ_CLOSURESTREAM_TAIL (('T'<<24)|('A'<<16)|('I'<<8)|('L')) #define SQ_CLOSURESTREAM_TAIL (('T'<<24)|('A'<<16)|('I'<<8)|('L'))

View File

@ -11,14 +11,23 @@
#ifndef NO_COMPILER #ifndef NO_COMPILER
#include <stdarg.h> #include <stdarg.h>
#include <setjmp.h> #include <setjmp.h>
#include <etk/types.hpp>
#include <rabbit/sqopcodes.hpp> #include <rabbit/sqopcodes.hpp>
#include <rabbit/Lexer.hpp>
#include <rabbit/sqfuncproto.hpp>
#include <rabbit/sqcompiler.hpp>
#include <rabbit/sqfuncstate.hpp>
#include <rabbit/sqlexer.hpp>
#include <rabbit/VirtualMachine.hpp> #include <rabbit/VirtualMachine.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/sqconfig.hpp>
#include <rabbit/FuncState.hpp>
#include <rabbit/LocalVarInfo.hpp>
#include <rabbit/OuterVar.hpp>
#include <rabbit/String.hpp>
#include <rabbit/SharedState.hpp>
#include <rabbit/Table.hpp>
#include <rabbit/Instruction.hpp>
namespace rabbit {
#define EXPR 1 #define EXPR 1
#define OBJECT 2 #define OBJECT 2
@ -75,10 +84,10 @@ struct SQScope {
if(__nbreaks__>0)ResolveBreaks(_fs,__nbreaks__); \ if(__nbreaks__>0)ResolveBreaks(_fs,__nbreaks__); \
_fs->_breaktargets.popBack();_fs->_continuetargets.popBack();} _fs->_breaktargets.popBack();_fs->_continuetargets.popBack();}
class rabbit::Compiler class Compiler
{ {
public: public:
rabbit::Compiler(rabbit::VirtualMachine *v, SQLEXREADFUNC rg, rabbit::UserPointer up, const rabbit::Char* sourcename, bool raiseerror, bool lineinfo) Compiler(rabbit::VirtualMachine *v, SQLEXREADFUNC rg, rabbit::UserPointer up, const rabbit::Char* sourcename, bool raiseerror, bool lineinfo)
{ {
_vm=v; _vm=v;
_lex.init(_get_shared_state(v), rg, up,Throwerror,this); _lex.init(_get_shared_state(v), rg, up,Throwerror,this);
@ -886,7 +895,7 @@ public:
if(target < 0) { if(target < 0) {
target = _fs->pushTarget(); target = _fs->pushTarget();
} }
if(value <= INT_MAX && value > INT_MIN) { //does it fit in 32 bits? if(value <= INT64_MAX && value > INT64_MIN) { //does it fit in 32 bits?
_fs->addInstruction(_OP_LOADINT, target,value); _fs->addInstruction(_OP_LOADINT, target,value);
} }
else { else {
@ -1583,8 +1592,9 @@ private:
jmp_buf _errorjmp; jmp_buf _errorjmp;
rabbit::VirtualMachine *_vm; rabbit::VirtualMachine *_vm;
}; };
}
bool compile(rabbit::VirtualMachine *vm,SQLEXREADFUNC rg, rabbit::UserPointer up, const rabbit::Char *sourcename, rabbit::ObjectPtr &out, bool raiseerror, bool lineinfo) bool rabbit::compile(rabbit::VirtualMachine *vm,SQLEXREADFUNC rg, rabbit::UserPointer up, const rabbit::Char *sourcename, rabbit::ObjectPtr &out, bool raiseerror, bool lineinfo)
{ {
rabbit::Compiler p(vm, rg, up, sourcename, raiseerror, lineinfo); rabbit::Compiler p(vm, rg, up, sourcename, raiseerror, lineinfo);
return p.compile(out); return p.compile(out);

View File

@ -7,6 +7,10 @@
*/ */
#pragma once #pragma once
#include <rabbit/sqconfig.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/ObjectPtr.hpp>
namespace rabbit { namespace rabbit {
#define TK_IDENTIFIER 258 #define TK_IDENTIFIER 258
#define TK_STRING_LITERAL 259 #define TK_STRING_LITERAL 259

View File

@ -5,15 +5,23 @@
* @copyright 2003-2017, Alberto DEMICHELIS, all right reserved * @copyright 2003-2017, Alberto DEMICHELIS, all right reserved
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#include <rabbit/Compiler.hpp>
#include <rabbit/FuncState.hpp> #include <rabbit/FuncState.hpp>
#ifndef NO_COMPILER #ifndef NO_COMPILER
#include <rabbit/Compiler.hpp> #include <rabbit/Compiler.hpp>
#include <rabbit/FuncProto.hpp> #include <rabbit/FunctionProto.hpp>
#include <rabbit/Instruction.hpp>
#include <rabbit/String.hpp>
#include <rabbit/Class.hpp>
#include <rabbit/Table.hpp>
#include <rabbit/SharedState.hpp>
#include <rabbit/sqopcodes.hpp> #include <rabbit/sqopcodes.hpp>
#include <rabbit/sqfuncstate.hpp> #include <rabbit/squtils.hpp>
#ifdef _DEBUG_DUMP #ifdef _DEBUG_DUMP
rabbit::InstructionDesc g_InstrDesc[]={ rabbit::InstructionDesc g_InstrDesc[]={
@ -80,8 +88,14 @@ rabbit::InstructionDesc g_InstrDesc[]={
{_SC("_OP_CLOSE")}, {_SC("_OP_CLOSE")},
}; };
#endif #endif
void dumpLiteral(rabbit::ObjectPtr &o)
{
void rabbit::FuncState::addInstruction(SQOpcode _op,int64_t arg0,int64_t arg1,int64_t arg2,int64_t arg3){
rabbit::Instruction i(_op,arg0,arg1,arg2,arg3);
addInstruction(i);
}
static void dumpLiteral(rabbit::ObjectPtr &o) {
switch(sq_type(o)){ switch(sq_type(o)){
case rabbit::OT_STRING: scprintf(_SC("\"%s\""),_stringval(o));break; case rabbit::OT_STRING: scprintf(_SC("\"%s\""),_stringval(o));break;
case rabbit::OT_FLOAT: scprintf(_SC("{%f}"),_float(o));break; case rabbit::OT_FLOAT: scprintf(_SC("{%f}"),_float(o));break;
@ -91,7 +105,7 @@ void dumpLiteral(rabbit::ObjectPtr &o)
} }
} }
FuncState::rabbit::FuncState(rabbit::SharedState *ss,rabbit::FuncState *parent,compilererrorFunc efunc,void *ed) rabbit::FuncState::FuncState(rabbit::SharedState *ss,rabbit::FuncState *parent,compilererrorFunc efunc,void *ed)
{ {
_nliterals = 0; _nliterals = 0;
_literals = rabbit::Table::create(ss,0); _literals = rabbit::Table::create(ss,0);
@ -112,13 +126,13 @@ FuncState::rabbit::FuncState(rabbit::SharedState *ss,rabbit::FuncState *parent,c
} }
void FuncState::error(const rabbit::Char *err) void rabbit::FuncState::error(const rabbit::Char *err)
{ {
_errfunc(_errtarget,err); _errfunc(_errtarget,err);
} }
#ifdef _DEBUG_DUMP #ifdef _DEBUG_DUMP
void FuncState::dump(rabbit::FunctionProto *func) void rabbit::FuncState::dump(rabbit::FunctionProto *func)
{ {
uint64_t n=0,i; uint64_t n=0,i;
int64_t si; int64_t si;
@ -217,17 +231,17 @@ void FuncState::dump(rabbit::FunctionProto *func)
} }
#endif #endif
int64_t FuncState::getNumericConstant(const int64_t cons) int64_t rabbit::FuncState::getNumericConstant(const int64_t cons)
{ {
return getConstant(rabbit::ObjectPtr(cons)); return getConstant(rabbit::ObjectPtr(cons));
} }
int64_t FuncState::getNumericConstant(const float_t cons) int64_t rabbit::FuncState::getNumericConstant(const float_t cons)
{ {
return getConstant(rabbit::ObjectPtr(cons)); return getConstant(rabbit::ObjectPtr(cons));
} }
int64_t FuncState::getConstant(const rabbit::Object &cons) int64_t rabbit::FuncState::getConstant(const rabbit::Object &cons)
{ {
rabbit::ObjectPtr val; rabbit::ObjectPtr val;
if(!_table(_literals)->get(cons,val)) if(!_table(_literals)->get(cons,val))
@ -243,7 +257,7 @@ int64_t FuncState::getConstant(const rabbit::Object &cons)
return _integer(val); return _integer(val);
} }
void FuncState::setIntructionParams(int64_t pos,int64_t arg0,int64_t arg1,int64_t arg2,int64_t arg3) void rabbit::FuncState::setIntructionParams(int64_t pos,int64_t arg0,int64_t arg1,int64_t arg2,int64_t arg3)
{ {
_instructions[pos]._arg0=(unsigned char)*((uint64_t *)&arg0); _instructions[pos]._arg0=(unsigned char)*((uint64_t *)&arg0);
_instructions[pos]._arg1=(int32_t)*((uint64_t *)&arg1); _instructions[pos]._arg1=(int32_t)*((uint64_t *)&arg1);
@ -251,7 +265,7 @@ void FuncState::setIntructionParams(int64_t pos,int64_t arg0,int64_t arg1,int64_
_instructions[pos]._arg3=(unsigned char)*((uint64_t *)&arg3); _instructions[pos]._arg3=(unsigned char)*((uint64_t *)&arg3);
} }
void FuncState::setIntructionParam(int64_t pos,int64_t arg,int64_t val) void rabbit::FuncState::setIntructionParam(int64_t pos,int64_t arg,int64_t val)
{ {
switch(arg){ switch(arg){
case 0:_instructions[pos]._arg0=(unsigned char)*((uint64_t *)&val);break; case 0:_instructions[pos]._arg0=(unsigned char)*((uint64_t *)&val);break;
@ -261,7 +275,7 @@ void FuncState::setIntructionParam(int64_t pos,int64_t arg,int64_t val)
}; };
} }
int64_t FuncState::allocStackPos() int64_t rabbit::FuncState::allocStackPos()
{ {
int64_t npos=_vlocals.size(); int64_t npos=_vlocals.size();
_vlocals.pushBack(rabbit::LocalVarInfo()); _vlocals.pushBack(rabbit::LocalVarInfo());
@ -272,7 +286,7 @@ int64_t FuncState::allocStackPos()
return npos; return npos;
} }
int64_t FuncState::pushTarget(int64_t n) int64_t rabbit::FuncState::pushTarget(int64_t n)
{ {
if(n!=-1){ if(n!=-1){
_targetstack.pushBack(n); _targetstack.pushBack(n);
@ -283,14 +297,14 @@ int64_t FuncState::pushTarget(int64_t n)
return n; return n;
} }
int64_t FuncState::getUpTarget(int64_t n){ int64_t rabbit::FuncState::getUpTarget(int64_t n){
return _targetstack[((_targetstack.size()-1)-n)]; return _targetstack[((_targetstack.size()-1)-n)];
} }
int64_t FuncState::topTarget(){ int64_t rabbit::FuncState::topTarget(){
return _targetstack.back(); return _targetstack.back();
} }
int64_t FuncState::popTarget() int64_t rabbit::FuncState::popTarget()
{ {
uint64_t npos=_targetstack.back(); uint64_t npos=_targetstack.back();
assert(npos < _vlocals.size()); assert(npos < _vlocals.size());
@ -302,12 +316,12 @@ int64_t FuncState::popTarget()
return npos; return npos;
} }
int64_t FuncState::getStacksize() int64_t rabbit::FuncState::getStacksize()
{ {
return _vlocals.size(); return _vlocals.size();
} }
int64_t FuncState::CountOuters(int64_t stacksize) int64_t rabbit::FuncState::CountOuters(int64_t stacksize)
{ {
int64_t outers = 0; int64_t outers = 0;
int64_t k = _vlocals.size() - 1; int64_t k = _vlocals.size() - 1;
@ -321,7 +335,7 @@ int64_t FuncState::CountOuters(int64_t stacksize)
return outers; return outers;
} }
void FuncState::setStacksize(int64_t n) void rabbit::FuncState::setStacksize(int64_t n)
{ {
int64_t size=_vlocals.size(); int64_t size=_vlocals.size();
while(size>n){ while(size>n){
@ -338,7 +352,7 @@ void FuncState::setStacksize(int64_t n)
} }
} }
bool FuncState::isConstant(const rabbit::Object &name,rabbit::Object &e) bool rabbit::FuncState::isConstant(const rabbit::Object &name,rabbit::Object &e)
{ {
rabbit::ObjectPtr val; rabbit::ObjectPtr val;
if(_table(_sharedstate->_consts)->get(name,val)) { if(_table(_sharedstate->_consts)->get(name,val)) {
@ -348,14 +362,14 @@ bool FuncState::isConstant(const rabbit::Object &name,rabbit::Object &e)
return false; return false;
} }
bool FuncState::isLocal(uint64_t stkpos) bool rabbit::FuncState::isLocal(uint64_t stkpos)
{ {
if(stkpos>=_vlocals.size())return false; if(stkpos>=_vlocals.size())return false;
else if(sq_type(_vlocals[stkpos]._name)!=rabbit::OT_NULL)return true; else if(sq_type(_vlocals[stkpos]._name)!=rabbit::OT_NULL)return true;
return false; return false;
} }
int64_t FuncState::pushLocalVariable(const rabbit::Object &name) int64_t rabbit::FuncState::pushLocalVariable(const rabbit::Object &name)
{ {
int64_t pos=_vlocals.size(); int64_t pos=_vlocals.size();
rabbit::LocalVarInfo lvi; rabbit::LocalVarInfo lvi;
@ -369,7 +383,7 @@ int64_t FuncState::pushLocalVariable(const rabbit::Object &name)
int64_t FuncState::getLocalVariable(const rabbit::Object &name) int64_t rabbit::FuncState::getLocalVariable(const rabbit::Object &name)
{ {
int64_t locals=_vlocals.size(); int64_t locals=_vlocals.size();
while(locals>=1){ while(locals>=1){
@ -382,14 +396,14 @@ int64_t FuncState::getLocalVariable(const rabbit::Object &name)
return -1; return -1;
} }
void FuncState::markLocalAsOuter(int64_t pos) void rabbit::FuncState::markLocalAsOuter(int64_t pos)
{ {
rabbit::LocalVarInfo &lvi = _vlocals[pos]; rabbit::LocalVarInfo &lvi = _vlocals[pos];
lvi._end_op = UINT_MINUS_ONE; lvi._end_op = UINT_MINUS_ONE;
_outers++; _outers++;
} }
int64_t FuncState::getOuterVariable(const rabbit::Object &name) int64_t rabbit::FuncState::getOuterVariable(const rabbit::Object &name)
{ {
int64_t outers = _outervalues.size(); int64_t outers = _outervalues.size();
for(int64_t i = 0; i<outers; i++) { for(int64_t i = 0; i<outers; i++) {
@ -405,25 +419,22 @@ int64_t FuncState::getOuterVariable(const rabbit::Object &name)
_outervalues.pushBack(rabbit::OuterVar(name,rabbit::ObjectPtr(int64_t(pos)),otOUTER)); //local _outervalues.pushBack(rabbit::OuterVar(name,rabbit::ObjectPtr(int64_t(pos)),otOUTER)); //local
return _outervalues.size() - 1; return _outervalues.size() - 1;
} }
} } else {
else {
_parent->markLocalAsOuter(pos); _parent->markLocalAsOuter(pos);
_outervalues.pushBack(rabbit::OuterVar(name,rabbit::ObjectPtr(int64_t(pos)),otLOCAL)); //local _outervalues.pushBack(rabbit::OuterVar(name,rabbit::ObjectPtr(int64_t(pos)),otLOCAL)); //local
return _outervalues.size() - 1; return _outervalues.size() - 1;
} }
} }
return -1; return -1;
} }
void FuncState::addParameter(const rabbit::Object &name) void rabbit::FuncState::addParameter(const rabbit::Object &name)
{ {
pushLocalVariable(name); pushLocalVariable(name);
_parameters.pushBack(name); _parameters.pushBack(name);
} }
void FuncState::addLineInfos(int64_t line,bool lineop,bool force) void rabbit::FuncState::addLineInfos(int64_t line,bool lineop,bool force)
{ {
if(_lastline!=line || force){ if(_lastline!=line || force){
rabbit::LineInfo li; rabbit::LineInfo li;
@ -436,7 +447,7 @@ void FuncState::addLineInfos(int64_t line,bool lineop,bool force)
} }
} }
void FuncState::discardTarget() void rabbit::FuncState::discardTarget()
{ {
int64_t discardedtarget = popTarget(); int64_t discardedtarget = popTarget();
int64_t size = _instructions.size(); int64_t size = _instructions.size();
@ -451,7 +462,7 @@ void FuncState::discardTarget()
} }
} }
void FuncState::addInstruction(rabbit::Instruction &i) void rabbit::FuncState::addInstruction(rabbit::Instruction &i)
{ {
int64_t size = _instructions.size(); int64_t size = _instructions.size();
if(size > 0 && _optimization){ //simple optimizer if(size > 0 && _optimization){ //simple optimizer
@ -584,23 +595,21 @@ void FuncState::addInstruction(rabbit::Instruction &i)
_instructions.pushBack(i); _instructions.pushBack(i);
} }
rabbit::Object FuncState::createString(const rabbit::Char *s,int64_t len) rabbit::Object rabbit::FuncState::createString(const rabbit::Char *s,int64_t len)
{ {
rabbit::ObjectPtr ns(rabbit::String::create(_sharedstate,s,len)); rabbit::ObjectPtr ns(rabbit::String::create(_sharedstate,s,len));
_table(_strings)->newSlot(ns,(int64_t)1); _table(_strings)->newSlot(ns,(int64_t)1);
return ns; return ns;
} }
rabbit::Object FuncState::createTable() rabbit::Object rabbit::FuncState::createTable()
{ {
rabbit::ObjectPtr nt(rabbit::Table::create(_sharedstate,0)); rabbit::ObjectPtr nt(rabbit::Table::create(_sharedstate,0));
_table(_strings)->newSlot(nt,(int64_t)1); _table(_strings)->newSlot(nt,(int64_t)1);
return nt; return nt;
} }
rabbit::FunctionProto *FuncState::buildProto() rabbit::FunctionProto* rabbit::FuncState::buildProto() {
{
rabbit::FunctionProto *f=rabbit::FunctionProto::create(_ss,_instructions.size(), rabbit::FunctionProto *f=rabbit::FunctionProto::create(_ss,_instructions.size(),
_nliterals,_parameters.size(),_functions.size(),_outervalues.size(), _nliterals,_parameters.size(),_functions.size(),_outervalues.size(),
_lineinfos.size(),_localvarinfos.size(),_defaultparams.size()); _lineinfos.size(),_localvarinfos.size(),_defaultparams.size());
@ -632,25 +641,22 @@ rabbit::FunctionProto *FuncState::buildProto()
return f; return f;
} }
FuncState *rabbit::FuncState::pushChildState(rabbit::SharedState *ss) rabbit::FuncState *rabbit::FuncState::pushChildState(rabbit::SharedState *ss)
{ {
FuncState *child = (rabbit::FuncState *)sq_malloc(sizeof(rabbit::FuncState)); FuncState *child = (rabbit::FuncState *)sq_malloc(sizeof(rabbit::FuncState));
new (child) FuncState(ss,this,_errfunc,_errtarget); new ((char*)child) FuncState(ss,this,_errfunc,_errtarget);
_childstates.pushBack(child); _childstates.pushBack(child);
return child; return child;
} }
void FuncState::popChildState() void rabbit::FuncState::popChildState() {
{
FuncState *child = _childstates.back(); FuncState *child = _childstates.back();
sq_delete(child,FuncState); sq_delete(child, FuncState);
_childstates.popBack(); _childstates.popBack();
} }
FuncState::~FuncState() rabbit::FuncState::~FuncState() {
{ while(_childstates.size() > 0) {
while(_childstates.size() > 0)
{
popChildState(); popChildState();
} }
} }

View File

@ -7,6 +7,12 @@
*/ */
#pragma once #pragma once
#include <etk/Vector.hpp>
#include <rabbit/LocalVarInfo.hpp>
#include <rabbit/OuterVar.hpp>
#include <rabbit/LineInfo.hpp>
#include <rabbit/Instruction.hpp>
namespace rabbit { namespace rabbit {
class FuncState { class FuncState {
public: public:
@ -18,7 +24,7 @@ namespace rabbit {
void error(const rabbit::Char *err); void error(const rabbit::Char *err);
FuncState *pushChildState(rabbit::SharedState *ss); FuncState *pushChildState(rabbit::SharedState *ss);
void popChildState(); void popChildState();
void addInstruction(SQOpcode _op,int64_t arg0=0,int64_t arg1=0,int64_t arg2=0,int64_t arg3=0){rabbit::Instruction i(_op,arg0,arg1,arg2,arg3);addInstruction(i);} void addInstruction(SQOpcode _op,int64_t arg0=0,int64_t arg1=0,int64_t arg2=0,int64_t arg3=0);
void addInstruction(rabbit::Instruction &i); void addInstruction(rabbit::Instruction &i);
void setIntructionParams(int64_t pos,int64_t arg0,int64_t arg1,int64_t arg2=0,int64_t arg3=0); void setIntructionParams(int64_t pos,int64_t arg0,int64_t arg1,int64_t arg2=0,int64_t arg3=0);
void setIntructionParam(int64_t pos,int64_t arg,int64_t val); void setIntructionParam(int64_t pos,int64_t arg,int64_t val);

View File

@ -6,7 +6,64 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#include <rabbit/FunctionProto.hpp> #include <rabbit/FunctionProto.hpp>
#include <rabbit/squtils.hpp>
#include <etk/types.hpp>
#include <etk/Allocator.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/Closure.hpp>
#include <rabbit/String.hpp>
#include <rabbit/VirtualMachine.hpp>
rabbit::FunctionProto* rabbit::FunctionProto::create(rabbit::SharedState *ss,int64_t ninstructions,
int64_t nliterals,int64_t nparameters,
int64_t nfunctions,int64_t noutervalues,
int64_t nlineinfos,int64_t nlocalvarinfos,int64_t ndefaultparams)
{
rabbit::FunctionProto *f;
//I compact the whole class and members in a single memory allocation
f = (rabbit::FunctionProto *)sq_vm_malloc(_FUNC_SIZE(ninstructions,nliterals,nparameters,nfunctions,noutervalues,nlineinfos,nlocalvarinfos,ndefaultparams));
new ((char*)f) rabbit::FunctionProto(ss);
f->_ninstructions = ninstructions;
f->_literals = (rabbit::ObjectPtr*)&f->_instructions[ninstructions];
f->_nliterals = nliterals;
f->_parameters = (rabbit::ObjectPtr*)&f->_literals[nliterals];
f->_nparameters = nparameters;
f->_functions = (rabbit::ObjectPtr*)&f->_parameters[nparameters];
f->_nfunctions = nfunctions;
f->_outervalues = (rabbit::OuterVar*)&f->_functions[nfunctions];
f->_noutervalues = noutervalues;
f->_lineinfos = (rabbit::LineInfo *)&f->_outervalues[noutervalues];
f->_nlineinfos = nlineinfos;
f->_localvarinfos = (rabbit::LocalVarInfo *)&f->_lineinfos[nlineinfos];
f->_nlocalvarinfos = nlocalvarinfos;
f->_defaultparams = (int64_t *)&f->_localvarinfos[nlocalvarinfos];
f->_ndefaultparams = ndefaultparams;
_CONSTRUCT_VECTOR(ObjectPtr, f->_nliterals, f->_literals);
_CONSTRUCT_VECTOR(ObjectPtr, f->_nparameters, f->_parameters);
_CONSTRUCT_VECTOR(ObjectPtr, f->_nfunctions, f->_functions);
_CONSTRUCT_VECTOR(OuterVar, f->_noutervalues, f->_outervalues);
//_CONSTRUCT_VECTOR(LineInfo, f->_nlineinfos,f->_lineinfos); //not required are 2 integers
_CONSTRUCT_VECTOR(LocalVarInfo, f->_nlocalvarinfos, f->_localvarinfos);
return f;
}
void rabbit::FunctionProto::release(){
_DESTRUCT_VECTOR(ObjectPtr,_nliterals,_literals);
_DESTRUCT_VECTOR(ObjectPtr,_nparameters,_parameters);
_DESTRUCT_VECTOR(ObjectPtr,_nfunctions,_functions);
_DESTRUCT_VECTOR(OuterVar,_noutervalues,_outervalues);
//_DESTRUCT_VECTOR(rabbit::LineInfo,_nlineinfos,_lineinfos); //not required are 2 integers
_DESTRUCT_VECTOR(LocalVarInfo,_nlocalvarinfos,_localvarinfos);
int64_t size = _FUNC_SIZE(_ninstructions,_nliterals,_nparameters,_nfunctions,_noutervalues,_nlineinfos,_nlocalvarinfos,_ndefaultparams);
this->~FunctionProto();
sq_vm_free(this,size);
}
const rabbit::Char* rabbit::FunctionProto::getLocal(rabbit::VirtualMachine *vm,uint64_t stackbase,uint64_t nseq,uint64_t nop) const rabbit::Char* rabbit::FunctionProto::getLocal(rabbit::VirtualMachine *vm,uint64_t stackbase,uint64_t nseq,uint64_t nop)
{ {

View File

@ -6,6 +6,13 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#pragma once #pragma once
#include <rabbit/LocalVarInfo.hpp>
#include <rabbit/LineInfo.hpp>
#include <rabbit/OuterVar.hpp>
#include <rabbit/Instruction.hpp>
#include <rabbit/RefCounted.hpp>
#include <rabbit/rabbit.hpp>
namespace rabbit { namespace rabbit {
@ -22,50 +29,11 @@ namespace rabbit {
~FunctionProto(); ~FunctionProto();
public: public:
FunctionProto *create(rabbit::SharedState *ss,int64_t ninstructions, static FunctionProto *create(rabbit::SharedState *ss,int64_t ninstructions,
int64_t nliterals,int64_t nparameters, int64_t nliterals,int64_t nparameters,
int64_t nfunctions,int64_t noutervalues, int64_t nfunctions,int64_t noutervalues,
int64_t nlineinfos,int64_t nlocalvarinfos,int64_t ndefaultparams) int64_t nlineinfos,int64_t nlocalvarinfos,int64_t ndefaultparams);
{ void release();
rabbit::FunctionProto *f;
//I compact the whole class and members in a single memory allocation
f = (rabbit::FunctionProto *)sq_vm_malloc(_FUNC_SIZE(ninstructions,nliterals,nparameters,nfunctions,noutervalues,nlineinfos,nlocalvarinfos,ndefaultparams));
new ((char*)f) rabbit::FunctionProto(ss);
f->_ninstructions = ninstructions;
f->_literals = (rabbit::ObjectPtr*)&f->_instructions[ninstructions];
f->_nliterals = nliterals;
f->_parameters = (rabbit::ObjectPtr*)&f->_literals[nliterals];
f->_nparameters = nparameters;
f->_functions = (rabbit::ObjectPtr*)&f->_parameters[nparameters];
f->_nfunctions = nfunctions;
f->_outervalues = (rabbit::OuterVar*)&f->_functions[nfunctions];
f->_noutervalues = noutervalues;
f->_lineinfos = (rabbit::LineInfo *)&f->_outervalues[noutervalues];
f->_nlineinfos = nlineinfos;
f->_localvarinfos = (rabbit::LocalVarInfo *)&f->_lineinfos[nlineinfos];
f->_nlocalvarinfos = nlocalvarinfos;
f->_defaultparams = (int64_t *)&f->_localvarinfos[nlocalvarinfos];
f->_ndefaultparams = ndefaultparams;
_CONSTRUCT_VECTOR(rabbit::ObjectPtr,f->_nliterals,f->_literals);
_CONSTRUCT_VECTOR(rabbit::ObjectPtr,f->_nparameters,f->_parameters);
_CONSTRUCT_VECTOR(rabbit::ObjectPtr,f->_nfunctions,f->_functions);
_CONSTRUCT_VECTOR(rabbit::OuterVar,f->_noutervalues,f->_outervalues);
//_CONSTRUCT_VECTOR(rabbit::LineInfo,f->_nlineinfos,f->_lineinfos); //not required are 2 integers
_CONSTRUCT_VECTOR(rabbit::LocalVarInfo,f->_nlocalvarinfos,f->_localvarinfos);
return f;
}
void release(){
_DESTRUCT_VECTOR(ObjectPtr,_nliterals,_literals);
_DESTRUCT_VECTOR(ObjectPtr,_nparameters,_parameters);
_DESTRUCT_VECTOR(ObjectPtr,_nfunctions,_functions);
_DESTRUCT_VECTOR(rabbit::OuterVar,_noutervalues,_outervalues);
//_DESTRUCT_VECTOR(rabbit::LineInfo,_nlineinfos,_lineinfos); //not required are 2 integers
_DESTRUCT_VECTOR(rabbit::LocalVarInfo,_nlocalvarinfos,_localvarinfos);
int64_t size = _FUNC_SIZE(_ninstructions,_nliterals,_nparameters,_nfunctions,_noutervalues,_nlineinfos,_nlocalvarinfos,_ndefaultparams);
this->~FunctionProto();
sq_vm_free(this,size);
}
const rabbit::Char* getLocal(rabbit::VirtualMachine *v,uint64_t stackbase,uint64_t nseq,uint64_t nop); const rabbit::Char* getLocal(rabbit::VirtualMachine *v,uint64_t stackbase,uint64_t nseq,uint64_t nop);
int64_t getLine(rabbit::Instruction *curr); int64_t getLine(rabbit::Instruction *curr);

View File

@ -6,6 +6,8 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#include <rabbit/Generator.hpp> #include <rabbit/Generator.hpp>
#include <rabbit/WeakRef.hpp>
#include <rabbit/squtils.hpp>
@ -85,3 +87,30 @@ bool rabbit::Generator::resume(rabbit::VirtualMachine *v,rabbit::ObjectPtr &dest
return true; return true;
} }
rabbit::Generator::Generator(rabbit::SharedState *ss,rabbit::Closure *closure) {
_closure = closure;
_state = eRunning;
_ci._generator = NULL;
}
rabbit::Generator *rabbit::Generator::create(rabbit::SharedState *ss,rabbit::Closure *closure) {
rabbit::Generator *nc=(rabbit::Generator*)SQ_MALLOC(sizeof(rabbit::Generator));
new ((char*)nc) rabbit::Generator(ss,closure);
return nc;
}
rabbit::Generator::~Generator() {
}
void rabbit::Generator::kill() {
_state=eDead;
_stack.resize(0);
_closure.Null();
}
void rabbit::Generator::release() {
sq_delete(this,Generator);
}

View File

@ -7,33 +7,26 @@
*/ */
#pragma once #pragma once
#include <rabbit/LocalVarInfo.hpp>
#include <rabbit/LineInfo.hpp>
#include <rabbit/OuterVar.hpp>
#include <rabbit/Instruction.hpp>
#include <rabbit/RefCounted.hpp>
#include <rabbit/rabbit.hpp>
#include <etk/Vector.hpp>
#include <rabbit/VirtualMachine.hpp>
namespace rabbit { namespace rabbit {
class Generator : public rabbit::RefCounted { class Generator : public rabbit::RefCounted {
public: public:
enum rabbit::GeneratorState{eRunning,eSuspended,eDead}; enum GeneratorState{eRunning,eSuspended,eDead};
private: private:
Generator(rabbit::SharedState *ss,rabbit::Closure *closure){ Generator(rabbit::SharedState *ss,rabbit::Closure *closure);
_closure = closure;
_state = eRunning;
_ci._generator = NULL;
}
public: public:
static Generator *create(rabbit::SharedState *ss,rabbit::Closure *closure){ static Generator *create(rabbit::SharedState *ss,rabbit::Closure *closure);
rabbit::Generator *nc=(rabbit::Generator*)SQ_MALLOC(sizeof(rabbit::Generator)); ~Generator();
new ((char*)nc) rabbit::Generator(ss,closure); void kill();
return nc; void release();
}
~Generator()
{
}
void kill(){
_state=eDead;
_stack.resize(0);
_closure.Null();}
void release(){
sq_delete(this,rabbit::Generator);
}
bool yield(rabbit::VirtualMachine *v,int64_t target); bool yield(rabbit::VirtualMachine *v,int64_t target);
bool resume(rabbit::VirtualMachine *v,rabbit::ObjectPtr &dest); bool resume(rabbit::VirtualMachine *v,rabbit::ObjectPtr &dest);
@ -41,7 +34,7 @@ namespace rabbit {
etk::Vector<rabbit::ObjectPtr> _stack; etk::Vector<rabbit::ObjectPtr> _stack;
rabbit::VirtualMachine::callInfo _ci; rabbit::VirtualMachine::callInfo _ci;
etk::Vector<rabbit::ExceptionTrap> _etraps; etk::Vector<rabbit::ExceptionTrap> _etraps;
rabbit::GeneratorState _state; GeneratorState _state;
}; };
} }

View File

@ -5,8 +5,6 @@
* @copyright 2003-2017, Alberto DEMICHELIS, all right reserved * @copyright 2003-2017, Alberto DEMICHELIS, all right reserved
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#pragma once
#include <rabbit/Hash.hpp> #include <rabbit/Hash.hpp>

View File

@ -8,6 +8,17 @@
#include <rabbit/Instance.hpp> #include <rabbit/Instance.hpp>
#include <rabbit/Table.hpp> #include <rabbit/Table.hpp>
#include <rabbit/SharedState.hpp> #include <rabbit/SharedState.hpp>
#include <rabbit/squtils.hpp>
#include <etk/types.hpp>
#include <etk/Allocator.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/Closure.hpp>
#include <rabbit/String.hpp>
#include <rabbit/Class.hpp>
#include <rabbit/VirtualMachine.hpp>
#include <rabbit/WeakRef.hpp>
void rabbit::Instance::init(rabbit::SharedState *ss) { void rabbit::Instance::init(rabbit::SharedState *ss) {
_userpointer = NULL; _userpointer = NULL;
@ -21,7 +32,7 @@ rabbit::Instance::Instance(rabbit::SharedState *ss, rabbit::Class *c, int64_t me
_class = c; _class = c;
uint64_t nvalues = _class->_defaultvalues.size(); uint64_t nvalues = _class->_defaultvalues.size();
for(uint64_t n = 0; n < nvalues; n++) { for(uint64_t n = 0; n < nvalues; n++) {
new (&_values[n]) rabbit::ObjectPtr(_class->_defaultvalues[n].val); new ((char*)&_values[n]) rabbit::ObjectPtr(_class->_defaultvalues[n].val);
} }
init(ss); init(ss);
} }
@ -31,7 +42,7 @@ rabbit::Instance::Instance(rabbit::SharedState *ss, rabbit::Instance *i, int64_t
_class = i->_class; _class = i->_class;
uint64_t nvalues = _class->_defaultvalues.size(); uint64_t nvalues = _class->_defaultvalues.size();
for(uint64_t n = 0; n < nvalues; n++) { for(uint64_t n = 0; n < nvalues; n++) {
new (&_values[n]) rabbit::ObjectPtr(i->_values[n]); new ((char*)&_values[n]) rabbit::ObjectPtr(i->_values[n]);
} }
init(ss); init(ss);
} }
@ -70,7 +81,7 @@ bool rabbit::Instance::instanceOf(rabbit::Class *trg) {
rabbit::Instance* rabbit::Instance::create(rabbit::SharedState *ss,rabbit::Class *theclass) { rabbit::Instance* rabbit::Instance::create(rabbit::SharedState *ss,rabbit::Class *theclass) {
int64_t size = calcinstancesize(theclass); int64_t size = calcinstancesize(theclass);
Instance *newinst = (Instance *)SQ_MALLOC(size); Instance *newinst = (Instance *)SQ_MALLOC(size);
new (newinst) Instance(ss, theclass,size); new ((char*)newinst) Instance(ss, theclass,size);
if(theclass->_udsize) { if(theclass->_udsize) {
newinst->_userpointer = ((unsigned char *)newinst) + (size - theclass->_udsize); newinst->_userpointer = ((unsigned char *)newinst) + (size - theclass->_udsize);
} }
@ -80,7 +91,7 @@ rabbit::Instance* rabbit::Instance::create(rabbit::SharedState *ss,rabbit::Class
rabbit::Instance* rabbit::Instance::clone(rabbit::SharedState *ss) { rabbit::Instance* rabbit::Instance::clone(rabbit::SharedState *ss) {
int64_t size = calcinstancesize(_class); int64_t size = calcinstancesize(_class);
Instance *newinst = (Instance *)SQ_MALLOC(size); Instance *newinst = (Instance *)SQ_MALLOC(size);
new (newinst) Instance(ss, this,size); new ((char*)newinst) Instance(ss, this,size);
if(_class->_udsize) { if(_class->_udsize) {
newinst->_userpointer = ((unsigned char *)newinst) + (size - _class->_udsize); newinst->_userpointer = ((unsigned char *)newinst) + (size - _class->_udsize);
} }

View File

@ -10,10 +10,13 @@
#include <etk/types.hpp> #include <etk/types.hpp>
#include <rabbit/VirtualMachine.hpp> #include <rabbit/VirtualMachine.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/sqconfig.hpp>
#include <rabbit/sqfuncproto.hpp>
#include <rabbit/sqclosure.hpp>
#include <rabbit/MetaMethod.hpp> #include <rabbit/MetaMethod.hpp>
#include <rabbit/Delegable.hpp> #include <rabbit/Delegable.hpp>

View File

@ -6,6 +6,10 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#pragma once #pragma once
#include <rabbit/sqopcodes.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/sqconfig.hpp>
namespace rabbit { namespace rabbit {
@ -15,18 +19,21 @@ namespace rabbit {
}; };
class Instruction { class Instruction {
Instruction(){}; public:
Instruction(SQOpcode _op,int64_t a0=0,int64_t a1=0,int64_t a2=0,int64_t a3=0) { Instruction(){};
op = (unsigned char)_op; Instruction(SQOpcode _op,int64_t a0=0,int64_t a1=0,int64_t a2=0,int64_t a3=0) {
_arg0 = (unsigned char)a0;_arg1 = (int32_t)a1; op = (unsigned char)_op;
_arg2 = (unsigned char)a2;_arg3 = (unsigned char)a3; _arg0 = (unsigned char)a0;
} _arg1 = (int32_t)a1;
_arg2 = (unsigned char)a2;
_arg3 = (unsigned char)a3;
}
int32_t _arg1; int32_t _arg1;
unsigned char op; unsigned char op;
unsigned char _arg0; unsigned char _arg0;
unsigned char _arg2; unsigned char _arg2;
unsigned char _arg3; unsigned char _arg3;
}; };
} }

View File

@ -6,11 +6,11 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#include <rabbit/Lexer.hpp> #include <rabbit/Lexer.hpp>
#include <rabbit/Table.hpp>
#include <rabbit/String.hpp>
#include <rabbit/sqconfig.hpp>
#include <rabbit/sqcompiler.hpp>
#include <rabbit/sqlexer.hpp>
#define CUR_CHAR (_currdata) #define CUR_CHAR (_currdata)
#define RETURN_TOKEN(t) { _prevtoken = _curtoken; _curtoken = t; return t;} #define RETURN_TOKEN(t) { _prevtoken = _curtoken; _curtoken = t; return t;}
#define IS_EOB() (CUR_CHAR <= RABBIT_EOB) #define IS_EOB() (CUR_CHAR <= RABBIT_EOB)

View File

@ -7,6 +7,12 @@
*/ */
#pragma once #pragma once
#include <etk/Vector.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/sqconfig.hpp>
#include <rabbit/Compiler.hpp>
namespace rabbit { namespace rabbit {
#ifdef SQUNICODE #ifdef SQUNICODE

View File

@ -7,6 +7,8 @@
*/ */
#pragma once #pragma once
#include <etk/types.hpp>
namespace rabbit { namespace rabbit {
class LineInfo { class LineInfo {
public: public:

View File

@ -7,6 +7,12 @@
*/ */
#pragma once #pragma once
#include <etk/types.hpp>
#include <rabbit/ObjectPtr.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/sqconfig.hpp>
namespace rabbit { namespace rabbit {
class LocalVarInfo { class LocalVarInfo {

View File

@ -8,6 +8,8 @@
#pragma once #pragma once
#include <etk/types.hpp> #include <etk/types.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/sqconfig.hpp> #include <rabbit/sqconfig.hpp>
namespace rabbit { namespace rabbit {

View File

@ -8,6 +8,9 @@
#pragma once #pragma once
#include <etk/types.hpp> #include <etk/types.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/sqconfig.hpp>
namespace rabbit { namespace rabbit {
enum MetaMethod { enum MetaMethod {

View File

@ -6,4 +6,43 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#include <rabbit/NativeClosure.hpp> #include <rabbit/NativeClosure.hpp>
#include <etk/Allocator.hpp>
#include <rabbit/WeakRef.hpp>
rabbit::NativeClosure::NativeClosure(rabbit::SharedState *ss,SQFUNCTION func) {
_function=func;
_env = NULL;
}
rabbit::NativeClosure* rabbit::NativeClosure::create(rabbit::SharedState *ss,SQFUNCTION func,int64_t nouters) {
int64_t size = _CALC_NATVIVECLOSURE_SIZE(nouters);
rabbit::NativeClosure *nc=(rabbit::NativeClosure*)SQ_MALLOC(size);
new ((char*)nc) rabbit::NativeClosure(ss,func);
nc->_outervalues = (rabbit::ObjectPtr *)(nc + 1);
nc->_noutervalues = nouters;
_CONSTRUCT_VECTOR(rabbit::ObjectPtr,nc->_noutervalues,nc->_outervalues);
return nc;
}
rabbit::NativeClosure* rabbit::NativeClosure::clone() {
rabbit::NativeClosure * ret = rabbit::NativeClosure::create(NULL,_function,_noutervalues);
ret->_env = _env;
if(ret->_env) __ObjaddRef(ret->_env);
ret->_name = _name;
_COPY_VECTOR(ret->_outervalues,_outervalues,_noutervalues);
ret->_typecheck = _typecheck;
ret->_nparamscheck = _nparamscheck;
return ret;
}
rabbit::NativeClosure::~NativeClosure() {
__Objrelease(_env);
}
void rabbit::NativeClosure::release(){
int64_t size = _CALC_NATVIVECLOSURE_SIZE(_noutervalues);
_DESTRUCT_VECTOR(ObjectPtr,_noutervalues,_outervalues);
this->~NativeClosure();
sq_free(this,size);
}

View File

@ -8,47 +8,26 @@
#pragma once #pragma once
#include <etk/types.hpp> #include <etk/types.hpp>
#include <etk/Vector.hpp>
#include <rabbit/RefCounted.hpp>
#include <rabbit/ObjectPtr.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/rabbit.hpp>
#include <rabbit/sqconfig.hpp>
namespace rabbit { namespace rabbit {
class ObjectPtr;
class SharedState;
class WeakRef;
#define _CALC_NATVIVECLOSURE_SIZE(noutervalues) (sizeof(rabbit::NativeClosure) + (noutervalues*sizeof(rabbit::ObjectPtr))) #define _CALC_NATVIVECLOSURE_SIZE(noutervalues) (sizeof(rabbit::NativeClosure) + (noutervalues*sizeof(rabbit::ObjectPtr)))
class NativeClosure : public rabbit::RefCounted { class NativeClosure : public rabbit::RefCounted {
private: private:
rabbit::NativeClosure(rabbit::SharedState *ss,SQFUNCTION func){ NativeClosure(rabbit::SharedState *ss,SQFUNCTION func);
_function=func;
_env = NULL;
}
public: public:
static rabbit::NativeClosure *create(rabbit::SharedState *ss,SQFUNCTION func,int64_t nouters) static rabbit::NativeClosure *create(rabbit::SharedState *ss,SQFUNCTION func,int64_t nouters);
{ rabbit::NativeClosure *clone();
int64_t size = _CALC_NATVIVECLOSURE_SIZE(nouters); ~NativeClosure();
rabbit::NativeClosure *nc=(rabbit::NativeClosure*)SQ_MALLOC(size); void release();
new (nc) rabbit::NativeClosure(ss,func);
nc->_outervalues = (rabbit::ObjectPtr *)(nc + 1);
nc->_noutervalues = nouters;
_CONSTRUCT_VECTOR(rabbit::ObjectPtr,nc->_noutervalues,nc->_outervalues);
return nc;
}
rabbit::NativeClosure *clone()
{
rabbit::NativeClosure * ret = rabbit::NativeClosure::create(NULL,_function,_noutervalues);
ret->_env = _env;
if(ret->_env) __ObjaddRef(ret->_env);
ret->_name = _name;
_COPY_VECTOR(ret->_outervalues,_outervalues,_noutervalues);
ret->_typecheck = _typecheck;
ret->_nparamscheck = _nparamscheck;
return ret;
}
~NativeClosure()
{
__Objrelease(_env);
}
void release(){
int64_t size = _CALC_NATVIVECLOSURE_SIZE(_noutervalues);
_DESTRUCT_VECTOR(ObjectPtr,_noutervalues,_outervalues);
this->~NativeClosure();
sq_free(this,size);
}
int64_t _nparamscheck; int64_t _nparamscheck;
etk::Vector<int64_t> _typecheck; etk::Vector<int64_t> _typecheck;

View File

@ -6,4 +6,26 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#include <rabbit/Outer.hpp> #include <rabbit/Outer.hpp>
#include <etk/Allocator.hpp>
#include <rabbit/squtils.hpp>
rabbit::Outer::Outer(rabbit::SharedState *ss, rabbit::ObjectPtr *outer){
_valptr = outer;
_next = NULL;
}
rabbit::Outer* rabbit::Outer::create(rabbit::SharedState *ss, rabbit::ObjectPtr *outer) {
rabbit::Outer *nc = (rabbit::Outer*)SQ_MALLOC(sizeof(rabbit::Outer));
new ((char*)nc) rabbit::Outer(ss, outer);
return nc;
}
rabbit::Outer::~Outer() {
}
void rabbit::Outer::release() {
this->~Outer();
sq_vm_free(this,sizeof(rabbit::Outer));
}

View File

@ -7,31 +7,24 @@
*/ */
#pragma once #pragma once
#include <etk/types.hpp>
#include <rabbit/RefCounted.hpp>
#include <rabbit/ObjectPtr.hpp>
namespace rabbit { namespace rabbit {
class SharedState;
class Outer : public rabbit::RefCounted { class Outer : public rabbit::RefCounted {
private: private:
rabbit::Outer(rabbit::SharedState *ss, rabbit::ObjectPtr *outer){ Outer(rabbit::SharedState *ss, rabbit::ObjectPtr *outer);
_valptr = outer;
_next = NULL;
}
public: public:
static rabbit::Outer *create(rabbit::SharedState *ss, rabbit::ObjectPtr *outer) { static rabbit::Outer *create(rabbit::SharedState *ss, rabbit::ObjectPtr *outer);
rabbit::Outer *nc = (rabbit::Outer*)SQ_MALLOC(sizeof(rabbit::Outer)); ~Outer();
new (nc) rabbit::Outer(ss, outer); void release();
return nc; rabbit::ObjectPtr *_valptr; /* pointer to value on stack, or _value below */
} int64_t _idx; /* idx in stack array, for relocation */
~Outer() { rabbit::ObjectPtr _value; /* value of outer after stack frame is closed */
rabbit::Outer *_next; /* pointer to next outer when frame is open */
}
void release()
{
this->~Outer();
sq_vm_free(this,sizeof(rabbit::Outer));
}
rabbit::ObjectPtr *_valptr; /* pointer to value on stack, or _value below */
int64_t _idx; /* idx in stack array, for relocation */
rabbit::ObjectPtr _value; /* value of outer after stack frame is closed */
rabbit::Outer *_next; /* pointer to next outer when frame is open */
}; };
} }

View File

@ -7,6 +7,10 @@
*/ */
#pragma once #pragma once
#include <etk/types.hpp>
#include <rabbit/RefCounted.hpp>
#include <rabbit/ObjectPtr.hpp>
namespace rabbit { namespace rabbit {
enum OuterType { enum OuterType {
otLOCAL = 0, otLOCAL = 0,

View File

@ -9,6 +9,7 @@
#include <rabbit/Table.hpp> #include <rabbit/Table.hpp>
#include <rabbit/squtils.hpp> #include <rabbit/squtils.hpp>
#include <etk/Allocator.hpp>
rabbit::RefTable::RefTable() rabbit::RefTable::RefTable()
{ {

View File

@ -8,7 +8,10 @@
#include <rabbit/SharedState.hpp> #include <rabbit/SharedState.hpp>
#include <rabbit/Table.hpp> #include <rabbit/Table.hpp>
#include <rabbit/String.hpp> #include <rabbit/String.hpp>
#include <rabbit/StringTable.hpp>
#include <rabbit/RegFunction.hpp> #include <rabbit/RegFunction.hpp>
#include <rabbit/NativeClosure.hpp>
#include <rabbit/VirtualMachine.hpp>
static rabbit::Table *createDefaultDelegate(rabbit::SharedState *ss,const rabbit::RegFunction *funcz) static rabbit::Table *createDefaultDelegate(rabbit::SharedState *ss,const rabbit::RegFunction *funcz)
{ {
@ -18,7 +21,7 @@ static rabbit::Table *createDefaultDelegate(rabbit::SharedState *ss,const rabbit
rabbit::NativeClosure *nc = rabbit::NativeClosure::create(ss,funcz[i].f,0); rabbit::NativeClosure *nc = rabbit::NativeClosure::create(ss,funcz[i].f,0);
nc->_nparamscheck = funcz[i].nparamscheck; nc->_nparamscheck = funcz[i].nparamscheck;
nc->_name = rabbit::String::create(ss,funcz[i].name); nc->_name = rabbit::String::create(ss,funcz[i].name);
if(funcz[i].typemask && !compileTypemask(nc->_typecheck,funcz[i].typemask)) if(funcz[i].typemask && !rabbit::compileTypemask(nc->_typecheck,funcz[i].typemask))
return NULL; return NULL;
t->newSlot(rabbit::String::create(ss,funcz[i].name),nc); t->newSlot(rabbit::String::create(ss,funcz[i].name),nc);
i++; i++;
@ -95,7 +98,7 @@ void rabbit::SharedState::init()
_scratchpad=NULL; _scratchpad=NULL;
_scratchpadsize=0; _scratchpadsize=0;
_stringtable = (rabbit::StringTable*)SQ_MALLOC(sizeof(rabbit::StringTable)); _stringtable = (rabbit::StringTable*)SQ_MALLOC(sizeof(rabbit::StringTable));
new (_stringtable) rabbit::StringTable(this); new ((char*)_stringtable) rabbit::StringTable(this);
sq_new(_metamethods,etk::Vector<rabbit::ObjectPtr>); sq_new(_metamethods,etk::Vector<rabbit::ObjectPtr>);
sq_new(_systemstrings,etk::Vector<rabbit::ObjectPtr>); sq_new(_systemstrings,etk::Vector<rabbit::ObjectPtr>);
sq_new(_types,etk::Vector<rabbit::ObjectPtr>); sq_new(_types,etk::Vector<rabbit::ObjectPtr>);
@ -186,7 +189,7 @@ rabbit::SharedState::~SharedState()
sq_delete(_types, tmpType); sq_delete(_types, tmpType);
sq_delete(_systemstrings, tmpType); sq_delete(_systemstrings, tmpType);
sq_delete(_metamethods, tmpType); sq_delete(_metamethods, tmpType);
sq_delete(_stringtable, rabbit::StringTable); sq_delete(_stringtable, StringTable);
if(_scratchpad)SQ_FREE(_scratchpad,_scratchpadsize); if(_scratchpad)SQ_FREE(_scratchpad,_scratchpadsize);
} }

View File

@ -5,12 +5,13 @@
* @copyright 2003-2017, Alberto DEMICHELIS, all right reserved * @copyright 2003-2017, Alberto DEMICHELIS, all right reserved
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#pragma once
#include <rabbit/String.hpp> #include <rabbit/String.hpp>
#include <rabbit/SharedState.hpp>
#include <rabbit/ObjectPtr.hpp>
#include <rabbit/StringTable.hpp>
rabbit::Hash rabbit::_hashstr(const rabbit::Char *s, size_t l); { rabbit::Hash rabbit::_hashstr(const rabbit::Char *s, size_t l) {
rabbit::Hash h = (rabbit::Hash)l; /* seed */ rabbit::Hash h = (rabbit::Hash)l; /* seed */
size_t step = (l>>5)|1; /* if string is too long, don't hash all its chars */ size_t step = (l>>5)|1; /* if string is too long, don't hash all its chars */
for (; l>=step; l-=step) for (; l>=step; l-=step)

View File

@ -8,22 +8,29 @@
#pragma once #pragma once
#include <etk/types.hpp> #include <etk/types.hpp>
#include <rabbit/Hash.hpp>
#include <rabbit/RefCounted.hpp>
#include <rabbit/sqconfig.hpp>
namespace rabbit { namespace rabbit {
class SharedState;
class ObjectPtr;
rabbit::Hash _hashstr (const rabbit::Char *s, size_t l); rabbit::Hash _hashstr (const rabbit::Char *s, size_t l);
class String : public rabbit::RefCounted { class String : public rabbit::RefCounted {
String(){} public:
~String(){} String(){}
public: ~String(){}
static rabbit::String *create(rabbit::SharedState *ss, const rabbit::Char *, int64_t len = -1 ); public:
int64_t next(const rabbit::ObjectPtr &refpos, rabbit::ObjectPtr &outkey, rabbit::ObjectPtr &outval); static rabbit::String *create(rabbit::SharedState *ss, const rabbit::Char *, int64_t len = -1 );
void release(); int64_t next(const rabbit::ObjectPtr &refpos, rabbit::ObjectPtr &outkey, rabbit::ObjectPtr &outval);
rabbit::SharedState *_sharedstate; void release();
rabbit::String *_next; //chain for the string table rabbit::SharedState *_sharedstate;
int64_t _len; rabbit::String *_next; //chain for the string table
rabbit::Hash _hash; int64_t _len;
rabbit::Char _val[1]; rabbit::Hash _hash;
rabbit::Char _val[1];
}; };

View File

@ -5,9 +5,11 @@
* @copyright 2003-2017, Alberto DEMICHELIS, all right reserved * @copyright 2003-2017, Alberto DEMICHELIS, all right reserved
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#pragma once
#include <rabbit/StringTable.hpp> #include <rabbit/StringTable.hpp>
#include <rabbit/SharedState.hpp>
#include <rabbit/ObjectPtr.hpp>
#include <rabbit/StringTable.hpp>
#include <rabbit/squtils.hpp>
@ -36,7 +38,7 @@ rabbit::String *rabbit::StringTable::add(const rabbit::Char *news,int64_t len)
{ {
if(len<0) if(len<0)
len = (int64_t)scstrlen(news); len = (int64_t)scstrlen(news);
rabbit::Hash newhash = ::_hashstr(news,len); rabbit::Hash newhash = _hashstr(news,len);
rabbit::Hash h = newhash&(_numofslots-1); rabbit::Hash h = newhash&(_numofslots-1);
rabbit::String *s; rabbit::String *s;
for (s = _strings[h]; s; s = s->_next){ for (s = _strings[h]; s; s = s->_next){
@ -45,7 +47,7 @@ rabbit::String *rabbit::StringTable::add(const rabbit::Char *news,int64_t len)
} }
rabbit::String *t = (rabbit::String *)SQ_MALLOC(sq_rsl(len)+sizeof(rabbit::String)); rabbit::String *t = (rabbit::String *)SQ_MALLOC(sq_rsl(len)+sizeof(rabbit::String));
new (t) rabbit::String; new ((char*)t) rabbit::String;
t->_sharedstate = _sharedstate; t->_sharedstate = _sharedstate;
memcpy(t->_val,news,sq_rsl(len)); memcpy(t->_val,news,sq_rsl(len));
t->_val[len] = _SC('\0'); t->_val[len] = _SC('\0');

View File

@ -8,6 +8,7 @@
#pragma once #pragma once
#include <etk/types.hpp> #include <etk/types.hpp>
#include <rabbit/String.hpp>
namespace rabbit { namespace rabbit {

View File

@ -5,11 +5,12 @@
* @copyright 2003-2017, Alberto DEMICHELIS, all right reserved * @copyright 2003-2017, Alberto DEMICHELIS, all right reserved
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#pragma once
#include <rabbit/Table.hpp> #include <rabbit/Table.hpp>
#include <rabbit/String.hpp>
#include <rabbit/WeakRef.hpp>
#include <etk/Allocator.hpp>
rabbit::Hash rabbit::HashObj(const rabbit::ObjectPtr &key); { rabbit::Hash rabbit::HashObj(const rabbit::ObjectPtr &key) {
switch(sq_type(key)) { switch(sq_type(key)) {
case rabbit::OT_STRING: case rabbit::OT_STRING:
return _string(key)->_hash; return _string(key)->_hash;
@ -26,7 +27,7 @@ rabbit::Hash rabbit::HashObj(const rabbit::ObjectPtr &key); {
#define MINPOWER2 4 #define MINPOWER2 4
rabbit::Table::rabbit::Table(rabbit::SharedState *ss,int64_t ninitialsize) { rabbit::Table::Table(rabbit::SharedState *ss,int64_t ninitialsize) {
int64_t pow2size=MINPOWER2; int64_t pow2size=MINPOWER2;
while(ninitialsize>pow2size)pow2size=pow2size<<1; while(ninitialsize>pow2size)pow2size=pow2size<<1;
allocNodes(pow2size); allocNodes(pow2size);
@ -49,7 +50,7 @@ void rabbit::Table::allocNodes(int64_t nsize)
_HashNode *nodes=(_HashNode *)SQ_MALLOC(sizeof(_HashNode)*nsize); _HashNode *nodes=(_HashNode *)SQ_MALLOC(sizeof(_HashNode)*nsize);
for(int64_t i=0;i<nsize;i++){ for(int64_t i=0;i<nsize;i++){
_HashNode &n = nodes[i]; _HashNode &n = nodes[i];
new (&n) _HashNode; new ((char*)&n) _HashNode;
n.next=NULL; n.next=NULL;
} }
_numofnodes=nsize; _numofnodes=nsize;
@ -249,7 +250,7 @@ rabbit::Table::~Table() {
SQ_FREE(_nodes, _numofnodes * sizeof(_HashNode)); SQ_FREE(_nodes, _numofnodes * sizeof(_HashNode));
} }
_HashNode* rabbit::Table::_get(const rabbit::ObjectPtr &key,rabbit::Hash hash) { rabbit::Table::_HashNode* rabbit::Table::_get(const rabbit::ObjectPtr &key,rabbit::Hash hash) {
_HashNode *n = &_nodes[hash]; _HashNode *n = &_nodes[hash];
do { do {
if( _rawval(n->key) == _rawval(key) if( _rawval(n->key) == _rawval(key)
@ -283,5 +284,5 @@ int64_t rabbit::Table::countUsed() {
} }
void rabbit::Table::release() { void rabbit::Table::release() {
sq_delete(this, rabbit::Table); sq_delete(this, Table);
} }

54
rabbit/UserData.cpp Normal file
View File

@ -0,0 +1,54 @@
/**
* @author Alberto DEMICHELIS
* @author Edouard DUPIN
* @copyright 2018, Edouard DUPIN, all right reserved
* @copyright 2003-2017, Alberto DEMICHELIS, all right reserved
* @license MPL-2 (see license file)
*/
#include <rabbit/UserData.hpp>
#include <etk/Allocator.hpp>
rabbit::UserData::UserData(rabbit::SharedState *ss) {
_delegate = 0;
m_hook = NULL;
}
rabbit::UserData::~UserData() {
setDelegate(NULL);
}
rabbit::UserData* rabbit::UserData::create(rabbit::SharedState *ss, int64_t size) {
UserData* ud = (UserData*)SQ_MALLOC(sq_aligning(sizeof(UserData))+size);
new ((char*)ud) UserData(ss);
ud->m_size = size;
ud->m_typetag = 0;
return ud;
}
void rabbit::UserData::release() {
if (m_hook) {
m_hook((rabbit::UserPointer)sq_aligning(this + 1),m_size);
}
int64_t tsize = m_size;
this->~UserData();
SQ_FREE(this, sq_aligning(sizeof(UserData)) + tsize);
}
const int64_t& rabbit::UserData::getsize() const {
return m_size;
}
const rabbit::UserPointer& rabbit::UserData::getTypeTag() const {
return m_typetag;
}
void rabbit::UserData::setTypeTag(const rabbit::UserPointer& _value) {
m_typetag = _value;
}
const SQRELEASEHOOK& rabbit::UserData::getHook() const {
return m_hook;
}
void rabbit::UserData::setHook(const SQRELEASEHOOK& _value) {
m_hook = _value;
}

View File

@ -6,47 +6,21 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#pragma once #pragma once
#include <etk/types.hpp>
#include <rabbit/Delegable.hpp>
namespace rabbit { namespace rabbit {
class UserData : public rabbit::Delegable { class UserData : public rabbit::Delegable {
public: public:
UserData(rabbit::SharedState *ss) { UserData(rabbit::SharedState *ss);
_delegate = 0; ~UserData();
m_hook = NULL; static UserData* create(rabbit::SharedState *ss, int64_t size);
} void release();
~UserData() { const int64_t& getsize() const;
setDelegate(NULL); const rabbit::UserPointer& getTypeTag() const;
} void setTypeTag(const rabbit::UserPointer& _value);
static UserData* create(rabbit::SharedState *ss, int64_t size) { const SQRELEASEHOOK& getHook() const;
UserData* ud = (UserData*)SQ_MALLOC(sq_aligning(sizeof(UserData))+size); void setHook(const SQRELEASEHOOK& _value);
new (ud) UserData(ss);
ud->m_size = size;
ud->m_typetag = 0;
return ud;
}
void release() {
if (m_hook) {
m_hook((rabbit::UserPointer)sq_aligning(this + 1),m_size);
}
int64_t tsize = m_size;
this->~UserData();
SQ_FREE(this, sq_aligning(sizeof(UserData)) + tsize);
}
const int64_t& getsize() const {
return m_size;
}
const rabbit::UserPointer& getTypeTag() const {
return m_typetag;
}
void setTypeTag(const rabbit::UserPointer& _value) {
m_typetag = _value;
}
const SQRELEASEHOOK& getHook() const {
return m_hook;
}
void setHook(const SQRELEASEHOOK& _value) {
m_hook = _value;
}
protected: protected:
int64_t m_size; int64_t m_size;
SQRELEASEHOOK m_hook; SQRELEASEHOOK m_hook;

View File

@ -10,13 +10,24 @@
#include <stdlib.h> #include <stdlib.h>
#include <rabbit/sqopcodes.hpp> #include <rabbit/sqopcodes.hpp>
#include <rabbit/VirtualMachine.hpp> #include <rabbit/VirtualMachine.hpp>
#include <rabbit/sqfuncproto.hpp>
#include <rabbit/sqclosure.hpp>
#include <rabbit/squtils.hpp>
#include <rabbit/UserData.hpp> #include <rabbit/UserData.hpp>
#include <rabbit/Array.hpp> #include <rabbit/Array.hpp>
#include <rabbit/Instance.hpp> #include <rabbit/Instance.hpp>
#include <rabbit/Closure.hpp>
#include <rabbit/String.hpp>
#include <rabbit/Table.hpp>
#include <rabbit/Generator.hpp>
#include <rabbit/Class.hpp>
#include <rabbit/FunctionProto.hpp>
#include <rabbit/NativeClosure.hpp>
#include <rabbit/WeakRef.hpp>
#include <rabbit/SharedState.hpp>
#include <rabbit/Outer.hpp>
#define TOP() (_stack[_top-1]) #define TOP() (_stack[_top-1])
@ -44,6 +55,10 @@ bool rabbit::VirtualMachine::BW_OP(uint64_t op,rabbit::ObjectPtr &trg,const rabb
return true; return true;
} }
void rabbit::VirtualMachine::release() {
sq_delete(this,VirtualMachine);
}
#define _ARITH_(op,trg,o1,o2) \ #define _ARITH_(op,trg,o1,o2) \
{ \ { \
int64_t tmask = sq_type(o1)|sq_type(o2); \ int64_t tmask = sq_type(o1)|sq_type(o2); \
@ -76,12 +91,12 @@ bool rabbit::VirtualMachine::ARITH_OP(uint64_t op,rabbit::ObjectPtr &trg,const r
case '+': res = i1 + i2; break; case '+': res = i1 + i2; break;
case '-': res = i1 - i2; break; case '-': res = i1 - i2; break;
case '/': if (i2 == 0) { raise_error(_SC("division by zero")); return false; } case '/': if (i2 == 0) { raise_error(_SC("division by zero")); return false; }
else if (i2 == -1 && i1 == INT_MIN) { raise_error(_SC("integer overflow")); return false; } else if (i2 == -1 && i1 == INT64_MIN) { raise_error(_SC("integer overflow")); return false; }
res = i1 / i2; res = i1 / i2;
break; break;
case '*': res = i1 * i2; break; case '*': res = i1 * i2; break;
case '%': if (i2 == 0) { raise_error(_SC("modulo by zero")); return false; } case '%': if (i2 == 0) { raise_error(_SC("modulo by zero")); return false; }
else if (i2 == -1 && i1 == INT_MIN) { res = 0; break; } else if (i2 == -1 && i1 == INT64_MAX) { res = 0; break; }
res = i1 % i2; res = i1 % i2;
break; break;
default: res = 0xDEADBEEF; default: res = 0xDEADBEEF;

View File

@ -36,8 +36,7 @@ void sq_base_register(rabbit::VirtualMachine* v);
#define _INLINE #define _INLINE
namespace rabbit { namespace rabbit {
class VirtualMachine : public rabbit::RefCounted class VirtualMachine : public rabbit::RefCounted {
{
public: public:
struct callInfo{ struct callInfo{
rabbit::Instruction *_ip; rabbit::Instruction *_ip;
@ -51,7 +50,6 @@ namespace rabbit {
int32_t _ncalls; int32_t _ncalls;
rabbit::Bool _root; rabbit::Bool _root;
}; };
public: public:
void DebugHookProxy(int64_t type, const rabbit::Char * sourcename, int64_t line, const rabbit::Char * funcname); void DebugHookProxy(int64_t type, const rabbit::Char * sourcename, int64_t line, const rabbit::Char * funcname);
static void _DebugHookProxy(rabbit::VirtualMachine* v, int64_t type, const rabbit::Char * sourcename, int64_t line, const rabbit::Char * funcname); static void _DebugHookProxy(rabbit::VirtualMachine* v, int64_t type, const rabbit::Char * sourcename, int64_t line, const rabbit::Char * funcname);
@ -132,10 +130,7 @@ namespace rabbit {
} }
bool enterFrame(int64_t newbase, int64_t newtop, bool tailcall); bool enterFrame(int64_t newbase, int64_t newtop, bool tailcall);
void leaveFrame(); void leaveFrame();
void release() { void release();
sq_delete(this,VirtualMachine);
}
////////////////////////////////////////////////////////////////////////////
//stack functions for the api //stack functions for the api
void remove(int64_t n); void remove(int64_t n);

View File

@ -11,10 +11,6 @@
#include _SQ_CONFIG_INCLUDE #include _SQ_CONFIG_INCLUDE
#endif #endif
#ifndef RABBIT_API
#define RABBIT_API extern
#endif
#if (defined(_WIN64) || defined(_LP64)) #if (defined(_WIN64) || defined(_LP64))
#ifndef _SQ64 #ifndef _SQ64
#define _SQ64 #define _SQ64
@ -56,175 +52,178 @@ typedef int64_t (*SQREADFUNC)(rabbit::UserPointer,rabbit::UserPointer,int64_t);
typedef int64_t (*SQLEXREADFUNC)(rabbit::UserPointer); typedef int64_t (*SQLEXREADFUNC)(rabbit::UserPointer);
namespace rabbit {
/*vm*/ /*vm*/
RABBIT_API rabbit::VirtualMachine* sq_open(int64_t initialstacksize); rabbit::VirtualMachine* sq_open(int64_t initialstacksize);
RABBIT_API rabbit::VirtualMachine* sq_newthread(rabbit::VirtualMachine* friendvm, int64_t initialstacksize); rabbit::VirtualMachine* sq_newthread(rabbit::VirtualMachine* friendvm, int64_t initialstacksize);
RABBIT_API void sq_seterrorhandler(rabbit::VirtualMachine* v); void sq_seterrorhandler(rabbit::VirtualMachine* v);
RABBIT_API void sq_close(rabbit::VirtualMachine* v); void sq_close(rabbit::VirtualMachine* v);
RABBIT_API void sq_setforeignptr(rabbit::VirtualMachine* v,rabbit::UserPointer p); void sq_setforeignptr(rabbit::VirtualMachine* v,rabbit::UserPointer p);
RABBIT_API rabbit::UserPointer sq_getforeignptr(rabbit::VirtualMachine* v); rabbit::UserPointer sq_getforeignptr(rabbit::VirtualMachine* v);
RABBIT_API void sq_setsharedforeignptr(rabbit::VirtualMachine* v,rabbit::UserPointer p); void sq_setsharedforeignptr(rabbit::VirtualMachine* v,rabbit::UserPointer p);
RABBIT_API rabbit::UserPointer sq_getsharedforeignptr(rabbit::VirtualMachine* v); rabbit::UserPointer sq_getsharedforeignptr(rabbit::VirtualMachine* v);
RABBIT_API void sq_setvmreleasehook(rabbit::VirtualMachine* v,SQRELEASEHOOK hook); void sq_setvmreleasehook(rabbit::VirtualMachine* v,SQRELEASEHOOK hook);
RABBIT_API SQRELEASEHOOK sq_getvmreleasehook(rabbit::VirtualMachine* v); SQRELEASEHOOK sq_getvmreleasehook(rabbit::VirtualMachine* v);
RABBIT_API void sq_setsharedreleasehook(rabbit::VirtualMachine* v,SQRELEASEHOOK hook); void sq_setsharedreleasehook(rabbit::VirtualMachine* v,SQRELEASEHOOK hook);
RABBIT_API SQRELEASEHOOK sq_getsharedreleasehook(rabbit::VirtualMachine* v); SQRELEASEHOOK sq_getsharedreleasehook(rabbit::VirtualMachine* v);
RABBIT_API void sq_setprintfunc(rabbit::VirtualMachine* v, SQPRINTFUNCTION printfunc,SQPRINTFUNCTION errfunc); void sq_setprintfunc(rabbit::VirtualMachine* v, SQPRINTFUNCTION printfunc,SQPRINTFUNCTION errfunc);
RABBIT_API SQPRINTFUNCTION sq_getprintfunc(rabbit::VirtualMachine* v); SQPRINTFUNCTION sq_getprintfunc(rabbit::VirtualMachine* v);
RABBIT_API SQPRINTFUNCTION sq_geterrorfunc(rabbit::VirtualMachine* v); SQPRINTFUNCTION sq_geterrorfunc(rabbit::VirtualMachine* v);
RABBIT_API rabbit::Result sq_suspendvm(rabbit::VirtualMachine* v); rabbit::Result sq_suspendvm(rabbit::VirtualMachine* v);
RABBIT_API rabbit::Result sq_wakeupvm(rabbit::VirtualMachine* v,rabbit::Bool resumedret,rabbit::Bool retval,rabbit::Bool raiseerror,rabbit::Bool throwerror); rabbit::Result sq_wakeupvm(rabbit::VirtualMachine* v,rabbit::Bool resumedret,rabbit::Bool retval,rabbit::Bool raiseerror,rabbit::Bool throwerror);
RABBIT_API int64_t sq_getvmstate(rabbit::VirtualMachine* v); int64_t sq_getvmstate(rabbit::VirtualMachine* v);
RABBIT_API int64_t sq_getversion(); int64_t sq_getversion();
/*compiler*/ /*compiler*/
RABBIT_API rabbit::Result sq_compile(rabbit::VirtualMachine* v,SQLEXREADFUNC read,rabbit::UserPointer p,const rabbit::Char *sourcename,rabbit::Bool raiseerror); rabbit::Result sq_compile(rabbit::VirtualMachine* v,SQLEXREADFUNC read,rabbit::UserPointer p,const rabbit::Char *sourcename,rabbit::Bool raiseerror);
RABBIT_API rabbit::Result sq_compilebuffer(rabbit::VirtualMachine* v,const rabbit::Char *s,int64_t size,const rabbit::Char *sourcename,rabbit::Bool raiseerror); rabbit::Result sq_compilebuffer(rabbit::VirtualMachine* v,const rabbit::Char *s,int64_t size,const rabbit::Char *sourcename,rabbit::Bool raiseerror);
RABBIT_API void sq_enabledebuginfo(rabbit::VirtualMachine* v, rabbit::Bool enable); void sq_enabledebuginfo(rabbit::VirtualMachine* v, rabbit::Bool enable);
RABBIT_API void sq_notifyallexceptions(rabbit::VirtualMachine* v, rabbit::Bool enable); void sq_notifyallexceptions(rabbit::VirtualMachine* v, rabbit::Bool enable);
RABBIT_API void sq_setcompilererrorhandler(rabbit::VirtualMachine* v,SQCOMPILERERROR f); void sq_setcompilererrorhandler(rabbit::VirtualMachine* v,SQCOMPILERERROR f);
/*stack operations*/ /*stack operations*/
RABBIT_API void sq_push(rabbit::VirtualMachine* v,int64_t idx); void sq_push(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API void sq_pop(rabbit::VirtualMachine* v,int64_t nelemstopop); void sq_pop(rabbit::VirtualMachine* v,int64_t nelemstopop);
RABBIT_API void sq_poptop(rabbit::VirtualMachine* v); void sq_poptop(rabbit::VirtualMachine* v);
RABBIT_API void sq_remove(rabbit::VirtualMachine* v,int64_t idx); void sq_remove(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API int64_t sq_gettop(rabbit::VirtualMachine* v); int64_t sq_gettop(rabbit::VirtualMachine* v);
RABBIT_API void sq_settop(rabbit::VirtualMachine* v,int64_t newtop); void sq_settop(rabbit::VirtualMachine* v,int64_t newtop);
RABBIT_API rabbit::Result sq_reservestack(rabbit::VirtualMachine* v,int64_t nsize); rabbit::Result sq_reservestack(rabbit::VirtualMachine* v,int64_t nsize);
RABBIT_API int64_t sq_cmp(rabbit::VirtualMachine* v); int64_t sq_cmp(rabbit::VirtualMachine* v);
RABBIT_API void sq_move(rabbit::VirtualMachine* dest,rabbit::VirtualMachine* src,int64_t idx); void sq_move(rabbit::VirtualMachine* dest,rabbit::VirtualMachine* src,int64_t idx);
/*object creation handling*/ /*object creation handling*/
RABBIT_API rabbit::UserPointer sq_newuserdata(rabbit::VirtualMachine* v,uint64_t size); rabbit::UserPointer sq_newuserdata(rabbit::VirtualMachine* v,uint64_t size);
RABBIT_API void sq_newtable(rabbit::VirtualMachine* v); void sq_newtable(rabbit::VirtualMachine* v);
RABBIT_API void sq_newtableex(rabbit::VirtualMachine* v,int64_t initialcapacity); void sq_newtableex(rabbit::VirtualMachine* v,int64_t initialcapacity);
RABBIT_API void sq_newarray(rabbit::VirtualMachine* v,int64_t size); void sq_newarray(rabbit::VirtualMachine* v,int64_t size);
RABBIT_API void sq_newclosure(rabbit::VirtualMachine* v,SQFUNCTION func,uint64_t nfreevars); void sq_newclosure(rabbit::VirtualMachine* v,SQFUNCTION func,uint64_t nfreevars);
RABBIT_API rabbit::Result sq_setparamscheck(rabbit::VirtualMachine* v,int64_t nparamscheck,const rabbit::Char *typemask); rabbit::Result sq_setparamscheck(rabbit::VirtualMachine* v,int64_t nparamscheck,const rabbit::Char *typemask);
RABBIT_API rabbit::Result sq_bindenv(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_bindenv(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_setclosureroot(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_setclosureroot(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_getclosureroot(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_getclosureroot(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API void sq_pushstring(rabbit::VirtualMachine* v,const rabbit::Char *s,int64_t len); void sq_pushstring(rabbit::VirtualMachine* v,const rabbit::Char *s,int64_t len);
RABBIT_API void sq_pushfloat(rabbit::VirtualMachine* v,float_t f); void sq_pushfloat(rabbit::VirtualMachine* v,float_t f);
RABBIT_API void sq_pushinteger(rabbit::VirtualMachine* v,int64_t n); void sq_pushinteger(rabbit::VirtualMachine* v,int64_t n);
RABBIT_API void sq_pushbool(rabbit::VirtualMachine* v,rabbit::Bool b); void sq_pushbool(rabbit::VirtualMachine* v,rabbit::Bool b);
RABBIT_API void sq_pushuserpointer(rabbit::VirtualMachine* v,rabbit::UserPointer p); void sq_pushuserpointer(rabbit::VirtualMachine* v,rabbit::UserPointer p);
RABBIT_API void sq_pushnull(rabbit::VirtualMachine* v); void sq_pushnull(rabbit::VirtualMachine* v);
RABBIT_API void sq_pushthread(rabbit::VirtualMachine* v, rabbit::VirtualMachine* thread); void sq_pushthread(rabbit::VirtualMachine* v, rabbit::VirtualMachine* thread);
RABBIT_API rabbit::ObjectType sq_gettype(rabbit::VirtualMachine* v,int64_t idx); rabbit::ObjectType sq_gettype(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_typeof(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_typeof(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API int64_t sq_getsize(rabbit::VirtualMachine* v,int64_t idx); int64_t sq_getsize(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Hash sq_gethash(rabbit::VirtualMachine* v, int64_t idx); rabbit::Hash sq_gethash(rabbit::VirtualMachine* v, int64_t idx);
RABBIT_API rabbit::Result sq_getbase(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_getbase(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Bool sq_instanceof(rabbit::VirtualMachine* v); rabbit::Bool sq_instanceof(rabbit::VirtualMachine* v);
RABBIT_API rabbit::Result sq_tostring(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_tostring(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API void sq_tobool(rabbit::VirtualMachine* v, int64_t idx, rabbit::Bool *b); void sq_tobool(rabbit::VirtualMachine* v, int64_t idx, rabbit::Bool *b);
RABBIT_API rabbit::Result sq_getstringandsize(rabbit::VirtualMachine* v,int64_t idx,const rabbit::Char **c,int64_t *size); rabbit::Result sq_getstringandsize(rabbit::VirtualMachine* v,int64_t idx,const rabbit::Char **c,int64_t *size);
RABBIT_API rabbit::Result sq_getstring(rabbit::VirtualMachine* v,int64_t idx,const rabbit::Char **c); rabbit::Result sq_getstring(rabbit::VirtualMachine* v,int64_t idx,const rabbit::Char **c);
RABBIT_API rabbit::Result sq_getinteger(rabbit::VirtualMachine* v,int64_t idx,int64_t *i); rabbit::Result sq_getinteger(rabbit::VirtualMachine* v,int64_t idx,int64_t *i);
RABBIT_API rabbit::Result sq_getfloat(rabbit::VirtualMachine* v,int64_t idx,float_t *f); rabbit::Result sq_getfloat(rabbit::VirtualMachine* v,int64_t idx,float_t *f);
RABBIT_API rabbit::Result sq_getbool(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool *b); rabbit::Result sq_getbool(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool *b);
RABBIT_API rabbit::Result sq_getthread(rabbit::VirtualMachine* v,int64_t idx,rabbit::VirtualMachine* *thread); rabbit::Result sq_getthread(rabbit::VirtualMachine* v,int64_t idx,rabbit::VirtualMachine* *thread);
RABBIT_API rabbit::Result sq_getuserpointer(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer *p); rabbit::Result sq_getuserpointer(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer *p);
RABBIT_API rabbit::Result sq_getuserdata(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer *p,rabbit::UserPointer *typetag); rabbit::Result sq_getuserdata(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer *p,rabbit::UserPointer *typetag);
RABBIT_API rabbit::Result sq_settypetag(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer typetag); rabbit::Result sq_settypetag(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer typetag);
RABBIT_API rabbit::Result sq_gettypetag(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer *typetag); rabbit::Result sq_gettypetag(rabbit::VirtualMachine* v,int64_t idx,rabbit::UserPointer *typetag);
RABBIT_API void sq_setreleasehook(rabbit::VirtualMachine* v,int64_t idx,SQRELEASEHOOK hook); void sq_setreleasehook(rabbit::VirtualMachine* v,int64_t idx,SQRELEASEHOOK hook);
RABBIT_API SQRELEASEHOOK sq_getreleasehook(rabbit::VirtualMachine* v,int64_t idx); SQRELEASEHOOK sq_getreleasehook(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Char *sq_getscratchpad(rabbit::VirtualMachine* v,int64_t minsize); rabbit::Char *sq_getscratchpad(rabbit::VirtualMachine* v,int64_t minsize);
RABBIT_API rabbit::Result sq_getfunctioninfo(rabbit::VirtualMachine* v,int64_t level,rabbit::FunctionInfo *fi); rabbit::Result sq_getfunctioninfo(rabbit::VirtualMachine* v,int64_t level,rabbit::FunctionInfo *fi);
RABBIT_API rabbit::Result sq_getclosureinfo(rabbit::VirtualMachine* v,int64_t idx,uint64_t *nparams,uint64_t *nfreevars); rabbit::Result sq_getclosureinfo(rabbit::VirtualMachine* v,int64_t idx,uint64_t *nparams,uint64_t *nfreevars);
RABBIT_API rabbit::Result sq_getclosurename(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_getclosurename(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_setnativeclosurename(rabbit::VirtualMachine* v,int64_t idx,const rabbit::Char *name); rabbit::Result sq_setnativeclosurename(rabbit::VirtualMachine* v,int64_t idx,const rabbit::Char *name);
RABBIT_API rabbit::Result sq_setinstanceup(rabbit::VirtualMachine* v, int64_t idx, rabbit::UserPointer p); rabbit::Result sq_setinstanceup(rabbit::VirtualMachine* v, int64_t idx, rabbit::UserPointer p);
RABBIT_API rabbit::Result sq_getinstanceup(rabbit::VirtualMachine* v, int64_t idx, rabbit::UserPointer *p,rabbit::UserPointer typetag); rabbit::Result sq_getinstanceup(rabbit::VirtualMachine* v, int64_t idx, rabbit::UserPointer *p,rabbit::UserPointer typetag);
RABBIT_API rabbit::Result sq_setclassudsize(rabbit::VirtualMachine* v, int64_t idx, int64_t udsize); rabbit::Result sq_setclassudsize(rabbit::VirtualMachine* v, int64_t idx, int64_t udsize);
RABBIT_API rabbit::Result sq_newclass(rabbit::VirtualMachine* v,rabbit::Bool hasbase); rabbit::Result sq_newclass(rabbit::VirtualMachine* v,rabbit::Bool hasbase);
RABBIT_API rabbit::Result sq_createinstance(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_createinstance(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_setattributes(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_setattributes(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_getattributes(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_getattributes(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_getclass(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_getclass(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API void sq_weakref(rabbit::VirtualMachine* v,int64_t idx); void sq_weakref(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_getdefaultdelegate(rabbit::VirtualMachine* v,rabbit::ObjectType t); rabbit::Result sq_getdefaultdelegate(rabbit::VirtualMachine* v,rabbit::ObjectType t);
RABBIT_API rabbit::Result sq_getmemberhandle(rabbit::VirtualMachine* v,int64_t idx,rabbit::MemberHandle *handle); rabbit::Result sq_getmemberhandle(rabbit::VirtualMachine* v,int64_t idx,rabbit::MemberHandle *handle);
RABBIT_API rabbit::Result sq_getbyhandle(rabbit::VirtualMachine* v,int64_t idx,const rabbit::MemberHandle *handle); rabbit::Result sq_getbyhandle(rabbit::VirtualMachine* v,int64_t idx,const rabbit::MemberHandle *handle);
RABBIT_API rabbit::Result sq_setbyhandle(rabbit::VirtualMachine* v,int64_t idx,const rabbit::MemberHandle *handle); rabbit::Result sq_setbyhandle(rabbit::VirtualMachine* v,int64_t idx,const rabbit::MemberHandle *handle);
/*object manipulation*/ /*object manipulation*/
RABBIT_API void sq_pushroottable(rabbit::VirtualMachine* v); void sq_pushroottable(rabbit::VirtualMachine* v);
RABBIT_API void sq_pushregistrytable(rabbit::VirtualMachine* v); void sq_pushregistrytable(rabbit::VirtualMachine* v);
RABBIT_API void sq_pushconsttable(rabbit::VirtualMachine* v); void sq_pushconsttable(rabbit::VirtualMachine* v);
RABBIT_API rabbit::Result sq_setroottable(rabbit::VirtualMachine* v); rabbit::Result sq_setroottable(rabbit::VirtualMachine* v);
RABBIT_API rabbit::Result sq_setconsttable(rabbit::VirtualMachine* v); rabbit::Result sq_setconsttable(rabbit::VirtualMachine* v);
RABBIT_API rabbit::Result sq_newslot(rabbit::VirtualMachine* v, int64_t idx, rabbit::Bool bstatic); rabbit::Result sq_newslot(rabbit::VirtualMachine* v, int64_t idx, rabbit::Bool bstatic);
RABBIT_API rabbit::Result sq_deleteslot(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool pushval); rabbit::Result sq_deleteslot(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool pushval);
RABBIT_API rabbit::Result sq_set(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_set(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_get(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_get(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_rawget(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_rawget(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_rawset(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_rawset(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_rawdeleteslot(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool pushval); rabbit::Result sq_rawdeleteslot(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool pushval);
RABBIT_API rabbit::Result sq_newmember(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool bstatic); rabbit::Result sq_newmember(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool bstatic);
RABBIT_API rabbit::Result sq_rawnewmember(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool bstatic); rabbit::Result sq_rawnewmember(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool bstatic);
RABBIT_API rabbit::Result sq_arrayappend(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_arrayappend(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_arraypop(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool pushval); rabbit::Result sq_arraypop(rabbit::VirtualMachine* v,int64_t idx,rabbit::Bool pushval);
RABBIT_API rabbit::Result sq_arrayresize(rabbit::VirtualMachine* v,int64_t idx,int64_t newsize); rabbit::Result sq_arrayresize(rabbit::VirtualMachine* v,int64_t idx,int64_t newsize);
RABBIT_API rabbit::Result sq_arrayreverse(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_arrayreverse(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_arrayremove(rabbit::VirtualMachine* v,int64_t idx,int64_t itemidx); rabbit::Result sq_arrayremove(rabbit::VirtualMachine* v,int64_t idx,int64_t itemidx);
RABBIT_API rabbit::Result sq_arrayinsert(rabbit::VirtualMachine* v,int64_t idx,int64_t destpos); rabbit::Result sq_arrayinsert(rabbit::VirtualMachine* v,int64_t idx,int64_t destpos);
RABBIT_API rabbit::Result sq_setdelegate(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_setdelegate(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_getdelegate(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_getdelegate(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_clone(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_clone(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_setfreevariable(rabbit::VirtualMachine* v,int64_t idx,uint64_t nval); rabbit::Result sq_setfreevariable(rabbit::VirtualMachine* v,int64_t idx,uint64_t nval);
RABBIT_API rabbit::Result sq_next(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_next(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_getweakrefval(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_getweakrefval(rabbit::VirtualMachine* v,int64_t idx);
RABBIT_API rabbit::Result sq_clear(rabbit::VirtualMachine* v,int64_t idx); rabbit::Result sq_clear(rabbit::VirtualMachine* v,int64_t idx);
/*calls*/ /*calls*/
RABBIT_API rabbit::Result sq_call(rabbit::VirtualMachine* v,int64_t params,rabbit::Bool retval,rabbit::Bool raiseerror); rabbit::Result sq_call(rabbit::VirtualMachine* v,int64_t params,rabbit::Bool retval,rabbit::Bool raiseerror);
RABBIT_API rabbit::Result sq_resume(rabbit::VirtualMachine* v,rabbit::Bool retval,rabbit::Bool raiseerror); rabbit::Result sq_resume(rabbit::VirtualMachine* v,rabbit::Bool retval,rabbit::Bool raiseerror);
RABBIT_API const rabbit::Char *sq_getlocal(rabbit::VirtualMachine* v,uint64_t level,uint64_t idx); const rabbit::Char *sq_getlocal(rabbit::VirtualMachine* v,uint64_t level,uint64_t idx);
RABBIT_API rabbit::Result sq_getcallee(rabbit::VirtualMachine* v); rabbit::Result sq_getcallee(rabbit::VirtualMachine* v);
RABBIT_API const rabbit::Char *sq_getfreevariable(rabbit::VirtualMachine* v,int64_t idx,uint64_t nval); const rabbit::Char *sq_getfreevariable(rabbit::VirtualMachine* v,int64_t idx,uint64_t nval);
RABBIT_API rabbit::Result sq_throwerror(rabbit::VirtualMachine* v,const rabbit::Char *err); rabbit::Result sq_throwerror(rabbit::VirtualMachine* v,const rabbit::Char *err);
RABBIT_API rabbit::Result sq_throwobject(rabbit::VirtualMachine* v); rabbit::Result sq_throwobject(rabbit::VirtualMachine* v);
RABBIT_API void sq_reseterror(rabbit::VirtualMachine* v); void sq_reseterror(rabbit::VirtualMachine* v);
RABBIT_API void sq_getlasterror(rabbit::VirtualMachine* v); void sq_getlasterror(rabbit::VirtualMachine* v);
RABBIT_API rabbit::Result sq_tailcall(rabbit::VirtualMachine* v, int64_t nparams); rabbit::Result sq_tailcall(rabbit::VirtualMachine* v, int64_t nparams);
/*raw object handling*/ /*raw object handling*/
RABBIT_API rabbit::Result sq_getstackobj(rabbit::VirtualMachine* v,int64_t idx,rabbit::Object *po); rabbit::Result sq_getstackobj(rabbit::VirtualMachine* v,int64_t idx,rabbit::Object *po);
RABBIT_API void sq_pushobject(rabbit::VirtualMachine* v,rabbit::Object obj); void sq_pushobject(rabbit::VirtualMachine* v,rabbit::Object obj);
RABBIT_API void sq_addref(rabbit::VirtualMachine* v,rabbit::Object *po); void sq_addref(rabbit::VirtualMachine* v,rabbit::Object *po);
RABBIT_API rabbit::Bool sq_release(rabbit::VirtualMachine* v,rabbit::Object *po); rabbit::Bool sq_release(rabbit::VirtualMachine* v,rabbit::Object *po);
RABBIT_API uint64_t sq_getrefcount(rabbit::VirtualMachine* v,rabbit::Object *po); uint64_t sq_getrefcount(rabbit::VirtualMachine* v,rabbit::Object *po);
RABBIT_API void sq_resetobject(rabbit::Object *po); void sq_resetobject(rabbit::Object *po);
RABBIT_API const rabbit::Char *sq_objtostring(const rabbit::Object *o); const rabbit::Char *sq_objtostring(const rabbit::Object *o);
RABBIT_API rabbit::Bool sq_objtobool(const rabbit::Object *o); rabbit::Bool sq_objtobool(const rabbit::Object *o);
RABBIT_API int64_t sq_objtointeger(const rabbit::Object *o); int64_t sq_objtointeger(const rabbit::Object *o);
RABBIT_API float_t sq_objtofloat(const rabbit::Object *o); float_t sq_objtofloat(const rabbit::Object *o);
RABBIT_API rabbit::UserPointer sq_objtouserpointer(const rabbit::Object *o); rabbit::UserPointer sq_objtouserpointer(const rabbit::Object *o);
RABBIT_API rabbit::Result sq_getobjtypetag(const rabbit::Object *o,rabbit::UserPointer * typetag); rabbit::Result sq_getobjtypetag(const rabbit::Object *o,rabbit::UserPointer * typetag);
RABBIT_API uint64_t sq_getvmrefcount(rabbit::VirtualMachine* v, const rabbit::Object *po); uint64_t sq_getvmrefcount(rabbit::VirtualMachine* v, const rabbit::Object *po);
/*GC*/ /*GC*/
RABBIT_API int64_t sq_collectgarbage(rabbit::VirtualMachine* v); int64_t sq_collectgarbage(rabbit::VirtualMachine* v);
RABBIT_API rabbit::Result sq_resurrectunreachable(rabbit::VirtualMachine* v); rabbit::Result sq_resurrectunreachable(rabbit::VirtualMachine* v);
/*serialization*/ /*serialization*/
RABBIT_API rabbit::Result sq_writeclosure(rabbit::VirtualMachine* vm,SQWRITEFUNC writef,rabbit::UserPointer up); rabbit::Result sq_writeclosure(rabbit::VirtualMachine* vm,SQWRITEFUNC writef,rabbit::UserPointer up);
RABBIT_API rabbit::Result sq_readclosure(rabbit::VirtualMachine* vm,SQREADFUNC readf,rabbit::UserPointer up); rabbit::Result sq_readclosure(rabbit::VirtualMachine* vm,SQREADFUNC readf,rabbit::UserPointer up);
/*mem allocation*/ /*mem allocation*/
RABBIT_API void *sq_malloc(uint64_t size); void *sq_malloc(uint64_t size);
RABBIT_API void *sq_realloc(void* p,uint64_t oldsize,uint64_t newsize); void *sq_realloc(void* p,uint64_t oldsize,uint64_t newsize);
RABBIT_API void sq_free(void *p,uint64_t size); void sq_free(void *p,uint64_t size);
/*debug*/ /*debug*/
RABBIT_API rabbit::Result sq_stackinfos(rabbit::VirtualMachine* v,int64_t level,rabbit::StackInfos *si); rabbit::Result sq_stackinfos(rabbit::VirtualMachine* v,int64_t level,rabbit::StackInfos *si);
RABBIT_API void sq_setdebughook(rabbit::VirtualMachine* v); void sq_setdebughook(rabbit::VirtualMachine* v);
RABBIT_API void sq_setnativedebughook(rabbit::VirtualMachine* v,SQDEBUGHOOK hook); void sq_setnativedebughook(rabbit::VirtualMachine* v,SQDEBUGHOOK hook);
}
/* deprecated */ /* deprecated */
#define sq_createslot(v,n) sq_newslot(v,n,SQFalse) #define sq_createslot(v,n) sq_newslot(v,n,SQFalse)

File diff suppressed because it is too large Load Diff

View File

@ -10,8 +10,16 @@
#include <rabbit/Array.hpp> #include <rabbit/Array.hpp>
#include <rabbit/sqfuncproto.hpp> #include <rabbit/SharedState.hpp>
#include <rabbit/sqclosure.hpp>
#include <rabbit/String.hpp>
#include <rabbit/Table.hpp>
#include <rabbit/Closure.hpp>
#include <rabbit/RegFunction.hpp>
#include <rabbit/NativeClosure.hpp>
#include <rabbit/FunctionProto.hpp>
#include <rabbit/Generator.hpp>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>

View File

@ -8,7 +8,7 @@
#pragma once #pragma once
#include <etk/types.hpp> #include <etk/types.hpp>
#include <ctype.h>
#ifdef SQUSEDOUBLE #ifdef SQUSEDOUBLE
typedef double float_t; typedef double float_t;
#else #else

View File

@ -9,13 +9,20 @@
#include <stdarg.h> #include <stdarg.h>
#include <rabbit/VirtualMachine.hpp> #include <rabbit/VirtualMachine.hpp>
#include <rabbit/sqfuncproto.hpp>
#include <rabbit/sqclosure.hpp>
#include <rabbit/String.hpp>
#include <rabbit/Table.hpp>
#include <rabbit/Closure.hpp>
#include <rabbit/RegFunction.hpp>
#include <rabbit/NativeClosure.hpp>
#include <rabbit/FunctionProto.hpp>
#include <rabbit/Generator.hpp>
#include <rabbit/SharedState.hpp>
#include <rabbit/FunctionInfo.hpp> #include <rabbit/FunctionInfo.hpp>
#include <rabbit/StackInfos.hpp> #include <rabbit/StackInfos.hpp>
rabbit::Result sq_getfunctioninfo(rabbit::VirtualMachine* v,int64_t level,rabbit::FunctionInfo *fi) rabbit::Result rabbit::sq_getfunctioninfo(rabbit::VirtualMachine* v,int64_t level,rabbit::FunctionInfo *fi)
{ {
int64_t cssize = v->_callsstacksize; int64_t cssize = v->_callsstacksize;
if (cssize > level) { if (cssize > level) {
@ -33,7 +40,7 @@ rabbit::Result sq_getfunctioninfo(rabbit::VirtualMachine* v,int64_t level,rabbit
return sq_throwerror(v,_SC("the object is not a closure")); return sq_throwerror(v,_SC("the object is not a closure"));
} }
rabbit::Result sq_stackinfos(rabbit::VirtualMachine* v, int64_t level, rabbit::StackInfos *si) rabbit::Result rabbit::sq_stackinfos(rabbit::VirtualMachine* v, int64_t level, rabbit::StackInfos *si)
{ {
int64_t cssize = v->_callsstacksize; int64_t cssize = v->_callsstacksize;
if (cssize > level) { if (cssize > level) {

View File

@ -6,12 +6,13 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#include <etk/types.hpp>
#ifndef SQ_EXCLUDE_DEFAULT_MEMFUNCTIONS #ifndef SQ_EXCLUDE_DEFAULT_MEMFUNCTIONS
void *sq_vm_malloc(uint64_t size){ return malloc(size); } void *sq_vm_malloc(uint64_t size){ return malloc(size); }
void *sq_vm_realloc(void *p, uint64_t SQ_UNUSED_ARG(oldsize), uint64_t size){ return realloc(p, size); } void *sq_vm_realloc(void *p, uint64_t oldsize, uint64_t size){ return realloc(p, size); }
void sq_vm_free(void *p, uint64_t SQ_UNUSED_ARG(size)){ free(p); } void sq_vm_free(void *p, uint64_t size){ free(p); }
#endif #endif

View File

@ -6,6 +6,7 @@
* @license MPL-2 (see license file) * @license MPL-2 (see license file)
*/ */
#pragma once #pragma once
#include <etk/types.hpp>
void *sq_vm_malloc(uint64_t size); void *sq_vm_malloc(uint64_t size);
void *sq_vm_realloc(void *p,uint64_t oldsize,uint64_t size); void *sq_vm_realloc(void *p,uint64_t oldsize,uint64_t size);
@ -24,7 +25,7 @@ void sq_vm_free(void *p,uint64_t size);
#define _CONSTRUCT_VECTOR(type, size, ptr) { \ #define _CONSTRUCT_VECTOR(type, size, ptr) { \
for(int64_t n = 0; n < ((int64_t)size); n++) { \ for(int64_t n = 0; n < ((int64_t)size); n++) { \
new (&ptr[n]) type(); \ new ((char*)&ptr[n]) type(); \
} \ } \
} }