2010-06-18 2 views
29

포인트 클래스를 노출하는 official examples은 프로그램에 고정 된 수의 인스턴스가 있다고 가정합니다. 이 자바 스크립트에서 호출 될 때 C++ 코드에서 새 인스턴스가 어떻게 할당되는지는 명확하지 않습니다.V8 Javascript 엔진에서 C++ 클래스를 어떻게 노출 시켜서 새로운 것을 사용하여 생성 할 수 있습니까?

여러 인스턴스를 가질 수있는 클래스를 어떻게 노출합니까? 예를 들어, 이미지 클래스 :

var img1 = new Image(640, 480); 
var img2 = new Image(1024, 768); 

img1.clear("red"); 
img2.clear("black"); 

답변

-11

내가 정확히 V8 JS 엔진에서이를 달성하는 방법을 모르겠지만, 파이썬 세계에서, 당신은 다음과 같이 할 수 있습니다. 이미지 클래스 : 당신의 js 파일에 다음 코드를 추가

Image* Image_New(int w, int h) { return new Image(w, h); } 
void Image_Delete(Image* pImage) { delete pImage; } 
int Image_Width(const Image* pImage) { return pImage->Width(); } 

: 지금

var Image = function (w, h) { 
    this.image = new Image(w, h); 
    this.Width = function() { 
     return Image_Width(this.image); 
    }; 
}; 

class Image 
{ 
public: 
    Image(int w, int h); 
    int Width(void) const; 
}; 

일부 래퍼 함수를 ​​작성하고 JS 세계에 이러한 기능을 노출 코드 작업을 할 수 있습니다. 또한 위의 코드는 가비지 수집 메커니즘을 고려하지 않았으므로 일부주의를 기울여야합니다. 내 borken 영어에 대해 죄송합니다!

+0

정의 된 함수 내보내기는 어떻게됩니까? – Basilevs

+1

예, 파이썬은이를위한 훌륭한 API를 가지고 있습니다. 그래서 V8이 너무 혼란 스럽습니다! 왜 V8 :: FunctionTemplate :: SetClassAllocator (AllocateFn, FreeFn)은 없다? 내가 보관 된 버전의 링크를 업데이트 : –

+2

V8은 상단에 링크 된 블로그 게시물 죽은 – ShrekOverflow

30

이것은 가장 좋은 blog post I could find on exposing C++ objects to V8 Javascript입니다. 심도 깊게 들어가서 코드 스 니펫으로 작은 단계로 나눕니다. 경고 : 코드 스 니펫에는 불일치가 거의없고 이해하기 위해 여러 번 읽어야합니다. 간략한 요약을 미리 읽어 보면 도움이 될 수 있습니다.

  1. 개체는 V8 템플릿으로 묶어야합니다. 참고 : Google 샘플은 ObjectTemplates를 사용하지만 저자가 왜 FunctionTemplates를 선호하는지 설명합니다.
    1. FunctionTemplate을 만듭니다. 이 템플릿의 인스턴스에는 C++ 객체의 메모리 주소를 저장하는 내부 필드가 있습니다. 클래스의 접근 자 메서드도 가져옵니다.
    2. 이러한 FunctionTemplates 중 하나에서 C++ 개체를 래핑하는 wrapObject() 함수를 만듭니다.
  2. 생성자는 (다른) V8 템플릿으로 래핑되어야합니다. 원하지 않는 재귀를 피하기 위해 다른 템플릿이 사용됩니다. 두 템플릿을 하나로 결합하는 방법은 블로그 게시물의 끝에 설명되어 있습니다.
    1. 다른 FunctionTemplate을 만듭니다. 이 템플릿은 자바 스크립트 전역 범위 (new이 호출 될 곳)를 C++ 생성자에 연결하기 만하면됩니다.
    2. 템플릿에서 호출 할 메서드를 만듭니다. 이 메서드는 실제로 C++ new 연산자를 사용하고 C++ 클래스 생성자를 호출합니다. 그런 다음 1.2 단계에서 만든 wrapObject() 메서드를 호출하여 개체를 래핑합니다. 지금

, delete 있어야 단계 2.2에 할당 된 메모리는 시간 거라고. 업데이트 : 다음 블로그 항목은, " Persistent Handles는"자세하게 설명합니다. actual code alluded to in these blog posts

내 노트 :

  • 블로그에 wrapPoint() 방법은 실제 코드에서 unwrap() 방법과 실제로 유사하다; 하지wrap()
  • 하는 코드 사이에 다른 공통점을 찾을 수를 검색하려면 : constructorCall
  • 실제 코드는 정리를 수행하는 콜백 메소드를 설정 MakeWeak() 메소드를 사용하여 메모리 관리를 할 것, SetInternalFieldCount(0.
+0

하지만 파이썬 후 빠른 방법입니다 – xaxxon

+0

@xaxxon이 – Leftium

관련 문제