Update to Squirrel 3.0.6
[supertux.git] / external / squirrel / sqstdlib / sqstdblob.cpp
old mode 100755 (executable)
new mode 100644 (file)
index 05ef8d9..59cff0d
@@ -15,7 +15,9 @@
 #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
@@ -115,7 +117,8 @@ static SQInteger _blob__typeof(HSQUIRRELVM v)
 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
@@ -127,10 +130,32 @@ static SQInteger _blob_constructor(HSQUIRRELVM v)
                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
@@ -146,6 +171,7 @@ static SQRegFunction _blob_methods[] = {
        _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