JavaScriptCore 분석
(WebKit rev 50723 기준)
JavaScriptCore 관련 소식/ ARM JIT 현황
l JSC 소스에 PLATFORM(ARM_THUMB2), PLATFORM(ARM_TRADITIONAL) 컴파일 플랙에 대한 구현부가 존재한다.
l WM6 포트에 적용할 수 있는지는 테스트해봐야 안다.
l 관련 뉴스 그룹 기사
n 2009/06/09: ARM JIT 릴리즈 됐다.
Today, we realized that there is a new ARM JIT port for WebKit.
(http://trac.webkit.org/changeset/44514> )
n 2009/10/22: WinMobile에서는 안된다.
The current implementation is designed for Linux
n 2009/04/01: ARM port of JIT 공시
on a Nokia N810, and we gained 13% performance improvement. The memory
consumption is increased by 3.3%.
JSC Class Diagram
다이어그램이 나타내는 내용 몇 가지를 다음과 같이 요약한다.
l 페이지의 root Frame과 WebView는 1:1 관계다.
n 동일한 WebView에서 페이지를 이동할 때, root Frame 인스턴스는 유지된다.
n 페이지에 따라 sub Frame들이 필요할 때가 있는데 sub Frame들은 페이지 이동시 생성되거나 소멸된다.
n 단 sub Frame의 소멸은 Cache 때문에 즉각적으로 이루어지지 않는다.
l Frame의 멤버로 ScriptController 인스턴스가 존재한다.
n ScriptController는 WebCore 세계에서 JSCore를 쉽게 호출하도록 캡슐화(창구를 단일화)하는 역할을 한다.
n WebCore가 페이지를 처리할 때, HTMLTokenParser가 JavaScript 소스 코드를 만나면 ScriptController::evaluate() 메소드를 호출한다. 그것으로 WebCore와 JSCore 사이의 모든 연결이 끝난다.
l JSGlobalData는 싱글톤 객체로 system wide하게 1개 존재하며, 시스템과 life-cycle을 같이 한다.
n JSGlobalData는 JSC 동작에 필요한 모든 것을 나타낸다 (Lexer, Parser, Interpreter, and Data).
l JSC::GlobalObject의 실 구현체는 WebCore::JSDOMWindow 이다.
n JSDOMWindow는 Frame에 속해 있다.
l ExecState는 JSCore의 실행 상태에 관한 모든 것을 나타낸다.
n Mostly, an ExecState represents the state of execution in the VM. (Geoffrey Garen)
n ExecState는 JSGlobalObject에 의해 생성/초기화 되며, JSGlobalObject와 life-cycle을 함께 한다.
l JSContextRef는 ExecState와 동일하다.
n JavaScriptCore/API/ 폴더 아래 있는 JSC public API을 호출하기 위해 정의한 타입이다.
n JSC public API는 C based API 이다. 이 때문에 ExecState* 객체 타입을 JSContextRef 타입으로 변환해서 사용해야 한다. 타입 변환을 위해 toRef()와 toJS() 함수를 사용한다.
n toRef()와 toJS() 함수는 타입 캐스팅만 수행하는 inline 함수다. 때문에 런타임 실행 오버헤드가 없다 (컴파일 타임에 처리됨).
JavaScript 소스코드 실행 시퀀스,
JSGlobalObject& ExecState 생성/초기화 시퀀스
l JS 코드가 없는 페이지에서는 JSGlobalObject와 ExecState가 생성/초기화 되지 않는다.
l JSGlobalObject와 ExecState 인스턴스는 JS 코드가 존재하는 페이지에서만 생성/초기화 된다.
(이상입니다.)