Skip to content

Commit cf7b0e1

Browse files
authored
Remove memcpy helper from libhtml5.js (#25785)
Instead we can move most of the implementation for these functions into native code.
1 parent b0f7582 commit cf7b0e1

File tree

5 files changed

+66
-43
lines changed

5 files changed

+66
-43
lines changed

src/lib/libhtml5.js

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@ var LibraryHTML5 = {
5151
currentEventHandler: null,
5252
#endif
5353
*/
54-
memcpy(target, src, size) {
55-
HEAP8.set(HEAP8.subarray(src, src + size), target);
56-
},
57-
5854
removeAllEventListeners() {
5955
while (JSEvents.eventHandlers.length) {
6056
JSEvents._removeHandler(JSEvents.eventHandlers.length - 1);
@@ -551,16 +547,14 @@ var LibraryHTML5 = {
551547
emscripten_set_mouseout_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
552548
registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_MOUSEOUT }}}, "mouseout", targetThread),
553549

554-
emscripten_get_mouse_status__proxy: 'sync',
555-
emscripten_get_mouse_status__deps: ['$JSEvents'],
556-
emscripten_get_mouse_status: (mouseState) => {
557-
if (!JSEvents.mouseEvent) return {{{ cDefs.EMSCRIPTEN_RESULT_NO_DATA }}};
558-
// HTML5 does not really have a polling API for mouse events, so implement one manually by
559-
// returning the data from the most recently received event. This requires that user has registered
560-
// at least some no-op function as an event handler to any of the mouse function.
561-
JSEvents.memcpy(mouseState, JSEvents.mouseEvent, {{{ C_STRUCTS.EmscriptenMouseEvent.__size__ }}});
562-
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
563-
},
550+
// HTML5 does not really have a polling API for mouse events, so implement one
551+
// manually by returning the data from the most recently received event. This
552+
// requires that user has registered at least some no-op function as an event
553+
// handler to any of the mouse function.
554+
_emscripten_get_last_mouse_event__proxy: 'sync',
555+
_emscripten_get_last_mouse_event__internal: true,
556+
_emscripten_get_last_mouse_event__deps: ['$JSEvents'],
557+
_emscripten_get_last_mouse_event: () => JSEvents.mouseEvent,
564558

565559
$registerWheelEventCallback__noleakcheck: true,
566560
$registerWheelEventCallback__deps: ['$JSEvents', '$fillMouseEventData', 'malloc'],
@@ -778,16 +772,14 @@ var LibraryHTML5 = {
778772
return registerDeviceOrientationEventCallback({{{ cDefs.EMSCRIPTEN_EVENT_TARGET_WINDOW }}}, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_DEVICEORIENTATION }}}, "deviceorientation", targetThread);
779773
},
780774

781-
emscripten_get_deviceorientation_status__proxy: 'sync',
782-
emscripten_get_deviceorientation_status__deps: ['$JSEvents'],
783-
emscripten_get_deviceorientation_status: (orientationState) => {
784-
if (!JSEvents.deviceOrientationEvent) return {{{ cDefs.EMSCRIPTEN_RESULT_NO_DATA }}};
785-
// HTML5 does not really have a polling API for device orientation events, so implement one manually by
786-
// returning the data from the most recently received event. This requires that user has registered
787-
// at least some no-op function as an event handler.
788-
JSEvents.memcpy(orientationState, JSEvents.deviceOrientationEvent, {{{ C_STRUCTS.EmscriptenDeviceOrientationEvent.__size__ }}});
789-
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
790-
},
775+
// HTML5 does not really have a polling API for device orientation events, so
776+
// implement one manually by returning the data from the most recently
777+
// received event. This requires that user has registered at least some
778+
// no-op function as an event handler.
779+
_emscripten_get_last_deviceorientation_event__proxy: 'sync',
780+
_emscripten_get_last_deviceorientation_event__internal: true,
781+
_emscripten_get_last_deviceorientation_event__deps: ['$JSEvents'],
782+
_emscripten_get_last_deviceorientation_event: () => JSEvents.deviceOrientationEvent,
791783

