You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by antoaravinth <gi...@git.apache.org> on 2015/08/16 15:00:15 UTC

[GitHub] incubator-groovy pull request: Fix for the issue GROOVY-7542

GitHub user antoaravinth opened a pull request:

    https://github.com/apache/incubator-groovy/pull/85

    Fix for the issue GROOVY-7542

    Hi @melix,
     
         I guess I have understood the problem. Looks like there is no method to handle `rightShiftUnsigned` operation. Actually there is no method for `leftShift` as well; After this fix, I have tested the code with and without `@CompileStatic`. Then did `groovyc`, could able to see the the difference in the generated byte code. 
    
    Sample I have used, same as given in the exception:
    
    ```
    import groovy.transform.CompileStatic 
    
    test()
    
    @CompileStatic
    def test() {
      long register = 0xfac432b10cd5e44aL  
      
      [1,2,3].each { int element -> 
        int t = (int) (register >>> 56 ^ (long) element) & 0xff
        println t
      }  
    }
    ```
    
    doing `javap` on the compiled groovy class, I could able to get 
    
    ```
      public java.lang.Object test();
        Code:
           0: getstatic     #59                 // Field $const$0:J
           3: invokestatic  #65                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
           6: new           #67                 // class groovy/lang/Reference
           9: dup_x1        
          10: swap          
          11: invokespecial #70                 // Method groovy/lang/Reference."<init>":(Ljava/lang/Object;)V
          14: astore_1      
          15: aload_1       
          16: pop           
          17: iconst_3      
          18: anewarray     #72                 // class java/lang/Object
          21: dup           
          22: iconst_0      
          23: iconst_1      
          24: invokestatic  #77                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
          27: aastore       
          28: dup           
          29: iconst_1      
          30: iconst_2      
          31: invokestatic  #77                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
          34: aastore       
          35: dup           
          36: iconst_2      
          37: iconst_3      
          38: invokestatic  #77                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
          41: aastore       
          42: invokestatic  #83                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.createList:([Ljava/lang/Object;)Ljava/util/List;
          45: new           #85                 // class "GROOVY-7542$_test_closure1"
          48: dup           
          49: aload_0       
          50: aload_0       
          51: aload_1       
          52: invokespecial #88                 // Method "GROOVY-7542$_test_closure1"."<init>":(Ljava/lang/Object;Ljava/lang/Object;Lgroovy/lang/Reference;)V
          55: invokestatic  #94                 // Method org/codehaus/groovy/runtime/DefaultGroovyMethods.each:(Ljava/util/List;Lgroovy/lang/Closure;)Ljava/util/List;
          58: areturn       
          59: aconst_null   
          60: areturn      
    ```
    
    (only for `test` method)
    
    where as removing the `@CompileStatic` does gives the following bytecode:
    
    ```
    public java.lang.Object test();
        Code:
           0: invokestatic  #19                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
           3: astore_1      
           4: getstatic     #59                 // Field $const$0:J
           7: invokestatic  #65                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
          10: new           #67                 // class groovy/lang/Reference
          13: dup_x1        
          14: swap          
          15: invokespecial #70                 // Method groovy/lang/Reference."<init>":(Ljava/lang/Object;)V
          18: astore_2      
          19: aload_2       
          20: pop           
          21: aload_1       
          22: ldc           #71                 // int 2
          24: aaload        
          25: iconst_3      
          26: anewarray     #73                 // class java/lang/Object
          29: dup           
          30: iconst_0      
          31: iconst_1      
          32: invokestatic  #78                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
          35: aastore       
          36: dup           
          37: iconst_1      
          38: iconst_2      
          39: invokestatic  #78                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
          42: aastore       
          43: dup           
          44: iconst_2      
          45: iconst_3      
          46: invokestatic  #78                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
          49: aastore       
          50: invokestatic  #84                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.createList:([Ljava/lang/Object;)Ljava/util/List;
          53: new           #86                 // class "GROOVY-7542$_test_closure1"
          56: dup           
          57: aload_0       
          58: aload_0       
          59: aload_2       
          60: invokespecial #89                 // Method "GROOVY-7542$_test_closure1"."<init>":(Ljava/lang/Object;Ljava/lang/Object;Lgroovy/lang/Reference;)V
          63: invokeinterface #92,  3           // InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.call:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
          68: areturn       
          69: aconst_null   
          70: areturn       
    ```
    
    I guess I'm in right path; I'm no-where an byte code engineer, so in case if I have missed any of the cases, let me know. 
    
    So that I can write some generic method for handling the bit-wise operator on the compile static mode!
    
    Thanks for your response. 

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/antoaravinth/incubator-groovy GROOVY-7542

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/incubator-groovy/pull/85.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 #85
    
----
commit 85904b51e21eb964ac0c3f22ac3dc3ad057d4440
Author: antoaravinth <an...@gmail.com>
Date:   2015-08-16T12:54:47Z

    GROOVY-7542: CompileStatic class generation bug 'register with message: rightShiftUnsigned and arguments X'

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---