JSC Opaque-type에 대하여

Dev 2009. 8. 25. 11:30
웹킷 JavaScriptCore 소스를 보면 JSValue 타입이 있고, JSValueRef 타입이 있다. 그리고 그 둘 사이에 형변환을 처리하는 toRef() 함수와 toJS() 함수가 제공된다. JSC에는 JSxxxxRef 스타일의 타입들이 몇개 더 있는데, 다음과 같다. JSValueRef, JSObjectRef, JSContextRef, JSGlobalContextRef, JSStringRef, JSClassRef.

웹킷 소스코드에서 JSValueRef와 JSObjectRef의 선언을 보면 다음과 같다.
typedef const struct OpaqueJSValue* JSValueRef;
typedef struct OpaqueJSValue* JSObjectRef;

그런데 소스코드 어디에도 struct OpaqueJSValue에 대한 정의는 없다.
OpaqueJSValue는 이름이 의미하듯 JSValue를 위한 모호한(Opaque) 타입이다.
위 JSValueRef와 JSObjectRef 선언 구문이 의미하는 바는 "JSValueRef is not JSObjectRef", 그리고 "JSObjectRef is JSValueRef" 이다. 즉, JSValueRef를 인자로 쓰는 모든 함수에는 JSObjectRef 변수들도 전달할 수 있지만, JSObjectRef를 인자로 쓰는 함수에는 JSValueRef 변수를 전달할 수 없다는 의미다.

JSC에는 JSValue* 타입과 JSObject* 타입을 인자로 쓰는 구현부와 JSValueRef 타입과 JSObjectRef를 인자로 쓰는 구현부가 달리 존재한다. 논리적인 이유에 의해 구분된 것이 아니고, 역사적인 이유에 의해 구분된 것이라 추측한다. 명쾌한 답은 찾지 못했다. 누군가 댓글이나 피드백으로 일러주면 고맙겠다.



(끝)
Posted by ingeeC
,