Upgrading from Spidermonkey 1.8.5 to 45. How to get property name in getters/setters now they are JSNatives and tiny IDs have been removed?

Miles <[email protected]> Mon, 5 Jun 2017 02:31:22 -0700 (PDT)
Newsgroups gmane.comp.mozilla.devel.jseng
Message-ID <[email protected]>
Hi,

I'm trying to upgrade my embedding from 1.8.5 to 45 and one of the things that I'm struggling with is how property getters/setters now work in 45.

In 1.8.5 I used tiny IDs and JSPropertySpec to define properties and getters/setters for a class.
e.g. In 1.8.5 I had something like

enum part_tinyid {
    PART_HEADING,
    PART_PID,
    PART_SECID,
    PART_MID,
    ...
};

JSPropertySpec dj_Part_dynamic_props[] =
{
    {"heading", PART_HEADING,  flags,  dj_get_part_prop, dj_set_part_prop },
    {"pid",     PART_PID,      flags,  dj_get_part_prop, dj_set_part_prop },
    {"secid",   PART_SECID,    flags,  dj_get_part_prop, dj_set_part_prop },
    {"mid",     PART_MID,      flags,  dj_get_part_prop, dj_set_part_prop },
...
    { 0 }
};   


and then my getter was something like

JSBool dj_get_part_prop(JSContext *cx, JSObject *obj, jsid propid, jsval *vp)
{
    jsval id = JS_IdToValue(cx, propid, &id);
    int idint = JSVAL_TO_INT(id);

    switch (idint)
    {
        case PART_HEADING:
            ...
            break;

        case PART_PID:
            ...
            break;
    }

}

i.e. I had a single getter and a single setter for all of the properties and I could find which property I was getting/setting from propid

Now in Spidermonkey 45 Tiny IDs have been removed and dj_get_part_prop/dj_set_part_prop are JSNatives so I have something like:

JSPropertySpec dj_Part_dynamic_props[] =
{
    JS_PSGS("heading", dj_get_part_prop, dj_set_part_prop, flags),
    JS_PSGS("pid",     dj_get_part_prop, dj_set_part_prop, flags),
    JS_PSGS("secid",   dj_get_part_prop, dj_set_part_prop, flags),
    JS_PSGS("mid",     dj_get_part_prop, dj_set_part_prop, flags),
...
    JS_PS_END
}; 


JSBool dj_get_part_prop(JSContext *cx, unsigned int argc, JS::Value *vp)
{
    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
    JS::RootedObject obj(cx, JS_THIS_OBJECT(cx, vp));
}

I can get the object by using JS_THIS_OBJECT and I can see that in the getter argc is 0, in the setter argc is 1 and args[0] contains the value of the property to set.
However, I can't see any way to find out *which* property I am getting/setting.

Am I being stupid here? How can I find out which property I am getting/setting? I know that tiny IDs have gone so I was expecting the property to be passed as a string or something.
Or is there no way of getting the property name and I have to use a different property getter/setter for each property?

If someone can help me I would be very grateful.

Thanks

Miles