#include #include "jsmagic.h" class ProxyClass{ public: /* ProxyClass leads the execution to code implemented in JavaScript */ ProxyClass(int ID) : ID(ID) {}; virtual int Stub0(int arg1, int arg2, int arg3, int arg4){ return magicallyExecuteJSFunction(ID, 0, arg1, arg2, arg3, arg4); } virtual int Stub1(int arg1, int arg2, int arg3, int arg4){ return magicallyExecuteJSFunction(ID, 1, arg1, arg2, arg3, arg4); } int ID; }; void CreateInstance(int ID, void **result){ ProxyClass* pc = new ProxyClass(ID); *result = reinterpret_cast(pc); } class JSComponentMath{ public: /* not implemented */ virtual int add(int op1, int op2){ return 0; }; virtual int mul(int op1, int op2){ return 0; }; }; class JSComponentImage{ public: /* not implemented */ virtual int drawLine(int startX, int startY, int endX, int endY){ return 0; }; virtual int drawCircle(int x, int y, int radius){ return 0; }; }; int main(){ JSComponentMath *jscMath; CreateInstance(JSC_ID_MATH, reinterpret_cast(&jscMath)); // At runtime, jscMath is of type ProxyClass, which means that the vtable of // ProxyClass is used at the virtual callsites below. jscMath->add(5, 10); jscMath->mul(3, 7); JSComponentImage *jscImage; CreateInstance(JSC_ID_IMAGE, reinterpret_cast(&jscImage)); // At runtime, jscImage is of type ProxyClass, which means that the vtable of // ProxyClass is used at the virtual callsites below. jscImage->drawLine(0, 0, 200, 200); jscImage->drawCircle(100, 100, 50); return 0; }