792784
$fillDeviceMotionEventData: (eventStruct, e, target) => {
793785
var supportedFields = 0;
@@ -847,16 +839,14 @@ var LibraryHTML5 = {
847839
emscripten_set_devicemotion_callback_on_thread: (userData, useCapture, callbackfunc, targetThread) =>
848840
registerDeviceMotionEventCallback({{{ cDefs.EMSCRIPTEN_EVENT_TARGET_WINDOW }}}, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_DEVICEMOTION }}}, "devicemotion", targetThread),
849841

850-
emscripten_get_devicemotion_status__proxy: 'sync',
851-
emscripten_get_devicemotion_status__deps: ['$JSEvents'],
852-
emscripten_get_devicemotion_status: (motionState) => {
853-
if (!JSEvents.deviceMotionEvent) return {{{ cDefs.EMSCRIPTEN_RESULT_NO_DATA }}};
854-
// HTML5 does not really have a polling API for device motion events, so implement one manually by
855-
// returning the data from the most recently received event. This requires that user has registered
856-
// at least some no-op function as an event handler.
857-
JSEvents.memcpy(motionState, JSEvents.deviceMotionEvent, {{{ C_STRUCTS.EmscriptenDeviceMotionEvent.__size__ }}});
858-
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
859-
},
842+
// HTML5 does not really have a polling API for device motion events, so
843+
// implement one manually by returning the data from the most recently
844+
// received event. This requires that user has registered at least some
845+
// no-op function as an event handler.
846+
_emscripten_get_last_devicemotion_event__proxy: 'sync',
847+
_emscripten_get_last_devicemotion_event__internal: true,
848+
_emscripten_get_last_devicemotion_event__deps: ['$JSEvents'],
849+
_emscripten_get_last_devicemotion_event: () => JSEvents.deviceMotionEvent,
860850

