Files
LayaNative2.0/Conch/source/conch/JSWrapper/JSInterface/JSC/JSCArrayBuffer.cpp
T
2020-11-11 16:17:13 +08:00

142 lines
4.1 KiB
C++

#ifdef JS_JSC
#include "JSCArrayBuffer.h"
#include <JavaScriptCore/JSTypedArray.h>
#include "JSCProxyTLS.h"
#include "util/Log.h"
#include <vector>
#include "JSCProxyType.h"
namespace laya {
//TODO 这里没有考虑多线程的问题,如果js要支持多线程的话,需要修改。
struct JsStrBuff {
char* _buff;
int _len;
static std::vector<JsStrBuff> jsstrbuffs;
static int curIdx;
JsStrBuff() {
_buff = NULL;
_len = 0;
}
static JsStrBuff& getAData() {
if (JsStrBuff::curIdx >= JsStrBuff::jsstrbuffs.size()) {
JsStrBuff::jsstrbuffs.push_back(JsStrBuff());
JsStrBuff::curIdx++;
return JsStrBuff::jsstrbuffs.back();
}
else {
return JsStrBuff::jsstrbuffs[JsStrBuff::curIdx++];
}
}
};
std::vector<JsStrBuff> JsStrBuff::jsstrbuffs;
int JsStrBuff::curIdx = 0;
void resetJsStrBuf() {
JsStrBuff::curIdx = 0;
}
char* JsCharToC(JSStringRef str) {
int len = 0;
if (str == nullptr)
return nullptr;//return "";
len = JSStringGetMaximumUTF8CStringSize(str);
if (len <= 0)
return nullptr;//return "";
JsStrBuff& curdata = JsStrBuff::getAData();
char*& tocharBuf = curdata._buff;
int& tocharBufLen = curdata._len;
//tocharBuf= new char[len + 1];
if (len > tocharBufLen) {
tocharBufLen = len;
if (tocharBuf != NULL)
delete[] tocharBuf;
tocharBuf = new char[len+1];
}
else {
//如果占用空间太大,也要重新分配
if (tocharBufLen > 1024 ) {
tocharBufLen = len;
if (tocharBuf != NULL)
delete[] tocharBuf;
tocharBuf = new char[len+1];
}
}
JSStringGetUTF8CString(str,tocharBuf,len);
return tocharBuf;
}
char* JsCharToC(JSValueRef p_vl) {
JSContextRef ctx = __TlsData::GetInstance()->GetCurContext();
JSStringRef str = JSValueToStringCopy(ctx, p_vl, nullptr);
if (str == nullptr)
return nullptr;//return "";
char* ret = JsCharToC(str);
JSStringRelease(str);
return ret;
}
}
namespace laya{
static void deallocator(void* bytes, void* deallocatorContext)
{
if (bytes){
delete (char*)bytes;
}
}
JSValueRef createJSAB(char* pData, int len)
{
JSContextRef ctx = __TlsData::GetInstance()->GetCurContext();
char* pBuffer = new char[len];
memcpy(pBuffer, pData, len);
return JSObjectMakeArrayBufferWithBytesNoCopy(ctx, pBuffer, len, deallocator, pBuffer, NULL);
}
JSValueRef createJSABAligned(char* pData, int len)
{
int asz = (len+3) & 0xfffffffc;
JSContextRef ctx = __TlsData::GetInstance()->GetCurContext();
char* pBuffer = new char[asz];
memcpy(pBuffer, pData, len);
for( int i = len; i < asz; i++ )
{
pBuffer[i] = 0;
}
return JSObjectMakeArrayBufferWithBytesNoCopy(ctx, pBuffer, asz, deallocator, pBuffer, NULL);
}
bool extractJSAB(JSValueRef ab, char*& data, int& len)
{
JSContextRef ctx = __TlsData::GetInstance()->GetCurContext();
JSObjectRef arrayObj = JSValueToObject(ctx,ab,NULL);
JSTypedArrayType arrayType = JSValueGetTypedArrayType(ctx, ab, NULL);
switch(arrayType)
{
case kJSTypedArrayTypeNone:
{
data = NULL;
len = 0;
return false;
}
break;
case kJSTypedArrayTypeArrayBuffer:
{
data = (char*)JSObjectGetArrayBufferBytesPtr(ctx, arrayObj, NULL);
len = (int)JSObjectGetArrayBufferByteLength(ctx, arrayObj, NULL);
return true;
}
break;
default:
{
data = (char*)JSObjectGetTypedArrayBytesPtr(ctx, arrayObj, NULL) + JSObjectGetTypedArrayByteOffset(ctx, arrayObj, NULL);
len = (int)JSObjectGetTypedArrayByteLength(ctx, arrayObj, NULL);
return true;
}
break;
}
}
}
#endif