Files
LayaNative2.0/Conch/source/webglPlus/v8/JSArrayBufferRef.cpp
T
2020-11-11 16:17:13 +08:00

120 lines
4.3 KiB
C++

/**
@file JSArrayBufferRef.cpp
@brief
@author James
@version 1.0
@date 2017_11_29
*/
#include "JSArrayBufferRef.h"
#include "../JCWebGLPlus.h"
#include "V8Util.h"
namespace laya
{
v8::Persistent<v8::ObjectTemplate> JSArrayBufferRef::persistentObjectTemplate;
JSArrayBufferRef::JSArrayBufferRef()
{
if (JSObjNode::s_pListJSObj)
{
JSObjNode::s_pListJSObj->push_back(this);
}
m_nID = 0;
m_bSyncToRender = false;
v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(128);
}
JSArrayBufferRef::~JSArrayBufferRef()
{
if (JSObjNode::s_pListJSObj)
{
JSObjNode::s_pListJSObj->delNode(this);
}
callManagerRemoveArrayBuffer();
}
void JSArrayBufferRef::callManagerRemoveArrayBuffer()
{
if (JCWebGLPlus::getInstance()->m_nThreadMODE == THREAD_MODE_DOUBLE)
{
if (m_bSyncToRender)
{
JCWebGLPlus::getInstance()->m_pJSABManagerSyncToRender->prepareRemoveArrayBuffer(m_nID);
}
else
{
JCWebGLPlus::getInstance()->m_pJSArrayBufferManager->removeArrayBuffer(m_nID);
}
}
else
{
JCWebGLPlus::getInstance()->m_pJSArrayBufferManager->removeArrayBuffer(m_nID);
}
}
int JSArrayBufferRef::getID()
{
return m_nID;
}
bool JSArrayBufferRef::getIsSyncToRender()
{
return m_bSyncToRender;
}
static void _GetID(v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Value>& info)
{
v8::Isolate* isolate = info.GetIsolate();
v8::Local<v8::Object> pthis = info.This();
JSArrayBufferRef* self = (JSArrayBufferRef*)pthis->GetAlignedPointerFromInternalField(0);
int v = self->getID();
info.GetReturnValue().Set(v8::Int32::New(isolate, v));
}
static void IsSyncToRender(const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::Isolate* isolate = args.GetIsolate();
v8::Local<v8::Object> pthis = args.This();
JSArrayBufferRef *pObj = (JSArrayBufferRef*)(pthis->GetAlignedPointerFromInternalField(0));
bool value = pObj->getIsSyncToRender();
args.GetReturnValue().Set(v8::Boolean::New(isolate, value));
}
void JSArrayBufferRef::WeakCallback(const v8::WeakCallbackInfo<JSArrayBufferRef>& data)
{
JSArrayBufferRef* wrap = data.GetParameter();
wrap->persistentObject.Reset();
delete wrap;
}
static void New(const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::Isolate* isolate = args.GetIsolate();
v8::Local<v8::Context> context = isolate->GetCurrentContext();
if (args.IsConstructCall())
{
JSArrayBufferRef* obj = new JSArrayBufferRef();
args.This()->SetAlignedPointerInInternalField(0, obj);
obj->persistentObject.Reset(isolate, args.This());
obj->persistentObject.SetWeak(obj, JSArrayBufferRef::WeakCallback, v8::WeakCallbackType::kParameter);
args.GetReturnValue().Set(args.This());
}
}
void JSArrayBufferRef::exportJS(v8::Local<v8::Object> object)
{
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::HandleScope sc(isolate);
v8::Local<v8::FunctionTemplate> functionTemplate = v8::FunctionTemplate::New(isolate, New);
functionTemplate->SetClassName(v8::String::NewFromUtf8(isolate, "ArrayBufferRef", v8::NewStringType::kNormal).ToLocalChecked());
v8::Local<v8::ObjectTemplate> instanceTemplate = functionTemplate->InstanceTemplate();
persistentObjectTemplate.Reset(isolate, instanceTemplate);
instanceTemplate->SetInternalFieldCount(1);
instanceTemplate->SetAccessor(v8::String::NewFromUtf8(isolate, "id"), _GetID, 0, v8::Local<v8::Value>(), v8::DEFAULT, v8::ReadOnly);
V8Util::SET_PROTOTYPE_METHOD(functionTemplate, "isSyncToRender", IsSyncToRender);
v8::Local<v8::Context> context = isolate->GetCurrentContext();
object->Set(v8::String::NewFromUtf8(isolate, "ArrayBufferRef"), functionTemplate->GetFunction(context).ToLocalChecked());
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------