Skip to content

Commit

Permalink
Hardcode data types, Formatter, USHR pointer casting, newFP, self arr…
Browse files Browse the repository at this point in the history
…aycopy, Enum#valueOf exception, File#list bug, Big-endian buffers, more concurrency, EnumSet, cloneArray fix, config wildcard enhancement
  • Loading branch information
TheLogicMaster committed Aug 27, 2022
1 parent 39eafe2 commit d7a4999
Show file tree
Hide file tree
Showing 41 changed files with 3,369 additions and 457 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ LibGDX backend but doesn't depend on it. An example project is provided in the `
- Dynamic cast checks
- Reformat runtime and transpiler sources
- Reflection type conversions (See SwitchGDX ReflectionTest)
- Reflection error handling
- Isolate String constants for incremental compilation

## Notes
- Requires retrolambda for lambda, default method, and method reference support (RetroLambda Gradle plugin doesn't support Gradle 7)
Expand All @@ -49,3 +51,4 @@ LibGDX backend but doesn't depend on it. An example project is provided in the `
- Array components in multidimensional arrays should refer to array classes of decreasing size
- Added dedicated primitive types
- Literals for non-integer types must be explicitly specified
- System.array copy from same source and dest must use intermediate buffer if necessary
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
allprojects {
version = "0.1"
version = "0.2"
group = 'com.thelogicmaster.clearwing-vm'
}

Expand Down
66 changes: 33 additions & 33 deletions runtime/res/cn1_globals.c

Large diffs are not rendered by default.

48 changes: 27 additions & 21 deletions runtime/res/cn1_globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,23 +41,23 @@


typedef void JAVA_VOID;
typedef int JAVA_BOOLEAN;
typedef int JAVA_CHAR;
typedef int JAVA_BYTE;
typedef int JAVA_SHORT;
typedef int JAVA_INT;
typedef int32_t JAVA_BOOLEAN;
typedef int32_t JAVA_CHAR;
typedef int32_t JAVA_BYTE;
typedef int32_t JAVA_SHORT;
typedef int32_t JAVA_INT;
typedef int64_t JAVA_LONG;
typedef float JAVA_FLOAT;
typedef double JAVA_DOUBLE;

typedef signed char JAVA_ARRAY_BYTE;
typedef char JAVA_ARRAY_BOOLEAN;
typedef unsigned short JAVA_ARRAY_CHAR;
typedef short JAVA_ARRAY_SHORT;
typedef int JAVA_ARRAY_INT;
typedef int64_t JAVA_ARRAY_LONG;
typedef float JAVA_ARRAY_FLOAT;
typedef double JAVA_ARRAY_DOUBLE;
typedef int8_t JAVA_ARRAY_BYTE;
typedef int8_t JAVA_ARRAY_BOOLEAN;
typedef uint16_t JAVA_ARRAY_CHAR;
typedef int16_t JAVA_ARRAY_SHORT;
typedef int32_t JAVA_ARRAY_INT;
typedef int64_t JAVA_ARRAY_LONG;
typedef float JAVA_ARRAY_FLOAT;
typedef double JAVA_ARRAY_DOUBLE;

typedef struct JavaArrayPrototype* JAVA_ARRAY;
typedef struct JavaObjectPrototype* JAVA_OBJECT;
Expand Down Expand Up @@ -147,6 +147,7 @@ struct clazz {
const int baseInterfaceCount;

void* newInstanceFp;
void* newFp;

// virtual method table lookup
void** vtable;
Expand Down Expand Up @@ -655,17 +656,22 @@ else if (IS_DOUBLE_WORD(-1)) SP=BC_DUP2_X2_DSS(SP);\
#define BC_LSHR() SP--; SP[-1].data.l = (SP[-1].data.l >> (0x3f & (*SP).data.l))
#define BC_LSHR_EXPR(val1, val2) (val1 >> (0x3f & val2))

#define BC_IUSHL() SP--; SP[-1].data.i = (((unsigned int)SP[-1].data.i) << (0x1f & ((unsigned int)(*SP).data.i)))
#define BC_IUSHL_EXPR(val1, val2) (((unsigned int)val1) << (0x1f & ((unsigned int)val2)))
#define BC_IUSHL() SP--; SP[-1].data.i = (((uint32_t)SP[-1].data.i) << (0x1f & ((uint32_t(*SP).data.i)))
#define BC_IUSHL_EXPR(val1, val2) (((uint32_tval1) << (0x1f & ((uint32_tval2)))

#define BC_LUSHL() SP--; SP[-1].data.l = (((unsigned long long)SP[-1].data.l) << (0x3f & ((unsigned long long)(*SP).data.l)))
#define BC_LUSHL_EXPR(val1, val2) (((unsigned long long)val1) << (0x3f & ((unsigned long long)val2)))
#define BC_LUSHL() SP--; SP[-1].data.l = (((uint64_t)SP[-1].data.l) << (0x3f & ((uint64_t)(*SP).data.l)))
#define BC_LUSHL_EXPR(val1, val2) (((uint64_t)val1) << (0x3f & ((uint64_t)val2)))

#define BC_IUSHR() SP--; SP[-1].data.i = (((unsigned int)SP[-1].data.i) >> (0x1f & ((unsigned int)(*SP).data.i)))
#define BC_IUSHR_EXPR(val1, val2) (((unsigned int)val1) >> (0x1f & ((unsigned int)val2)))
#define BC_IUSHR() SP--; SP[-1].data.i = (((uint32_tSP[-1].data.i) >> (0x1f & ((uint32_t(*SP).data.i)))
//#define BC_IUSHR_EXPR(val1, val2) (((uint32_t)val1) >> (0x1f & ((uint32_t)val2)))
#define BC_IUSHR_EXPR unsignedShiftRightInt

#define BC_LUSHR() SP--; SP[-1].data.l = (((unsigned long long)SP[-1].data.l) >> (0x3f & ((unsigned long long)(*SP).data.l)))
#define BC_LUSHR_EXPR(val1, val2) (((unsigned long long)val1) >> (0x3f & ((unsigned long long)val2)))
#define BC_LUSHR() SP--; SP[-1].data.l = (((uint64_t)SP[-1].data.l) >> (0x3f & ((uint64_t)(*SP).data.l)))
//#define BC_LUSHR_EXPR(val1, val2) (((uint64_t)val1) >> (0x3f & ((uint64_t)val2)))
#define BC_LUSHR_EXPR unsignedShiftRightLong

extern JAVA_INT unsignedShiftRightInt(JAVA_INT value, JAVA_INT shift);
extern JAVA_LONG unsignedShiftRightLong(JAVA_LONG value, JAVA_INT shift);

#define BC_ISUB() SP--; SP[-1].data.i = (SP[-1].data.i - (*SP).data.i)

Expand Down
34 changes: 26 additions & 8 deletions runtime/res/nativeMethods.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "java_lang_Class.h"
#include "java_lang_InterruptedException.h"
#include "java_lang_annotation_Annotation.h"
#include "java_lang_IllegalArgumentException.h"

#include <pthread.h>
#include <math.h>
Expand Down Expand Up @@ -80,7 +81,7 @@ static const uint8_t utf8d[] = {
int gettimeofday(struct timeval* tp, struct timezone* tzp) {
// Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's
// This magic number is the number of 100 nanosecond intervals since January 1, 1601 (UTC)
// until 00:00:00 January 1, 1970
// until 00:00:00 January 1, 1970
static const uint64_t EPOCH = ((uint64_t)116444736000000000ULL);

SYSTEMTIME system_time;
Expand Down Expand Up @@ -133,6 +134,16 @@ struct clazz ClazzClazz = {
};


JAVA_INT unsignedShiftRightInt(JAVA_INT value, JAVA_INT shift) {
uint32_t temp = *(uint32_t*)&value >> (0x1F & shift);
return *(JAVA_INT*)&temp;
}

JAVA_LONG unsignedShiftRightLong(JAVA_LONG value, JAVA_INT shift) {
uint64_t temp = *(uint64_t*)&value >> (0x3F & shift);
return *(JAVA_LONG*)&temp;
}

JAVA_BOOLEAN compareStringToCharArray(const char* str, JAVA_ARRAY_CHAR* chrs, int length) {
if(strlen(str) != length) {
return JAVA_FALSE;
Expand Down Expand Up @@ -571,9 +582,14 @@ JAVA_VOID java_lang_System_arraycopy___java_lang_Object_int_java_lang_Object_int
THROW_ARRAY_INDEX_EXCEPTION(-1);
return;
}
struct clazz* cls = (*srcArr).__codenameOneParentClsReference;
struct clazz *cls = (*srcArr).__codenameOneParentClsReference;
int byteSize = byteSizeForArray(cls);
memcpy(((char *)dstArr->data) + (dstOffset * byteSize), ((char *)srcArr->data) + (srcOffset * byteSize), length * byteSize);
if (src == dst) {
JAVA_ARRAY arr = (JAVA_ARRAY)allocArray(getThreadLocalData(), length, cls, byteSize, srcArr->dimensions);
memcpy(arr->data, ((char *) srcArr->data) + (srcOffset * byteSize), length * byteSize);
memcpy(((char *) dstArr->data) + (dstOffset * byteSize), arr->data, length * byteSize);
} else
memcpy(((char *) dstArr->data) + (dstOffset * byteSize), ((char *) srcArr->data) + (srcOffset * byteSize), length * byteSize);
}

JAVA_LONG java_lang_System_currentTimeMillis___R_long(CODENAME_ONE_THREAD_STATE) {
Expand Down Expand Up @@ -1134,7 +1150,7 @@ JAVA_OBJECT java_lang_Class_getSuperclass___R_java_lang_Class(CODENAME_ONE_THREA

JAVA_OBJECT java_lang_reflect_Constructor_nativeCreate___java_lang_Class_R_java_lang_Object(CODENAME_ONE_THREAD_STATE, JAVA_OBJECT cls) {
struct clazz* clz = (struct clazz*)cls;
return ((JAVA_OBJECT (*) (struct ThreadLocalData *))clz->newInstanceFp)(threadStateData);
return ((JAVA_OBJECT (*) (struct ThreadLocalData *))clz->newFp)(threadStateData);
}

JAVA_OBJECT java_lang_reflect_Array_newInstanceImpl___java_lang_Class_int_R_java_lang_Object(CODENAME_ONE_THREAD_STATE, JAVA_OBJECT cls, JAVA_INT len) {
Expand Down Expand Up @@ -1415,10 +1431,12 @@ JAVA_OBJECT java_lang_reflect_Method_invoke___java_lang_Object_java_lang_Object_
JAVA_OBJECT java_lang_Enum_valueOf___java_lang_Class_java_lang_String_R_java_lang_Enum(CODENAME_ONE_THREAD_STATE, JAVA_OBJECT cls, JAVA_OBJECT value) {
struct clazz* clz = (struct clazz*)cls;
enumValueOfFunctionPointer f = clz->enumValueOfFp;
if (f == 0) {
return JAVA_NULL;
}
return f(threadStateData, value);
JAVA_OBJECT result = JAVA_NULL;
if (f != 0)
result = f(threadStateData, value);
if (!result)
throwException(threadStateData, __NEW_INSTANCE_java_lang_IllegalArgumentException(threadStateData));
return result;
}

JAVA_OBJECT java_lang_Object_toString___R_java_lang_String(CODENAME_ONE_THREAD_STATE, JAVA_OBJECT obj) {
Expand Down
9 changes: 4 additions & 5 deletions runtime/res/runtime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,13 +151,12 @@ JAVA_OBJECT java_io_File_list___R_java_lang_String_1ARRAY(CODENAME_ONE_THREAD_ST
return nullptr;
for (const auto & entry : fs::directory_iterator(path)) {
#if defined(__WIN32__) || defined(__WINRT__)
std::wstring wstring(entry.path().c_str());
std::string string(wstring.begin(), wstring.end());
auto filePath = string.c_str();
std::wstring wstring(entry.path().filename().c_str());
std::string filePath(wstring.begin(), wstring.end());
#else
auto filePath = entry.path().c_str();
auto filePath = entry.path().filename().string();
#endif
collected.emplace_back(newStringFromCString(threadStateData, filePath));
collected.emplace_back(newStringFromCString(threadStateData, filePath.c_str()));
}
auto array = __NEW_ARRAY_java_lang_String(threadStateData, (int)collected.size());
for (int i = 0; i < (int)collected.size(); i++)
Expand Down
7 changes: 7 additions & 0 deletions runtime/src/java/io/InputStreamReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
*/

package java.io;

import java.nio.charset.Charset;

/**
* An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and translates them into characters. The encoding that it uses may be specified by name, or the platform's default encoding may be accepted.
* Each invocation of one of an InputStreamReader's read() methods may cause one or more bytes to be read from the underlying byte input stream. To enable the efficient conversion of bytes to characters, more bytes may be read ahead from the underlying stream than are necessary to satisfy the current read operation.
Expand All @@ -42,6 +45,10 @@ public InputStreamReader(java.io.InputStream is) {
this.enc = "UTF-8";
}

public InputStreamReader(java.io.InputStream is, Charset charset) {
this(is);
}

private void complete() throws IOException{
byte[] b = readInputStream(internal);
cbuffer = bytesToChars(b, 0, b.length, enc);
Expand Down
Loading

0 comments on commit d7a4999

Please sign in to comment.