#include "v8_binder.h" #include "c-api.h" #include "cxx-api.hpp" #include "JsConverter.h" #include "js_wrapper_macros.h" using namespace v8; Envelope PointEnvelope("Point"); Envelope CircleEnvelope("Circle"); /* C function wrapper */ Handle whatnumber_wrapper(const Arguments& args) { HandleScope scope; REQUIRE_ARGS_LENGTH(2); JsValueConverter arg0(args[0]); JsValueConverter arg1(args[1]); return scope.Close(toJS(whatnumber(arg0.toC(), arg1.toC()))); } /* Introduce C function in JavaScript namespace */ void whatnumber_initOnLoad(Handle target) { DEFINE_JS_FUNCTION(target, "whatnumber", whatnumber_wrapper); } // c++ class wrapper... /* Implementation of JS "new Point" */ Handle Point_new_wrapper(const Arguments &args) { HandleScope scope; REQUIRE_CONSTRUCTOR_CALL(); REQUIRE_ARGS_LENGTH(2); JsValueConverter arg0(args[0]); JsValueConverter arg1(args[1]); Point * p = new Point(arg0.toC(), arg1.toC()); wrapPointerInObject(p, PointEnvelope, args.This()); return args.This(); } /* Point::quadrant() */ Handle Point_quadrant_wrapper(const Arguments &args) { HandleScope scope; REQUIRE_ARGS_LENGTH(0); Point *p = unwrapPointer(args.Holder()); return scope.Close(toJS(p->quadrant())); } /* Introduce Point in JavaScript namespace */ void Point_initOnLoad(Handle target) { Local JSPoint; DEFINE_JS_CLASS(JSPoint, "Point", Point_new_wrapper); DEFINE_JS_METHOD(JSPoint, "quadrant", Point_quadrant_wrapper); DEFINE_JS_CONSTRUCTOR(target, "Point", JSPoint); } /* Circle */ Handle Circle_new_wrapper(const Arguments &args) { HandleScope scope; REQUIRE_ARGS_LENGTH(2); JsValueConverter arg0(args[0]); JsValueConverter arg1(args[1]); Circle * c = new Circle(* arg0.toC(), arg1.toC()); wrapPointerInObject(c, CircleEnvelope, args.This()); return args.This(); } Handle Circle_area_wrapper(const Arguments &args) { HandleScope scope; REQUIRE_ARGS_LENGTH(0); Circle *c = unwrapPointer(args.Holder()); return scope.Close(toJS(c->area())); } void Circle_initOnLoad(Handle target) { Local JSCircle; DEFINE_JS_CLASS(JSCircle, "Circle", Circle_new_wrapper); DEFINE_JS_METHOD(JSCircle, "area", Circle_area_wrapper); DEFINE_JS_CONSTRUCTOR(target, "Circle", JSCircle); } /* Initializer for the whole module */ void initAllOnLoad(Handle target) { Point_initOnLoad(target); Circle_initOnLoad(target); whatnumber_initOnLoad(target); } /* FINAL STEP. This macro associates the module name with its initializer function */ V8BINDER_LOADABLE_MODULE(mapper, initAllOnLoad)