improve print implementation

This commit is contained in:
Zack Buhman 2024-12-29 11:56:03 -06:00
parent 8768bd516c
commit 5c88c8f7c1
17 changed files with 250 additions and 26 deletions

View File

@ -438,7 +438,7 @@ struct method_entry class_resolver_lookup_method_from_interfacemethodref_index(i
assert(class_entry != nullptr); 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, 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); class_entry->class_file->super_class);
assert(class_entry != nullptr); assert(class_entry != nullptr);
} }
return nullptr;
assert(!"methodref method does not exist");
} }
int32_t * class_resolver_lookup_string(int class_hash_table_length, int32_t * class_resolver_lookup_string(int class_hash_table_length,

View File

@ -1,7 +1,11 @@
#include "example/DreamcastVideo2.class.h" #include "example/DreamcastVideo2.class.h"
#include "example/DreamcastVideo.class.h" #include "example/DreamcastVideo.class.h"
#include "java/io/PrintStream.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/Integer.class.h"
#include "java/lang/Long.class.h"
#include "java/lang/Math.class.h" #include "java/lang/Math.class.h"
#include "java/lang/Object.class.h" #include "java/lang/Object.class.h"
#include "java/lang/String.class.h" #include "java/lang/String.class.h"

View File

@ -1,7 +1,11 @@
(const uint8_t *)&_binary_example_DreamcastVideo2_class_start, (const uint8_t *)&_binary_example_DreamcastVideo2_class_start,
(const uint8_t *)&_binary_example_DreamcastVideo_class_start, (const uint8_t *)&_binary_example_DreamcastVideo_class_start,
(const uint8_t *)&_binary_java_io_PrintStream_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_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_Math_class_start,
(const uint8_t *)&_binary_java_lang_Object_class_start, (const uint8_t *)&_binary_java_lang_Object_class_start,
(const uint8_t *)&_binary_java_lang_String_class_start, (const uint8_t *)&_binary_java_lang_String_class_start,

View File

@ -2,7 +2,11 @@ CLASS_PATH = \
example/DreamcastVideo2.class.o \ example/DreamcastVideo2.class.o \
example/DreamcastVideo.class.o \ example/DreamcastVideo.class.o \
java/io/PrintStream.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/Integer.class.o \
java/lang/Long.class.o \
java/lang/Math.class.o \ java/lang/Math.class.o \
java/lang/Object.class.o \ java/lang/Object.class.o \
java/lang/String.class.o \ java/lang/String.class.o \

View File

@ -12,6 +12,38 @@ public class PrintStream
public static native void write(byte[] buf); 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() { public void println() {
write(newline); write(newline);
} }
@ -21,25 +53,33 @@ public class PrintStream
write(newline); write(newline);
} }
public void println(String s) { public void println(boolean b) {
write(s.getBytes()); write(String.valueOf(b));
write(newline); write(newline);
} }
public void println(int n) { public void println(int i) {
write(Integer.toString(n).getBytes()); write(String.valueOf(i));
write(newline); write(newline);
} }
public void print(byte[] buf) { public void println(long l) {
write(buf); write(String.valueOf(l));
write(newline);
} }
public void print(String s) { public void println(float f) {
write(s.getBytes()); write(String.valueOf(f));
write(newline);
} }
public void print(int n) { public void println(double d) {
write(Integer.toString(n).getBytes()); write(String.valueOf(d));
write(newline);
}
public void println(Object obj) {
write(String.valueOf(obj));
write(newline);
} }
} }

View File

@ -0,0 +1,15 @@
#pragma once
#include <stdint.h>
#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

View File

@ -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;
}
}

15
java/lang/Double.class.h Normal file
View File

@ -0,0 +1,15 @@
#pragma once
#include <stdint.h>
#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

7
java/lang/Double.java Normal file
View File

@ -0,0 +1,7 @@
package java.lang;
public class Double {
public static String toString(double d) {
return "";
}
}

15
java/lang/Float.class.h Normal file
View File

@ -0,0 +1,15 @@
#pragma once
#include <stdint.h>
#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

7
java/lang/Float.java Normal file
View File

@ -0,0 +1,7 @@
package java.lang;
public class Float {
public static String toString(float f) {
return "";
}
}

View File

@ -1,19 +1,8 @@
package java.lang; package java.lang;
public class Integer { import java.lang.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;
}
public class Integer {
public static int stringSize(int n) { public static int stringSize(int n) {
int sign_digits = 0; int sign_digits = 0;
if (n < 0) { if (n < 0) {
@ -46,7 +35,7 @@ public class Integer {
pos -= 2; pos -= 2;
int mod = n - (div * 100); int mod = n - (div * 100);
short digits = DIGITS[mod]; short digits = DecimalDigits.DIGITS[mod];
buf[pos] = (byte)(digits >> 8); buf[pos] = (byte)(digits >> 8);
buf[pos+1] = (byte)(digits); buf[pos+1] = (byte)(digits);

15
java/lang/Long.class.h Normal file
View File

@ -0,0 +1,15 @@
#pragma once
#include <stdint.h>
#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

56
java/lang/Long.java Normal file
View File

@ -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);
}
}

View File

@ -2,4 +2,8 @@ package java.lang;
public class Object { public class Object {
public Object() {} public Object() {}
public String toString() {
return "Object";
}
} }

View File

@ -18,4 +18,28 @@ public class String {
public byte[] getBytes() { public byte[] getBytes() {
return this.value; 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);
}
} }

8
p/TestPrintLong.java Normal file
View File

@ -0,0 +1,8 @@
package p;
class TestPrintLong {
public static void main() {
long l = -7273144631380624066l;
System.out.println(l);
}
}