You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Raji Sankar (JIRA)" <ji...@apache.org> on 2012/06/14 11:47:43 UTC

[jira] [Created] (SANDBOX-420) Javaflow has a problem when the suspended function is invoked using reflection

Raji Sankar created SANDBOX-420:
-----------------------------------

             Summary: Javaflow has a problem when the suspended function is invoked using reflection
                 Key: SANDBOX-420
                 URL: https://issues.apache.org/jira/browse/SANDBOX-420
             Project: Commons Sandbox
          Issue Type: Bug
          Components: Javaflow
    Affects Versions: CSV 1.0
         Environment: Debian linux using Sun JDK 1.6 and asm 4.0_RC2
            Reporter: Raji Sankar
            Priority: Minor


 I have a fn which has a code as below:

private void callsomeshared()
        throws Exception
{
        Method mthd = _someShared.getDeclaredMethod("doSomething");
        int cnt = 0;
        while (cnt < 10)
        {
            mthd.invoke(_shared);
            //Continuation.suspend();
            cnt++;
        }
}

The doSomething does this:
    public boolean doSomething()
        throws Exception
    {
        if (_shared.value() < 10)
        {
            _shared.echo();
            Continuation.suspend();
        }

        return (_shared.value() < 10);
    }

Doing this, fails with a ClassCastException, since when it hits the Method.invoke, it is potentially popping out the AnotherLoader class and does not have the Method class pushed. 



--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] [Commented] (SANDBOX-420) Javaflow has a problem when the suspended function is invoked using reflection

Posted by "Raji Sankar (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/SANDBOX-420?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13294937#comment-13294937 ] 

Raji Sankar commented on SANDBOX-420:
-------------------------------------

java.lang.Method cannot be BCI'ed since this is a system class. But, if I do not continue the Method.invoke, but re-invoke it passing to it the same parameters as previous, then the calling class by virtue of having a state should technically continue from where it left off.

A partial fix which I have added it has worked (it only works where Class, method and parameters passed to it are all local variables): 
- I have changed ContinuationMethodAnalyzer to read the variables for the Method.invoke call
- Push in ContinuationMethodAdapter calls push for the method object and the method.invoke reference when the state is saved of the class calling Method.invoke
- the pop pops all the references and hence the method reference, so no changes here, just a change to the parameters, it pops the local variables instead of null parameters.
- happens only if the method is annotated with ContinueReflection 
                
> Javaflow has a problem when the suspended function is invoked using reflection
> ------------------------------------------------------------------------------
>
>                 Key: SANDBOX-420
>                 URL: https://issues.apache.org/jira/browse/SANDBOX-420
>             Project: Commons Sandbox
>          Issue Type: Bug
>          Components: Javaflow
>    Affects Versions: CSV 1.0
>         Environment: Debian linux using Sun JDK 1.6 and asm 4.0_RC2
>            Reporter: Raji Sankar
>            Priority: Minor
>         Attachments: ContinuationMethodAdapter.java, ContinuationMethodAnalyzer.java, ContinueReflection.java
>
>
>  I have a fn which has a code as below:
> private void callsomeshared()
>         throws Exception
> {
>         Method mthd = _someShared.getDeclaredMethod("doSomething");
>         int cnt = 0;
>         while (cnt < 10)
>         {
>             mthd.invoke(_shared);
>             //Continuation.suspend();
>             cnt++;
>         }
> }
> The doSomething does this:
>     public boolean doSomething()
>         throws Exception
>     {
>         if (_shared.value() < 10)
>         {
>             _shared.echo();
>             Continuation.suspend();
>         }
>         return (_shared.value() < 10);
>     }
> Doing this, fails with a ClassCastException, since when it hits the Method.invoke, it is potentially popping out the AnotherLoader class and does not have the Method class pushed. 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] [Updated] (SANDBOX-420) Javaflow has a problem when the suspended function is invoked using reflection

Posted by "Raji Sankar (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/SANDBOX-420?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Raji Sankar updated SANDBOX-420:
--------------------------------

    Attachment: ContinueReflection.java
                ContinuationMethodAnalyzer.java
                ContinuationMethodAdapter.java

Changes Commented with //RS
                
> Javaflow has a problem when the suspended function is invoked using reflection
> ------------------------------------------------------------------------------
>
>                 Key: SANDBOX-420
>                 URL: https://issues.apache.org/jira/browse/SANDBOX-420
>             Project: Commons Sandbox
>          Issue Type: Bug
>          Components: Javaflow
>    Affects Versions: CSV 1.0
>         Environment: Debian linux using Sun JDK 1.6 and asm 4.0_RC2
>            Reporter: Raji Sankar
>            Priority: Minor
>         Attachments: ContinuationMethodAdapter.java, ContinuationMethodAnalyzer.java, ContinueReflection.java
>
>
>  I have a fn which has a code as below:
> private void callsomeshared()
>         throws Exception
> {
>         Method mthd = _someShared.getDeclaredMethod("doSomething");
>         int cnt = 0;
>         while (cnt < 10)
>         {
>             mthd.invoke(_shared);
>             //Continuation.suspend();
>             cnt++;
>         }
> }
> The doSomething does this:
>     public boolean doSomething()
>         throws Exception
>     {
>         if (_shared.value() < 10)
>         {
>             _shared.echo();
>             Continuation.suspend();
>         }
>         return (_shared.value() < 10);
>     }
> Doing this, fails with a ClassCastException, since when it hits the Method.invoke, it is potentially popping out the AnotherLoader class and does not have the Method class pushed. 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira