JavaScript-SpiderMonkey

 view release on metacpan or  search on metacpan

SpiderMonkey.xs  view on Meta::CPAN

        JS::RootedObject robj(cx, obj);
        JS::RootedString str(cx, JS_NewStringCopyZ(cx, value));
        JS::RootedValue val(cx, JS::StringValue(str));
        rc = JS_DefineProperty(cx, robj, name, val, JSPROP_ENUMERATE);
        RETVAL = (int) rc;
    }
    OUTPUT:
    RETVAL

######################################################################
int
JS_DefinePropertyWithAccessors(cx, obj, name, value)
    JSContext   * cx
    JSObject    * obj
    char        * name
    char        * value
######################################################################
    PREINIT:
    bool rc;
    CODE:
    {
        JS::RootedObject robj(cx, obj);

        /* Store initial value in our property store */
        prop_store_set((void*)obj, name, value);

        /* Define as accessor property with getter/setter interceptors */
#if MOZJS_MAJOR_VERSION >= 78
        /* Use the JSNative overload; getter_native/setter_native retrieve
         * the property name from the callee function created by
         * JS_NewFunction with the property name embedded. */
        JSFunction *getterFn = JS_NewFunction(cx, getter_native, 0, 0, name);
        if (!getterFn) XSRETURN_UNDEF;
        JSFunction *setterFn = JS_NewFunction(cx, setter_native, 1, 0, name);
        if (!setterFn) XSRETURN_UNDEF;
        JS::RootedObject rgetterObj(cx, JS_GetFunctionObject(getterFn));
        JS::RootedObject rsetterObj(cx, JS_GetFunctionObject(setterFn));
        rc = JS_DefineProperty(cx, robj, name, rgetterObj, rsetterObj,
                               JSPROP_ENUMERATE | JSPROP_GETTER | JSPROP_SETTER);
#else
        rc = JS_DefineProperty(cx, robj, name,
                               JS_PROPERTYOP_GETTER(getter_dispatcher),
                               JS_PROPERTYOP_SETTER(setter_dispatcher),
                               JSPROP_ENUMERATE | JSPROP_PROPOP_ACCESSORS);
#endif
        RETVAL = (int) rc;
    }
    OUTPUT:
    RETVAL

######################################################################
void
JS_GetProperty(cx, obj, name)
    JSContext   * cx
    JSObject    * obj
    char        * name
######################################################################
    PREINIT:
    bool rc;
    SV   *sv = sv_newmortal();
    PPCODE:
    {
        JS::RootedObject robj(cx, obj);
        JS::RootedValue vp(cx);
        rc = JS_GetProperty(cx, robj, name, &vp);
        if (rc) {
            JS::RootedString str(cx, JS::ToString(cx, vp));
            if (str) {
                EncodedString encoded = EncodeString(cx, str);
                if (SM_ENCODED_CHARS(encoded)) {
                    if (strcmp(SM_ENCODED_CHARS(encoded), "undefined") == 0) {
                        sv = &PL_sv_undef;
                    } else {
                        sv_setpv(sv, SM_ENCODED_CHARS(encoded));
                    }
                    SM_FREE_ENCODED(cx, encoded);
                } else {
                    sv = &PL_sv_undef;
                }
            } else {
                sv = &PL_sv_undef;
            }
        } else {
            sv = &PL_sv_undef;
        }
        XPUSHs(sv);
    }

######################################################################
JSObject *
JS_NewArrayObject(cx)
    JSContext  * cx
######################################################################
    PREINIT:
    JSObject *rc;
    CODE:
    {
#if MOZJS_MAJOR_VERSION >= 78
        rc = JS::NewArrayObject(cx, (size_t)0);
#else
        rc = JS_NewArrayObject(cx, (size_t)0);
#endif
        RETVAL = rc;
    }
    OUTPUT:
    RETVAL

######################################################################
int
JS_SetElement(cx, obj, idx, valptr)
    JSContext  *cx
    JSObject   *obj
    int         idx
    char       *valptr
######################################################################
    PREINIT:
    bool rc;
    CODE:
    {
        JS::RootedObject robj(cx, obj);
        JS::RootedString str(cx, JS_NewStringCopyZ(cx, valptr));
        JS::RootedValue val(cx, JS::StringValue(str));
        rc = JS_SetElement(cx, robj, (uint32_t)idx, val);
        RETVAL = rc ? 1 : 0;
    }
    OUTPUT:
    RETVAL

######################################################################
int
JS_SetElementAsObject(cx, obj, idx, elobj)
    JSContext  *cx
    JSObject   *obj
    int         idx
    JSObject   *elobj
######################################################################
    PREINIT:
    bool rc;
    CODE:
    {
        JS::RootedObject robj(cx, obj);
        JS::RootedValue val(cx, JS::ObjectValue(*elobj));
        rc = JS_SetElement(cx, robj, (uint32_t)idx, val);
        RETVAL = rc ? 1 : 0;
    }
    OUTPUT:
    RETVAL

######################################################################
void
JS_GetElement(cx, obj, idx)
    JSContext  *cx
    JSObject   *obj
    int         idx
######################################################################
    PREINIT:
    bool rc;
    SV   *sv = sv_newmortal();
    PPCODE:
    {
        JS::RootedObject robj(cx, obj);
        JS::RootedValue vp(cx);
        rc = JS_GetElement(cx, robj, (uint32_t)idx, &vp);
        if (rc) {
            JS::RootedString str(cx, JS::ToString(cx, vp));
            if (str) {
                EncodedString encoded = EncodeString(cx, str);
                if (SM_ENCODED_CHARS(encoded)) {
                    if (strcmp(SM_ENCODED_CHARS(encoded), "undefined") == 0) {
                        sv = &PL_sv_undef;
                    } else {
                        sv_setpv(sv, SM_ENCODED_CHARS(encoded));
                    }
                    SM_FREE_ENCODED(cx, encoded);
                } else {
                    sv = &PL_sv_undef;
                }
            } else {
                sv = &PL_sv_undef;
            }
        } else {
            sv = &PL_sv_undef;
        }
        XPUSHs(sv);
    }

######################################################################
JSClass *
JS_GetClass(obj)
    JSObject  * obj
######################################################################
    PREINIT:
    const JSClass *rc;
    CODE:
    {
        rc = JS_GetClass(obj);
        RETVAL = (JSClass *)rc;
    }
    OUTPUT:
    RETVAL


######################################################################
void
JS_SetMaxBranchOperations(cx, max_branch_operations)
    JSContext  *cx
    int         max_branch_operations
######################################################################
    CODE:
    {
        PJS_Context* pcx = (PJS_Context *) JS_GetContextPrivate(cx);
        pcx->branch_count = 0;
        pcx->branch_max = max_branch_operations;
        JS_AddInterruptCallback(cx, BranchHandler);
    }
    OUTPUT:


######################################################################



( run in 0.820 second using v1.01-cache-2.11-cpan-5511b514fd6 )