[stdlib] Don't pass an arena to JS math functions
This commit is contained in:
@@ -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
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user