Details
-
Bug
-
Resolution: Fixed
-
P2
-
8u40
-
None
-
b13
-
generic
-
generic
-
Verified
Backports
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8045099 | 8u25 | Sundararajan Athijegannathan | P2 | Resolved | Fixed | b01 |
JDK-8042475 | 8u20 | Sundararajan Athijegannathan | P2 | Closed | Fixed | b15 |
JDK-8052499 | emb-8u26 | Sundararajan Athijegannathan | P2 | Resolved | Fixed | b18 |
Description
http://webreflection.blogspot.ca/2014/05/fixing-java-nashorn-proto.html
all right, you might think __proto__ is my obsession but for fuck sake not a single engine got it right so far ... and it's perfectly spec'd in ES6 too so I don't know what is with nashorn here ...
// how to fix nashorn
Object.defineProperty(
Object.prototype,
'__proto__',
{
configurable: true,
get: function () {
return Object.getPrototypeOf(this);
},
set: function (proto) {
Object.setPrototypeOf(this, proto);
}
}
);
Are You Asking Why?
Here the answer: nashorn is broken, since it does not expose __proto__ quirks anywhere.
'__proto__' in {} is false
Object.getOwnPropertyNames(Object.prototype).indexOf('__proto__') is a -1 negative
Object.getOwnPropertyDescriptor(Object.prototype, '__proto__') is null
Basically even most common basic features detections for '__proto__' are screwed, so that not a single library can trust its own code ... how cool is that ...
Broken null Objects Too
The worst of the worst comes with null objects, where the infamous property makes dictionaries pointless, not secure, and unreliable ... I start thinking the web world was not even ready for dictionaries, it's taking forever to have a reliable one
var o = Object.create(null);
// it's a null object
// nothing should affect it
o.__proto__ = [];
// but nashorn is brilliant
// as old Android 2.1 phones here
o instanceof Array; // true
Congratulation, you never understood what was the purpose of __proto__
Quick Specs Recap
So, since it's apparently the first rocket science problem ever, here a quick summary of how stupidly simple is the __proto__ spec:
if it's a literal expression, not wrapped in quotes, it defines inheritance at runtime: {__proto__:[]} which is an instanceof Array VS {"__proto__":[]} which is just valid JSON and won't even affect inheritance
if accessed through the Object.prototype, where whatever object that inherits from null should NOT be involved, and where __proto__ has not been defined as own property, it behaves as described in the first snippet I've created to fix nashorn
everything else is an epic fail
So please fix this madness once for all ... it's about reading specs and implementing them properly, even if Appendix B of whatever status ES6 is ... or GTFO!
all right, you might think __proto__ is my obsession but for fuck sake not a single engine got it right so far ... and it's perfectly spec'd in ES6 too so I don't know what is with nashorn here ...
// how to fix nashorn
Object.defineProperty(
Object.prototype,
'__proto__',
{
configurable: true,
get: function () {
return Object.getPrototypeOf(this);
},
set: function (proto) {
Object.setPrototypeOf(this, proto);
}
}
);
Are You Asking Why?
Here the answer: nashorn is broken, since it does not expose __proto__ quirks anywhere.
'__proto__' in {} is false
Object.getOwnPropertyNames(Object.prototype).indexOf('__proto__') is a -1 negative
Object.getOwnPropertyDescriptor(Object.prototype, '__proto__') is null
Basically even most common basic features detections for '__proto__' are screwed, so that not a single library can trust its own code ... how cool is that ...
Broken null Objects Too
The worst of the worst comes with null objects, where the infamous property makes dictionaries pointless, not secure, and unreliable ... I start thinking the web world was not even ready for dictionaries, it's taking forever to have a reliable one
var o = Object.create(null);
// it's a null object
// nothing should affect it
o.__proto__ = [];
// but nashorn is brilliant
// as old Android 2.1 phones here
o instanceof Array; // true
Congratulation, you never understood what was the purpose of __proto__
Quick Specs Recap
So, since it's apparently the first rocket science problem ever, here a quick summary of how stupidly simple is the __proto__ spec:
if it's a literal expression, not wrapped in quotes, it defines inheritance at runtime: {__proto__:[]} which is an instanceof Array VS {"__proto__":[]} which is just valid JSON and won't even affect inheritance
if accessed through the Object.prototype, where whatever object that inherits from null should NOT be involved, and where __proto__ has not been defined as own property, it behaves as described in the first snippet I've created to fix nashorn
everything else is an epic fail
So please fix this madness once for all ... it's about reading specs and implementing them properly, even if Appendix B of whatever status ES6 is ... or GTFO!
Attachments
Issue Links
- backported by
-
JDK-8045099 Make __proto__ ES6 draft compliant
- Resolved
-
JDK-8052499 Make __proto__ ES6 draft compliant
- Resolved
-
JDK-8042475 Make __proto__ ES6 draft compliant
- Closed