861851
$screenOrientation: () => {
862852
if (!window.screen) return undefined;

src/lib/libsigs.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,9 @@ sigs = {
320320
_emscripten_fetch_get_response_headers__sig: 'pipp',
321321
_emscripten_fetch_get_response_headers_length__sig: 'pi',
322322
_emscripten_fs_load_embedded_files__sig: 'vp',
323+
_emscripten_get_last_devicemotion_event__sig: 'p',
324+
_emscripten_get_last_deviceorientation_event__sig: 'p',
325+
_emscripten_get_last_mouse_event__sig: 'p',
323326
_emscripten_get_now_is_monotonic__sig: 'i',
324327
_emscripten_get_progname__sig: 'vpi',
325328
_emscripten_init_main_thread_js__sig: 'vp',
@@ -642,15 +645,12 @@ sigs = {
642645
emscripten_get_canvas_size__sig: 'vppp',
643646
emscripten_get_compiler_setting__sig: 'pp',
644647
emscripten_get_device_pixel_ratio__sig: 'd',
645-
emscripten_get_devicemotion_status__sig: 'ip',
646-
emscripten_get_deviceorientation_status__sig: 'ip',
647648
emscripten_get_element_css_size__sig: 'ippp',
648649
emscripten_get_exported_function__sig: 'pp',
649650
emscripten_get_fullscreen_status__sig: 'ip',
650651
emscripten_get_gamepad_status__sig: 'iip',
651652
emscripten_get_heap_max__sig: 'p',
652653
emscripten_get_main_loop_timing__sig: 'vpp',
653-
emscripten_get_mouse_status__sig: 'ip',
654654
emscripten_get_now__sig: 'd',
655655
emscripten_get_now_res__sig: 'd',
656656
emscripten_get_num_gamepads__sig: 'i',

system/lib/html5/callback.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,23 @@ void _emscripten_run_callback_on_thread(pthread_t t,
4242
assert(false && "emscripten_proxy_async failed");
4343
}
4444
}
45+
46+
static EMSCRIPTEN_RESULT _get_last_event(void* out, void *latest, size_t len) {
47+
if (!latest) {
48+
return EMSCRIPTEN_RESULT_NO_DATA;
49+
}
50+
memcpy(out, latest, len);
51+
return EMSCRIPTEN_RESULT_SUCCESS;
52+
}
53+
54+
EMSCRIPTEN_RESULT emscripten_get_deviceorientation_status(EmscriptenDeviceOrientationEvent *out) {
55+
return _get_last_event(out, _emscripten_get_last_deviceorientation_event(), sizeof(*out));
56+
}
57+
58+
EMSCRIPTEN_RESULT emscripten_get_devicemotion_status(EmscriptenDeviceMotionEvent *out) {
59+
return _get_last_event(out, _emscripten_get_last_devicemotion_event(), sizeof(*out));
60+
}
61+
62+
EMSCRIPTEN_RESULT emscripten_get_mouse_status(EmscriptenMouseEvent *out) {
63+
return _get_last_event(out, _emscripten_get_last_mouse_event(), sizeof(*out));
64+
}

system/lib/libc/emscripten_internal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ int _emscripten_system(const char *command);
147147

148148
void _emscripten_log_formatted(int flags, const char* str);
149149

150+
EmscriptenDeviceOrientationEvent* _emscripten_get_last_deviceorientation_event();
151+
EmscriptenDeviceMotionEvent* _emscripten_get_last_devicemotion_event();
152+
EmscriptenMouseEvent* _emscripten_get_last_mouse_event();
153+
150154
#ifdef __cplusplus
151155
}
152156
#endif

test/codesize/test_codesize_hello_dylink_all.json

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"a.out.js": 245475,
3-
"a.out.nodebug.wasm": 573783,
4-
"total": 819258,
2+
"a.out.js": 245299,
3+
"a.out.nodebug.wasm": 574162,
4+
"total": 819461,
55
"sent": [
66
"IMG_Init",
77
"IMG_Load",
@@ -270,6 +270,9 @@
270270
"_dlsym_js",
271271
"_emscripten_dlopen_js",
272272
"_emscripten_fs_load_embedded_files",
273+
"_emscripten_get_last_devicemotion_event",
274+
"_emscripten_get_last_deviceorientation_event",
275+
"_emscripten_get_last_mouse_event",
273276
"_emscripten_get_now_is_monotonic",
274277
"_emscripten_get_progname",
275278
"_emscripten_log_formatted",
@@ -461,14 +464,11 @@
461464
"emscripten_get_canvas_size",
462465
"emscripten_get_compiler_setting",
463466
"emscripten_get_device_pixel_ratio",
464-
"emscripten_get_devicemotion_status",
465-
"emscripten_get_deviceorientation_status",
466467
"emscripten_get_element_css_size",
467468
"emscripten_get_fullscreen_status",
468469
"emscripten_get_gamepad_status",
469470
"emscripten_get_heap_max",
470471
"emscripten_get_main_loop_timing",
471-
"emscripten_get_mouse_status",
472472
"emscripten_get_now",
473473
"emscripten_get_now_res",
474474
"emscripten_get_num_gamepads",
@@ -1457,6 +1457,9 @@
14571457
"env._dlopen_js",
14581458
"env._dlsym_js",
14591459
"env._emscripten_dlopen_js",
1460+
"env._emscripten_get_last_devicemotion_event",
1461+
"env._emscripten_get_last_deviceorientation_event",
1462+
"env._emscripten_get_last_mouse_event",
14601463
"env._emscripten_get_progname",
14611464
"env._emscripten_log_formatted",
14621465
"env._emscripten_lookup_name",
@@ -2220,7 +2223,10 @@
22202223
"emscripten_fiber_init_from_current_context",
22212224
"emscripten_futex_wait",
22222225
"emscripten_futex_wake",
2226+
"emscripten_get_devicemotion_status",
2227+
"emscripten_get_deviceorientation_status",
22232228
"emscripten_get_heap_size",
2229+
"emscripten_get_mouse_status",
22242230
"emscripten_get_sbrk_ptr",
22252231
"emscripten_has_threading_support",
22262232
"emscripten_is_main_runtime_thread",
@@ -4082,7 +4088,10 @@
40824088
"$emscripten_fiber_init",
40834089
"$emscripten_fiber_init_from_current_context",
40844090
"$emscripten_futex_wait",
4091+
"$emscripten_get_devicemotion_status",
4092+
"$emscripten_get_deviceorientation_status",
40854093
"$emscripten_get_heap_size",
4094+
"$emscripten_get_mouse_status",
40864095
"$emscripten_get_sbrk_ptr",
40874096
"$emscripten_log",
40884097
"$emscripten_longjmp",

0 commit comments

Comments
 (0)