웹킷 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 ingee

댓글을 달아 주세요

  1. ingee 2010.01.06 13:30 신고  댓글주소  수정/삭제  댓글쓰기

    이유를 알았다.
    xxxRef 계열의 타입을 쓰는 API set은 구현과 무관한 인터페이스이다.
    JavaScriptCore는 내부적 구현 방식을 몇번이나 통째로 갈아 엎은 역사가 있다. 그런 변화가 있더라도 JSC를 사용하는 코드에 미치는 영향을 최소화 할 수 있도록, 구현 방식과 무관한 함수 set을 제공하는 것이라 한다.