请在2024年Clojure状态调查中分享您的想法!

欢迎!请查看关于页面以了解有关此功能的更多信息。

0
编译器

最小示例,使用 1.9.0-alpha11

`
user=> (set! warn-on-reflection true)
true
user=> (defn foo ^String [^long x] "")

'user/foo

user=> (.length (foo 10))
反射警告,(...) - 无法解析对java.lang.Object的length字段的引用。
0
`

仅在禁用直接链接时出现此警告。

说明
这是CLJ-1533的另一种表现形式 - 因为编译器在通过invokePrim路由调用时执行的词法变换,导致arglists类型提示丢失。启用直接链接(DL)时不会发生此情况,因为invokeStatic不是通过词法变换编译的,而是通过StaticInvokeExpr编译,它正确地跟踪原始var的类型提示。

补丁: 0001-CLJ-2005-assoc-arglist-ret-tag-as-tag-in-constructed.patch

3 个回答

0

评论者:bronsa

启用DL时
public static java.lang.Object invokeStatic();  方法描述符:()Ljava/lang/Object;    标志:ACC_PUBLIC, ACC_STATIC    代码:             stack=2, locals=0, args_size=0         0: ldc2_w        #12                 // long 10l         3: invokestatic  #18                 // 方法 test$foo.invokeStatic:(J)Ljava/lang/Object;         6: checkcast        #20                 // 类 java/lang/String         9: invokevirtual #24                 // 方法 java/lang/String.length:()I        12: invokestatic  #30                 // 方法 java/lang/Integer.valueOf:(I)Ljava/lang/Integer;        15: areturn                LineNumberTable:             line 5: 0         line 5: 9

禁用DL时

public static java.lang.Object invokeStatic();    描述符: ()Ljava/lang/Object;    标志: ACC_PUBLIC, ACC_STATIC    代码:      堆栈=3, 局部变量=0, 参数大小=0         0: getstatic     #15                 // 字段 const__0:Lclojure/lang/Var;         3: invokevirtual #20                 // 方法 clojure/lang/Var.getRawRoot:()Ljava/lang/Object;         6: checkcast     #22                 // 类 clojure/lang/IFn$LO         9: ldc2_w        #23                 // 长整型 10l        12: invokeinterface #28,  3           // 接口方法 clojure/lang/IFn$LO.invokePrim:(J)Ljava/lang/Object;         17: ldc           #30                 // 字符串 length        19: iconst_0        20: invokestatic  #36                 // 方法 clojure/lang/Reflector.invokeNoArgInstanceMember:(Ljava/lang/Object;Ljava/lang/String;Z)Ljava/lang/Object;        23: areturn      行号表:        line 5: 0        line 5: 12        line 5: 17

0
by

评论者:bronsa

拥有DL关闭和当前补丁的字节码

`

public static java.lang.Object invokeStatic();

descriptor: ()Ljava/lang/Object;
flags: ACC_PUBLIC, ACC_STATIC
Code:
  stack=3, locals=0, args_size=0
     0: getstatic     #15                 // Field const__0:Lclojure/lang/Var;
     3: invokevirtual #20                 // Method clojure/lang/Var.getRawRoot:()Ljava/lang/Object;
     6: checkcast     #22                 // class clojure/lang/IFn$LO
     9: ldc2_w        #23                 // long 10l
    12: invokeinterface #28,  3           // InterfaceMethod clojure/lang/IFn$LO.invokePrim:(J)Ljava/lang/Object;
    17: checkcast     #30                 // class java/lang/String
    20: invokevirtual #34                 // Method java/lang/String.length:()I
    23: invokestatic  #40                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
    26: areturn
  LineNumberTable:
    line 5: 0
    line 5: 12
    line 5: 20

`

0
by
...