Skip to content

Commit 315d362

Browse files
authored
Add zeroMemory JS utility function to avoid _memset. NFC (#14441)
This avoids the extra export from wasm and the potential codesize of including memset. Its probably faster and smaller over the wire too. Using TypedArray:fill looks fine on all the current min browser versions we support: https://caniuse.com/mdn-javascript_builtins_typedarray_fill If we need to support even older browsers we can always ifdef/polyfill at this single location in the future.
1 parent 6b80c5d commit 315d362

File tree

6 files changed

+28
-17
lines changed

6 files changed

+28
-17
lines changed

src/library.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,18 @@ LibraryManager.library = {
3838
setTempRet0(val);
3939
},
4040

41+
$zeroMemory: function(address, size) {
42+
#if LEGACY_VM_SUPPORT
43+
if (!HEAPU8.fill) {
44+
for (var i = 0; i < size; i++) {
45+
HEAPU8[address + i] = 0;
46+
}
47+
return;
48+
}
49+
#endif
50+
HEAPU8.fill(0, address, address + size);
51+
},
52+
4153
#if SAFE_HEAP
4254
// Trivial wrappers around runtime functions that make these symbols available
4355
// to native code.
@@ -1490,12 +1502,13 @@ LibraryManager.library = {
14901502
// sys/times.h
14911503
// ==========================================================================
14921504

1505+
times__deps: ['$zeroMemory'],
14931506
times: function(buffer) {
14941507
// clock_t times(struct tms *buffer);
14951508
// http://pubs.opengroup.org/onlinepubs/009695399/functions/times.html
14961509
// NOTE: This is fake, since we can't calculate real CPU time usage in JS.
14971510
if (buffer !== 0) {
1498-
_memset(buffer, 0, {{{ C_STRUCTS.tms.__size__ }}});
1511+
zeroMemory(buffer, {{{ C_STRUCTS.tms.__size__ }}});
14991512
}
15001513
return 0;
15011514
},
@@ -2040,23 +2053,22 @@ LibraryManager.library = {
20402053

20412054
return { family: family, addr: addr, port: port };
20422055
},
2043-
$writeSockaddr__deps: ['$Sockets', '$inetPton4', '$inetPton6'],
2056+
$writeSockaddr__deps: ['$Sockets', '$inetPton4', '$inetPton6', '$zeroMemory'],
20442057
$writeSockaddr: function (sa, family, addr, port, addrlen) {
20452058
switch (family) {
20462059
case {{{ cDefine('AF_INET') }}}:
20472060
addr = inetPton4(addr);
2061+
zeroMemory(sa, {{{ C_STRUCTS.sockaddr_in.__size__ }}});
20482062
if (addrlen) {
20492063
{{{ makeSetValue('addrlen', 0, C_STRUCTS.sockaddr_in.__size__, 'i32') }}};
20502064
}
20512065
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in.sin_family, 'family', 'i16') }}};
20522066
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in.sin_addr.s_addr, 'addr', 'i32') }}};
20532067
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in.sin_port, '_htons(port)', 'i16') }}};
2054-
/* Use makeSetValue instead of memset to avoid adding memset dependency for all users of writeSockaddr. */
2055-
{{{ assert(C_STRUCTS.sockaddr_in.__size__ - C_STRUCTS.sockaddr_in.sin_zero == 8), '' }}}
2056-
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in.sin_zero, '0', 'i64') }}};
20572068
break;
20582069
case {{{ cDefine('AF_INET6') }}}:
20592070
addr = inetPton6(addr);
2071+
zeroMemory(sa, {{{ C_STRUCTS.sockaddr_in6.__size__ }}});
20602072
if (addrlen) {
20612073
{{{ makeSetValue('addrlen', 0, C_STRUCTS.sockaddr_in6.__size__, 'i32') }}};
20622074
}
@@ -2066,8 +2078,6 @@ LibraryManager.library = {
20662078
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+8, 'addr[2]', 'i32') }}};
20672079
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+12, 'addr[3]', 'i32') }}};
20682080
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_port, '_htons(port)', 'i16') }}};
2069-
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_flowinfo, '0', 'i32') }}};
2070-
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_scope_id, '0', 'i32') }}};
20712081
break;
20722082
default:
20732083
return {{{ cDefine('EAFNOSUPPORT') }}};

src/library_sdl.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1348,6 +1348,7 @@ var LibrarySDL = {
13481348
return SDL.version;
13491349
},
13501350

1351+
SDL_Init__deps: ['$zeroMemory'],
13511352
SDL_Init__proxy: 'sync',
13521353
SDL_Init__sig: 'ii',
13531354
SDL_Init__docs: '/** @param{number=} initFlags */',
@@ -1368,7 +1369,7 @@ var LibrarySDL = {
13681369

13691370
window.addEventListener("unload", SDL.receiveEvent);
13701371
SDL.keyboardState = _malloc(0x10000); // Our SDL needs 512, but 64K is safe for older SDLs
1371-
_memset(SDL.keyboardState, 0, 0x10000);
1372+
zeroMemory(SDL.keyboardState, 0x10000);
13721373
// Initialize this structure carefully for closure
13731374
SDL.DOMEventToSDLEvent['keydown'] = 0x300 /* SDL_KEYDOWN */;
13741375
SDL.DOMEventToSDLEvent['keyup'] = 0x301 /* SDL_KEYUP */;

src/library_syscall.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ var SyscallsLibrary = {
226226
}
227227
},
228228

