gcj/25


Top / gcj / 25

インターフェースメソッドの呼び出し

gcjではインターフェースメソッドを呼び出すと _Jv_LookupInterfaceMethodIdx が呼ばれる。したがってこれを実装しないとインターフェースは使えないといってよい。

Class.h を眺める

実装開始

javalang.cpp

以下のメソッドを追加する。見つからなかったときは仕方ないので落とす。method_idx - 1 しているのは method_idx が実際の引数よりも 1 大きかったから。

extern "C" void* _Jv_LookupInterfaceMethodIdx (jclass klass, jclass iface, int method_idx)
{
	char* target1 = iface->methods[method_idx - 1].name->data;
	char* target2 = iface->methods[method_idx - 1].signature->data;
	for (int i = 0; i < klass->method_count; i++) {
		if (strcmp(target1, klass->methods[i].name->data) == 0 && 
		strcmp(target2, klass->methods[i].signature->data) == 0) {
			return klass->methods[i].ncode;
		}
	}
	printf("cant find method: %s.%s\n", klass->name->data, target1);
	*(int*)NULL = 0;
	return 0;
}

Main.java

gcj/24 で使ったものに手を加える。

import java.util.ArrayList;

interface Test1 {
	void func1();
}

interface Test2 {
	void func2();
}

interface Test3 {
	void func3();
}

interface Test4 {
	void func4();
}

public class Main extends ArrayList implements Test1, Test2, Test3 {
	public void func1() {
		System.out.println("func1 called.");
	}
	
	public void func2() {
		System.out.println("func2 called.");
	}
	
	public void func3() {
		System.out.println("func3 called.");
	}
	
	public static void main(String[] args) {
		Main main = new Main();
		if (main instanceof Main) {
			System.out.println("main == Main");
		}
		if (main instanceof ArrayList) {
			System.out.println("main == ArrayList");
		}
		if (main instanceof Object) {
			System.out.println("main == Object");
		}
		if (main instanceof Test1) {
			System.out.println("main == Test1");
			((Test1)main).func1();
		}
		if (main instanceof Test2) {
			System.out.println("main == Test2");
			((Test2)main).func2();
		}
		if (main instanceof Test3) {
			System.out.println("main == Test3");
			((Test3)main).func3();
		}
		if (!(main instanceof Test4)) {
			System.out.println("main != Test4");
			((Test4)main).func4();
		}
	}
}

実行例

最後に落ちているのはわざとなので、想定内です。

gcj.gif

コメント

コメントはありません。 コメント/gcj/25?

お名前:

MENU

now: 3

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 2413, today: 2, yesterday: 1

添付ファイル: filegcj.gif 802件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:00 (3769d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.024 sec.