请在 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 类型提示。启用直接链接时不会出现此问题,因为 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();  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

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
参考:[报错链接](https://clojure.atlassian.net/browse/CLJ-2005)(由moxaj报告)
...