#define SETUP_BLOB(v) \\r
SQBlob *self = NULL; \\r
{ if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_BLOB_TYPE_TAG))) \\r
- return SQ_ERROR; }\r
+ return sq_throwerror(v,_SC("invalid type tag")); } \\r
+ if(!self || !self->IsValid()) \\r
+ return sq_throwerror(v,_SC("the blob is invalid"));\r
\r
\r
static SQInteger _blob_resize(HSQUIRRELVM v)\r
static SQInteger _blob_releasehook(SQUserPointer p, SQInteger size)\r
{\r
SQBlob *self = (SQBlob*)p;\r
- delete self;\r
+ self->~SQBlob();\r
+ sq_free(self,sizeof(SQBlob));\r
return 1;\r
}\r
\r
sq_getinteger(v, 2, &size);\r
}\r
if(size < 0) return sq_throwerror(v, _SC("cannot create blob with negative size"));\r
- SQBlob *b = new SQBlob(size);\r
+ //SQBlob *b = new SQBlob(size);\r
+\r
+ SQBlob *b = new (sq_malloc(sizeof(SQBlob)))SQBlob(size);\r
if(SQ_FAILED(sq_setinstanceup(v,1,b))) {\r
- delete b;\r
- return sq_throwerror(v, _SC("cannot create blob with negative size"));\r
+ b->~SQBlob();\r
+ sq_free(b,sizeof(SQBlob));\r
+ return sq_throwerror(v, _SC("cannot create blob"));\r
+ }\r
+ sq_setreleasehook(v,1,_blob_releasehook);\r
+ return 0;\r
+}\r
+\r
+static SQInteger _blob__cloned(HSQUIRRELVM v)\r
+{\r
+ SQBlob *other = NULL;\r
+ { \r
+ if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&other,(SQUserPointer)SQSTD_BLOB_TYPE_TAG)))\r
+ return SQ_ERROR; \r
+ }\r
+ //SQBlob *thisone = new SQBlob(other->Len());\r
+ SQBlob *thisone = new (sq_malloc(sizeof(SQBlob)))SQBlob(other->Len());\r
+ memcpy(thisone->GetBuf(),other->GetBuf(),thisone->Len());\r
+ if(SQ_FAILED(sq_setinstanceup(v,1,thisone))) {\r
+ thisone->~SQBlob();\r
+ sq_free(thisone,sizeof(SQBlob));\r
+ return sq_throwerror(v, _SC("cannot clone blob"));\r
}\r
sq_setreleasehook(v,1,_blob_releasehook);\r
return 0;\r
_DECL_BLOB_FUNC(_get,2,_SC("xn")),\r
_DECL_BLOB_FUNC(_typeof,1,_SC("x")),\r
_DECL_BLOB_FUNC(_nexti,2,_SC("x")),\r
+ _DECL_BLOB_FUNC(_cloned,2,_SC("xx")),\r
{0,0,0,0}\r
};\r
\r