[JIRA] (JENKINS-62064) CPS-transformed assignment expressions evaluate to null instead of the value of the RHS

13 views
Skip to first unread message

dnusbaum@cloudbees.com (JIRA)

unread,
Apr 27, 2020, 11:45:02 AM4/27/20
to jenkinsc...@googlegroups.com
Devin Nusbaum updated an issue
 
Jenkins / Bug JENKINS-62064
CPS-transformed assignment expressions evaluate to null instead of the value of the RHS
Change By: Devin Nusbaum
Summary: CPS-transformed assignment expressions do not return their result evaluate to null instead of the value of the RHS
Add Comment Add Comment
 
This message was sent by Atlassian Jira (v7.13.12#713012-sha1:6e07c38)
Atlassian logo

dnusbaum@cloudbees.com (JIRA)

unread,
Apr 27, 2020, 11:46:05 AM4/27/20
to jenkinsc...@googlegroups.com
Devin Nusbaum updated an issue
As described in [https://stackoverflow.com/questions/61420959/jenkins-interpretation-of-multiple-object-declarations-on-one-line], CPS-transformed assignment expressions do not return their result evaluate to {{null}} instead of the value of the RHS of the expression . Here is an example:
{code:java}
def a = b = c = 1 {code}
In a Pipeline, after executing that expression {{a == null}}, {{b == null}}, and {{c == 1}}.

In regular Groovy, after executing that expression, {{a}}, {{b}}, and {{c}}, are all equal to 1.

Here is a (failing) {{workflow-cps}} test case (for {{CpsFlowDefinition2Test}}) that demonstrates the bug:
{code:java}
@Test public void assignmentExprsReturnRhs() throws Exception {
    WorkflowJob p = jenkins.createProject(WorkflowJob.class);
    p.setDefinition(new CpsFlowDefinition(
            "def a = b = c = 1\n" +
            "println(/a == ${a}/)\n" +
            "println(/b == ${b}/)\n" +
            "println(/c == ${c}/)\n", true));
    WorkflowRun b = jenkins.buildAndAssertSuccess(p);
    jenkins.assertLogContains("a == 1", b);
    jenkins.assertLogContains("b == 1", b);
    jenkins.assertLogContains("c == 1", b);
} {code}
I think the relevant code is [AssignmentBlock|https://github.com/cloudbees/groovy-cps/blob/94939d33fab9b04be76b9fbd0477b9807bf1ad32/lib/src/main/java/com/cloudbees/groovy/cps/impl/AssignmentBlock.java] in {{groovy-cps}}. In particular, I think that [assignAndDone|https://github.com/cloudbees/groovy-cps/blob/94939d33fab9b04be76b9fbd0477b9807bf1ad32/lib/src/main/java/com/cloudbees/groovy/cps/impl/AssignmentBlock.java#L70] needs to create a new continuation to pass to {{lhs.set}} that calls {{k.receive(rhs)}} internally.

dnusbaum@cloudbees.com (JIRA)

unread,
Apr 27, 2020, 11:51:02 AM4/27/20
to jenkinsc...@googlegroups.com
Devin Nusbaum updated an issue
As described in [https://stackoverflow.com/questions/61420959/jenkins-interpretation-of-multiple-object-declarations-on-one-line], CPS-transformed assignment expressions evaluate to {{null}} instead of the value of the RHS of the expression. Here is an example:

{code:java}
def a = b = c = 1 {code}
In a Pipeline, after executing that expression {{a == null}}, {{b == null}}, and {{c == 1}}.

In regular Groovy, after executing that expression, {{a}}, {{b}}, and {{c}}, are all equal to 1.

Here is a (failing) {{workflow-cps}} test case (for {{CpsFlowDefinition2Test}}) that demonstrates the bug:
{code:java}
@Test public void assignmentExprsReturnRhs() throws Exception {
    WorkflowJob p = jenkins.createProject(WorkflowJob.class);
    p.setDefinition(new CpsFlowDefinition(
            "def a = b = c = 1\n" +
            "println( / [ a == ${a}/)\n" +
            "println(/
, b == ${b}/)\n" +
            "println(/
, c == ${c}/ ].toString( ) \n ) ", true));

    WorkflowRun b = jenkins.buildAndAssertSuccess(p);
    jenkins.assertLogContains("
a == [ 1 " , b);
    jenkins.assertLogContains("b ==
1 , 1] ", b);
    jenkins.assertLogContains(
// Actual output today is " c == [null, null, 1 ] " , b); .
} {code}
I think the relevant code is [AssignmentBlock|https://github.com/cloudbees/groovy-cps/blob/94939d33fab9b04be76b9fbd0477b9807bf1ad32/lib/src/main/java/com/cloudbees/groovy/cps/impl/AssignmentBlock.java] in {{groovy-cps}}. In particular, I think that [assignAndDone|https://github.com/cloudbees/groovy-cps/blob/94939d33fab9b04be76b9fbd0477b9807bf1ad32/lib/src/main/java/com/cloudbees/groovy/cps/impl/AssignmentBlock.java#L70] needs to create a new continuation to pass to {{lhs.set}} that calls {{k.receive(rhs)}} internally.

dnusbaum@cloudbees.com (JIRA)

unread,
May 6, 2020, 3:40:02 PM5/6/20
to jenkinsc...@googlegroups.com

dnusbaum@cloudbees.com (JIRA)

unread,
May 6, 2020, 3:40:03 PM5/6/20
to jenkinsc...@googlegroups.com
Devin Nusbaum started work on Bug JENKINS-62064
 
Change By: Devin Nusbaum
Status: Open In Progress

dnusbaum@cloudbees.com (JIRA)

unread,
May 6, 2020, 3:40:03 PM5/6/20
to jenkinsc...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages