[jira] [Commented] (GROOVY-7969) Incorrect modifers on setter for volatile property with @Bindable/@Vetoable
[ https://issues.apache.org/jira/browse/GROOVY-7969?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15571138#comment-15571138 ] ASF GitHub Bot commented on GROOVY-7969: Github user paulk-asert closed the pull request at: https://github.com/apache/groovy/pull/448 > Incorrect modifers on setter for volatile property with @Bindable/@Vetoable > --- > > Key: GROOVY-7969 > URL: https://issues.apache.org/jira/browse/GROOVY-7969 > Project: Groovy > Issue Type: Bug >Reporter: Paul King >Assignee: Paul King > Fix For: 2.4.8 > > > As part of GROOVY-3726 we fixed getter/setter method modifiers for volatile > (or transient) properties. The @Bindable and @Vetoable transforms however > generate their own setters and bypass that fix. > Here is a script to reproduce the problem: > {code} > import static java.lang.reflect.Modifier.toString > import groovy.beans.Bindable > class Foo { > volatile Date now > } > @Bindable class Bar { > volatile Date then > } > void pretty(int mod) { println "${mod.toString().padRight(10)}" + > toString(mod) } > pretty(Foo.getMethod('getNow').modifiers) > pretty(Foo.getMethod('setNow', Date).modifiers) > pretty(Bar.getMethod('getThen').modifiers) > pretty(Bar.getMethod('setThen', Date).modifiers) > {code} > which currently produces: > {noformat} > 1 public > 1 public > 1 public > 65public volatile > {noformat} -- This message was sent by Atlassian JIRA (v6.3.4#6332)
[jira] [Commented] (GROOVY-7969) Incorrect modifers on setter for volatile property with @Bindable/@Vetoable
[ https://issues.apache.org/jira/browse/GROOVY-7969?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15569528#comment-15569528 ] ASF GitHub Bot commented on GROOVY-7969: Github user blackdrag commented on a diff in the pull request: https://github.com/apache/groovy/pull/448#discussion_r83071079 --- Diff: src/main/org/codehaus/groovy/ast/tools/PropertyNodeUtils.java --- @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.codehaus.groovy.ast.tools; + +import org.codehaus.groovy.ast.PropertyNode; + +import java.lang.reflect.Modifier; + +public class PropertyNodeUtils { +/** + * Fields within the AST that have no explicit visibility are deemed to be properties + * and represented by a PropertyNode. The Groovy compiler creates accessor methods and + * a backing field for such property nodes. During this process, all modifiers + * from the property are carried over to the backing field (so a property marked as + * {@code transient} will have a {@code transient} backing field) but when creating + * the accessor methods we don't carry over modifier values which don't make sense for + * methods (this includes VOLATILE and TRANSIENT) but other modifiers are carried over, + * for example {@code static}. + * + * @param propNode the original property node + * @return the modifiers which make sense for an accessor method + */ +public static int adjustPropertyModifiersForMethod(PropertyNode propNode) { +int propNodeModifiers = propNode.getModifiers(); +// GROOVY-3726: clear volatile, transient modifiers so that they don't get applied to methods +if ((propNodeModifiers & Modifier.VOLATILE) != 0) { +propNodeModifiers -= Modifier.VOLATILE; +} +if ((propNodeModifiers & Modifier.TRANSIENT) != 0) { +propNodeModifiers -= Modifier.TRANSIENT; +} --- End diff -- or: propNodeModifiers = ~(Modifier.TRANSIENT | Modifier.VOLATILE) & propNodeModifiers > Incorrect modifers on setter for volatile property with @Bindable/@Vetoable > --- > > Key: GROOVY-7969 > URL: https://issues.apache.org/jira/browse/GROOVY-7969 > Project: Groovy > Issue Type: Bug >Reporter: Paul King > > As part of GROOVY-3726 we fixed getter/setter method modifiers for volatile > (or transient) properties. The @Bindable and @Vetoable transforms however > generate their own setters and bypass that fix. > Here is a script to reproduce the problem: > {code} > import static java.lang.reflect.Modifier.toString > import groovy.beans.Bindable > class Foo { > volatile Date now > } > @Bindable class Bar { > volatile Date then > } > void pretty(int mod) { println "${mod.toString().padRight(10)}" + > toString(mod) } > pretty(Foo.getMethod('getNow').modifiers) > pretty(Foo.getMethod('setNow', Date).modifiers) > pretty(Bar.getMethod('getThen').modifiers) > pretty(Bar.getMethod('setThen', Date).modifiers) > {code} > which currently produces: > {noformat} > 1 public > 1 public > 1 public > 65public volatile > {noformat} -- This message was sent by Atlassian JIRA (v6.3.4#6332)
[jira] [Commented] (GROOVY-7969) Incorrect modifers on setter for volatile property with @Bindable/@Vetoable
[ https://issues.apache.org/jira/browse/GROOVY-7969?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15568490#comment-15568490 ] ASF GitHub Bot commented on GROOVY-7969: GitHub user paulk-asert opened a pull request: https://github.com/apache/groovy/pull/448 GROOVY-7969: Incorrect modifers on setter for volatile property with … …@Bindable/@Vetoable You can merge this pull request into a Git repository by running: $ git pull https://github.com/paulk-asert/groovy groovy7969 Alternatively you can review and apply these changes as the patch at: https://github.com/apache/groovy/pull/448.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #448 commit 254e6038e033b29b7fd9d0512dc11e13997d8730 Author: paulkDate: 2016-10-12T11:42:17Z GROOVY-7969: Incorrect modifers on setter for volatile property with @Bindable/@Vetoable > Incorrect modifers on setter for volatile property with @Bindable/@Vetoable > --- > > Key: GROOVY-7969 > URL: https://issues.apache.org/jira/browse/GROOVY-7969 > Project: Groovy > Issue Type: Bug >Reporter: Paul King > > As part of GROOVY-3726 we fixed getter/setter method modifiers for volatile > (or transient) properties. The @Bindable and @Vetoable transforms however > generate their own setters and bypass that fix. > Here is a script to reproduce the problem: > {code} > import static java.lang.reflect.Modifier.toString > import groovy.beans.Bindable > class Foo { > volatile Date now > } > @Bindable class Bar { > volatile Date then > } > void pretty(int mod) { println "${mod.toString().padRight(10)}" + > toString(mod) } > pretty(Foo.getMethod('getNow').modifiers) > pretty(Foo.getMethod('setNow', Date).modifiers) > pretty(Bar.getMethod('getThen').modifiers) > pretty(Bar.getMethod('setThen', Date).modifiers) > {code} > which currently produces: > {noformat} > 1 public > 1 public > 1 public > 65public volatile > {noformat} -- This message was sent by Atlassian JIRA (v6.3.4#6332)