首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jasmin使用参数调用方法

Jasmin使用参数调用方法
EN

Stack Overflow用户
提问于 2014-07-13 12:20:08
回答 1查看 2.1K关注 0票数 0

我正在编写一个生成Jasmin代码的编译器,我希望使用参数调用一个方法,如下所示:

代码语言:javascript
复制
val test(val x) {
    return x;
}

val main (string[] args) {
    test(1);
}

该文件汇编为:

代码语言:javascript
复制
.class public helloworld
.super java/lang/Object

.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method

.method public test(I)I
.limit stack 4
.limit locals 3
iload 1
ireturn
.end method

.method public static main([Ljava/lang/String;)V
.limit stack 4
.limit locals 3
aload_0
ldc 1
invokevirtual helloworld/test(I)I
return
.end method

但是,这会导致以下错误。我在这里做错什么了?

代码语言:javascript
复制
java.lang.VerifyError: (class: helloworld, method: main signature: ([Ljava/lang/String;)V) Incompatible object argument for function call
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-13 13:34:21

首先,您‘编译’的代码不是Java,我不知道它是什么(伪代码?)。

jasmin代码的问题是,您似乎希望调用test()作为数组的实例方法,但它不是,因为它是helloworld的实例方法,您没有实例化它。

因此,要么实例化helloworld类,要么使test()成为静态方法,这样就可以在不创建对象的情况下调用它。

在修复jasmin代码时,我还遇到了另一个错误:iload 1应该是iload 0。(程序员喜欢从0开始计数)。

在这段代码中,我假设您的意思是test()是静态的。

代码语言:javascript
复制
.class public helloworld
.super java/lang/Object

.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method

.method public static test([Ljava/lang/String;)[Ljava/lang/String;
.limit stack 4
.limit locals 3
aload 0
areturn
.end method

.method public static main([Ljava/lang/String;)V
.limit stack 4
.limit locals 3
ldc 1
anewarray java/lang/String
astore 2
aload 2
ldc 0
ldc "bar"
aastore
aload_0
aload 2
invokestatic helloworld/test([Ljava/lang/String;)[Ljava/lang/String;
return
.end method
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24722634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档