// // JSCProxyTrnasfer.h // jsc_test // // Created by 蒋 宇彤 on 13-11-25. // Copyright (c) 2013年 蒋 宇彤. All rights reserved. // #ifndef jsc_test_JSCProxyTrnasfer_h #define jsc_test_JSCProxyTrnasfer_h #include #include #include #include "JSArrayBuffer.h" //#include "JsBinder.h" using namespace v8; namespace laya{ //为了能快速返回js的字符串,现在转字符串的函数使用了通用buffer, //为了能同时返回多个buffer指针,就用了一个vector,为了避免vector一直增加,内存泄露 //就用了这个函数。具体看代码。 void resetJsStrBuf(); template Local createJsObjAttachCObj(T* cobj, bool weak); template class __TransferToCpp{public: static T ToCpp( Local p_vl ){ // 这是很危险的 if( !p_vl.IsEmpty() && p_vl->IsObject() ){ return static_cast((p_vl.As())->GetAlignedPointerFromInternalField(0)); }else{ return (T)0; } } //问题:如果是对象的话,当请求 T或者T* 认为是相同的 static bool is(Local p_vl) { if (!p_vl->IsObject()) return false; Local obj = p_vl.As(); if (obj->InternalFieldCount() < 2) return false; void* pdt = obj->GetAlignedPointerFromInternalField(1); if( pdt == &T::JSCLSINFO) { return true; } return false; } }; //不知道怎么区分对象和对象指针,先硬写一个 template class __TransferToCpp { public: static T* ToCpp(Local p_vl) { // 这是很危险的 if (!p_vl.IsEmpty() && p_vl->IsObject()) { Local obj = p_vl.As(); return static_cast(obj->GetAlignedPointerFromInternalField(0)); } else { return (T*)0; } } //问题:如果是对象的话,当请求 T或者T* 认为是相同的 static bool is(Local p_vl) { if (!p_vl->IsObject()) return false; Local obj = p_vl.As(); void* pdt = obj->GetAlignedPointerFromInternalField(1); if (pdt == &T::JSCLSINFO) { return true; } return false; } }; template <> class __TransferToCpp { public: static int32_t ToCpp(Local p_vl) { return p_vl->Int32Value(); } static bool is(Local p_vl) { return p_vl->IsInt32(); } }; template <> class __TransferToCpp { public: static int64_t ToCpp(Local p_vl) { return p_vl->IntegerValue(); } static bool is(Local p_vl) { return p_vl->IsNumber(); } }; template <> class __TransferToCpp { public: static uint32_t ToCpp(Local p_vl) { return p_vl->Uint32Value(); } static bool is(Local p_vl) { return p_vl->IsUint32(); } }; template <> class __TransferToCpp { public: static uint64_t ToCpp(Local p_vl) { return (uint64_t)p_vl->IntegerValue(); } static bool is(Local p_vl) { return p_vl->IsNumber(); } }; // template <> class __TransferToCpp{public: // static int ToCpp( Local p_vl ){return p_vl->Int32Value();} // static bool is(Local p_vl) { return p_vl->IsInt32(); } //}; //template <> class __TransferToCpp {public: // static short ToCpp(Local p_vl) { return p_vl->Int32Value(); } // static bool is(Local p_vl) { return p_vl->IsInt32(); } //}; // template <> class __TransferToCpp {public: // static unsigned int ToCpp( Local p_vl ){return p_vl->Uint32Value();} // static bool is(Local p_vl) { return p_vl->IsUint32(); } //}; // template <> class __TransferToCpp{public: // static long ToCpp( Local p_vl ){return p_vl->Int32Value();} // static bool is(Local p_vl) { return p_vl->IsInt32(); } //}; // template <> class __TransferToCpp{public: // static unsigned long ToCpp( Local p_vl ){return p_vl->Uint32Value();} // static bool is(Local p_vl) { return p_vl->IsUint32(); } //}; template <> class __TransferToCpp{public: static bool ToCpp( Local p_vl ){return p_vl->BooleanValue();} static bool is(Local p_vl) { return p_vl->IsBoolean(); } }; template <> class __TransferToCpp{public: static float ToCpp( Local p_vl ){return (float)p_vl->NumberValue();} static bool is(Local p_vl) { return p_vl->IsNumber(); } }; template <> class __TransferToCpp{public: static double ToCpp( Local p_vl ){return p_vl->NumberValue();} static bool is(Local p_vl) { return p_vl->IsNumber(); } }; // template <> class __TransferToCpp{public: // static long long ToCpp( Local p_vl ){return p_vl->IntegerValue();} // static bool is(Local p_vl) { return p_vl->IsNumber(); } //}; // template <> class __TransferToCpp{public: // static unsigned long long ToCpp( Local p_vl ){return (unsigned long long)p_vl->IntegerValue();} // static bool is(Local p_vl) { return p_vl->IsNumber(); } //}; template <> class __TransferToCpp>{public: static Local ToCpp(Local p_vl) { return p_vl; } static bool is(Local p_vl) { return true; } }; //注意:这个函数返回的字符串使用了一个通用buffer,所以注意复制。 //这个函数必须配合 resetJsStrBuf 函数使用。 //例如 // char* p1 = JsCharToC(args[0]); // char* p2 = JsCharToC(args[1]); // use(p1,p2); // resetJsStrBuf(); char* JsCharToC(Local p_vl); class transToCharPtr { public: static char *ToCpp1(Local p_vl) { String::Utf8Value utf8str(p_vl->ToString()); //return *utf8str; //下面有泄露 char *pRet = 0; size_t len; if (0 != *utf8str && 0 != (len = strlen(*utf8str))){ pRet = new char[len + 1]; memcpy(pRet, *utf8str, len + 1); } return pRet; } static std::string ToCppStd(Local p_vl) { String::Utf8Value utf8str(p_vl->ToString()); return std::string(*utf8str); } }; template <> class __TransferToCpp {public: //注意:这个函数返回的字符串使用了一个通用buffer,所以注意复制 static char* ToCpp(Local p_vl) { return JsCharToC(p_vl); } static bool is(Local p_vl) { return p_vl->IsString(); } static std::string ToCppStd(Local p_vl) { return transToCharPtr::ToCppStd(p_vl); } }; template <> class __TransferToCpp {public: //注意:这个函数返回的字符串使用了一个通用buffer,所以注意复制 static const char* ToCpp(Local p_vl) { return (const char*)JsCharToC(p_vl); } static bool is(Local p_vl) { return p_vl->IsString(); } static std::string ToCppStd(Local p_vl) { return transToCharPtr::ToCppStd(p_vl); } }; template <> class __TransferToCpp {public: //注意:这个函数返回的字符串使用了一个通用buffer,所以注意复制 static unsigned char* ToCpp(Local p_vl) { return (unsigned char*)JsCharToC(p_vl); } static bool is(Local p_vl) { return p_vl->IsString(); } static std::string ToCppStd(Local p_vl) { return transToCharPtr::ToCppStd(p_vl); } }; template <> class __TransferToCpp {public: //注意:这个函数返回的字符串使用了一个通用buffer,所以注意复制 static const unsigned char* ToCpp(Local p_vl) { return (const unsigned char*)JsCharToC(p_vl); } static bool is(Local p_vl) { return p_vl->IsString(); } static std::string ToCppStd(Local p_vl) { return transToCharPtr::ToCppStd(p_vl); } }; //template<> class __TransferToCpp{public: // static bool is(Local p_vl) { return p_vl->IsArrayBuffer() || p_vl->IsArrayBufferView(); } // static laya::JSArrayBuffer* ToCpp(Local p_vl) { return laya::JSArrayBuffer::fromeJSObj(p_vl); }; //}; template class __TransferToJs{ public:static Handle ToJs(T* p_vl) { return laya::createJsObjAttachCObj(p_vl,true); } }; //为什么不直接把没有参数作为void? template <> class __TransferToJs {public:static Handle ToJs( int p_vl ) { if(0==p_vl) return Undefined(Isolate::GetCurrent()); else return Null(Isolate::GetCurrent()); }}; template <> class __TransferToJs>{ public:static Handle ToJs(v8::Local p_vl) { return p_vl; } }; template <> class __TransferToJs > { public:static Handle ToJs(v8::Local p_vl) { return p_vl; } }; template <> class __TransferToJs {public:static Handle ToJs( bool p_vl ){return Boolean::New(Isolate::GetCurrent(),p_vl);}}; template <> class __TransferToJs {public:static Handle ToJs( int p_vl ){return Int32::New(Isolate::GetCurrent(), p_vl);}}; template <> class __TransferToJs {public:static Handle ToJs( unsigned int p_vl ){return Uint32::New(Isolate::GetCurrent(), p_vl);}}; template <> class __TransferToJs { public:static Handle ToJs(long unsigned int p_vl) { return Number::New(Isolate::GetCurrent(), p_vl); } }; template <> class __TransferToJs {public:static Handle ToJs( float p_vl ){return Number::New(Isolate::GetCurrent(), p_vl);}}; template <> class __TransferToJs {public:static Handle ToJs( double p_vl ){return Number::New(Isolate::GetCurrent(), p_vl);}}; template <> class __TransferToJs { public: static Handle ToJs( long long p_vl ) { return Number::New(Isolate::GetCurrent(), (double)p_vl); } static Handle ToJsDate( long long p_vl ) { return Date::New(Isolate::GetCurrent(), (double)p_vl ); } }; template <> class __TransferToJs { public: static Handle ToJs( long p_vl ) { return Number::New(Isolate::GetCurrent(), (double)p_vl); } static Handle ToJsDate( long p_vl ) { return Date::New(Isolate::GetCurrent(), (double)p_vl ); } }; template <> class __TransferToJs { public: static Handle ToJs( unsigned long long p_vl ) { return Number::New(Isolate::GetCurrent(), (double)p_vl); } static Handle ToJsDate( unsigned long long p_vl ) { return Date::New(Isolate::GetCurrent(), (double)p_vl ); } }; template <> class __TransferToJs {public:static Handle ToJs( char *p_vl ){if(p_vl==0) p_vl=(char*)""; return String::NewFromUtf8(Isolate::GetCurrent(),p_vl);}}; template <> class __TransferToJs {public:static Handle ToJs( const char *p_vl ){if(p_vl==0) p_vl=(const char *)""; return String::NewFromUtf8(Isolate::GetCurrent(),p_vl);}}; template <> class __TransferToJs {public:static Handle ToJs( const unsigned char*p_vl ){if(p_vl==0) p_vl=(const unsigned char*)""; return String::NewFromUtf8(Isolate::GetCurrent(),(const char *)p_vl);}}; template <> class __TransferToJs {public:static Handle ToJs( const unsigned char *p_vl ){if(p_vl==0) p_vl=(const unsigned char *)""; return String::NewFromUtf8(Isolate::GetCurrent(),(const char *)p_vl);}}; template <> class __TransferToJs {public:static Handle ToJs( std::string p_vl ){return String::NewFromUtf8(Isolate::GetCurrent(), p_vl.c_str());}}; template <> class __TransferToJs { public:static Handle ToJs(std::string& p_vl) { return String::NewFromUtf8(Isolate::GetCurrent(), p_vl.c_str()); } }; //template <> class __TransferToJs //{public:static Handle ToJs( laya::JSArrayBuffer* p_vl ){return p_vl->toLocal();}}; template class __JsArray{ public: static Handle ToJsArray(const std::vector& p_v1) { int size=p_v1.size(); if(0==size) { Handle __array = Array::New(Isolate::GetCurrent(), 0); return __array; } else { Handle __array = Array::New(Isolate::GetCurrent(), size); for(int i=0;iSet(i, __JSCProxy_class::GetInstance()->TransferObjPtrToJS(p_v1.at(i))); __array->Set(i, __TransferToJs::ToJs(p_v1.at(i))); } return __array; } } static Handle ToJsArray(const std::vector& p_v1) { int size = p_v1.size(); if (0 == size) { Handle __array = Array::New(Isolate::GetCurrent(), 0); return __array; } else { Handle __array = Array::New(Isolate::GetCurrent(), size); for (int i = 0; iSet(i, __JSCProxy_class::GetInstance()->TransferObjPtrToJS(p_v1.at(i))); __array->Set(i, __TransferToJs::ToJs(p_v1.at(i))); } return __array; } } }; class __JsByteArray { public: static Handle ToJsByteArray( const unsigned char *p_vl, int p_iSize ) { if( 0 == p_vl || p_iSize <= 0 ) { return Null(Isolate::GetCurrent()); } else { Handle __array = Array::New(Isolate::GetCurrent(), p_iSize); for(int i=0;iSet( i, Int32::New(Isolate::GetCurrent(), p_vl[i]) ); } return __array; } } }; template class __TransferToJs > { public:static Handle ToJs( const std::vector& p_vl ) { return __JsArray::ToJsArray(p_vl); } }; template class __TransferToJs > { public:static Handle ToJs(const std::vector& p_vl) { return __JsArray::ToJsArray(p_vl); } }; } #endif