> On 2020. Oct 19., at 18:06, Remi Forax <remi.fo...@univ-eiffel.fr> wrote: > > ----- Mail original ----- >> De: "Attila Szegedi" <szege...@gmail.com <mailto:szege...@gmail.com>> >> À: "nashorn-dev" <nashorn-dev@openjdk.java.net >> <mailto:nashorn-dev@openjdk.java.net>> >> Envoyé: Lundi 19 Octobre 2020 17:16:55 >> Objet: Re: Standalone Nashorn is coming for Java 15+ > >> Hi y’all, > > > Hi Attila, > >> >> * for now, I disabled anonymous code loading. It’s a funny one. Nashorn has a >> feature called “anonymous code loading” that it uses for somewhat >> lighter-weight loading of code as it compiles JavaScript functions one-by-one >> into bytecode classes. Unfortunately, it uses Unsafe.defineAnonymousClass for >> that, and outside of JDK it can’t access Unsafe. So I switched to a new API, >> luckily available from Java 15, MethodHandles.Lookup.defineHiddenClass. It >> seems to work as it should, except with it, eval’d expressions no longer >> report >> “<eval>” as their script name and anonymous functions no longer report >> “<anonymous>” but rather their callers names, script names, and line numbers >> are reported. It’s quite maddening, and if I can’t get to the bottom of it in >> reasonable amount of time. > > A hidden class is well, hidden, so it doesn't appear by default in the stack > trace (You have a special configuation of the StackWalker that shows the > hidden classes). > With an anonymous class, you can use the annotation @Hidden or not but with a > hidden class, you have no choice, a hidden class is always hidden.
Thanks for chiming in, Remi! I just came back from an evening walk, and around halfway into it I actually had this lightbulb go on thinking “y’know, this feels like the the stack frames are hidden…” > Also, you can still use Unsafe.defineAnonymous class with Java 15, but using > sun.misc.Unsafe and not jdk.internal.misc.Unsafe. > But it's a short term solution given that sun.misc.Unsafe.defineAnonymous is > now deprecated. I gave it a brief try, but the compiler complained that the package sun.misc is not visible. And anyway I was hoping for using a supported public API :-) I might give it _another_ try. I’m not sure what else do I need to do, but I hope it can be done without users needing to screw around with JVM flags such as --add-exports etc. > >> I’ll just keep anonymous code loading switched off >> for initial release. There’s not many drawbacks to it, maybe a bit higher >> memory utilization if you don’t use optimistic types. With optimistic types, >> it >> would preclude obsolete code versions from clearing up from memory when >> functions are repeatedly recompiled until the whole script gets unloaded. > > I've added Mandy in CC, given you are not the first one to ask for a > "visible" hidden class, so maybe, the ClassOption could be extended to had a > VISIBLE option ? That’d be awesome! By the way, Mandy, it is already awesome that we have Lookup.defineHiddenClass! Attila.