Skip to content

Commit 604eeef

Browse files
authored
[embind] Change GenericEnumValue's type to int (#20908)
`long` is interpreted as a pointer and causes negative `enum class` values to be casted to unsigned and become large overflown values when `CAN_ADDRESS_2GB` is true: https://github.com/emscripten-core/emscripten/blob/0a3b7539856df97370c2e42e174850883c735c9a/src/jsifier.js#L153
1 parent fb19437 commit 604eeef

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

src/library_sigs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ sigs = {
300300
_embind_register_constant__sig: 'vppd',
301301
_embind_register_emval__sig: 'vpp',
302302
_embind_register_enum__sig: 'vpppi',
303-
_embind_register_enum_value__sig: 'vppp',
303+
_embind_register_enum_value__sig: 'vppi',
304304
_embind_register_float__sig: 'vppp',
305305
_embind_register_function__sig: 'vpippppi',
306306
_embind_register_integer__sig: 'vpppii',

system/include/emscripten/bind.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ enum class sharing_policy {
3737

3838
namespace internal {
3939

40-
typedef long GenericEnumValue;
40+
typedef int GenericEnumValue;
4141

4242
typedef void* GenericFunction;
4343
typedef void (*VoidFunctionPtr)(void);

test/test_other.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14298,3 +14298,38 @@ def test_errar(self):
1429814298
def test_no_input_files(self):
1429914299
err = self.expect_fail([EMCC, '-c'])
1430014300
self.assertContained('clang: error: no input files', err)
14301+
14302+
def test_embind_negative_enum_values(self):
14303+
# Test if negative enum values are printed correctly and not overflown to
14304+
# large values when CAN_ADDRESS_2GB is true.
14305+
src = r'''
14306+
#include <stdio.h>
14307+
#include <emscripten.h>
14308+
#include <emscripten/bind.h>
14309+
14310+
using namespace emscripten;
14311+
14312+
int main() {
14313+
EM_ASM(
14314+
console.log(Module.value.neg.value);
14315+
console.log(Module.value.zero.value);
14316+
console.log(Module.value.pos.value);
14317+
);
14318+
}
14319+
14320+
enum class value {
14321+
neg = -1,
14322+
zero = 0,
14323+
pos = 1,
14324+
};
14325+
14326+
EMSCRIPTEN_BINDINGS(utility) {
14327+
enum_<value>("value")
14328+
.value("neg", value::neg)
14329+
.value("zero", value::zero)
14330+
.value("pos", value::pos);
14331+
}
14332+
'''
14333+
expected = '-1\n0\n1\n'
14334+
self.do_run(src, expected_output=expected,
14335+
emcc_args=['-lembind', '-sALLOW_MEMORY_GROWTH', '-sMAXIMUM_MEMORY=4GB'])

0 commit comments

Comments
 (0)