From 5c88c8f7c15305902af6ec66af5b715f921574c7 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sun, 29 Dec 2024 11:56:03 -0600 Subject: [PATCH] improve print implementation --- c/class_resolver.c | 5 +-- c/classpath.h | 4 +++ c/classpath.inc.c | 4 +++ classpath.mk | 4 +++ java/io/PrintStream.java | 60 +++++++++++++++++++++++++++------ java/lang/DecimalDigits.class.h | 15 +++++++++ java/lang/DecimalDigits.java | 16 +++++++++ java/lang/Double.class.h | 15 +++++++++ java/lang/Double.java | 7 ++++ java/lang/Float.class.h | 15 +++++++++ java/lang/Float.java | 7 ++++ java/lang/Integer.java | 17 ++-------- java/lang/Long.class.h | 15 +++++++++ java/lang/Long.java | 56 ++++++++++++++++++++++++++++++ java/lang/Object.java | 4 +++ java/lang/String.java | 24 +++++++++++++ p/TestPrintLong.java | 8 +++++ 17 files changed, 250 insertions(+), 26 deletions(-) create mode 100644 java/lang/DecimalDigits.class.h create mode 100644 java/lang/DecimalDigits.java create mode 100644 java/lang/Double.class.h create mode 100644 java/lang/Double.java create mode 100644 java/lang/Float.class.h create mode 100644 java/lang/Float.java create mode 100644 java/lang/Long.class.h create mode 100644 java/lang/Long.java create mode 100644 p/TestPrintLong.java diff --git a/c/class_resolver.c b/c/class_resolver.c index 5ba8664..2a5acff 100644 --- a/c/class_resolver.c +++ b/c/class_resolver.c @@ -438,7 +438,7 @@ struct method_entry class_resolver_lookup_method_from_interfacemethodref_index(i assert(class_entry != nullptr); } - assert(!"invokeinterface method does not exist"); + assert(!"interfacemethodref method does not exist"); } struct method_entry * class_resolver_lookup_method_from_methodref_index(int class_hash_table_length, @@ -505,7 +505,8 @@ struct method_entry * class_resolver_lookup_method_from_methodref_index(int clas class_entry->class_file->super_class); assert(class_entry != nullptr); } - return nullptr; + + assert(!"methodref method does not exist"); } int32_t * class_resolver_lookup_string(int class_hash_table_length, diff --git a/c/classpath.h b/c/classpath.h index 39cc847..0db1aa0 100644 --- a/c/classpath.h +++ b/c/classpath.h @@ -1,7 +1,11 @@ #include "example/DreamcastVideo2.class.h" #include "example/DreamcastVideo.class.h" #include "java/io/PrintStream.class.h" +#include "java/lang/DecimalDigits.class.h" +#include "java/lang/Double.class.h" +#include "java/lang/Float.class.h" #include "java/lang/Integer.class.h" +#include "java/lang/Long.class.h" #include "java/lang/Math.class.h" #include "java/lang/Object.class.h" #include "java/lang/String.class.h" diff --git a/c/classpath.inc.c b/c/classpath.inc.c index 20e1398..d473912 100644 --- a/c/classpath.inc.c +++ b/c/classpath.inc.c @@ -1,7 +1,11 @@ (const uint8_t *)&_binary_example_DreamcastVideo2_class_start, (const uint8_t *)&_binary_example_DreamcastVideo_class_start, (const uint8_t *)&_binary_java_io_PrintStream_class_start, +(const uint8_t *)&_binary_java_lang_DecimalDigits_class_start, +(const uint8_t *)&_binary_java_lang_Double_class_start, +(const uint8_t *)&_binary_java_lang_Float_class_start, (const uint8_t *)&_binary_java_lang_Integer_class_start, +(const uint8_t *)&_binary_java_lang_Long_class_start, (const uint8_t *)&_binary_java_lang_Math_class_start, (const uint8_t *)&_binary_java_lang_Object_class_start, (const uint8_t *)&_binary_java_lang_String_class_start, diff --git a/classpath.mk b/classpath.mk index c934e63..8e98d79 100644 --- a/classpath.mk +++ b/classpath.mk @@ -2,7 +2,11 @@ CLASS_PATH = \ example/DreamcastVideo2.class.o \ example/DreamcastVideo.class.o \ java/io/PrintStream.class.o \ + java/lang/DecimalDigits.class.o \ + java/lang/Double.class.o \ + java/lang/Float.class.o \ java/lang/Integer.class.o \ + java/lang/Long.class.o \ java/lang/Math.class.o \ java/lang/Object.class.o \ java/lang/String.class.o \ diff --git a/java/io/PrintStream.java b/java/io/PrintStream.java index a817904..ad867cb 100644 --- a/java/io/PrintStream.java +++ b/java/io/PrintStream.java @@ -12,6 +12,38 @@ public class PrintStream public static native void write(byte[] buf); + public static void write(String s) { + write(s.getBytes()); + } + + public void print(byte[] buf) { + write(buf); + } + + public void print(boolean b) { + write(String.valueOf(b)); + } + + public void print(int i) { + write(String.valueOf(i)); + } + + public void print(long l) { + write(String.valueOf(l)); + } + + public void print(float f) { + write(String.valueOf(f)); + } + + public void print(double d) { + write(String.valueOf(d)); + } + + public void print(Object obj) { + write(String.valueOf(obj)); + } + public void println() { write(newline); } @@ -21,25 +53,33 @@ public class PrintStream write(newline); } - public void println(String s) { - write(s.getBytes()); + public void println(boolean b) { + write(String.valueOf(b)); write(newline); } - public void println(int n) { - write(Integer.toString(n).getBytes()); + public void println(int i) { + write(String.valueOf(i)); write(newline); } - public void print(byte[] buf) { - write(buf); + public void println(long l) { + write(String.valueOf(l)); + write(newline); } - public void print(String s) { - write(s.getBytes()); + public void println(float f) { + write(String.valueOf(f)); + write(newline); } - public void print(int n) { - write(Integer.toString(n).getBytes()); + public void println(double d) { + write(String.valueOf(d)); + write(newline); + } + + public void println(Object obj) { + write(String.valueOf(obj)); + write(newline); } } diff --git a/java/lang/DecimalDigits.class.h b/java/lang/DecimalDigits.class.h new file mode 100644 index 0000000..1ccc63e --- /dev/null +++ b/java/lang/DecimalDigits.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_java_lang_DecimalDigits_class_start __asm("_binary_java_lang_DecimalDigits_class_start"); +extern uint32_t _binary_java_lang_DecimalDigits_class_end __asm("_binary_java_lang_DecimalDigits_class_end"); +extern uint32_t _binary_java_lang_DecimalDigits_class_size __asm("_binary_java_lang_DecimalDigits_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/java/lang/DecimalDigits.java b/java/lang/DecimalDigits.java new file mode 100644 index 0000000..c1050bf --- /dev/null +++ b/java/lang/DecimalDigits.java @@ -0,0 +1,16 @@ +package java.lang; + +class DecimalDigits { + public static final short[] DIGITS; + static { + short[] digits = new short[100]; + for (int h = 0; h < 10; h++) { + int high = (h + '0') << 8; + for (int l = 0; l < 10; l++) { + int low = l + '0'; + digits[h * 10 + l] = (short)(high | low); + } + } + DIGITS = digits; + } +} diff --git a/java/lang/Double.class.h b/java/lang/Double.class.h new file mode 100644 index 0000000..365c582 --- /dev/null +++ b/java/lang/Double.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_java_lang_Double_class_start __asm("_binary_java_lang_Double_class_start"); +extern uint32_t _binary_java_lang_Double_class_end __asm("_binary_java_lang_Double_class_end"); +extern uint32_t _binary_java_lang_Double_class_size __asm("_binary_java_lang_Double_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/java/lang/Double.java b/java/lang/Double.java new file mode 100644 index 0000000..c9e8795 --- /dev/null +++ b/java/lang/Double.java @@ -0,0 +1,7 @@ +package java.lang; + +public class Double { + public static String toString(double d) { + return ""; + } +} diff --git a/java/lang/Float.class.h b/java/lang/Float.class.h new file mode 100644 index 0000000..0a9c121 --- /dev/null +++ b/java/lang/Float.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_java_lang_Float_class_start __asm("_binary_java_lang_Float_class_start"); +extern uint32_t _binary_java_lang_Float_class_end __asm("_binary_java_lang_Float_class_end"); +extern uint32_t _binary_java_lang_Float_class_size __asm("_binary_java_lang_Float_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/java/lang/Float.java b/java/lang/Float.java new file mode 100644 index 0000000..a26e9bf --- /dev/null +++ b/java/lang/Float.java @@ -0,0 +1,7 @@ +package java.lang; + +public class Float { + public static String toString(float f) { + return ""; + } +} diff --git a/java/lang/Integer.java b/java/lang/Integer.java index 8da7e24..2067096 100644 --- a/java/lang/Integer.java +++ b/java/lang/Integer.java @@ -1,19 +1,8 @@ package java.lang; -public class Integer { - public static final short[] DIGITS; - static { - short[] digits = new short[100]; - for (int h = 0; h < 10; h++) { - int high = (h + '0') << 8; - for (int l = 0; l < 10; l++) { - int low = l + '0'; - digits[h * 10 + l] = (short)(high | low); - } - } - DIGITS = digits; - } +import java.lang.DecimalDigits; +public class Integer { public static int stringSize(int n) { int sign_digits = 0; if (n < 0) { @@ -46,7 +35,7 @@ public class Integer { pos -= 2; int mod = n - (div * 100); - short digits = DIGITS[mod]; + short digits = DecimalDigits.DIGITS[mod]; buf[pos] = (byte)(digits >> 8); buf[pos+1] = (byte)(digits); diff --git a/java/lang/Long.class.h b/java/lang/Long.class.h new file mode 100644 index 0000000..dcfc6d2 --- /dev/null +++ b/java/lang/Long.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern C { +#endif + +extern uint32_t _binary_java_lang_Long_class_start __asm("_binary_java_lang_Long_class_start"); +extern uint32_t _binary_java_lang_Long_class_end __asm("_binary_java_lang_Long_class_end"); +extern uint32_t _binary_java_lang_Long_class_size __asm("_binary_java_lang_Long_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/java/lang/Long.java b/java/lang/Long.java new file mode 100644 index 0000000..13fc6a9 --- /dev/null +++ b/java/lang/Long.java @@ -0,0 +1,56 @@ +package java.lang; + +import java.lang.DecimalDigits; + +public class Long { + public static int stringSize(long n) { + int sign_digits = 0; + if (n < 0) { + sign_digits = 1; + n = -n; + } + int digits = 1; + int cmp = 10; + for (int i = 0; i < 18; i++) { + if (n < cmp) + return digits + sign_digits; + digits += 1; + cmp *= 10; + } + return 19 + sign_digits; + } + + public static String toString(long n) { + int pos = stringSize(n); + byte[] buf = new byte[pos]; + buf[0] = (char)'0'; + + boolean sign = n < 0; + if (sign) { + n = -n; + } + + while (n >= 10) { + long div = n / 100; + pos -= 2; + long mod = n - (div * 100); + + short digits = DecimalDigits.DIGITS[(int)mod]; + buf[pos] = (byte)(digits >> 8); + buf[pos+1] = (byte)(digits); + + n = div; + } + + if (n != 0) { + pos -= 1; + buf[pos] = (byte)('0' + n); + } + + if (sign) { + pos -= 1; + buf[pos] = (byte)('-'); + } + return new String(buf); + } +} diff --git a/java/lang/Object.java b/java/lang/Object.java index 3822387..61743b5 100644 --- a/java/lang/Object.java +++ b/java/lang/Object.java @@ -2,4 +2,8 @@ package java.lang; public class Object { public Object() {} + + public String toString() { + return "Object"; + } } diff --git a/java/lang/String.java b/java/lang/String.java index bf55646..4a781d4 100644 --- a/java/lang/String.java +++ b/java/lang/String.java @@ -18,4 +18,28 @@ public class String { public byte[] getBytes() { return this.value; } + + public static String valueOf(Object obj) { + return (obj == null) ? "null" : obj.toString(); + } + + public static String valueOf(boolean b) { + return b ? "true" : "false"; + } + + public static String valueOf(int i) { + return Integer.toString(i); + } + + public static String valueOf(long l) { + return Long.toString(l); + } + + public static String valueOf(float f) { + return Float.toString(f); + } + + public static String valueOf(double d) { + return Double.toString(d); + } } diff --git a/p/TestPrintLong.java b/p/TestPrintLong.java new file mode 100644 index 0000000..fa7700a --- /dev/null +++ b/p/TestPrintLong.java @@ -0,0 +1,8 @@ +package p; + +class TestPrintLong { + public static void main() { + long l = -7273144631380624066l; + System.out.println(l); + } +}