/** @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 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 property, const v8::PropertyCallbackInfo& info) { v8::Isolate* isolate = info.GetIsolate(); v8::Local 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& args) { v8::Isolate* isolate = args.GetIsolate(); v8::Local 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& data) { JSArrayBufferRef* wrap = data.GetParameter(); wrap->persistentObject.Reset(); delete wrap; } static void New(const v8::FunctionCallbackInfo& args) { v8::Isolate* isolate = args.GetIsolate(); v8::Local 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 object) { v8::Isolate* isolate = v8::Isolate::GetCurrent(); v8::HandleScope sc(isolate); v8::Local functionTemplate = v8::FunctionTemplate::New(isolate, New); functionTemplate->SetClassName(v8::String::NewFromUtf8(isolate, "ArrayBufferRef", v8::NewStringType::kNormal).ToLocalChecked()); v8::Local instanceTemplate = functionTemplate->InstanceTemplate(); persistentObjectTemplate.Reset(isolate, instanceTemplate); instanceTemplate->SetInternalFieldCount(1); instanceTemplate->SetAccessor(v8::String::NewFromUtf8(isolate, "id"), _GetID, 0, v8::Local(), v8::DEFAULT, v8::ReadOnly); V8Util::SET_PROTOTYPE_METHOD(functionTemplate, "isSyncToRender", IsSyncToRender); v8::Local context = isolate->GetCurrentContext(); object->Set(v8::String::NewFromUtf8(isolate, "ArrayBufferRef"), functionTemplate->GetFunction(context).ToLocalChecked()); } } //------------------------------------------------------------------------------ //-----------------------------END FILE--------------------------------