Skip to content

Commit b0aeed2

Browse files
committed
Add zeroMemory JS utility function to avoid _memset. NFC
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 f875fc6 commit b0aeed2

File tree

5 files changed

+19
-17
lines changed

5 files changed

+19
-17
lines changed

src/library.js

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

41+
$zeroMemory: function(address, size) {
42+
HEAPU8.fill(0, address, address + size);
43+
},
44+
4145
#if SAFE_HEAP
4246
// Trivial wrappers around runtime functions that make these symbols available
4347
// to native code.
@@ -1490,12 +1494,13 @@ LibraryManager.library = {
14901494
// sys/times.h
14911495
// ==========================================================================
14921496

1497+
times__deps: ['$zeroMemory'],
14931498
times: function(buffer) {
14941499
// clock_t times(struct tms *buffer);
14951500
// http://pubs.opengroup.org/onlinepubs/009695399/functions/times.html
14961501
// NOTE: This is fake, since we can't calculate real CPU time usage in JS.
14971502
if (buffer !== 0) {
1498-
_memset(buffer, 0, {{{ C_STRUCTS.tms.__size__ }}});
1503+
zeroMemory(buffer, {{{ C_STRUCTS.tms.__size__ }}});
14991504
}
15001505
return 0;
15011506
},
@@ -2040,23 +2045,22 @@ LibraryManager.library = {
20402045

20412046
return { family: family, addr: addr, port: port };
20422047
},
2043-
$writeSockaddr__deps: ['$Sockets', '$inetPton4', '$inetPton6'],
2048+
$writeSockaddr__deps: ['$Sockets', '$inetPton4', '$inetPton6', '$zeroMemory'],
20442049
$writeSockaddr: function (sa, family, addr, port, addrlen) {
20452050
switch (family) {
20462051
case {{{ cDefine('AF_INET') }}}:
20472052
addr = inetPton4(addr);
2053+
zeroMemory(sa, {{{ C_STRUCTS.sockaddr_in.__size__ }}});
20482054
if (addrlen) {
20492055
{{{ makeSetValue('addrlen', 0, C_STRUCTS.sockaddr_in.__size__, 'i32') }}};
20502056
}
20512057
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in.sin_family, 'family', 'i16') }}};
20522058
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in.sin_addr.s_addr, 'addr', 'i32') }}};
20532059
{{{ 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') }}};
20572060
break;
20582061
case {{{ cDefine('AF_INET6') }}}:
20592062
addr = inetPton6(addr);
2063+
zeroMemory(sa, {{{ C_STRUCTS.sockaddr_in6.__size__ }}});
20602064
if (addrlen) {
20612065
{{{ makeSetValue('addrlen', 0, C_STRUCTS.sockaddr_in6.__size__, 'i32') }}};
20622066
}
@@ -2066,8 +2070,6 @@ LibraryManager.library = {
20662070
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+8, 'addr[2]', 'i32') }}};
20672071
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+12, 'addr[3]', 'i32') }}};
20682072
{{{ 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') }}};
20712073
break;
20722074
default:
20732075
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.

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)