Code Monkey home page Code Monkey logo

Comments (16)

nicolo-ribaudo avatar nicolo-ribaudo commented on May 19, 2024 2

An even minimal example is

let capturedPrivateAccess;
class A {
  static #x = 42;
  static [(class {}, capturedPrivateAccess = () => A.#x)];
}
console.log(capturedPrivateAccess())

the class in the computed key is needed, but the private access doesn't need to be inside the class

from babel.

nicolo-ribaudo avatar nicolo-ribaudo commented on May 19, 2024 2

I think that is the same bug. Chrome doesn't throw because the function is never called.

from babel.

nicolo-ribaudo avatar nicolo-ribaudo commented on May 19, 2024 1

It seems like wrapping the computed key in an IIFE works:

let capturedPrivateAccess;
class A {
  static #x = 42;
  static [(() => (class {}, capturedPrivateAccess = () => A.#x))()];
}
console.log(capturedPrivateAccess())

from babel.

nicolo-ribaudo avatar nicolo-ribaudo commented on May 19, 2024 1

Even smaller reproduction, from Firefox folks :)

class A {
  static #x = 42;
  static [class {}];
} 

This throws in Firefox.

from babel.

nicolo-ribaudo avatar nicolo-ribaudo commented on May 19, 2024 1

This code on the other hand works:

class A {
  static [class A {}];
  static #x = 42;
}

Maybe this hints at a better fix than wrapping in an IIFE 🤔

from babel.

JLHwung avatar JLHwung commented on May 19, 2024 1

This code on the other hand works:

class A {
  static [class A {}];
  static #x = 42;
}

Maybe this hints at a better fix than wrapping in an IIFE 🤔

Well the decorator transform already output the class in the first static property.

from babel.

JLHwung avatar JLHwung commented on May 19, 2024 1

SpiderMonkey just merged a fix for this, but let's still implement a workaround plugin for all the existing Firefox version. @JLHwung do you want to work on it since you are fixing other decorator bugs, or should I do it?

Thank you. The bugfix is your idea, go ahead, meanwhile I will be kept busy by a few other decorators bugs.

from babel.

babel-bot avatar babel-bot commented on May 19, 2024

Hey @SirPepe! We really appreciate you taking the time to report an issue. The collaborators on this project attempt to help as many people as possible, but we're a limited number of volunteers, so it's possible this won't be addressed swiftly.

If you need any help, or just have general Babel or JavaScript questions, we have a vibrant Slack community that typically always has someone willing to help. You can sign-up here for an invite.

from babel.

JLHwung avatar JLHwung commented on May 19, 2024

Yes, I am almost sure that this is a FF bug, both JSC and V8 work as expected.

Here is a minimal test case without any Babel helpers or the decorator boilerplates. It should print 42, currently it throws on FF but works on both JSC and V8:

let capturedPrivateAccess;
class A {
  static #x = 42;
  static [class B {
    static {
      capturedPrivateAccess = (t) => t.#x
    }
  }];
}
console.log(capturedPrivateAccess(A))

It seems to me FF somehow marks the whole computed key as if it were defined in the outer scope, this is convenient for the functional context variables such as this and super, but not the case for private environment where the #x should have been resolved.

Per spec RS:ClassDefinitionEvaluation, the private environment is set in step 13 and the ClassElementEvaluation is in step 25.

@nicolo-ribaudo Do you know if FF already had a tracking bug for this issue? I can't find one on Bugzilla.

from babel.

nicolo-ribaudo avatar nicolo-ribaudo commented on May 19, 2024

I'll ask today to a friend at Firefox, otherwise I'll open one.

Wdyt about creating a bugfix plugin for this, given that because of our decorators transform it might be common?

from babel.

liuxingbaoyu avatar liuxingbaoyu commented on May 19, 2024
class A {
  static #x = 42;
  static [class B {
    static {
      () => B.#x;
    }
  }];
}

There seems to be another difference here, this code throws in Firefox but not in Chrome.

from babel.

JLHwung avatar JLHwung commented on May 19, 2024

Wdyt about creating a bugfix plugin for this, given that because of our decorators transform it might be common?

Good idea, though I haven't figured out how to workaround this bug except transforming the whole class.

from babel.

nicolo-ribaudo avatar nicolo-ribaudo commented on May 19, 2024

Fun fact 😛 In Babel 7.21, compiling this code to es2015:

let capturedPrivateAccess;
class A {
  static #x = 42;
  static [(class {}, capturedPrivateAccess = () => A.#x)];
}
console.log(capturedPrivateAccess());

would then at runtime throw an error about A being in TDZ.

from babel.

JLHwung avatar JLHwung commented on May 19, 2024

Fun fact 😛 In Babel 7.21, compiling this code to es2015:

let capturedPrivateAccess;
class A {
  static #x = 42;
  static [(class {}, capturedPrivateAccess = () => A.#x)];
}
console.log(capturedPrivateAccess());

would then at runtime throw an error about A being in TDZ.

Yes, that is another bug, our current classTDZVisitor blindly forbids any class binding references in the computed key.

from babel.

JLHwung avatar JLHwung commented on May 19, 2024

It seems like wrapping the computed key in an IIFE works:

let capturedPrivateAccess;
class A {
  static #x = 42;
  static [(() => (class {}, capturedPrivateAccess = () => A.#x))()];
}
console.log(capturedPrivateAccess())

Great, and we will have to check whether it is an async/generator and emit other IIFEs likewise.

from babel.

nicolo-ribaudo avatar nicolo-ribaudo commented on May 19, 2024

SpiderMonkey just merged a fix for this, but let's still implement a workaround plugin for all the existing Firefox version. @JLHwung do you want to work on it since you are fixing other decorator bugs, or should I do it?

from babel.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.