[stdlib] Don't pass an arena to JS math functions

This commit is contained in:
Ilya Matveev
2018-03-01 11:33:11 +03:00
committed by ilmat192
parent da5f4e4c2e
commit 968014868d
6 changed files with 61 additions and 81 deletions
@@ -42,12 +42,10 @@ external public fun pushIntToArena(arena: Arena, value: Int)
const val upperWord = 0xffffffff.toLong() shl 32 const val upperWord = 0xffffffff.toLong() shl 32
@Used
@ExportForCppRuntime @ExportForCppRuntime
fun doubleUpper(value: Double): Int = fun doubleUpper(value: Double): Int =
((value.toBits() and upperWord) ushr 32) .toInt() ((value.toBits() and upperWord) ushr 32) .toInt()
@Used
@ExportForCppRuntime @ExportForCppRuntime
fun doubleLower(value: Double): Int = fun doubleLower(value: Double): Int =
(value.toBits() and 0x00000000ffffffff) .toInt() (value.toBits() and 0x00000000ffffffff) .toInt()
@@ -144,7 +142,3 @@ object ArenaManager {
val globalArena = allocateArena() val globalArena = allocateArena()
var currentArena = globalArena var currentArena = globalArena
} }
@Used
@ExportForCppRuntime("Konan_js_getCurrentArena")
internal fun getCurrentArena() = ArenaManager.currentArena
+7 -16
View File
@@ -53,27 +53,18 @@ task clean {
} }
task generateJsMath { task generateJsMath {
dependsOn ':dist' dependsOn ':distCompiler'
doLast { doLast {
def jsinteropScript = isWindows() ? "jsinterop.bat" : "jsinterop" def jsinteropScript = isWindows() ? "jsinterop.bat" : "jsinterop"
def jsinterop = "$distDir/bin/$jsinteropScript" def jsinterop = "$distDir/bin/$jsinteropScript"
def targetDir = "$buildDir/generated" def targetDir = "$buildDir/generated"
def firstLine = true
"$jsinterop -pkg kotlinx.interop.wasm.math -o $targetDir/math -target wasm32".execute().waitFor() "$jsinterop -pkg kotlinx.interop.wasm.math -o $targetDir/math -target wasm32".execute().waitFor()
copy { def generated = file("$targetDir/math-build/natives/js_stubs.js")
from("$targetDir/math-build/natives/js_stubs.js") def mathJs = file('src/main/js/math.js')
into('src/main/js') mathJs.write("// NOTE: THIS FILE IS AUTO-GENERATED!\n" +
rename { "math.js" } "// Run ':runtime:generateJsMath' to re-generate it.\n\n")
filter { line -> generated.withReader {
if (firstLine) { mathJs.append(it)
firstLine = false
return "// NOTE: THIS FILE IS AUTO-GENERATED!\n" +
"// Run ':runtime:generateJsMath' to re-generate it.\n\n" +
"$line"
} else {
return line
}
}
} }
} }
} }
+17 -13
View File
@@ -16,43 +16,47 @@
#include "Types.h" #include "Types.h"
typedef KInt Arena;
typedef KInt Object;
typedef KInt Pointer;
#ifndef KONAN_WASM #ifndef KONAN_WASM
extern "C" { extern "C" {
// These functions are implemented in JS file for WASM and are not available on other platforms. // 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"); 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"); 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"); RuntimeAssert(false, "JavaScript interop is disabled");
} }
RUNTIME_NORETURN KInt Konan_js_getProperty(JS::Arena arena, RUNTIME_NORETURN KInt Konan_js_getProperty(Arena arena,
JS::Object obj, Object obj,
JS::Pointer propertyPtr, Pointer propertyPtr,
KInt propertyLen) { KInt propertyLen) {
RuntimeAssert(false, "JavaScript interop is disabled"); RuntimeAssert(false, "JavaScript interop is disabled");
} }
RUNTIME_NORETURN void Konan_js_setFunction(JS::Arena arena, RUNTIME_NORETURN void Konan_js_setFunction(Arena arena,
JS::Object obj, Object obj,
JS::Pointer propertyName, Pointer propertyName,
KInt propertyLength, KInt propertyLength,
KInt function) { KInt function) {
RuntimeAssert(false, "JavaScript interop is disabled"); RuntimeAssert(false, "JavaScript interop is disabled");
} }
RUNTIME_NORETURN void Konan_js_setString(JS::Arena arena, RUNTIME_NORETURN void Konan_js_setString(Arena arena,
JS::Object obj, Object obj,
JS::Pointer propertyName, Pointer propertyName,
KInt propertyLength, KInt propertyLength,
JS::Pointer stringPtr, Pointer stringPtr,
KInt stringLength) { KInt stringLength) {
RuntimeAssert(false, "JavaScript interop is disabled"); RuntimeAssert(false, "JavaScript interop is disabled");
} }
+4 -5
View File
@@ -245,17 +245,16 @@ KLong Kotlin_math_absl(KLong x) { return llabs(x); }
#else // KONAN_WASM defined. Use JS math implementation. #else // KONAN_WASM defined. Use JS math implementation.
#define RETURN_RESULT_OF_JS_CALL(call, doubleArg) { \ #define RETURN_RESULT_OF_JS_CALL(call, doubleArg) { \
call(doubleUpper(doubleArg), doubleLower(doubleArg), Konan_js_getCurrentArena()); \ call(doubleUpper(doubleArg), doubleLower(doubleArg)); \
return ReturnSlot_getDouble(); \ return ReturnSlot_getDouble(); \
} }
#define RETURN_RESULT_OF_JS_CALL2(call, doubleArg1, doubleArg2) { \ #define RETURN_RESULT_OF_JS_CALL2(call, doubleArg1, doubleArg2) { \
call(doubleUpper(doubleArg1), \ call(doubleUpper(doubleArg1), \
doubleLower(doubleArg1), \ doubleLower(doubleArg1), \
doubleUpper(doubleArg2), \ doubleUpper(doubleArg2), \
doubleLower(doubleArg2), \ doubleLower(doubleArg2)); \
Konan_js_getCurrentArena()); \
return ReturnSlot_getDouble(); \ return ReturnSlot_getDouble(); \
} }
+33 -35
View File
@@ -23,44 +23,42 @@
extern "C" { extern "C" {
JS::Arena Konan_js_getCurrentArena();
// Bridges for JS math. // Bridges for JS math.
void knjs__Math_abs(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_abs(KInt xUpper, KInt xLower);
void knjs__Math_acos(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_acos(KInt xUpper, KInt xLower);
void knjs__Math_acosh(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_acosh(KInt xUpper, KInt xLower);
void knjs__Math_asin(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_asin(KInt xUpper, KInt xLower);
void knjs__Math_asinh(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_asinh(KInt xUpper, KInt xLower);
void knjs__Math_atan(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_atan(KInt xUpper, KInt xLower);
void knjs__Math_atan2(KInt yUpper, KInt yLower, KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_atan2(KInt yUpper, KInt yLower, KInt xUpper, KInt xLower);
void knjs__Math_atanh(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_atanh(KInt xUpper, KInt xLower);
void knjs__Math_cbrt(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_cbrt(KInt xUpper, KInt xLower);
void knjs__Math_ceil(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_ceil(KInt xUpper, KInt xLower);
void knjs__Math_clz32(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_clz32(KInt xUpper, KInt xLower);
void knjs__Math_cos(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_cos(KInt xUpper, KInt xLower);
void knjs__Math_cosh(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_cosh(KInt xUpper, KInt xLower);
void knjs__Math_exp(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_exp(KInt xUpper, KInt xLower);
void knjs__Math_expm1(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_expm1(KInt xUpper, KInt xLower);
void knjs__Math_floor(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_floor(KInt xUpper, KInt xLower);
void knjs__Math_fround(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_fround(KInt xUpper, KInt xLower);
void knjs__Math_log(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_log(KInt xUpper, KInt xLower);
void knjs__Math_log1p(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_log1p(KInt xUpper, KInt xLower);
void knjs__Math_log10(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_log10(KInt xUpper, KInt xLower);
void knjs__Math_log2(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_log2(KInt xUpper, KInt xLower);
void knjs__Math_round(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_round(KInt xUpper, KInt xLower);
void knjs__Math_sign(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_sign(KInt xUpper, KInt xLower);
void knjs__Math_sin(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_sin(KInt xUpper, KInt xLower);
void knjs__Math_sinh(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_sinh(KInt xUpper, KInt xLower);
void knjs__Math_sqrt(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_sqrt(KInt xUpper, KInt xLower);
void knjs__Math_tan(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_tan(KInt xUpper, KInt xLower);
void knjs__Math_tanh(KInt xUpper, KInt xLower, JS::Arena resultArena); void knjs__Math_tanh(KInt xUpper, KInt xLower);
void knjs__Math_trunc(KInt xUpper, KInt xLower, JS::Arena resultArena); 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_hypot(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower);
void knjs__Math_max(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower, JS::Arena resultArena); void knjs__Math_max(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower);
void knjs__Math_min(KInt xUpper, KInt xLower, KInt yUpper, KInt yLower, JS::Arena resultArena); 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);
} }
-6
View File
@@ -50,12 +50,6 @@ typedef ObjHeader* KRef;
typedef const ObjHeader* KConstRef; typedef const ObjHeader* KConstRef;
typedef const ArrayHeader* KString; typedef const ArrayHeader* KString;
namespace JS {
typedef KInt Arena;
typedef KInt Object;
typedef KInt Pointer;
}
// Definitions of STL classes used inside Konan runtime. // Definitions of STL classes used inside Konan runtime.
typedef std::basic_string<char, std::char_traits<char>, typedef std::basic_string<char, std::char_traits<char>,
KonanAllocator<char>> KStdString; KonanAllocator<char>> KStdString;