Re: Problem with object properties/hasOwnProperty() in Spidermonkey 78

Jan de Mooij <[email protected]> Tue, 2 Feb 2021 18:00:44 +0100
Newsgroups gmane.comp.mozilla.devel.jseng
Message-ID <CABTC+Jds2Cp_WVu0tonbe0BnudX=dVH7HrN0p-kkURJpP089WA@mail.gmail.com>
On Tue, Feb 2, 2021 at 4:55 PM Miles <[email protected]> wrote:

> However, for some reason I don't understand the properties that I define
> for my class do not return true for Object.prototype.hasOwnProperty() in
> Spidermonkey 78 but they did in Spidermonkey 1.8.5.
> For example I define a Node class with properties x,y,z (and lots more...)
>

The properties in the JSPropertySpec that you pass to JS_InitClass (the 7th
argument?) are defined on the prototype chain. Looking at Firefox 3 era
code that hasn't changed and the SpiderMonkey 78 behavior is what I'd
expect.

Are these getters? If not, how do you assign the 1.1/2.2/3.3 properties in
your constructor? Can you post all the relevant code for one of these
properties?

Thanks,
Jan


>
> To do the upgrade I have been using all sorts of macros/pre-processor
> logic so that I can compile using either the old 1.8.5 version or the new
> 78 version of Spidermonkey until we are sure everything is working.
> With the old 1.8.5 engine if I run the following code
>
> var n = new Node(1.1, 2.2, 3.3);
> for (a in n)
>         Message("  Property "+a+": "+n[a]);
> Message("  n.hasOwnProperty('x') returns "+n.hasOwnProperty('x'));
>
> I get the output
>
>   Property x: 1.100000023841858
>   Property y: 2.200000047683716
> ...
>   n.hasOwnProperty('x') returns true
>
> However, in the new Spidermonkey 78 engine I get
>
>   Property x: 1.100000023841858
>   Property y: 2.200000047683716
> ...
>   n.hasOwnProperty('x') returns false
>
> i.e. In the new Spidermonkey 78 engine I can still enumerate over the
> properties but some some unknown reason the properties are not defined in
> this class. Presumably the engine thinks they are somehow being defined in
> the prototype chain somewhere else...
> There are differences as to what is exactly being executed in the
> different engines due to my macros but I'm running the same basic code with
> JS_InitClass etc.
> My class stores private data and I am setting JSCLASS_HAS_PRIVATE
> My properties are defined with the flags JSPROP_ENUMERATE|JSPROP_PERMANENT
>
> No doubt I'm (yet again) being stupid and missing something obvious but I
> can't for the life of me see what the problem is.
> Can anybody help?
>
> Many thanks in advance for any assistance
>
> Miles
> _______________________________________________
> dev-tech-js-engine mailing list
> [email protected]
> https://lists.mozilla.org/listinfo/dev-tech-js-engine
>