gcj/17


gcj

17. StringBuffer

文字や数字どうしの連結で無意識に使っている StringBuffer を実装します。

A.java

import java.lang.*;
import java.io.*;

public class A {
	public static void main(String[] args) {
		System.out.println(new Object());
		System.out.println("abc");
		System.out.println("abc.length=" + "abc".length());
	}
}

s ファイルを吐いてみる

gcj -S A.java

未定義参照を見つけた

Letext:
   .def    __ZN4java4lang6Object5cloneEv;    .scl    3;    .type    32;    .endef
   .def    __ZN4java4lang6Object8toStringEv;    .scl    3;    .type    32;    .endef
   .def    __ZN4java4lang6Object6equalsEPS1_;    .scl    3;    .type    32;    .endef
   .def    __ZN4java4lang6Object8hashCodeEv;    .scl    3;    .type    32;    .endef
   .def    __ZN4java4lang6Object8finalizeEv;    .scl    3;    .type    32;    .endef
   .def    __ZN3gnu3gcj7runtime12StringBuffer8toStringEv;    .scl    3;    .type    32;    .endef
   .def    __ZN3gnu3gcj7runtime12StringBuffer6appendEi;    .scl    3;    .type    32;    .endef
   .def    __ZN4java4lang6String6lengthEv;    .scl    3;    .type    32;    .endef
   .def    __Jv_ThrowNullPointerException;    .scl    3;    .type    32;    .endef
   .def    __ZN3gnu3gcj7runtime12StringBufferC1EPN4java4lang6StringE;    .scl    3;    .type    32;    .endef
   .def    __ZN4java4lang6ObjectC1Ev;    .scl    3;    .type    32;    .endef
   .def    __Jv_AllocObjectNoFinalizer;    .scl    3;    .type    32;    .endef
   .def    __Jv_InitClass;    .scl    3;    .type    32;    .endef

未定義参照を実装してみる

java/lang/Object.java

	protected Object clone() {
		return this;
	}

gnu/gcj/runtime/StringBuffer.java

package gnu.gcj.runtime;

public final class StringBuffer {
	private char[] data = null;
	private int count = 0;
	private static final int BUFFER_SIZE = 16;
	
	public StringBuffer() {
		data = new char[BUFFER_SIZE];
	}
	
	public StringBuffer(String str) {
		data = new char[BUFFER_SIZE];
		append(str);
	}
	
	public StringBuffer append(boolean b) {
		if (b) {
			append("true");
		} else {
			append("false");
		}
		return this;
	}
	
	public StringBuffer append(char c) {
		if (count == data.length - 1) {
			char[] new_data = new char[data.length * 2];
			for (int i = 0; i < count; i++) {
				new_data[i] = data[i];
			}
			data = new_data;
			count++;
		}
		data[count++] = c;
		return this;
	}
	
	public StringBuffer append(int i) {
		if (i < 0) {
			append('-');
			i *= -1;
		}
		char[] digit= new char[20];
		int count = 0;
		while(i > 0) {
			digit[count++] = (char)(i % 10 + '0');
			i /= 10;
		}
		for (i = count - 1; i >= 0; i--) {
			append(digit[i]);
		}
		return this;
	}
	
	public StringBuffer append(long l) {
		append((int)l);
		return this;
	}
	
	public StringBuffer append(float f) {
		append((int)f);
		return this;
	}
	
	public StringBuffer append(double d) {
		append((int)d);
		return this;
	}
	
	public StringBuffer append(Object obj) {
		append(obj.toString());
		return this;
	}
	
	public StringBuffer append(String str) {
		for (int i = 0; i < str.length(); i++) {
			append(str.charAt(i));
		}
		return this;
	}
	
	public StringBuffer append(StringBuffer sb) {
		append(sb.toString());
		return this;
	}
	
	public String toString() {
		return new String(data, 0, count);
	}
}

動いたっぽい

gcj.gif

コメント

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

お名前:

MENU

now: 1

リンク


最新の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: 3810, today: 1, yesterday: 0

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

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

Last-modified: 2008-03-28 (金) 15:48:00 (3709d);  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.084 sec.