Tapestry 5
  1. Tapestry 5
  2. TAP5-1860

Access to protected component fields does not always reflect in subclasses

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 5.3.2
    • Fix Version/s: 5.3.3, 5.4
    • Component/s: tapestry-core
    • Labels:
      None

      Description

      There seems to be a problem with the new feature introduced in 5.3.2 - https://issues.apache.org/jira/browse/TAP5-1801
      When I create a protected field in by base page class, setting the field in a subclass' event handling method seems to have no effect.

      1. testapp.tgz
        3 kB
        Olaf Tomczak

        Activity

        Hide
        Olaf Tomczak added a comment -

        Attached a project with simple application exposing the issue.

        Show
        Olaf Tomczak added a comment - Attached a project with simple application exposing the issue.
        Hide
        Steve Eynon added a comment -

        I believe there is a problem with the introduction of protected instance fields, but that it's different to the one stated.

        Protected fields work just fine (and why wouldn't they, it's just Java!) however, T5 annotated fields are only instrumented within the same class. Meaning if you access an instrumented protected field from a subclass, it doesn't work.

        The problem (as I see it) is that T5 doesn't complain when it instruments a field marked as protected. I would also like to see the documentation updated to explain this.

        We've come a cropper with this a couple of times in work. The nasty gotcha being, if you access the field in DevMode the field is shadowed, so future protected access works - but fails spectacularly with NPEs in ProdMode!

        Show
        Steve Eynon added a comment - I believe there is a problem with the introduction of protected instance fields, but that it's different to the one stated. Protected fields work just fine (and why wouldn't they, it's just Java!) however, T5 annotated fields are only instrumented within the same class. Meaning if you access an instrumented protected field from a subclass, it doesn't work. The problem (as I see it) is that T5 doesn't complain when it instruments a field marked as protected. I would also like to see the documentation updated to explain this. We've come a cropper with this a couple of times in work. The nasty gotcha being, if you access the field in DevMode the field is shadowed, so future protected access works - but fails spectacularly with NPEs in ProdMode!
        Hide
        Howard M. Lewis Ship added a comment -

        The intent is that protected instance fields accessed from a base class are, in fact, instrumented. So there's probably a bug here.

        Show
        Howard M. Lewis Ship added a comment - The intent is that protected instance fields accessed from a base class are, in fact, instrumented. So there's probably a bug here.
        Hide
        Howard M. Lewis Ship added a comment -

        I've taken the code and renamed the classes slightly (to Grandparent and Parent), and enabled component transformation logging.

        DEBUG - // class version 50.0 (50)
        // access flags 0x21
        public class test/base/pages/Grandparent implements org/apache/tapestry5/runtime/Component org/apache/tapestry5/runtime/RenderCommand {

        // compiled from: Grandparent.java

        // access flags 0x14
        protected final Lorg/slf4j/Logger; log
        @Lorg/apache/tapestry5/ioc/annotations/Inject;()

        // access flags 0x4
        protected Z fieldSetOnEvent
        @Lorg/apache/tapestry5/annotations/Property;()

        // access flags 0x12
        private final Lorg/apache/tapestry5/internal/InternalComponentResources; internalComponentResources

        // access flags 0x12
        private final Lorg/apache/tapestry5/internal/InternalComponentResources; resources

        // access flags 0x12
        private final Lorg/apache/tapestry5/plastic/FieldConduit; fieldSetOnEvent_FieldConduit

        // access flags 0x12
        private final Lorg/apache/tapestry5/plastic/InstanceContext; instanceContext

        // access flags 0x2
        private initializeInstance()V
        L0
        LINENUMBER 12 L0
        RETURN
        L1
        LOCALVARIABLE this Ltest/base/pages/Grandparent; L0 L1 0
        MAXSTACK = 1
        MAXLOCALS = 1

        // access flags 0x1
        public getFieldValueUsingGrandparentGetter()Z
        L0
        LINENUMBER 19 L0
        ALOAD 0
        INVOKEVIRTUAL test/base/pages/Grandparent.conduit_get_fieldSetOnEvent ()Z
        IRETURN
        L1
        LOCALVARIABLE this Ltest/base/pages/Grandparent; L0 L1 0
        MAXSTACK = 1
        MAXLOCALS = 1

        // access flags 0x0
        onAnother()V
        L0
        LINENUMBER 28 L0
        ALOAD 0
        ICONST_1
        INVOKEVIRTUAL test/base/pages/Grandparent.conduit_set_fieldSetOnEvent (Z)V
        L1
        LINENUMBER 29 L1
        ALOAD 0
        GETFIELD test/base/pages/Grandparent.log : Lorg/slf4j/Logger;
        LDC "onAnother: this.fieldSetOnEvent = {}"
        ALOAD 0
        INVOKEVIRTUAL test/base/pages/Grandparent.conduit_get_fieldSetOnEvent ()Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L2
        LINENUMBER 30 L2
        ALOAD 0
        GETFIELD test/base/pages/Grandparent.log : Lorg/slf4j/Logger;
        LDC "onAnother: this.getFieldValueUsingGrandparentGetter() = {}"
        ALOAD 0
        INVOKEVIRTUAL test/base/pages/Grandparent.getFieldValueUsingGrandparentGetter ()Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L3
        LINENUMBER 32 L3
        RETURN
        L4
        LOCALVARIABLE this Ltest/base/pages/Grandparent; L0 L4 0
        MAXSTACK = 3
        MAXLOCALS = 1

        // access flags 0x1
        public postRenderCleanup()V
        ALOAD 0
        GETFIELD test/base/pages/Grandparent.resources : Lorg/apache/tapestry5/internal/InternalComponentResources;
        INVOKEINTERFACE org/apache/tapestry5/internal/InternalComponentResources.postRenderCleanup ()V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public setupRender(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public beginRender(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public beforeRenderTemplate(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public afterRenderTemplate(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public beforeRenderBody(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public afterRenderBody(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public afterRender(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public cleanupRender(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public dispatchComponentEvent(Lorg/apache/tapestry5/runtime/ComponentEvent;)Z
        L0
        LDC false
        ISTORE 2
        ALOAD 1
        LDC "Another"
        LDC ""
        ICONST_0
        INVOKEINTERFACE org/apache/tapestry5/runtime/ComponentEvent.matches (Ljava/lang/String;Ljava/lang/String;I)Z
        IFEQ L1
        ALOAD 1
        LDC "test.base.pages.Grandparent.onAnother()"
        INVOKEINTERFACE org/apache/tapestry5/runtime/Event.setMethodDescription (Ljava/lang/String;)V
        ALOAD 0
        INVOKEVIRTUAL test/base/pages/Grandparent.onAnother ()V
        LDC true
        ISTORE 2
        GOTO L2
        L1
        L2
        ILOAD 2
        IRETURN
        L3
        LOCALVARIABLE var0 Z L0 L3 2
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public getComponentResources()Lorg/apache/tapestry5/ComponentResources;
        ALOAD 0
        GETFIELD test/base/pages/Grandparent.internalComponentResources : Lorg/apache/tapestry5/internal/InternalComponentResources;
        ARETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final reject_field_change_internalComponentResources(Lorg/apache/tapestry5/internal/InternalComponentResources;)V
        NEW java/lang/IllegalStateException
        DUP
        LDC "Field internalComponentResources of class test.base.pages.Grandparent is read-only."
        INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
        ATHROW
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public getFieldSetOnEvent()Z
        ALOAD 0
        INVOKEVIRTUAL test/base/pages/Grandparent.conduit_get_fieldSetOnEvent ()Z
        IRETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public setFieldSetOnEvent(Z)V
        ALOAD 0
        ILOAD 1
        INVOKEVIRTUAL test/base/pages/Grandparent.conduit_set_fieldSetOnEvent (Z)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public render(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/RenderQueue;)V
        ALOAD 0
        GETFIELD test/base/pages/Grandparent.resources : Lorg/apache/tapestry5/internal/InternalComponentResources;
        ALOAD 1
        ALOAD 2
        INVOKEINTERFACE org/apache/tapestry5/internal/InternalComponentResources.render (Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/RenderQueue;)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final reject_field_change_resources(Lorg/apache/tapestry5/internal/InternalComponentResources;)V
        NEW java/lang/IllegalStateException
        DUP
        LDC "Field resources of class test.base.pages.Grandparent is read-only."
        INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
        ATHROW
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1014
        protected final reject_field_change_log(Lorg/slf4j/Logger;)V
        NEW java/lang/IllegalStateException
        DUP
        LDC "Field log of class test.base.pages.Grandparent is read-only."
        INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
        ATHROW
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final reject_field_change_fieldSetOnEvent_FieldConduit(Lorg/apache/tapestry5/plastic/FieldConduit;)V
        NEW java/lang/IllegalStateException
        DUP
        LDC "Field fieldSetOnEvent_FieldConduit of class test.base.pages.Grandparent is read-only."
        INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
        ATHROW
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1014
        protected final conduit_get_fieldSetOnEvent()Z
        ALOAD 0
        GETFIELD test/base/pages/Grandparent.fieldSetOnEvent_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 0
        GETFIELD test/base/pages/Grandparent.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext;
        INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.get (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object;
        CHECKCAST java/lang/Boolean
        INVOKEVIRTUAL java/lang/Boolean.booleanValue ()Z
        DUP
        ALOAD 0
        SWAP
        PUTFIELD test/base/pages/Grandparent.fieldSetOnEvent : Z
        IRETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1014
        protected final conduit_set_fieldSetOnEvent(Z)V
        ALOAD 0
        GETFIELD test/base/pages/Grandparent.fieldSetOnEvent_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 0
        GETFIELD test/base/pages/Grandparent.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext;
        ILOAD 1
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.set (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/Object;)V
        ALOAD 0
        ILOAD 1
        PUTFIELD test/base/pages/Grandparent.fieldSetOnEvent : Z
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public <init>()V
        NEW java/lang/IllegalStateException
        DUP
        LDC "Class test.base.pages.Grandparent has been transformed and may not be directly instantiated."
        INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
        ATHROW
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public <init>(Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V
        ALOAD 0
        INVOKESPECIAL java/lang/Object.<init> ()V
        ALOAD 0
        ALOAD 2
        LDC "org.apache.tapestry5.internal.InternalComponentResources"
        INVOKESTATIC org/apache/tapestry5/internal/plastic/PlasticInternalUtils.getFromInstanceContext (Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/String;)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/internal/InternalComponentResources
        PUTFIELD test/base/pages/Grandparent.internalComponentResources : Lorg/apache/tapestry5/internal/InternalComponentResources;
        ALOAD 0
        ALOAD 2
        LDC "org.apache.tapestry5.internal.InternalComponentResources"
        INVOKESTATIC org/apache/tapestry5/internal/plastic/PlasticInternalUtils.getFromInstanceContext (Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/String;)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/internal/InternalComponentResources
        PUTFIELD test/base/pages/Grandparent.resources : Lorg/apache/tapestry5/internal/InternalComponentResources;
        ALOAD 0
        ALOAD 1
        ICONST_0
        INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get (I)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/plastic/ComputedValue
        ALOAD 2
        INVOKEINTERFACE org/apache/tapestry5/plastic/ComputedValue.get (Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object;
        CHECKCAST org/slf4j/Logger
        PUTFIELD test/base/pages/Grandparent.log : Lorg/slf4j/Logger;
        ALOAD 0
        ALOAD 1
        ICONST_1
        INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get (I)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/plastic/ComputedValue
        ALOAD 2
        INVOKEINTERFACE org/apache/tapestry5/plastic/ComputedValue.get (Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/plastic/FieldConduit
        PUTFIELD test/base/pages/Grandparent.fieldSetOnEvent_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 2
        PUTFIELD test/base/pages/Grandparent.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext;
        ALOAD 0
        INVOKEVIRTUAL test/base/pages/Grandparent.initializeInstance ()V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0
        }

        DEBUG - // class version 50.0 (50)
        // access flags 0x421
        public abstract class test/base/pages/other/Parent extends test/base/pages/Grandparent {

        // compiled from: Parent.java

        // access flags 0x2
        private initializeInstance()V
        L0
        LINENUMBER 10 L0
        RETURN
        L1
        LOCALVARIABLE this Ltest/base/pages/other/Parent; L0 L1 0
        MAXSTACK = 1
        MAXLOCALS = 1

        // access flags 0x0
        onOther()V
        L0
        LINENUMBER 14 L0
        ALOAD 0
        ICONST_1
        PUTFIELD test/base/pages/other/Parent.fieldSetOnEvent : Z
        L1
        LINENUMBER 15 L1
        ALOAD 0
        GETFIELD test/base/pages/other/Parent.log : Lorg/slf4j/Logger;
        LDC "onOther: this.fieldSetOnEvent = {}"
        ALOAD 0
        GETFIELD test/base/pages/other/Parent.fieldSetOnEvent : Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L2
        LINENUMBER 16 L2
        ALOAD 0
        GETFIELD test/base/pages/other/Parent.log : Lorg/slf4j/Logger;
        LDC "onOther: this.getFieldValueViaParentGetter() = {}"
        ALOAD 0
        INVOKEVIRTUAL test/base/pages/other/Parent.getFieldValueViaParentGetter ()Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L3
        LINENUMBER 17 L3
        ALOAD 0
        GETFIELD test/base/pages/other/Parent.log : Lorg/slf4j/Logger;
        LDC "onOther: this.getFieldValueUsingGrandparentGetter() = {}"
        ALOAD 0
        INVOKEVIRTUAL test/base/pages/other/Parent.getFieldValueUsingGrandparentGetter ()Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L4
        LINENUMBER 19 L4
        RETURN
        L5
        LOCALVARIABLE this Ltest/base/pages/other/Parent; L0 L5 0
        MAXSTACK = 3
        MAXLOCALS = 1

        // access flags 0x1
        public getFieldValueViaParentGetter()Z
        L0
        LINENUMBER 23 L0
        ALOAD 0
        GETFIELD test/base/pages/other/Parent.fieldSetOnEvent : Z
        IRETURN
        L1
        LOCALVARIABLE this Ltest/base/pages/other/Parent; L0 L1 0
        MAXSTACK = 1
        MAXLOCALS = 1

        // access flags 0x1
        public dispatchComponentEvent(Lorg/apache/tapestry5/runtime/ComponentEvent;)Z
        L0
        ALOAD 0
        ALOAD 1
        INVOKESPECIAL test/base/pages/Grandparent.dispatchComponentEvent (Lorg/apache/tapestry5/runtime/ComponentEvent;)Z
        ISTORE 2
        ALOAD 1
        INVOKEINTERFACE org/apache/tapestry5/runtime/Event.isAborted ()Z
        IFEQ L1
        LDC true
        IRETURN
        GOTO L2
        L1
        L2
        ALOAD 1
        LDC "Other"
        LDC ""
        ICONST_0
        INVOKEINTERFACE org/apache/tapestry5/runtime/ComponentEvent.matches (Ljava/lang/String;Ljava/lang/String;I)Z
        IFEQ L3
        ALOAD 1
        LDC "test.base.pages.other.Parent.onOther()"
        INVOKEINTERFACE org/apache/tapestry5/runtime/Event.setMethodDescription (Ljava/lang/String;)V
        ALOAD 0
        INVOKEVIRTUAL test/base/pages/other/Parent.onOther ()V
        LDC true
        ISTORE 2
        GOTO L4
        L3
        L4
        ILOAD 2
        IRETURN
        L5
        LOCALVARIABLE var0 Z L0 L5 2
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public <init>()V
        NEW java/lang/IllegalStateException
        DUP
        LDC "Class test.base.pages.other.Parent has been transformed and may not be directly instantiated."
        INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
        ATHROW
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public <init>(Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V
        ALOAD 0
        ALOAD 1
        ALOAD 2
        INVOKESPECIAL test/base/pages/Grandparent.<init> (Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V
        ALOAD 0
        INVOKEVIRTUAL test/base/pages/other/Parent.initializeInstance ()V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0
        }

        DEBUG - // class version 50.0 (50)
        // access flags 0x21
        public class test/pages/Index extends test/base/pages/other/Parent {

        // compiled from: Index.java

        // access flags 0x2
        private Z result1
        @Lorg/apache/tapestry5/annotations/Persist;(value="flash")
        @Lorg/apache/tapestry5/annotations/Property;()

        // access flags 0x2
        private Z result2
        @Lorg/apache/tapestry5/annotations/Persist;(value="flash")
        @Lorg/apache/tapestry5/annotations/Property;()

        // access flags 0x2
        private Z result3
        @Lorg/apache/tapestry5/annotations/Persist;(value="flash")
        @Lorg/apache/tapestry5/annotations/Property;()

        // access flags 0x12
        private final Lorg/apache/tapestry5/plastic/FieldConduit; result1_FieldConduit

        // access flags 0x12
        private final Lorg/apache/tapestry5/plastic/InstanceContext; instanceContext

        // access flags 0x12
        private final Lorg/apache/tapestry5/plastic/FieldConduit; result2_FieldConduit

        // access flags 0x12
        private final Lorg/apache/tapestry5/plastic/FieldConduit; result3_FieldConduit

        // access flags 0x2
        private initializeInstance()V
        L0
        LINENUMBER 14 L0
        RETURN
        L1
        LOCALVARIABLE this Ltest/pages/Index; L0 L1 0
        MAXSTACK = 1
        MAXLOCALS = 1

        // access flags 0x0
        onSome()V
        L0
        LINENUMBER 33 L0
        ALOAD 0
        ICONST_1
        PUTFIELD test/pages/Index.fieldSetOnEvent : Z
        L1
        LINENUMBER 34 L1
        ALOAD 0
        GETFIELD test/pages/Index.log : Lorg/slf4j/Logger;
        LDC "onSome: this.fieldSetOnEvent = {}"
        ALOAD 0
        GETFIELD test/pages/Index.fieldSetOnEvent : Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L2
        LINENUMBER 35 L2
        ALOAD 0
        GETFIELD test/pages/Index.log : Lorg/slf4j/Logger;
        LDC "onSome: this.getFieldValueViaParentGetter() = {}"
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.getFieldValueViaParentGetter ()Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L3
        LINENUMBER 36 L3
        ALOAD 0
        GETFIELD test/pages/Index.log : Lorg/slf4j/Logger;
        LDC "onSome: this.getFieldValueUsingGrandparentGetter() = {}"
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.getFieldValueUsingGrandparentGetter ()Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L4
        LINENUMBER 37 L4
        RETURN
        L5
        LOCALVARIABLE this Ltest/pages/Index; L0 L5 0
        MAXSTACK = 3
        MAXLOCALS = 1

        // access flags 0x0
        onSuccess()Ljava/lang/Object;
        L0
        LINENUMBER 41 L0
        ALOAD 0
        GETFIELD test/pages/Index.log : Lorg/slf4j/Logger;
        LDC "onSuccess: this.fieldSetOnEvent = {}"
        ALOAD 0
        GETFIELD test/pages/Index.fieldSetOnEvent : Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L1
        LINENUMBER 42 L1
        ALOAD 0
        GETFIELD test/pages/Index.log : Lorg/slf4j/Logger;
        LDC "onSuccess: this.getFieldValueViaParentGetter() = {}"
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.getFieldValueViaParentGetter ()Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L2
        LINENUMBER 43 L2
        ALOAD 0
        GETFIELD test/pages/Index.log : Lorg/slf4j/Logger;
        LDC "onSuccess: this.getFieldValueUsingGrandparentGetter() = {}"
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.getFieldValueUsingGrandparentGetter ()Z
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V
        L3
        LINENUMBER 44 L3
        ALOAD 0
        ALOAD 0
        GETFIELD test/pages/Index.fieldSetOnEvent : Z
        INVOKEVIRTUAL test/pages/Index.conduit_set_result1 (Z)V
        L4
        LINENUMBER 45 L4
        ALOAD 0
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.getFieldValueViaParentGetter ()Z
        INVOKEVIRTUAL test/pages/Index.conduit_set_result2 (Z)V
        L5
        LINENUMBER 46 L5
        ALOAD 0
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.getFieldValueUsingGrandparentGetter ()Z
        INVOKEVIRTUAL test/pages/Index.conduit_set_result3 (Z)V
        L6
        LINENUMBER 47 L6
        ALOAD 0
        ARETURN
        L7
        LOCALVARIABLE this Ltest/pages/Index; L0 L7 0
        MAXSTACK = 3
        MAXLOCALS = 1

        // access flags 0x1
        public getResult1()Z
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.conduit_get_result1 ()Z
        IRETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public setResult1(Z)V
        ALOAD 0
        ILOAD 1
        INVOKEVIRTUAL test/pages/Index.conduit_set_result1 (Z)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public getResult2()Z
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.conduit_get_result2 ()Z
        IRETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public setResult2(Z)V
        ALOAD 0
        ILOAD 1
        INVOKEVIRTUAL test/pages/Index.conduit_set_result2 (Z)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public getResult3()Z
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.conduit_get_result3 ()Z
        IRETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public setResult3(Z)V
        ALOAD 0
        ILOAD 1
        INVOKEVIRTUAL test/pages/Index.conduit_set_result3 (Z)V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public dispatchComponentEvent(Lorg/apache/tapestry5/runtime/ComponentEvent;)Z
        L0
        ALOAD 0
        ALOAD 1
        INVOKESPECIAL test/base/pages/other/Parent.dispatchComponentEvent (Lorg/apache/tapestry5/runtime/ComponentEvent;)Z
        ISTORE 2
        ALOAD 1
        INVOKEINTERFACE org/apache/tapestry5/runtime/Event.isAborted ()Z
        IFEQ L1
        LDC true
        IRETURN
        GOTO L2
        L1
        L2
        ALOAD 1
        LDC "Some"
        LDC ""
        ICONST_0
        INVOKEINTERFACE org/apache/tapestry5/runtime/ComponentEvent.matches (Ljava/lang/String;Ljava/lang/String;I)Z
        IFEQ L3
        ALOAD 1
        LDC "test.pages.Index.onSome()"
        INVOKEINTERFACE org/apache/tapestry5/runtime/Event.setMethodDescription (Ljava/lang/String;)V
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.onSome ()V
        LDC true
        ISTORE 2
        GOTO L4
        L3
        L4
        ALOAD 1
        LDC "Success"
        LDC ""
        ICONST_0
        INVOKEINTERFACE org/apache/tapestry5/runtime/ComponentEvent.matches (Ljava/lang/String;Ljava/lang/String;I)Z
        IFEQ L5
        ALOAD 1
        LDC "test.pages.Index.onSuccess()"
        INVOKEINTERFACE org/apache/tapestry5/runtime/Event.setMethodDescription (Ljava/lang/String;)V
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.onSuccess ()Ljava/lang/Object;
        ALOAD 1
        SWAP
        INVOKEINTERFACE org/apache/tapestry5/runtime/Event.storeResult (Ljava/lang/Object;)Z
        IFEQ L6
        LDC true
        IRETURN
        GOTO L7
        L6
        L7
        LDC true
        ISTORE 2
        GOTO L8
        L5
        L8
        ILOAD 2
        IRETURN
        L9
        LOCALVARIABLE var0 Z L0 L9 2
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final reject_field_change_result1_FieldConduit(Lorg/apache/tapestry5/plastic/FieldConduit;)V
        NEW java/lang/IllegalStateException
        DUP
        LDC "Field result1_FieldConduit of class test.pages.Index is read-only."
        INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
        ATHROW
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final conduit_get_result1()Z
        ALOAD 0
        GETFIELD test/pages/Index.result1_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 0
        GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext;
        INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.get (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object;
        CHECKCAST java/lang/Boolean
        INVOKEVIRTUAL java/lang/Boolean.booleanValue ()Z
        DUP
        ALOAD 0
        SWAP
        PUTFIELD test/pages/Index.result1 : Z
        IRETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final conduit_set_result1(Z)V
        ALOAD 0
        GETFIELD test/pages/Index.result1_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 0
        GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext;
        ILOAD 1
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.set (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/Object;)V
        ALOAD 0
        ILOAD 1
        PUTFIELD test/pages/Index.result1 : Z
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final reject_field_change_result2_FieldConduit(Lorg/apache/tapestry5/plastic/FieldConduit;)V
        NEW java/lang/IllegalStateException
        DUP
        LDC "Field result2_FieldConduit of class test.pages.Index is read-only."
        INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
        ATHROW
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final conduit_get_result2()Z
        ALOAD 0
        GETFIELD test/pages/Index.result2_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 0
        GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext;
        INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.get (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object;
        CHECKCAST java/lang/Boolean
        INVOKEVIRTUAL java/lang/Boolean.booleanValue ()Z
        DUP
        ALOAD 0
        SWAP
        PUTFIELD test/pages/Index.result2 : Z
        IRETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final conduit_set_result2(Z)V
        ALOAD 0
        GETFIELD test/pages/Index.result2_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 0
        GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext;
        ILOAD 1
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.set (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/Object;)V
        ALOAD 0
        ILOAD 1
        PUTFIELD test/pages/Index.result2 : Z
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final reject_field_change_result3_FieldConduit(Lorg/apache/tapestry5/plastic/FieldConduit;)V
        NEW java/lang/IllegalStateException
        DUP
        LDC "Field result3_FieldConduit of class test.pages.Index is read-only."
        INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
        ATHROW
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final conduit_get_result3()Z
        ALOAD 0
        GETFIELD test/pages/Index.result3_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 0
        GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext;
        INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.get (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object;
        CHECKCAST java/lang/Boolean
        INVOKEVIRTUAL java/lang/Boolean.booleanValue ()Z
        DUP
        ALOAD 0
        SWAP
        PUTFIELD test/pages/Index.result3 : Z
        IRETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1010
        final conduit_set_result3(Z)V
        ALOAD 0
        GETFIELD test/pages/Index.result3_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 0
        GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext;
        ILOAD 1
        INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
        INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.set (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/Object;)V
        ALOAD 0
        ILOAD 1
        PUTFIELD test/pages/Index.result3 : Z
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public <init>()V
        NEW java/lang/IllegalStateException
        DUP
        LDC "Class test.pages.Index has been transformed and may not be directly instantiated."
        INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
        ATHROW
        MAXSTACK = 0
        MAXLOCALS = 0

        // access flags 0x1
        public <init>(Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V
        ALOAD 0
        ALOAD 1
        ALOAD 2
        INVOKESPECIAL test/base/pages/other/Parent.<init> (Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V
        ALOAD 0
        ALOAD 1
        ICONST_2
        INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get (I)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/plastic/ComputedValue
        ALOAD 2
        INVOKEINTERFACE org/apache/tapestry5/plastic/ComputedValue.get (Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/plastic/FieldConduit
        PUTFIELD test/pages/Index.result1_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 2
        PUTFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext;
        ALOAD 0
        ALOAD 1
        ICONST_3
        INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get (I)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/plastic/ComputedValue
        ALOAD 2
        INVOKEINTERFACE org/apache/tapestry5/plastic/ComputedValue.get (Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/plastic/FieldConduit
        PUTFIELD test/pages/Index.result2_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        ALOAD 1
        ICONST_4
        INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get (I)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/plastic/ComputedValue
        ALOAD 2
        INVOKEINTERFACE org/apache/tapestry5/plastic/ComputedValue.get (Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object;
        CHECKCAST org/apache/tapestry5/plastic/FieldConduit
        PUTFIELD test/pages/Index.result3_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit;
        ALOAD 0
        INVOKEVIRTUAL test/pages/Index.initializeInstance ()V
        RETURN
        MAXSTACK = 0
        MAXLOCALS = 0
        }

        Show
        Howard M. Lewis Ship added a comment - I've taken the code and renamed the classes slightly (to Grandparent and Parent), and enabled component transformation logging. DEBUG - // class version 50.0 (50) // access flags 0x21 public class test/base/pages/Grandparent implements org/apache/tapestry5/runtime/Component org/apache/tapestry5/runtime/RenderCommand { // compiled from: Grandparent.java // access flags 0x14 protected final Lorg/slf4j/Logger; log @Lorg/apache/tapestry5/ioc/annotations/Inject;() // access flags 0x4 protected Z fieldSetOnEvent @Lorg/apache/tapestry5/annotations/Property;() // access flags 0x12 private final Lorg/apache/tapestry5/internal/InternalComponentResources; internalComponentResources // access flags 0x12 private final Lorg/apache/tapestry5/internal/InternalComponentResources; resources // access flags 0x12 private final Lorg/apache/tapestry5/plastic/FieldConduit; fieldSetOnEvent_FieldConduit // access flags 0x12 private final Lorg/apache/tapestry5/plastic/InstanceContext; instanceContext // access flags 0x2 private initializeInstance()V L0 LINENUMBER 12 L0 RETURN L1 LOCALVARIABLE this Ltest/base/pages/Grandparent; L0 L1 0 MAXSTACK = 1 MAXLOCALS = 1 // access flags 0x1 public getFieldValueUsingGrandparentGetter()Z L0 LINENUMBER 19 L0 ALOAD 0 INVOKEVIRTUAL test/base/pages/Grandparent.conduit_get_fieldSetOnEvent ()Z IRETURN L1 LOCALVARIABLE this Ltest/base/pages/Grandparent; L0 L1 0 MAXSTACK = 1 MAXLOCALS = 1 // access flags 0x0 onAnother()V L0 LINENUMBER 28 L0 ALOAD 0 ICONST_1 INVOKEVIRTUAL test/base/pages/Grandparent.conduit_set_fieldSetOnEvent (Z)V L1 LINENUMBER 29 L1 ALOAD 0 GETFIELD test/base/pages/Grandparent.log : Lorg/slf4j/Logger; LDC "onAnother: this.fieldSetOnEvent = {}" ALOAD 0 INVOKEVIRTUAL test/base/pages/Grandparent.conduit_get_fieldSetOnEvent ()Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L2 LINENUMBER 30 L2 ALOAD 0 GETFIELD test/base/pages/Grandparent.log : Lorg/slf4j/Logger; LDC "onAnother: this.getFieldValueUsingGrandparentGetter() = {}" ALOAD 0 INVOKEVIRTUAL test/base/pages/Grandparent.getFieldValueUsingGrandparentGetter ()Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L3 LINENUMBER 32 L3 RETURN L4 LOCALVARIABLE this Ltest/base/pages/Grandparent; L0 L4 0 MAXSTACK = 3 MAXLOCALS = 1 // access flags 0x1 public postRenderCleanup()V ALOAD 0 GETFIELD test/base/pages/Grandparent.resources : Lorg/apache/tapestry5/internal/InternalComponentResources; INVOKEINTERFACE org/apache/tapestry5/internal/InternalComponentResources.postRenderCleanup ()V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public setupRender(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public beginRender(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public beforeRenderTemplate(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public afterRenderTemplate(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public beforeRenderBody(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public afterRenderBody(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public afterRender(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public cleanupRender(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/Event;)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public dispatchComponentEvent(Lorg/apache/tapestry5/runtime/ComponentEvent;)Z L0 LDC false ISTORE 2 ALOAD 1 LDC "Another" LDC "" ICONST_0 INVOKEINTERFACE org/apache/tapestry5/runtime/ComponentEvent.matches (Ljava/lang/String;Ljava/lang/String;I)Z IFEQ L1 ALOAD 1 LDC "test.base.pages.Grandparent.onAnother()" INVOKEINTERFACE org/apache/tapestry5/runtime/Event.setMethodDescription (Ljava/lang/String;)V ALOAD 0 INVOKEVIRTUAL test/base/pages/Grandparent.onAnother ()V LDC true ISTORE 2 GOTO L2 L1 L2 ILOAD 2 IRETURN L3 LOCALVARIABLE var0 Z L0 L3 2 MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public getComponentResources()Lorg/apache/tapestry5/ComponentResources; ALOAD 0 GETFIELD test/base/pages/Grandparent.internalComponentResources : Lorg/apache/tapestry5/internal/InternalComponentResources; ARETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final reject_field_change_internalComponentResources(Lorg/apache/tapestry5/internal/InternalComponentResources;)V NEW java/lang/IllegalStateException DUP LDC "Field internalComponentResources of class test.base.pages.Grandparent is read-only." INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V ATHROW MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public getFieldSetOnEvent()Z ALOAD 0 INVOKEVIRTUAL test/base/pages/Grandparent.conduit_get_fieldSetOnEvent ()Z IRETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public setFieldSetOnEvent(Z)V ALOAD 0 ILOAD 1 INVOKEVIRTUAL test/base/pages/Grandparent.conduit_set_fieldSetOnEvent (Z)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public render(Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/RenderQueue;)V ALOAD 0 GETFIELD test/base/pages/Grandparent.resources : Lorg/apache/tapestry5/internal/InternalComponentResources; ALOAD 1 ALOAD 2 INVOKEINTERFACE org/apache/tapestry5/internal/InternalComponentResources.render (Lorg/apache/tapestry5/MarkupWriter;Lorg/apache/tapestry5/runtime/RenderQueue;)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final reject_field_change_resources(Lorg/apache/tapestry5/internal/InternalComponentResources;)V NEW java/lang/IllegalStateException DUP LDC "Field resources of class test.base.pages.Grandparent is read-only." INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V ATHROW MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1014 protected final reject_field_change_log(Lorg/slf4j/Logger;)V NEW java/lang/IllegalStateException DUP LDC "Field log of class test.base.pages.Grandparent is read-only." INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V ATHROW MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final reject_field_change_fieldSetOnEvent_FieldConduit(Lorg/apache/tapestry5/plastic/FieldConduit;)V NEW java/lang/IllegalStateException DUP LDC "Field fieldSetOnEvent_FieldConduit of class test.base.pages.Grandparent is read-only." INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V ATHROW MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1014 protected final conduit_get_fieldSetOnEvent()Z ALOAD 0 GETFIELD test/base/pages/Grandparent.fieldSetOnEvent_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 0 GETFIELD test/base/pages/Grandparent.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext; INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.get (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object; CHECKCAST java/lang/Boolean INVOKEVIRTUAL java/lang/Boolean.booleanValue ()Z DUP ALOAD 0 SWAP PUTFIELD test/base/pages/Grandparent.fieldSetOnEvent : Z IRETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1014 protected final conduit_set_fieldSetOnEvent(Z)V ALOAD 0 GETFIELD test/base/pages/Grandparent.fieldSetOnEvent_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 0 GETFIELD test/base/pages/Grandparent.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext; ILOAD 1 INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.set (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/Object;)V ALOAD 0 ILOAD 1 PUTFIELD test/base/pages/Grandparent.fieldSetOnEvent : Z RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public <init>()V NEW java/lang/IllegalStateException DUP LDC "Class test.base.pages.Grandparent has been transformed and may not be directly instantiated." INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V ATHROW MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public <init>(Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V ALOAD 0 INVOKESPECIAL java/lang/Object.<init> ()V ALOAD 0 ALOAD 2 LDC "org.apache.tapestry5.internal.InternalComponentResources" INVOKESTATIC org/apache/tapestry5/internal/plastic/PlasticInternalUtils.getFromInstanceContext (Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/String;)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/internal/InternalComponentResources PUTFIELD test/base/pages/Grandparent.internalComponentResources : Lorg/apache/tapestry5/internal/InternalComponentResources; ALOAD 0 ALOAD 2 LDC "org.apache.tapestry5.internal.InternalComponentResources" INVOKESTATIC org/apache/tapestry5/internal/plastic/PlasticInternalUtils.getFromInstanceContext (Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/String;)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/internal/InternalComponentResources PUTFIELD test/base/pages/Grandparent.resources : Lorg/apache/tapestry5/internal/InternalComponentResources; ALOAD 0 ALOAD 1 ICONST_0 INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get (I)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/plastic/ComputedValue ALOAD 2 INVOKEINTERFACE org/apache/tapestry5/plastic/ComputedValue.get (Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object; CHECKCAST org/slf4j/Logger PUTFIELD test/base/pages/Grandparent.log : Lorg/slf4j/Logger; ALOAD 0 ALOAD 1 ICONST_1 INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get (I)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/plastic/ComputedValue ALOAD 2 INVOKEINTERFACE org/apache/tapestry5/plastic/ComputedValue.get (Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/plastic/FieldConduit PUTFIELD test/base/pages/Grandparent.fieldSetOnEvent_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 2 PUTFIELD test/base/pages/Grandparent.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext; ALOAD 0 INVOKEVIRTUAL test/base/pages/Grandparent.initializeInstance ()V RETURN MAXSTACK = 0 MAXLOCALS = 0 } DEBUG - // class version 50.0 (50) // access flags 0x421 public abstract class test/base/pages/other/Parent extends test/base/pages/Grandparent { // compiled from: Parent.java // access flags 0x2 private initializeInstance()V L0 LINENUMBER 10 L0 RETURN L1 LOCALVARIABLE this Ltest/base/pages/other/Parent; L0 L1 0 MAXSTACK = 1 MAXLOCALS = 1 // access flags 0x0 onOther()V L0 LINENUMBER 14 L0 ALOAD 0 ICONST_1 PUTFIELD test/base/pages/other/Parent.fieldSetOnEvent : Z L1 LINENUMBER 15 L1 ALOAD 0 GETFIELD test/base/pages/other/Parent.log : Lorg/slf4j/Logger; LDC "onOther: this.fieldSetOnEvent = {}" ALOAD 0 GETFIELD test/base/pages/other/Parent.fieldSetOnEvent : Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L2 LINENUMBER 16 L2 ALOAD 0 GETFIELD test/base/pages/other/Parent.log : Lorg/slf4j/Logger; LDC "onOther: this.getFieldValueViaParentGetter() = {}" ALOAD 0 INVOKEVIRTUAL test/base/pages/other/Parent.getFieldValueViaParentGetter ()Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L3 LINENUMBER 17 L3 ALOAD 0 GETFIELD test/base/pages/other/Parent.log : Lorg/slf4j/Logger; LDC "onOther: this.getFieldValueUsingGrandparentGetter() = {}" ALOAD 0 INVOKEVIRTUAL test/base/pages/other/Parent.getFieldValueUsingGrandparentGetter ()Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L4 LINENUMBER 19 L4 RETURN L5 LOCALVARIABLE this Ltest/base/pages/other/Parent; L0 L5 0 MAXSTACK = 3 MAXLOCALS = 1 // access flags 0x1 public getFieldValueViaParentGetter()Z L0 LINENUMBER 23 L0 ALOAD 0 GETFIELD test/base/pages/other/Parent.fieldSetOnEvent : Z IRETURN L1 LOCALVARIABLE this Ltest/base/pages/other/Parent; L0 L1 0 MAXSTACK = 1 MAXLOCALS = 1 // access flags 0x1 public dispatchComponentEvent(Lorg/apache/tapestry5/runtime/ComponentEvent;)Z L0 ALOAD 0 ALOAD 1 INVOKESPECIAL test/base/pages/Grandparent.dispatchComponentEvent (Lorg/apache/tapestry5/runtime/ComponentEvent;)Z ISTORE 2 ALOAD 1 INVOKEINTERFACE org/apache/tapestry5/runtime/Event.isAborted ()Z IFEQ L1 LDC true IRETURN GOTO L2 L1 L2 ALOAD 1 LDC "Other" LDC "" ICONST_0 INVOKEINTERFACE org/apache/tapestry5/runtime/ComponentEvent.matches (Ljava/lang/String;Ljava/lang/String;I)Z IFEQ L3 ALOAD 1 LDC "test.base.pages.other.Parent.onOther()" INVOKEINTERFACE org/apache/tapestry5/runtime/Event.setMethodDescription (Ljava/lang/String;)V ALOAD 0 INVOKEVIRTUAL test/base/pages/other/Parent.onOther ()V LDC true ISTORE 2 GOTO L4 L3 L4 ILOAD 2 IRETURN L5 LOCALVARIABLE var0 Z L0 L5 2 MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public <init>()V NEW java/lang/IllegalStateException DUP LDC "Class test.base.pages.other.Parent has been transformed and may not be directly instantiated." INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V ATHROW MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public <init>(Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V ALOAD 0 ALOAD 1 ALOAD 2 INVOKESPECIAL test/base/pages/Grandparent.<init> (Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V ALOAD 0 INVOKEVIRTUAL test/base/pages/other/Parent.initializeInstance ()V RETURN MAXSTACK = 0 MAXLOCALS = 0 } DEBUG - // class version 50.0 (50) // access flags 0x21 public class test/pages/Index extends test/base/pages/other/Parent { // compiled from: Index.java // access flags 0x2 private Z result1 @Lorg/apache/tapestry5/annotations/Persist;(value="flash") @Lorg/apache/tapestry5/annotations/Property;() // access flags 0x2 private Z result2 @Lorg/apache/tapestry5/annotations/Persist;(value="flash") @Lorg/apache/tapestry5/annotations/Property;() // access flags 0x2 private Z result3 @Lorg/apache/tapestry5/annotations/Persist;(value="flash") @Lorg/apache/tapestry5/annotations/Property;() // access flags 0x12 private final Lorg/apache/tapestry5/plastic/FieldConduit; result1_FieldConduit // access flags 0x12 private final Lorg/apache/tapestry5/plastic/InstanceContext; instanceContext // access flags 0x12 private final Lorg/apache/tapestry5/plastic/FieldConduit; result2_FieldConduit // access flags 0x12 private final Lorg/apache/tapestry5/plastic/FieldConduit; result3_FieldConduit // access flags 0x2 private initializeInstance()V L0 LINENUMBER 14 L0 RETURN L1 LOCALVARIABLE this Ltest/pages/Index; L0 L1 0 MAXSTACK = 1 MAXLOCALS = 1 // access flags 0x0 onSome()V L0 LINENUMBER 33 L0 ALOAD 0 ICONST_1 PUTFIELD test/pages/Index.fieldSetOnEvent : Z L1 LINENUMBER 34 L1 ALOAD 0 GETFIELD test/pages/Index.log : Lorg/slf4j/Logger; LDC "onSome: this.fieldSetOnEvent = {}" ALOAD 0 GETFIELD test/pages/Index.fieldSetOnEvent : Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L2 LINENUMBER 35 L2 ALOAD 0 GETFIELD test/pages/Index.log : Lorg/slf4j/Logger; LDC "onSome: this.getFieldValueViaParentGetter() = {}" ALOAD 0 INVOKEVIRTUAL test/pages/Index.getFieldValueViaParentGetter ()Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L3 LINENUMBER 36 L3 ALOAD 0 GETFIELD test/pages/Index.log : Lorg/slf4j/Logger; LDC "onSome: this.getFieldValueUsingGrandparentGetter() = {}" ALOAD 0 INVOKEVIRTUAL test/pages/Index.getFieldValueUsingGrandparentGetter ()Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L4 LINENUMBER 37 L4 RETURN L5 LOCALVARIABLE this Ltest/pages/Index; L0 L5 0 MAXSTACK = 3 MAXLOCALS = 1 // access flags 0x0 onSuccess()Ljava/lang/Object; L0 LINENUMBER 41 L0 ALOAD 0 GETFIELD test/pages/Index.log : Lorg/slf4j/Logger; LDC "onSuccess: this.fieldSetOnEvent = {}" ALOAD 0 GETFIELD test/pages/Index.fieldSetOnEvent : Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L1 LINENUMBER 42 L1 ALOAD 0 GETFIELD test/pages/Index.log : Lorg/slf4j/Logger; LDC "onSuccess: this.getFieldValueViaParentGetter() = {}" ALOAD 0 INVOKEVIRTUAL test/pages/Index.getFieldValueViaParentGetter ()Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L2 LINENUMBER 43 L2 ALOAD 0 GETFIELD test/pages/Index.log : Lorg/slf4j/Logger; LDC "onSuccess: this.getFieldValueUsingGrandparentGetter() = {}" ALOAD 0 INVOKEVIRTUAL test/pages/Index.getFieldValueUsingGrandparentGetter ()Z INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/slf4j/Logger.info (Ljava/lang/String;Ljava/lang/Object;)V L3 LINENUMBER 44 L3 ALOAD 0 ALOAD 0 GETFIELD test/pages/Index.fieldSetOnEvent : Z INVOKEVIRTUAL test/pages/Index.conduit_set_result1 (Z)V L4 LINENUMBER 45 L4 ALOAD 0 ALOAD 0 INVOKEVIRTUAL test/pages/Index.getFieldValueViaParentGetter ()Z INVOKEVIRTUAL test/pages/Index.conduit_set_result2 (Z)V L5 LINENUMBER 46 L5 ALOAD 0 ALOAD 0 INVOKEVIRTUAL test/pages/Index.getFieldValueUsingGrandparentGetter ()Z INVOKEVIRTUAL test/pages/Index.conduit_set_result3 (Z)V L6 LINENUMBER 47 L6 ALOAD 0 ARETURN L7 LOCALVARIABLE this Ltest/pages/Index; L0 L7 0 MAXSTACK = 3 MAXLOCALS = 1 // access flags 0x1 public getResult1()Z ALOAD 0 INVOKEVIRTUAL test/pages/Index.conduit_get_result1 ()Z IRETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public setResult1(Z)V ALOAD 0 ILOAD 1 INVOKEVIRTUAL test/pages/Index.conduit_set_result1 (Z)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public getResult2()Z ALOAD 0 INVOKEVIRTUAL test/pages/Index.conduit_get_result2 ()Z IRETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public setResult2(Z)V ALOAD 0 ILOAD 1 INVOKEVIRTUAL test/pages/Index.conduit_set_result2 (Z)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public getResult3()Z ALOAD 0 INVOKEVIRTUAL test/pages/Index.conduit_get_result3 ()Z IRETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public setResult3(Z)V ALOAD 0 ILOAD 1 INVOKEVIRTUAL test/pages/Index.conduit_set_result3 (Z)V RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public dispatchComponentEvent(Lorg/apache/tapestry5/runtime/ComponentEvent;)Z L0 ALOAD 0 ALOAD 1 INVOKESPECIAL test/base/pages/other/Parent.dispatchComponentEvent (Lorg/apache/tapestry5/runtime/ComponentEvent;)Z ISTORE 2 ALOAD 1 INVOKEINTERFACE org/apache/tapestry5/runtime/Event.isAborted ()Z IFEQ L1 LDC true IRETURN GOTO L2 L1 L2 ALOAD 1 LDC "Some" LDC "" ICONST_0 INVOKEINTERFACE org/apache/tapestry5/runtime/ComponentEvent.matches (Ljava/lang/String;Ljava/lang/String;I)Z IFEQ L3 ALOAD 1 LDC "test.pages.Index.onSome()" INVOKEINTERFACE org/apache/tapestry5/runtime/Event.setMethodDescription (Ljava/lang/String;)V ALOAD 0 INVOKEVIRTUAL test/pages/Index.onSome ()V LDC true ISTORE 2 GOTO L4 L3 L4 ALOAD 1 LDC "Success" LDC "" ICONST_0 INVOKEINTERFACE org/apache/tapestry5/runtime/ComponentEvent.matches (Ljava/lang/String;Ljava/lang/String;I)Z IFEQ L5 ALOAD 1 LDC "test.pages.Index.onSuccess()" INVOKEINTERFACE org/apache/tapestry5/runtime/Event.setMethodDescription (Ljava/lang/String;)V ALOAD 0 INVOKEVIRTUAL test/pages/Index.onSuccess ()Ljava/lang/Object; ALOAD 1 SWAP INVOKEINTERFACE org/apache/tapestry5/runtime/Event.storeResult (Ljava/lang/Object;)Z IFEQ L6 LDC true IRETURN GOTO L7 L6 L7 LDC true ISTORE 2 GOTO L8 L5 L8 ILOAD 2 IRETURN L9 LOCALVARIABLE var0 Z L0 L9 2 MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final reject_field_change_result1_FieldConduit(Lorg/apache/tapestry5/plastic/FieldConduit;)V NEW java/lang/IllegalStateException DUP LDC "Field result1_FieldConduit of class test.pages.Index is read-only." INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V ATHROW MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final conduit_get_result1()Z ALOAD 0 GETFIELD test/pages/Index.result1_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 0 GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext; INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.get (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object; CHECKCAST java/lang/Boolean INVOKEVIRTUAL java/lang/Boolean.booleanValue ()Z DUP ALOAD 0 SWAP PUTFIELD test/pages/Index.result1 : Z IRETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final conduit_set_result1(Z)V ALOAD 0 GETFIELD test/pages/Index.result1_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 0 GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext; ILOAD 1 INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.set (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/Object;)V ALOAD 0 ILOAD 1 PUTFIELD test/pages/Index.result1 : Z RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final reject_field_change_result2_FieldConduit(Lorg/apache/tapestry5/plastic/FieldConduit;)V NEW java/lang/IllegalStateException DUP LDC "Field result2_FieldConduit of class test.pages.Index is read-only." INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V ATHROW MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final conduit_get_result2()Z ALOAD 0 GETFIELD test/pages/Index.result2_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 0 GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext; INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.get (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object; CHECKCAST java/lang/Boolean INVOKEVIRTUAL java/lang/Boolean.booleanValue ()Z DUP ALOAD 0 SWAP PUTFIELD test/pages/Index.result2 : Z IRETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final conduit_set_result2(Z)V ALOAD 0 GETFIELD test/pages/Index.result2_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 0 GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext; ILOAD 1 INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.set (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/Object;)V ALOAD 0 ILOAD 1 PUTFIELD test/pages/Index.result2 : Z RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final reject_field_change_result3_FieldConduit(Lorg/apache/tapestry5/plastic/FieldConduit;)V NEW java/lang/IllegalStateException DUP LDC "Field result3_FieldConduit of class test.pages.Index is read-only." INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V ATHROW MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final conduit_get_result3()Z ALOAD 0 GETFIELD test/pages/Index.result3_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 0 GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext; INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.get (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object; CHECKCAST java/lang/Boolean INVOKEVIRTUAL java/lang/Boolean.booleanValue ()Z DUP ALOAD 0 SWAP PUTFIELD test/pages/Index.result3 : Z IRETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1010 final conduit_set_result3(Z)V ALOAD 0 GETFIELD test/pages/Index.result3_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 0 GETFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext; ILOAD 1 INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean; INVOKEINTERFACE org/apache/tapestry5/plastic/FieldConduit.set (Ljava/lang/Object;Lorg/apache/tapestry5/plastic/InstanceContext;Ljava/lang/Object;)V ALOAD 0 ILOAD 1 PUTFIELD test/pages/Index.result3 : Z RETURN MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public <init>()V NEW java/lang/IllegalStateException DUP LDC "Class test.pages.Index has been transformed and may not be directly instantiated." INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V ATHROW MAXSTACK = 0 MAXLOCALS = 0 // access flags 0x1 public <init>(Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V ALOAD 0 ALOAD 1 ALOAD 2 INVOKESPECIAL test/base/pages/other/Parent.<init> (Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V ALOAD 0 ALOAD 1 ICONST_2 INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get (I)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/plastic/ComputedValue ALOAD 2 INVOKEINTERFACE org/apache/tapestry5/plastic/ComputedValue.get (Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/plastic/FieldConduit PUTFIELD test/pages/Index.result1_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 2 PUTFIELD test/pages/Index.instanceContext : Lorg/apache/tapestry5/plastic/InstanceContext; ALOAD 0 ALOAD 1 ICONST_3 INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get (I)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/plastic/ComputedValue ALOAD 2 INVOKEINTERFACE org/apache/tapestry5/plastic/ComputedValue.get (Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/plastic/FieldConduit PUTFIELD test/pages/Index.result2_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 ALOAD 1 ICONST_4 INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get (I)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/plastic/ComputedValue ALOAD 2 INVOKEINTERFACE org/apache/tapestry5/plastic/ComputedValue.get (Lorg/apache/tapestry5/plastic/InstanceContext;)Ljava/lang/Object; CHECKCAST org/apache/tapestry5/plastic/FieldConduit PUTFIELD test/pages/Index.result3_FieldConduit : Lorg/apache/tapestry5/plastic/FieldConduit; ALOAD 0 INVOKEVIRTUAL test/pages/Index.initializeInstance ()V RETURN MAXSTACK = 0 MAXLOCALS = 0 }
        Hide
        Howard M. Lewis Ship added a comment -

        Already seeing some incorrect bytecode, in the intermediate class, Parent:

        onOther()V
        L0
        LINENUMBER 14 L0
        ALOAD 0
        ICONST_1
        PUTFIELD test/base/pages/other/Parent.fieldSetOnEvent : Z

        ... thought it might be due to name collision, but nope. That is, the fact that each class defines a method named "onOther()".

        Awesome. I now have a test case that fails in the Plastic test suite.

        Show
        Howard M. Lewis Ship added a comment - Already seeing some incorrect bytecode, in the intermediate class, Parent: onOther()V L0 LINENUMBER 14 L0 ALOAD 0 ICONST_1 PUTFIELD test/base/pages/other/Parent.fieldSetOnEvent : Z ... thought it might be due to name collision, but nope. That is, the fact that each class defines a method named "onOther()". Awesome. I now have a test case that fails in the Plastic test suite.
        Hide
        Howard M. Lewis Ship added a comment -

        Think I found the problem:

        private FieldInstrumentations findInstrumentations(FieldInsnNode node)
        {
        if (node.owner.equals(classNode.name))

        { return fieldInstrumentations; }

        return pool.getFieldInstrumentations(node.owner);

        }

        What I'm seeing in the debugger is that node.owner is the name of the class being transformed, not the class that contains the field.

        Show
        Howard M. Lewis Ship added a comment - Think I found the problem: private FieldInstrumentations findInstrumentations(FieldInsnNode node) { if (node.owner.equals(classNode.name)) { return fieldInstrumentations; } return pool.getFieldInstrumentations(node.owner); } What I'm seeing in the debugger is that node.owner is the name of the class being transformed , not the class that contains the field.
        Hide
        Howard M. Lewis Ship added a comment -

        public class FieldInsnNode extends AbstractInsnNode {

        /**

        • The internal name of the field's owner class (see
        • {@link org.apache.tapestry5.internal.plastic.asm.Type#getInternalName() getInternalName}

          ).
          */
          public String owner;

        I wonder if this is a bug in the copy of ASM copied into Plastic?

        Nope. node.owner doesn't do what I thought. It's the name of the class containing the reference to the field, not the name of the class that defines the field.

        Show
        Howard M. Lewis Ship added a comment - public class FieldInsnNode extends AbstractInsnNode { /** The internal name of the field's owner class (see {@link org.apache.tapestry5.internal.plastic.asm.Type#getInternalName() getInternalName} ). */ public String owner; I wonder if this is a bug in the copy of ASM copied into Plastic? Nope. node.owner doesn't do what I thought. It's the name of the class containing the reference to the field, not the name of the class that defines the field.
        Hide
        Hudson added a comment -

        Integrated in tapestry-trunk-freestyle #700 (See https://builds.apache.org/job/tapestry-trunk-freestyle/700/)
        TAP5-1860: Access to protected component fields does not always reflect in subclasses (Revision 1325553)

        Result = SUCCESS
        hlship : http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1325553
        Files :

        • /tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/FieldInstrumentations.java
        • /tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
        • /tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
        • /tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/FieldConduitTests.groovy
        • /tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/ProtectedFieldSubclass.java
        Show
        Hudson added a comment - Integrated in tapestry-trunk-freestyle #700 (See https://builds.apache.org/job/tapestry-trunk-freestyle/700/ ) TAP5-1860 : Access to protected component fields does not always reflect in subclasses (Revision 1325553) Result = SUCCESS hlship : http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1325553 Files : /tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/FieldInstrumentations.java /tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java /tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java /tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/FieldConduitTests.groovy /tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/ProtectedFieldSubclass.java
        Hide
        Hudson added a comment -

        Integrated in tapestry-5.3-freestyle #22 (See https://builds.apache.org/job/tapestry-5.3-freestyle/22/)
        TAP5-1860: Access to protected component fields does not always reflect in subclasses (Revision 1325552)

        Result = FAILURE
        hlship : http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1325552
        Files :

        • /tapestry/tapestry5/branches/5.3/plastic/src/main/java/org/apache/tapestry5/internal/plastic/FieldInstrumentations.java
        • /tapestry/tapestry5/branches/5.3/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
        • /tapestry/tapestry5/branches/5.3/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
        • /tapestry/tapestry5/branches/5.3/plastic/src/test/groovy/org/apache/tapestry5/plastic/FieldConduitTests.groovy
        Show
        Hudson added a comment - Integrated in tapestry-5.3-freestyle #22 (See https://builds.apache.org/job/tapestry-5.3-freestyle/22/ ) TAP5-1860 : Access to protected component fields does not always reflect in subclasses (Revision 1325552) Result = FAILURE hlship : http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1325552 Files : /tapestry/tapestry5/branches/5.3/plastic/src/main/java/org/apache/tapestry5/internal/plastic/FieldInstrumentations.java /tapestry/tapestry5/branches/5.3/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java /tapestry/tapestry5/branches/5.3/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java /tapestry/tapestry5/branches/5.3/plastic/src/test/groovy/org/apache/tapestry5/plastic/FieldConduitTests.groovy

          People

          • Assignee:
            Howard M. Lewis Ship
            Reporter:
            Olaf Tomczak
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development