2017-09-25 9 views
0

상황은 이렇습니다 : 객체 + 프로토 타입에 정의한 모든 함수에 단일 duktape/C 함수를 사용하고 싶습니다. 이를 위해 나는 함수 이름과 콜백 (실제로는 std::function)을 사용하는 함수 맵을 가지고 있으며, 그렇게 쉽게 일반적인 처리를 할 수 있고 콜백을 간단하게 할 수있다. (심지어 랭다를 사용할 수도있다.)duktape 용 중앙 기능 디스패처를 작성하는 방법은 무엇입니까?

이미 하나의 문제, 즉 다른 객체에 동일한 이름의 함수가있어 잘 작동합니다. 모호성을 제거하기 위해 이제 객체의 힙 포인터 (또는 객체 인 프로토 타입)를 추가 한정자로 사용합니다. 따라서 내 중앙 딱지/C 함수를 호출 할 때 함수가 전역 (즉 전역 개체에 정의되어 있는지) 여부를 먼저 확인합니다. 그게 실패하면 this 바인딩을 얻고 힙 포인터로 룩업을 수행합니다. 또한 실패 할 경우 프로토 타입 체인을 걷고 프로토 타입 중 하나에서 함수를 찾을 수 있는지 확인합니다.

이것은 this 바인딩이없는 경우 (또는 Function.prototype.apply()과 같은 잘못된 경우)를 제외하고는 99 %까지 잘 작동합니다.

내 질문에 대한 : 내 중앙 duktape/C 콜백 함수에 대한 원래 프로토 타입을 어떻게 얻을 수 있습니까?

답변

0

대답은 내가 처음 생각한 것보다 간단합니다. 중앙 함수 맵의 경우 함수 이름이 필요합니다. 그것은 객체 나 프로토 타입에 새로운 함수를 정의 할 때 생성 한 함수 객체의 속성으로 설정되어야합니다.

원본 개체/프로토 타입에도 동일한 접근 방식을 사용할 수 있습니다. 다른 속성 (예 : "ptr")으로 함수 객체에 역 참조를 추가하기 만하면됩니다. 이를 통해 함수의 이름뿐만 아니라 실행 컨텍스트를 쉽게 얻을 수 있습니다. 그리고 우리는 이미 올바른 객체/프로토 타입을 가지고 있기 때문에 상속 체인을 걷는 것이 필요하지 않습니다.