diff --git a/classlib/src/main/java/org/teavm/classlib/java/lang/TConsoleOutputStreamStderr.java b/classlib/src/main/java/org/teavm/classlib/java/lang/TConsoleOutputStreamStderr.java index 0cc2de9ae..8bc0ce3d6 100644 --- a/classlib/src/main/java/org/teavm/classlib/java/lang/TConsoleOutputStreamStderr.java +++ b/classlib/src/main/java/org/teavm/classlib/java/lang/TConsoleOutputStreamStderr.java @@ -16,29 +16,31 @@ package org.teavm.classlib.java.lang; import java.io.IOException; +import org.teavm.classlib.PlatformDetector; import org.teavm.classlib.java.io.TOutputStream; -import org.teavm.interop.DelegateTo; import org.teavm.interop.Import; import org.teavm.interop.Unmanaged; -import org.teavm.interop.c.Include; import org.teavm.jso.JSBody; class TConsoleOutputStreamStderr extends TOutputStream { @Override - @DelegateTo("writeLowLevel") public void write(int b) throws IOException { - writeJs(b); - } - - @JSBody(params = "b", script = "$rt_putStderr(b);") - private static native void writeJs(int b); - - private void writeLowLevel(int b) { writeImpl(b); } - @Include("wchar.h") + static void writeImpl(int b) { + if (PlatformDetector.isC()) { + writeC(b); + } else { + writeJs(b); + } + } + + @JSBody(params = "b", script = "$rt_putStderr(b);") @Import(name = "putwchar", module = "teavm") + private static native void writeJs(int b); + @Unmanaged - static native void writeImpl(int b); + @Import(name = "teavm_logchar") + private static native void writeC(int b); } diff --git a/core/src/main/java/org/teavm/backend/c/generate/ClassGenerator.java b/core/src/main/java/org/teavm/backend/c/generate/ClassGenerator.java index bd72ddc13..6ab02b08a 100644 --- a/core/src/main/java/org/teavm/backend/c/generate/ClassGenerator.java +++ b/core/src/main/java/org/teavm/backend/c/generate/ClassGenerator.java @@ -240,6 +240,9 @@ public class ClassGenerator { String poolName = "strings_" + context.getNames().forClassInstance(type); codeWriter.println("TeaVM_String* " + poolName + "[];"); + codeWriter.println("#ifdef TEAVM_GET_STRING"); + codeWriter.println("#undef TEAVM_GET_STRING"); + codeWriter.println("#endif"); codeWriter.println("#define TEAVM_GET_STRING(i) " + poolName + "[i]"); } diff --git a/core/src/main/java/org/teavm/backend/c/generate/CodeGenerationVisitor.java b/core/src/main/java/org/teavm/backend/c/generate/CodeGenerationVisitor.java index 9af0209af..a5b46392a 100644 --- a/core/src/main/java/org/teavm/backend/c/generate/CodeGenerationVisitor.java +++ b/core/src/main/java/org/teavm/backend/c/generate/CodeGenerationVisitor.java @@ -600,7 +600,7 @@ public class CodeGenerationVisitor implements ExprVisitor, StatementVisitor { } if (resultTmp != null) { - writer.print(resultTmp + " = "); + writer.print(resultTmp + " = (" + typeToCType(method.getResultType()).text + ") "); } writer.print(names.forMethod(method.getReference())); if (method.getAnnotations().get(Variable.class.getName()) == null) { diff --git a/core/src/main/resources/org/teavm/backend/c/date.c b/core/src/main/resources/org/teavm/backend/c/date.c index b187a9f5f..3dfa57db0 100644 --- a/core/src/main/resources/org/teavm/backend/c/date.c +++ b/core/src/main/resources/org/teavm/backend/c/date.c @@ -48,13 +48,14 @@ int64_t teavm_date_timeToTimestamp(time_t t) { } time_t teavm_date_timestampToTime(int64_t timestamp) { + int64_t seconds = (timestamp / 1000); struct tm t = { .tm_year = 70, .tm_mon = 0, .tm_mday = 1, - .tm_hour = 0, - .tm_min = 0, - .tm_sec = timestamp / 1000, + .tm_hour = (int) (seconds / 3600), + .tm_min = (int) ((seconds / 60) % 60), + .tm_sec = (int) (seconds % 60), .tm_isdst = -1 }; return timegm(&t) + timestamp % 1000; @@ -62,7 +63,10 @@ time_t teavm_date_timestampToTime(int64_t timestamp) { inline static struct tm* teavm_date_decompose(int64_t timestamp, struct tm *t) { *t = teavm_epochStartTm; - t->tm_sec += timestamp / 1000; + int64_t seconds = (timestamp / 1000); + t->tm_sec += (int) (seconds % 60); + t->tm_min += (int) ((seconds / 60) % 60); + t->tm_hour += (int) (seconds / 3600); mktime(t); return t; } @@ -179,7 +183,10 @@ int64_t teavm_date_setSeconds(int64_t time, int32_t seconds) { char* teavm_date_format(int64_t time) { struct tm t; t = teavm_epochStartTm; - t.tm_sec += time / 1000; + int64_t seconds = (time / 1000); + t.tm_sec += (int) (seconds % 60); + t.tm_min += (int) ((seconds / 60) % 60); + t.tm_hour += (int) (seconds / 3600); mktime(&t); strftime(teavm_date_formatBuffer, 512, teavm_date_defaultFormat, &t); return teavm_date_formatBuffer; diff --git a/core/src/main/resources/org/teavm/backend/c/file.c b/core/src/main/resources/org/teavm/backend/c/file.c index 1dfc54296..a87496d5f 100644 --- a/core/src/main/resources/org/teavm/backend/c/file.c +++ b/core/src/main/resources/org/teavm/backend/c/file.c @@ -587,7 +587,7 @@ int32_t teavm_file_isWindows() { } static TeaVM_StringList* teavm_file_addToList(TeaVM_StringList* strings, char16_t* data) { - int32_t size = wcslen(data); + int32_t size = (int32_t) wcslen(data); WCHAR* copy = malloc(size * sizeof(char16_t)); memcpy(copy, data, size * sizeof(char16_t)); return teavm_appendString(strings, copy, size); diff --git a/core/src/main/resources/org/teavm/backend/c/runtime.c b/core/src/main/resources/org/teavm/backend/c/runtime.c index 9c0e22a91..5afdbc794 100644 --- a/core/src/main/resources/org/teavm/backend/c/runtime.c +++ b/core/src/main/resources/org/teavm/backend/c/runtime.c @@ -62,7 +62,7 @@ static HANDLE teavm_queueTimer; #endif void teavm_beforeInit() { - srand(time(NULL)); + srand((unsigned int) time(NULL)); #ifdef __GNUC__ setlocale (LC_ALL, ""); @@ -100,7 +100,7 @@ void teavm_beforeInit() { #ifdef __GNUC__ void teavm_initHeap(int64_t heapSize) { - long workSize = heapSize / 16; + long workSize = (long) (heapSize / 16); long regionsSize = (long) (heapSize / teavm_gc_regionSize); long pageSize = sysconf(_SC_PAGE_SIZE); @@ -166,7 +166,7 @@ static void* teavm_virtualAlloc(int size) { } void teavm_initHeap(int64_t heapSize) { - long workSize = heapSize / 16; + long workSize = (long) (heapSize / 16); long regionsSize = (long) (heapSize / teavm_gc_regionSize); SYSTEM_INFO systemInfo; @@ -206,9 +206,8 @@ int64_t teavm_currentTimeNano() { #endif #ifdef _MSC_VER -#define gmtime_r(a, b) gmtime_s(b, a) -#define mktime_r(a, b) mktime_s(b, a) -#define localtime_r(a, b) localtime_s(b, a) +#define gmtime_r(a, b) gmtime_s(a, b) +#define localtime_r(a, b) localtime_s(a, b) #endif int32_t teavm_timeZoneOffset() { @@ -216,7 +215,7 @@ int32_t teavm_timeZoneOffset() { time_t t = time(NULL); time_t local = mktime(localtime_r(&t, &tm)); time_t utc = mktime(gmtime_r(&t, &tm)); - return difftime(utc, local) / 60; + return (int32_t) (difftime(utc, local) / 60); } #ifdef __GNUC__ @@ -245,7 +244,7 @@ void teavm_interrupt() { #ifdef _MSC_VER void teavm_waitFor(int64_t timeout) { - WaitForSingleObject(teavm_queueTimer, timeout); + WaitForSingleObject(teavm_queueTimer, (DWORD) timeout); ResetEvent(teavm_queueTimer); } @@ -320,7 +319,7 @@ size_t teavm_mbSize(char16_t* javaChars, int32_t javaCharsCount) { mbstate_t state = {0}; for (int32_t i = 0; i < javaCharsCount; ++i) { size_t result = c16rtomb(buffer, javaChars[i], &state); - if (result == -1) { + if (result == (size_t) -1) { break; } sz += result; @@ -333,7 +332,7 @@ int32_t teavm_c16Size(char* cstring, size_t count) { int32_t sz = 0; while (count > 0) { size_t result = mbrtoc16(NULL, cstring, count, &state); - if (result == -1) { + if (result == (size_t) -1) { break; } else if ((int) result >= 0) { sz++; @@ -362,7 +361,7 @@ char* teavm_stringToC(void* obj) { mbstate_t state = {0}; for (int32_t i = 0; i < charArray->size; ++i) { size_t result = c16rtomb(dst, javaChars[i], &state); - if (result == -1) { + if (result == (size_t) -1) { break; } dst += result; @@ -397,8 +396,8 @@ TeaVM_String* teavm_cToString(char* cstring) { char16_t* javaChars = TEAVM_ARRAY_DATA(charArray, char16_t); mbstate_t state = {0}; for (int32_t i = 0; i < size; ++i) { - int32_t result = mbrtoc16(javaChars++, cstring, clen, &state); - if (result == -1) { + size_t result = mbrtoc16(javaChars++, cstring, clen, &state); + if (result == (size_t) -1) { break; } else if ((int) result >= 0) { clen -= result; @@ -429,8 +428,8 @@ char16_t* teavm_mbToChar16(char* cstring, int32_t* length) { char16_t* javaChars = malloc(sizeof(char16_t) * (size + 2)); mbstate_t state = {0}; for (int32_t i = 0; i < size; ++i) { - int32_t result = mbrtoc16(javaChars + i, cstring, clen, &state); - if (result == -1) { + size_t result = mbrtoc16(javaChars + i, cstring, clen, &state); + if (result == (size_t) -1) { break; } else if ((int) result >= 0) { clen -= result; @@ -542,3 +541,14 @@ TeaVM_StringList* teavm_appendString(TeaVM_StringList* list, char16_t* data, int entry->next = list; return entry; } + +#ifndef TEAVM_WINDOWS_LOG +void teavm_logchar(char16_t c) { + putwchar(c); +} +#else +void teavm_logchar(int32_t c) { + char16_t buffer[2] = { (char16_t) c, 0 }; + OutputDebugStringW(buffer); +} +#endif diff --git a/core/src/main/resources/org/teavm/backend/c/runtime.h b/core/src/main/resources/org/teavm/backend/c/runtime.h index 5a48328da..c3961ac41 100644 --- a/core/src/main/resources/org/teavm/backend/c/runtime.h +++ b/core/src/main/resources/org/teavm/backend/c/runtime.h @@ -12,6 +12,8 @@ #ifdef _MSC_VER #define alignas(n) __declspec(align(n)) #pragma comment (lib,"uuid.lib") +#pragma warning(disable:4116) +#pragma warning(disable:4102) #ifdef WINAPI_FAMILY #if WINAPI_FAMILY == 2 || WINAPI_FAMILY == 3 || WINAPI_FAMILY == 5 @@ -353,4 +355,6 @@ extern int32_t teavm_file_isWindows(); #ifdef _MSC_VER extern int64_t teavm_unixTimeOffset; -#endif \ No newline at end of file +#endif + +extern void teavm_logchar(int32_t); \ No newline at end of file