Call trampolines with the actual number of provided operands

When calling indirectly, the number of required operands might not be known at compile time and providing the actual number of operands instead solves this.
This commit is contained in:
dcodeIO 2018-03-23 15:00:09 +01:00
parent 4adb69f73a
commit 2738eee9cd
13 changed files with 150 additions and 76 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -4274,6 +4274,13 @@ export class Compiler extends DiagnosticEmitter {
/** Gets the trampoline for the specified function. */
ensureTrampoline(original: Function): Function {
// A trampoline is a function that takes a fixed amount of operands with some of them possibly
// being zeroed. It takes one additional argument denoting the number of actual operands
// provided to the call, and takes appropriate steps to initialize zeroed operands to their
// default values using the optional parameter initializers of the original function. Doing so
// allows calls to functions with optional parameters to circumvent the trampoline when all
// parameters are provided as a fast route, respectively setting up omitted operands in a proper
// context otherwise.
var trampoline = original.trampoline;
if (trampoline) return trampoline;
@ -4345,7 +4352,14 @@ export class Compiler extends DiagnosticEmitter {
var body = module.createBlock(names[0], [
module.createBlock("N=invalid", [
module.createSwitch(names, "N=invalid",
module.createGetLocal(maxOperands, NativeType.I32)
// condition is number of provided optional operands, so subtract required operands
minOperands
? module.createBinary(
BinaryOp.SubI32,
module.createGetLocal(maxOperands, NativeType.I32),
module.createI32(minOperands)
)
: module.createGetLocal(maxOperands, NativeType.I32)
)
]),
module.createUnreachable()
@ -4407,7 +4421,7 @@ export class Compiler extends DiagnosticEmitter {
for (let i = numArguments; i < maxArguments; ++i) {
operands.push(instance.signature.parameterTypes[i].toNativeZero(module));
}
operands.push(module.createI32(numOperands - minOperands));
operands.push(module.createI32(numOperands)); // actual number of provided operands
}
var returnType = instance.signature.returnType;
this.currentType = returnType;

View File

@ -23,7 +23,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=2 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 1)
)
)
)
(unreachable)
@ -48,7 +51,7 @@
(i32.const 3)
(i32.const 0)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(block
(call $abort
@ -66,7 +69,7 @@
(i32.const 3)
(i32.const 4)
(i32.const 0)
(i32.const 1)
(i32.const 2)
)
(i32.const 5)
)

View File

@ -26,7 +26,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=2 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 1)
)
)
)
(unreachable)
@ -53,7 +56,7 @@
(i32.const 3)
(i32.const 0)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(i32.const 0)
)
@ -75,7 +78,7 @@
(i32.const 3)
(i32.const 4)
(i32.const 0)
(i32.const 1)
(i32.const 2)
)
(i32.const 5)
)

View File

@ -62,7 +62,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -203,7 +206,7 @@
(i32.const 1)
(i32.const 2)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
(i32.const 3)
)

View File

@ -96,7 +96,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -251,7 +254,7 @@
(i32.const 1)
(i32.const 2)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
(i32.const 3)
)

View File

@ -2844,7 +2844,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -2952,7 +2955,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -4037,7 +4043,7 @@
(get_global $std/array/arr)
(i32.const 44)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if
@ -4057,7 +4063,7 @@
(get_global $std/array/arr)
(i32.const 42)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if
@ -4080,7 +4086,7 @@
(get_global $std/array/arr)
(i32.const 45)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if
@ -4257,7 +4263,7 @@
(get_global $std/array/arr)
(i32.const 44)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if
@ -4280,7 +4286,7 @@
(get_global $std/array/arr)
(i32.const 42)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if
@ -4303,7 +4309,7 @@
(get_global $std/array/arr)
(i32.const 45)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if

View File

@ -3192,7 +3192,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -3310,7 +3313,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -4523,7 +4529,7 @@
(get_global $std/array/arr)
(i32.const 44)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if
@ -4548,7 +4554,7 @@
(get_global $std/array/arr)
(i32.const 42)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if
@ -4573,7 +4579,7 @@
(get_global $std/array/arr)
(i32.const 45)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if
@ -4766,7 +4772,7 @@
(get_global $std/array/arr)
(i32.const 44)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if
@ -4791,7 +4797,7 @@
(get_global $std/array/arr)
(i32.const 42)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if
@ -4816,7 +4822,7 @@
(get_global $std/array/arr)
(i32.const 45)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(if

View File

@ -2135,7 +2135,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=2 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 1)
)
)
)
(unreachable)
@ -2195,7 +2198,7 @@
(get_global $std/arraybuffer/buffer)
(i32.const 0)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
)
(if
@ -2235,7 +2238,7 @@
(get_global $std/arraybuffer/buffer)
(i32.const 1)
(i32.const 0)
(i32.const 1)
(i32.const 2)
)
)
(if
@ -2260,7 +2263,7 @@
(get_global $std/arraybuffer/buffer)
(i32.const -1)
(i32.const 0)
(i32.const 1)
(i32.const 2)
)
)
(if
@ -2381,7 +2384,7 @@
(get_global $std/arraybuffer/buffer)
(i32.const 42)
(i32.const 0)
(i32.const 1)
(i32.const 2)
)
)
(if

View File

@ -2441,7 +2441,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=2 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 1)
)
)
)
(unreachable)
@ -2506,7 +2509,7 @@
(get_global $std/arraybuffer/buffer)
(i32.const 0)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
)
(if
@ -2550,7 +2553,7 @@
(get_global $std/arraybuffer/buffer)
(i32.const 1)
(i32.const 0)
(i32.const 1)
(i32.const 2)
)
)
(if
@ -2577,7 +2580,7 @@
(get_global $std/arraybuffer/buffer)
(i32.const -1)
(i32.const 0)
(i32.const 1)
(i32.const 2)
)
)
(if
@ -2708,7 +2711,7 @@
(get_global $std/arraybuffer/buffer)
(i32.const 42)
(i32.const 0)
(i32.const 1)
(i32.const 2)
)
)
(if

View File

@ -284,7 +284,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -390,7 +393,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -526,7 +532,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -546,7 +555,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -940,7 +952,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $2)
(i32.sub
(get_local $2)
(i32.const 1)
)
)
)
(unreachable)
@ -3358,7 +3373,7 @@
(get_global $std/string/str)
(i32.const 108)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(block
@ -3377,7 +3392,7 @@
(get_global $std/string/str)
(i32.const 128)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(block
@ -3396,7 +3411,7 @@
(get_global $std/string/str)
(i32.const 144)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(block
@ -3415,7 +3430,7 @@
(get_global $std/string/str)
(i32.const 156)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
(i32.const 2)
)
@ -3435,7 +3450,7 @@
(get_global $std/string/str)
(i32.const 164)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
(i32.const -1)
)
@ -3454,7 +3469,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 172)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 0)
)
@ -3473,7 +3488,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 180)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 1)
)
@ -3492,7 +3507,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 188)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 5)
)
@ -3511,7 +3526,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 204)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 455)
)
@ -3530,7 +3545,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 220)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 3855)
)
@ -3549,7 +3564,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 236)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 3855)
)
@ -3568,7 +3583,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 252)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 11)
)
@ -3587,7 +3602,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 264)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 1)
)

View File

@ -349,7 +349,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -473,7 +476,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -634,7 +640,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -654,7 +663,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $3)
(i32.sub
(get_local $3)
(i32.const 2)
)
)
)
(unreachable)
@ -1097,7 +1109,10 @@
(block $N=0
(block $N=invalid
(br_table $N=0 $N=1 $N=invalid
(get_local $2)
(i32.sub
(get_local $2)
(i32.const 1)
)
)
)
(unreachable)
@ -3854,7 +3869,7 @@
(get_global $std/string/str)
(i32.const 108)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(block
@ -3873,7 +3888,7 @@
(get_global $std/string/str)
(i32.const 128)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(block
@ -3892,7 +3907,7 @@
(get_global $std/string/str)
(i32.const 144)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
)
(block
@ -3912,7 +3927,7 @@
(get_global $std/string/str)
(i32.const 156)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
(i32.const 2)
)
@ -3934,7 +3949,7 @@
(get_global $std/string/str)
(i32.const 164)
(i32.const 0)
(i32.const 0)
(i32.const 2)
)
(i32.const -1)
)
@ -3955,7 +3970,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 172)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 0)
)
@ -3976,7 +3991,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 180)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 1)
)
@ -3997,7 +4012,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 188)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 5)
)
@ -4018,7 +4033,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 204)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 455)
)
@ -4039,7 +4054,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 220)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 3855)
)
@ -4060,7 +4075,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 236)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 3855)
)
@ -4081,7 +4096,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 252)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 11)
)
@ -4102,7 +4117,7 @@
(call "$(lib)/string/parseInt|trampoline"
(i32.const 264)
(i32.const 0)
(i32.const 0)
(i32.const 1)
)
(f64.const 1)
)