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 >