Sergeui, You were right - I read the sources incorrectly. Would still help to understand both the motivation and the reason to not add to the spec.
Robert - do you remember why we didn’t add this to the specification? (6404550) > On Feb 21, 2018, at 4:44 PM, serguei.spit...@oracle.com wrote: > > Hi Karen, > > Thank you for sorting this out! > > > On 2/21/18 09:55, Karen Kinnear wrote: >> Dan, >> >> Thank you for all the background digging. This is really helpful. >> >> Serguei - do you know what tests exist for this behavior? > > Dan already replied (thanks, Dan!) > There are two tests in the open/test/jdk/java/lang/instrument: > RedefineMethodAddInvoke* > RedefineMethodDelInvoke* > > >> The way I read the source code - we currently allow ADD and DELETE for >> PRIVATE OR STATIC OR FINAL methods. Did I read that correctly? > The above does not look correct to me. > We have the same check for both ADD and DELETE method: > if ((old_flags & JVM_ACC_PRIVATE) == 0 > // hack: private should be treated as final, but alas > || (old_flags & (JVM_ACC_FINAL|JVM_ACC_STATIC)) == 0 > ) { > // deleted methods must be private > return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED; > } > > I read it as we allow ADD and DELETE for PRIVATE && (STATIC || FINAL) methods. > (Rephrase: We allow PRIVATE FINAL or PRIVATE STATIC methods.) > As private should always be treated final then we can simplify the above to: > We allow and and delete PRIVATE INSTANCE or PRIVATE STATIC methods > which is equal to just "PRIVATE methods”. Sergeui - you are right - I misread this today. And I played with the tests a bit - thanks Dan - and it matches the way you read this. So today, private methods that are not marked as final in the source code can not be added - I tried that variation by modifying the RedefineMethodAddInvokeTarget_1.java and changing private final void myMethod1() to private void myMethod1() and got an UnsupportedOperationException. So - private methods are not marked as ACC_FINAL today so I think the simplification doesn’t apply, so we are left with the ability to ADD or DELETE PRIVATE && (STATIC || FINAL) methods - at least that is what we support today. > >> With the current implementation, I am not sure if deletion works for private >> methods - do we >> have a test for that? Or could you add one as part of this exercise? > > Yes, we have one j.l.instrument test: RedefineMethodDelInvoke.sh. I tried the test. And it works because of the requirement that FINAL or STATIC are set, which therefore means no vtable entry. > > >> Today we create a vtable entry for private methods (my misunderstanding ~ >> 2006ish). After discussions >> with David I no longer believe we need those. >> Today, klassVtable::adjust_method_entries has an assertion >> assert(!old_method->is_deleted(), “vtable methods may not be deleted”) >> >> I may have read the code incorrectly - but I would expect to hit this >> assertion if you had a private >> method you were deleting that was not final and not static. >> >> option 1) we could explicitly tighten the restrictions to match what we have >> implemented >> option 2) we could make this work by changing >> klassVtable.cpp::update_inherited_vtable >> handling of private fields to be done the way it handles final fields. >> option 3) I read the code incorrectly? > > If we create a vtable entry for private methods then we should hit the assert > above. > If we no longer need this then we have no problem. We do create a vtable entry for private methods; however if FINAL or STATIC is set, then we do not create a vtable entry. That is why we don’t ever get here. thanks, Karen > > Thanks, > Serguei > >> thanks, >> Karen >> >>> On Feb 21, 2018, at 10:40 AM, Daniel D. Daugherty >>> <daniel.daughe...@oracle.com <mailto:daniel.daughe...@oracle.com>> wrote: >>> >>> On 2/21/18 2:45 AM, serguei.spit...@oracle.com >>> <mailto:serguei.spit...@oracle.com> wrote: >>>> On 2/20/18 23:01, David Holmes wrote: >>>>> On 21/02/2018 4:50 PM, serguei.spit...@oracle.com >>>>> <mailto:serguei.spit...@oracle.com> wrote: >>>>>> Hi Karen and David, >>>>>> >>>>>> >>>>>> On 2/20/18 19:52, David Holmes wrote: >>>>>>> Hi Karen, >>>>>>> >>>>>>> On 21/02/2018 1:54 AM, Karen Kinnear wrote: >>>>>>>> Folks, >>>>>>>> >>>>>>>> As part of the Valhalla EG discussions for JVMTI changes for nestmates >>>>>>>> (thank you Serguei and David), >>>>>>>> IBM brought up a request that we update the JVMTI documentation to >>>>>>>> reflect that we allow addition >>>>>>>> of private methods. >>>>>>>> >>>>>>>> Is there a reason we do not document this? I’m inviting those who were >>>>>>>> involved at the time - please include >>>>>>>> others if needed. >>>>>> >>>>>> I support documenting this in the JVMTI spec and had a plan to fix it in >>>>>> 11. >>>>>> However, it is not clear to me yet if we have a consensus on it. >>>>> >>>>> I would like to see a detailed analysis of the implications of allowing >>>>> this. I _think_ it is safe but ... >>>> >>>> Valid concern. >>>> Also, I'd love to collect more details on the initial motivation to relax >>>> the JVMTI spec. >>>> Most likely we had no CCC/CSR filed on this change. >>>> >>>> >>>>>>> This issue is tracked by: >>>>>>> >>>>>>> https://bugs.openjdk.java.net/browse/JDK-8192936 >>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8192936> >>>>>>> >>>>>>> "RI does not follow the JVMTI RedefineClasses spec that is too strict >>>>>>> in the definition" >>>>>> >>>>>> Yes, this is the one. >>>>>> Thank you, David, for posting the link. >>>>>> >>>>>> >>>>>>> As I wrote there ... It is not at all clear how JDK-6404550 morphed >>>>>>> into "Permit the adding or deleting of private final/static methods >>>>>>> with redefine" - nor why those changes failed to make any change to the >>>>>>> spec itself. It is also unclear whether the add/delete is restricted to >>>>>>> final/static methods or any private method? I can see that the intent >>>>>>> was to only allow something that would not perturb the vtable for >>>>>>> existing instances. >>>>>> >>>>>> I agree, there is a confusion somewhere. >>>>>> Is it possible, the JDK-6404550 in JIRA is a different bug than the one >>>>>> in the Bugtraq system? >>>>>> >>>>>> The JDK-6404550 in JIRA has a different synopsis: >>>>>> https://bugs.openjdk.java.net/browse/JDK-6404550 >>>>>> <https://bugs.openjdk.java.net/browse/JDK-6404550> >>>>>> Cannot implement late attach in NetBeans Profiler due to missing >>>>>> functionality in JVMTI >>>>> >>>>> Digging deeper ... to fix the problem described in that bug they >>>>> augmented JVM TI to allow private method redefinition as an alternate to >>>>> the "native rebinding" technique that had been used previously. See the >>>>> final comment in: >>>>> >>>>> https://bugs.openjdk.java.net/browse/JDK-6341303 >>>>> <https://bugs.openjdk.java.net/browse/JDK-6341303> >>>>> >>>>> "JVMTI Spec: Need a way how to rebind Object.wait and Thread.sleep with >>>>> late attach" >>>>> >>>>> which was closed as a duplicate. >>>> >>>> Thank you for the point. >>>> This explains it. >>>> It seems, the bug synopsis was changed at some moment. >>> >>> The synopsis for 6404550 has never changed. Here's the subject line when >>> it was created on 2006.03.27: >>> >>> > CR 6404550 *HOT* Created P1 hotspot/jvmti Cannot implement late attach in >>> > NetBeans Profiler due to missing functionality in JVMTI >>> >>> I think the confusion arises over comments like this in 6341303: >>> >>>> Robert Field >>>> <https://bugs.openjdk.java.net/secure/ViewProfile.jspa?name=rfield> added >>>> a comment - 2006-05-04 11:54 >>>> BT2:EVALUATION >>>> >>>> This can now be accomplished with Java programming language >>>> instrumentation, via: >>>> >>>> 6404550: missing late attach (JVM TI redefine) functionality >>>> Permit the adding or deleting of private final/static methods >>>> with redefine >>>> >>>> Closing this bug as a duplicate. >>> >>> That's just Robert's style for an sccs delta comment: >>> >>> D 1.65.2.3 06/04/25 23:36:35 rfield 140 139 00023/00013/03263 >>> MRs: >>> COMMENTS: >>> 6404550: missing late attach (JVM TI redefine) functionality >>> Add/delete private methods, continued: changes per review >>> >>> Back in the ancient past we tried to include some brief >>> info about the change in the delta comment. This was one of many >>> deltas associated with 6404550. >>> >>> Please see the attached email that I sent on 2012.12.17 about the >>> history behind this issue... (sent to Karen, Mikael V, and Serguei) >>> >>> It seems I forwarded that same email to Coleen, Markus G and Serguei >>> back on 2014.05.20. Since Markus is on that thread, it must have had >>> something to do with research about JFR... >>> >>> I need to do a detailed read thru my e-mail archive for 6404550 to >>> see if I can spot some clues about why we didn't do a spec update. >>> >>> Dan >>> >>> >>>> >>>> Thanks, >>>> Serguei >>>> >>>>> >>>>> David >>>>> ----- >>>>> >>>>>> >>>>>> Thanks, >>>>>> Serguei >>>>>> >>>>>> >>>>>>> -- >>>>>>> David >>>>>>> >>>>>>> >>>>>>>> thanks, >>>>>>>> Karen >>>>>>>> >>>>>> >>>> >>>> >>> >>> <Attached Message.eml> >> >