229-
$syscallMmap2__deps: ['$SYSCALLS',
229+
$syscallMmap2__deps: ['$SYSCALLS', '$zeroMemory',
230230
#if FILESYSTEM && SYSCALLS_REQUIRE_FILESYSTEM
231231
'$FS',
232232
#endif
@@ -247,7 +247,7 @@ var SyscallsLibrary = {
247247
if ((flags & {{{ cDefine('MAP_ANONYMOUS') }}}) !== 0) {
248248
ptr = _memalign({{{ WASM_PAGE_SIZE }}}, len);
249249
if (!ptr) return -{{{ cDefine('ENOMEM') }}};
250-
_memset(ptr, 0, len);
250+
zeroMemory(ptr, len);
251251
allocated = true;
252252
} else {
253253
#if FILESYSTEM && SYSCALLS_REQUIRE_FILESYSTEM
@@ -494,11 +494,12 @@ var SyscallsLibrary = {
494494
__sys_setrlimit: function(varargs) {
495495
return 0; // no-op
496496
},
497+
__sys_getrusage__deps: ['$zeroMemory'],
497498
__sys_getrusage: function(who, usage) {
498499
#if SYSCALL_DEBUG
499500
err('warning: untested syscall');
500501
#endif
501-
_memset(usage, 0, {{{ C_STRUCTS.rusage.__size__ }}});
502+
zeroMemory(usage, {{{ C_STRUCTS.rusage.__size__ }}});
502503
{{{ makeSetValue('usage', C_STRUCTS.rusage.ru_utime.tv_sec, '1', 'i32') }}}; // fake some values
503504
{{{ makeSetValue('usage', C_STRUCTS.rusage.ru_utime.tv_usec, '2', 'i32') }}};
504505
{{{ makeSetValue('usage', C_STRUCTS.rusage.ru_stime.tv_sec, '3', 'i32') }}};

src/library_uuid.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88

99
mergeInto(LibraryManager.library, {
1010
// Clear a 'compact' UUID.
11+
uuid_clear__deps: ['$zeroMemory'],
1112
uuid_clear: function(uu) {
1213
// void uuid_clear(uuid_t uu);
13-
_memset(uu, 0, 16);
14+
zeroMemory(uu, 16);
1415
},
1516

1617
// Compare whether or not two 'compact' UUIDs are the same.

src/settings.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,7 @@ var POLYFILL_OLD_MATH_FUNCTIONS = 0;
598598
// * Work around old Chromium WebGL 1 bug (-s WORKAROUND_OLD_WEBGL_UNIFORM_UPLOAD_IGNORED_OFFSET_BUG=1)
599599
// * Disable WebAssembly. (Must be paired with -s WASM=0)
600600
// * Adjusts MIN_X_VERSION settings to 0 to include support for all browser versions.
601+
// * Avoid TypedArray.fill, if necessary, in zeroMemory utility function.
601602
// You can also configure the above options individually.
602603
// [link]
603604
var LEGACY_VM_SUPPORT = 0;

tools/deps_info.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
'Mix_LoadWAV_RW': ['fileno'],
5555
'SDL_CreateRGBSurface': ['malloc', 'free'],
5656
'SDL_GL_GetProcAddress': ['malloc'],
57-
'SDL_Init': ['malloc', 'free', 'memset', 'memcpy'],
57+
'SDL_Init': ['malloc', 'free', 'memcpy'],
5858
'SDL_LockSurface': ['malloc', 'free'],
5959
'SDL_OpenAudio': ['malloc', 'free'],
6060
'SDL_PushEvent': ['malloc', 'free'],
@@ -160,7 +160,6 @@
160160
'getnameinfo': ['htons', 'ntohs'],
161161
'getpeername': ['htons'],
162162
'getsockname': ['htons'],
163-
'getrusage': ['memset'],
164163
'glGetString': ['malloc'],
165164
'glGetStringi': ['malloc'],
166165
'glMapBufferRange': ['malloc'],
@@ -173,7 +172,7 @@
173172
'localtime': ['_get_tzname', '_get_daylight', '_get_timezone', 'malloc'],
174173
'localtime_r': ['_get_tzname', '_get_daylight', '_get_timezone', 'malloc'],
175174
'mktime': ['_get_tzname', '_get_daylight', '_get_timezone', 'malloc'],
176-
'mmap': ['memalign', 'memset', 'malloc'],
175+
'mmap': ['memalign', 'malloc'],
177176
'munmap': ['malloc', 'free'],
178177
'pthread_create': ['malloc', 'free', 'emscripten_main_thread_process_queued_calls'],
179178
'readdir': ['malloc'],
@@ -193,11 +192,9 @@
193192
'setgroups': ['sysconf'],
194193
'syslog': ['malloc', 'ntohs'],
195194
'timegm': ['_get_tzname', '_get_daylight', '_get_timezone', 'malloc'],
196-
'times': ['memset'],
197195
'tmpnam': ['malloc'],
198196
'ttyname': ['malloc'],
199197
'tzset': ['_get_tzname', '_get_daylight', '_get_timezone', 'malloc'],
200-
'uuid_clear': ['memset'],
201198
'uuid_compare': ['memcmp'],
202199
'uuid_copy': ['memcpy'],
203200
'wgpuBufferGetMappedRange': ['malloc', 'free'],

0 commit comments

Comments
 (0)