V8 Binding 노트
Web IDL은 DOM(Webkit)과 ECMAScript(V8, JavaScript Core, Objectc, GObject, CPP)의 귀속 규범을 정의했다.
새 바인딩을 추가하려면 다음 세 단계를 수행합니다.
만약 HTMLElement이 실현된다면
Step1: WebKit에서 HTMLElement이 필요합니다.
-WebCore/html/HTMLElement.{h,cpp}, etc
Step2: 적절한 IDL 파일을 작성해야 합니다.
-WebCore/html/HTMLElement.idl
Step3: Build 바인딩 코드가 자동으로 생성됩니다.
e.g
Step1: Write an IDL file
//Node.idl
interface Node{
attribute Node firstChild;
...;
};
Step2: generate the binding code
-Perl scripts in WebCore/binding/scripts parse the IDL file and auto-generate the binding code
IDL files
CodeGeneratorV8.pm
*.h,*.cpp
|
CodeGeneratorJS.pm
*.h,*.cpp
IDLParser.pm->
CodeGeneratorObjC.pm
*.h,*.cpp
CodeGeneratorGObject.pm
*.h,*.cpp
CodeGeneratorCPP.pm
*.h,*.cpp
Step3:
-An example of the generate code
//V8 calls back this method when div.firstChild is evaluated
static v8:Handle<v8::Value>
firstChildAttrGetter(..., const v8::AccessorInfo& info)
{
//Retrieve a Dom object from a V8 object.
Node* imp = V8Node::toNative(info.Holder());
//Call a WebKit method.
Node* firstChild = imp->firstChild();
//Convert a DOM object to a V8 object, and return.
return toV8(firstChild, ...);
}
********************************
Where you should check.
-IDL parser:
-WebCore/bindings/scripts/IDLParser.pm
-Code generators:
-WebCore/bindings/scripts/CodeGenerator{V8,JS,ObjeC,GObject,CPP}.pm
-Helper Perl scripts:
WebCore/bindings/scripts/*.pm
-Generated code for V8:
-src/out/{Release,Debug}/obj/gen/webkit/bindings/*.h
-src/out/{Release,Debug}/obj,gen/webcore/bindings/*.cpp
*************************
V8 Data
v8::Handle
v8:Value==> Data Type: Value, Integer, Boolean, String, Object, Function or ...etc
v8:Handle==>Data allocated: Handle, Local, Persistent.
V8을 사용하여 데이터를 전달할 때 데이터 유형은Value를 사용하고 용기는Handle을 사용한다. 즉, 최대한 사용한다.
V8::Handle
컨테이너:
1) Local
-Will be auto-deallocated when the current scope exits
-Don't hold the Local data on heap
2)Persistent
-Never deallocated unless you explicitly call Persistent::Dispose()
-Persistent::New() must be balanced with Persistent::Dispose()
3)Handle은 Local 및 Persistent의 상위 클래스
데이터 유형: Value는 루트 클래스입니다.
Object 및 Primitive는 Value에서 상속됨
Object 포함: Array, Function, Date, RegExp, BooleanObject, StringObject and NumberObject
Primitive에는 Boolean, Number, String, Integer, Int32 and Uint32가 포함됩니다.
Summary
V8 API Document in v8.h
V8 utility methods are documented in V8Binding.h
DOM Object:
V8XXX::toNative(): Wrapper => DOM
toV8(): DOM => Wrapper
Garbage Collection
V8/JSC knows te JavaScript object graph only
WebKit knows the DOM trees only
Bindings are responsible for managing the relationship between the two graphs.
How to tell the reachability to V8
(1) Override visitDOMWrapper() in your custom binding
(2) Add the reachability by v8::V8::AddImplicitReferences()
void V8NodeList::visitDOMWrapper(DOMDataStore* store, void* object, v8::Persistent<v8::Object> wrapper) {
NodeList* impl = static_cast<NodeList*>(object);
Node* owner = ... // Get the owner Node of impl
v8::Persistent<v8::Object> ownerWrapper = ... // Get the wrapper object of owner
if (/* the wrapper object exists */)
v8::V8::AddImplicitReferences(ownerWrapper, &wrapper, 1);
}
You need to add the references by visitDOMWrapper() and AddImplicitReferences()
V8 GC Design Redesigning V8 Garbage Collection for DOM Objects
https://docs.google.com/document/d/1OMG0fXB3DDvBaQ2YgxWLzzKjn9nWp8y_oTdQqFkBWhw/edit?pli=1
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.