Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8042364

Make __proto__ ES6 draft compliant

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • P2
    • 9
    • 8u40
    • core-libs
    • None
    • b13
    • generic
    • generic
    • Verified

    Backports

      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!

        Attachments

          Issue Links

            Activity

              People

                sundar Sundararajan Athijegannathan
                jlaskey Jim Laskey
                Votes:
                0 Vote for this issue
                Watchers:
                5 Start watching this issue

                Dates

                  Created:
                  Updated:
                  Resolved: