diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-17 09:04:05 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-17 09:04:05 +0000 |
commit | 6391fbb73e25d3f7af15213274c2a3bfe1bc7af5 (patch) | |
tree | d2c6903d55ffdba0655dc473a5ad44c2ecf59df8 /xpcom/reflect/xptcall/md/unix | |
parent | Releasing progress-linux version 115.11.0esr-1~deb12u1progress7u1. (diff) | |
download | firefox-esr-6391fbb73e25d3f7af15213274c2a3bfe1bc7af5.tar.xz firefox-esr-6391fbb73e25d3f7af15213274c2a3bfe1bc7af5.zip |
Merging upstream version 115.12.0esr.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xpcom/reflect/xptcall/md/unix')
-rw-r--r-- | xpcom/reflect/xptcall/md/unix/xptcinvoke_arm.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/xpcom/reflect/xptcall/md/unix/xptcinvoke_arm.cpp b/xpcom/reflect/xptcall/md/unix/xptcinvoke_arm.cpp index 39a6b406f4..d66f300649 100644 --- a/xpcom/reflect/xptcall/md/unix/xptcinvoke_arm.cpp +++ b/xpcom/reflect/xptcall/md/unix/xptcinvoke_arm.cpp @@ -164,6 +164,18 @@ NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, vtable = *reinterpret_cast<vtable_func **>(that); func = vtable[methodIndex]; +/* !!! IMPORTANT !!! + * In the case of paramCount = 0 (and also some other cases in practice but + * the compiler doesn't know about them), the stack_space is not initialized. + * Reading the stack_space is technically undefined behavior, but practically, + * the values we read from there only matter to the called function when they + * are initialized. + * The asm volatile block makes the compiler ignore that the stack_space + * may not be initialized, avoiding it optimizing away e.g. the first loop + * test in invoke_copy_to_stack. + */ + asm volatile(";"); + return func(that, stack_space[base_size * 2 - 3], stack_space[base_size * 2 - 2], stack_space[base_size * 2 - 1]); |