From 968014868d1dba1efcc2144684f095860c619c92 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Thu, 1 Mar 2018 11:33:11 +0300 Subject: [PATCH] [stdlib] Don't pass an arena to JS math functions --- .../JsRuntime/src/main/kotlin/jsinterop.kt | 6 -- runtime/build.gradle | 23 ++----- runtime/src/main/cpp/JSInterop.cpp | 30 ++++---- runtime/src/main/cpp/KotlinMath.cpp | 9 ++- runtime/src/main/cpp/KotlinMath.h | 68 +++++++++---------- runtime/src/main/cpp/Types.h | 6 -- 6 files changed, 61 insertions(+), 81 deletions(-) diff --git a/Interop/JsRuntime/src/main/kotlin/jsinterop.kt b/Interop/JsRuntime/src/main/kotlin/jsinterop.kt index 7183661c975..94f28bb2e09 100644 --- a/Interop/JsRuntime/src/main/kotlin/jsinterop.kt +++ b/Interop/JsRuntime/src/main/kotlin/jsinterop.kt @@ -42,12 +42,10 @@ external public fun pushIntToArena(arena: Arena, value: Int) const val upperWord = 0xffffffff.toLong() shl 32 -@Used @ExportForCppRuntime fun doubleUpper(value: Double): Int = ((value.toBits() and upperWord) ushr 32) .toInt() -@Used @ExportForCppRuntime fun doubleLower(value: Double): Int = (value.toBits() and 0x00000000ffffffff) .toInt() @@ -144,7 +142,3 @@ object ArenaManager { val globalArena = allocateArena() var currentArena = globalArena } - -@Used -@ExportForCppRuntime("Konan_js_getCurrentArena") -internal fun getCurrentArena() = ArenaManager.currentArena \ No newline at end of file diff --git a/runtime/build.gradle b/runtime/build.gradle index 5eb2af6c05e..c5b3485a9af 100644 --- a/runtime/build.gradle +++ b/runtime/build.gradle @@ -53,27 +53,18 @@ task clean { } task generateJsMath { - dependsOn ':dist' + dependsOn ':distCompiler' doLast { def jsinteropScript = isWindows() ? "jsinterop.bat" : "jsinterop" def jsinterop = "$distDir/bin/$jsinteropScript" def targetDir = "$buildDir/generated" - def firstLine = true "$jsinterop -pkg kotlinx.interop.wasm.math -o $targetDir/math -target wasm32".execute().waitFor() - copy { - from("$targetDir/math-build/natives/js_stubs.js") - into('src/main/js') - rename { "math.js" } - filter { line -> - if (firstLine) { - firstLine = false - return "// NOTE: THIS FILE IS AUTO-GENERATED!\n" + - "// Run ':runtime:generateJsMath' to re-generate it.\n\n" + - "$line" - } else { - return line - } - } + def generated = file("$targetDir/math-build/natives/js_stubs.js") + def mathJs = file('src/main/js/math.js') + mathJs.write("// NOTE: THIS FILE IS AUTO-GENERATED!\n" + + "// Run ':runtime:generateJsMath' to re-generate it.\n\n") + generated.withReader { + mathJs.append(it) } } } diff --git a/runtime/src/main/cpp/JSInterop.cpp b/runtime/src/main/cpp/JSInterop.cpp index 669305db45f..738d86d712b 100644 --- a/runtime/src/main/cpp/JSInterop.cpp +++ b/runtime/src/main/cpp/JSInterop.cpp @@ -16,43 +16,47 @@ #include "Types.h" +typedef KInt Arena; +typedef KInt Object; +typedef KInt Pointer; + #ifndef KONAN_WASM extern "C" { // These functions are implemented in JS file for WASM and are not available on other platforms. -RUNTIME_NORETURN JS::Arena Konan_js_allocateArena() { +RUNTIME_NORETURN Arena Konan_js_allocateArena() { RuntimeAssert(false, "JavaScript interop is disabled"); } -RUNTIME_NORETURN void Konan_js_freeArena(JS::Arena arena) { +RUNTIME_NORETURN void Konan_js_freeArena(Arena arena) { RuntimeAssert(false, "JavaScript interop is disabled"); } -RUNTIME_NORETURN void Konan_js_pushIntToArena(JS::Arena arena, KInt value) { +RUNTIME_NORETURN void Konan_js_pushIntToArena(Arena arena, KInt value) { RuntimeAssert(false, "JavaScript interop is disabled"); } -RUNTIME_NORETURN KInt Konan_js_getProperty(JS::Arena arena, - JS::Object obj, - JS::Pointer propertyPtr, +RUNTIME_NORETURN KInt Konan_js_getProperty(Arena arena, + Object obj, + Pointer propertyPtr, KInt propertyLen) { RuntimeAssert(false, "JavaScript interop is disabled"); } -RUNTIME_NORETURN void Konan_js_setFunction(JS::Arena arena, - JS::Object obj, - JS::Pointer propertyName, +RUNTIME_NORETURN void Konan_js_setFunction(Arena arena, + Object obj, + Pointer propertyName, KInt propertyLength, KInt function) { RuntimeAssert(false, "JavaScript interop is disabled"); } -RUNTIME_NORETURN void Konan_js_setString(JS::Arena arena, - JS::Object obj, - JS::Pointer propertyName, +RUNTIME_NORETURN void Konan_js_setString(Arena arena, + Object obj, + Pointer propertyName, KInt propertyLength, - JS::Pointer stringPtr, + Pointer stringPtr, KInt stringLength) { RuntimeAssert(false, "JavaScript interop is disabled"); } diff --git a/runtime/src/main/cpp/KotlinMath.cpp b/runtime/src/main/cpp/KotlinMath.cpp index 066d822f34d..b2edc827e0e 100644 --- a/runtime/src/main/cpp/KotlinMath.cpp +++ b/runtime/src/main/cpp/KotlinMath.cpp @@ -245,17 +245,16 @@ KLong Kotlin_math_absl(KLong x) { return llabs(x); } #else // KONAN_WASM defined. Use JS math implementation. -#define RETURN_RESULT_OF_JS_CALL(call, doubleArg) { \ - call(doubleUpper(doubleArg), doubleLower(doubleArg), Konan_js_getCurrentArena()); \ - return ReturnSlot_getDouble(); \ +#define RETURN_RESULT_OF_JS_CALL(call, doubleArg) { \ + call(doubleUpper(doubleArg), doubleLower(doubleArg)); \ + return ReturnSlot_getDouble(); \ } #define RETURN_RESULT_OF_JS_CALL2(call, doubleArg1, doubleArg2) { \ call(doubleUpper(doubleArg1), \ doubleLower(doubleArg1), \ doubleUpper(doubleArg2), \ - doubleLower(doubleArg2), \ - Konan_js_getCurrentArena()); \ + doubleLower(doubleArg2)); \ return ReturnSlot_getDouble(); \ } diff --git a/runtime/src/main/cpp/KotlinMath.h b/runtime/src/main/cpp/KotlinMath.h index 27505004df1..2e052052a1a 100644 --- a/runtime/src/main/cpp/KotlinMath.h +++ b/runtime/src/main/cpp/KotlinMath.h @@ -23,44 +23,42 @@ extern "C" { -JS::Arena Konan_js_getCurrentArena(); - // Bridges for JS math. -void knjs__Math_abs(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_acos(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_acosh(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_asin(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_asinh(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_atan(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_atan2(KInt yUpper, KInt yLower, KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_atanh(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_cbrt(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_ceil(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_clz32(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_cos(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_cosh(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_exp(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_expm1(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_floor(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_fround(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_log(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_log1p(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_log10(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_log2(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_round(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_sign(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_sin(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_sinh(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_sqrt(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_tan(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_tanh(KInt xUpper, KInt xLower, JS::Arena resultArena); -void knjs__Math_trunc(KInt xUpper, KInt xLower, JS::Arena resultArena); +void knjs__Math_abs(KInt xUpper, KInt xLower); +void knjs__Math_acos(KInt xUpper, KInt xLower); +void knjs__Math_acosh(KInt xUpper, KInt xLower); +void knjs__Math_asin(KInt xUpper, KInt xLower); +void knjs__Math_asinh(KInt xUpper, KInt xLower); +void knjs__Math_atan(KInt xUpper, KInt xLower); +void knjs__Math_atan2(KInt yUpper, KInt yLower, KInt xUpper, KInt xLower); +void knjs__Math_atanh(KInt xUpper, KInt xLower); +void knjs__Math_cbrt(KInt xUpper, KInt xLower); +void knjs__Math_ceil(KInt xUpper, KInt xLower); +void knjs__Math_clz32(KInt xUpper, KInt xLower); +void knjs__Math_cos(KInt xUpper, KInt xLower); +void knjs__Math_cosh(KInt xUpper, KInt xLower); +void knjs__Math_exp(KInt xUpper, KInt xLower); +void knjs__Math_expm1(KInt xUpper, KInt xLower); +void knjs__Math_floor(KInt xUpper, KInt xLower); +void knjs__Math_fround(KInt xUpper, KInt xLower); +void knjs__Math_log(KInt xUpper, KInt xLower); +void knjs__Math_log1p(KInt xUpper, KInt xLower); +void knjs__Math_log10(KInt xUpper, KInt xLower); +void knjs__Math_log2(KInt xUpper, KInt xLower); +void knjs__Math_round(KInt xUpper, KInt xLower); +void knjs__Math_sign(KInt xUpper, KInt xLower); +void knjs__Math_sin(KInt xUpper, KInt xLower); +void knjs__Math_sinh(KInt xUpper, KInt xLower); +void knjs__Math_sqrt(KInt xUpper, KInt xLower); +void knjs__Math_tan(KInt xUpper, KInt xLower); +void knjs__Math_tanh(KInt xUpper, KInt xLower); +void knjs__Math_trunc(KInt xUpper, KInt xLower); -void knjs__Math_hypot(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower, JS::Arena resultArena); -void knjs__Math_max(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower, JS::Arena resultArena); -void knjs__Math_min(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower, JS::Arena resultArena); +void knjs__Math_hypot(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower); +void knjs__Math_max(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower); +void knjs__Math_min(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower); -void knjs__Math_pow(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower, JS::Arena resultArena); +void knjs__Math_pow(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower); } diff --git a/runtime/src/main/cpp/Types.h b/runtime/src/main/cpp/Types.h index 561a21d7e08..850f19ef586 100644 --- a/runtime/src/main/cpp/Types.h +++ b/runtime/src/main/cpp/Types.h @@ -50,12 +50,6 @@ typedef ObjHeader* KRef; typedef const ObjHeader* KConstRef; typedef const ArrayHeader* KString; -namespace JS { -typedef KInt Arena; -typedef KInt Object; -typedef KInt Pointer; -} - // Definitions of STL classes used inside Konan runtime. typedef std::basic_string, KonanAllocator> KStdString;