static JSBool call(JSContext* js_context, JSObject* UNUSED(obj), uintN argc, jsval* argv, jsval* retval) { VALUE ruby_context = (VALUE)JS_GetContextPrivate(js_context); JohnsonContext* context; JohnsonRuntime* runtime; Data_Get_Struct(ruby_context, JohnsonContext, context); VALUE ruby_runtime = (VALUE)JS_GetRuntimePrivate(JS_GetRuntime(js_context)); Data_Get_Struct(ruby_runtime, JohnsonRuntime, runtime); PREPARE_JROOTS(js_context, 0); VALUE self = (VALUE)JS_GetInstancePrivate(context->js, JSVAL_TO_OBJECT(JS_ARGV_CALLEE(argv)), &JSLandCallableProxyClass, NULL); VALUE args = rb_ary_new(); uintN i; for (i = 0; i < argc; ++i) rb_ary_push(args, CONVERT_TO_RUBY(runtime, argv[i])); JCHECK(call_ruby_from_js(runtime, retval, Johnson_SpiderMonkey_JSLandProxy(), rb_intern("send_with_possible_block"), 3, self, ID2SYM(rb_intern("call")), args)); JRETURN; }
static JSBool perlsub_call( JSContext *cx, DEFJSFSARGS_ ) { dTHX; DECJSFSARGS; JSObject *func = JSVAL_TO_OBJECT(JS_ARGV_CALLEE(argv)); SV *callee = (SV *)JS_GetPrivate(cx, func); JSObject *This = JSVAL_TO_OBJECT(argv[-1]); JSClass *clasp = PJS_GET_CLASS(cx, This); SV *caller; JSBool wanta, isclass = JS_FALSE; if(!JS_GetProperty(cx, func, "$wantarray", rval) || !JS_ValueToBoolean(cx, *rval, &wanta)) return JS_FALSE; PJS_DEBUG1("In PSC: obj is %s\n", PJS_GET_CLASS(cx, obj)->name); if(clasp == &perlpackage_class) { if(!JS_GetProperty(cx, This, "$__im_a_class", rval) || !JS_ValueToBoolean(cx, *rval, &isclass)) return JS_FALSE; } if(isclass || ( clasp == &perlsub_class /* Constructors has a Stash in __proto__ */ && (func = JS_GetPrototype(cx, This)) && PJS_GET_CLASS(cx, func) == &perlpackage_class) ) { // Caller is a stash, make a static call char *pkgname = PJS_GetPackageName(aTHX_ cx, This); if(!pkgname) return JS_FALSE; caller = newSVpv(pkgname, 0); PJS_DEBUG1("Caller is a stash: %s\n", pkgname); #if JS_VERSION >= 185 Safefree(pkgname); #endif } else if(IS_PERL_CLASS(clasp) && sv_isobject(caller = (SV *)JS_GetPrivate(cx, This)) ) { // Caller is a perl object SvREFCNT_inc_void_NN(caller); PJS_DEBUG1("Caller is an object: %s\n", SvPV_nolen(caller)); } else { caller = NULL; PJS_DEBUG1("Caller is %s\n", clasp->name); } return PJS_Call_sv_with_jsvals(aTHX_ cx, obj, callee, caller, argc, argv, rval, wanta ? G_ARRAY : G_SCALAR); }
static JSBool construct(JSContext *cx, JSObject *thisPtr, uintN argc, jsval *argv, jsval *rval) { JSObject *obj = JSVAL_TO_OBJECT(JS_ARGV_CALLEE(argv)); if (resolverHasMethod(cx, obj, "construct")) return delegateNativeToResolver("construct", cx, thisPtr, obj, argc, argv, rval); JS_ReportError(cx, "Either the object can't be used as a constructor, or " "the caller doesn't have permission to use it."); return JS_FALSE; }
static JSBool call(JSContext *cx, JSObject *thisPtr, uintN argc, jsval *argv, jsval *rval) { JSObject *obj = JSVAL_TO_OBJECT(JS_ARGV_CALLEE(argv)); if (resolverHasMethod(cx, obj, "call")) return delegateNativeToResolver("call", cx, thisPtr, obj, argc, argv, rval); JS_ReportError(cx, "Either the object isn't callable, or the caller " "doesn't have permission to call it."); return JS_FALSE; }
static JSBool perlsub_construct( JSContext *cx, DEFJSFSARGS_ ) { dTHX; DECJSFSARGS; JSObject *func = JSVAL_TO_OBJECT(JS_ARGV_CALLEE(argv)); SV *callee = (SV *)JS_GetPrivate(cx, func); SV *caller = NULL; #if JS_VERSION < 185 JSObject *This = JSVAL_TO_OBJECT(argv[-1]); #else JSObject *This = JS_NewObjectForConstructor(cx, vp); #endif JSObject *proto = JS_GetPrototype(cx, This); PJS_DEBUG1("Want construct, This is a %s", PJS_GET_CLASS(cx, This)->name); if(PJS_GET_CLASS(cx, proto) == &perlpackage_class || ( JS_LookupProperty(cx, func, "prototype", &argv[-1]) && JSVAL_IS_OBJECT(argv[-1]) && !JSVAL_IS_NULL(argv[-1]) && (proto = JS_GetPrototype(cx, JSVAL_TO_OBJECT(argv[-1]))) && strEQ(PJS_GET_CLASS(cx, proto)->name, PJS_PACKAGE_CLASS_NAME)) ) { SV *rsv = NULL; char *pkgname = PJS_GetPackageName(aTHX_ cx, proto); #if JS_VERSION >= 185 JSAutoByteString bytes; bytes.initBytes(pkgname); #endif caller = newSVpv(pkgname, 0); argv[-1] = OBJECT_TO_JSVAL(This); if(!PJS_Call_sv_with_jsvals_rsv(aTHX_ cx, obj, callee, caller, argc, argv, &rsv, G_SCALAR)) return JS_FALSE; if(SvROK(rsv) && sv_derived_from(rsv, pkgname)) { JSObject *newobj = PJS_NewPerlObject(aTHX_ cx, JS_GetParent(cx, func), rsv); *rval = OBJECT_TO_JSVAL(newobj); return JS_TRUE; } JS_ReportError(cx, "%s's constructor don't return an object", SvPV_nolen(caller)); } else JS_ReportError(cx, "Can't use as a constructor"); // Yet! ;-) return JS_FALSE; }