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
`

当禁用直接链接时才会出现此警告。

说明
this 是 CLJ-1533 的另一种表现 -- 因编译器在对通过 invokePrim 路由调用进行词法变换时的原因,arglists 类型提示已丢失。开启 DL 时不发生这种情况,因为 invokeStatic 通过 StaticInvokeExpr 编译,它正确跟踪原始 var 的类型提示

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

3 答案

0投票
by

评论者:bronsa

开启 DL
public static java.lang.Object invokeStatic();  descriptor: ()Ljava/lang/Object;    flags: ACC_PUBLIC, ACC_STATIC    Code:      stack=2, locals=0, args_size=0         0: ldc2_w        #12                 // long 10l         3: invokestatic  #18                 // Method test$foo.invokeStatic:(J)Ljava/lang/Object;         6: checkcast     #20                 // class java/lang/String         9: invokevirtual #24                 // Method java/lang/String.length:()I        12: invokestatic  #30                 // Method 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      行号表:                                     行 5: 0                                     行 5: 12                                     行 5: 17

0投票

评论者: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投票
...