Skip to content

Commit ebbbacd

Browse files
committed
Split out syscall vararg handling into seperate functions. NFC
This means we only include these function when they are needed. As part of a seperate change I was having issue with closure compiler when `SYSCALLS.varargs` are used by never assigned to.
1 parent 3f2245b commit ebbbacd

File tree

4 files changed

+53
-47
lines changed

4 files changed

+53
-47
lines changed

src/library_syscall.js

Lines changed: 50 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -75,59 +75,57 @@ var SyscallsLibrary = {
7575
var buffer = HEAPU8.slice(addr, addr + len);
7676
FS.msync(stream, buffer, offset, len, flags);
7777
},
78+
// Just like `FS.getStream` but will throw EBADF if stream is undefined.
79+
getStreamFromFD(fd) {
80+
var stream = FS.getStreamChecked(fd);
81+
#if SYSCALL_DEBUG
82+
dbg(` (stream: "${stream.path}")`);
7883
#endif
79-
80-
// arguments handling
84+
return stream;
85+
},
86+
#endif // SYSCALLS_REQUIRE_FILESYSTEM
8187

8288
varargs: undefined,
8389

84-
get() {
85-
#if ASSERTIONS
86-
assert(SYSCALLS.varargs != undefined);
87-
#endif
88-
// the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number.
89-
var ret = {{{ makeGetValue('+SYSCALLS.varargs', 0, 'i32') }}};
90-
SYSCALLS.varargs += 4;
90+
getStr(ptr) {
91+
var ret = UTF8ToString(ptr);
9192
#if SYSCALL_DEBUG
92-
dbg(` (raw: "${ret}")`);
93+
dbg(` (str: "${ret}")`);
9394
#endif
9495
return ret;
9596
},
97+
},
9698

97-
#if MEMORY64
98-
getp() {
99+
$syscallGetVarargI__internal: true,
100+
$syscallGetVarargI: function() {
99101
#if ASSERTIONS
100-
assert(SYSCALLS.varargs != undefined);
102+
assert(SYSCALLS.varargs != undefined);
101103
#endif
102-
var ret = {{{ makeGetValue('SYSCALLS.varargs', 0, '*') }}};
103-
SYSCALLS.varargs += {{{ POINTER_SIZE }}};
104+
// the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number.
105+
var ret = {{{ makeGetValue('+SYSCALLS.varargs', 0, 'i32') }}};
106+
SYSCALLS.varargs += 4;
104107
#if SYSCALL_DEBUG
105-
dbg(` (raw: "${ret}")`);
106-
#endif
107-
return ret;
108-
},
109-
#else
110-
getp() { return SYSCALLS.get() },
108+
dbg(` (raw: "${ret}")`);
111109
#endif
110+
return ret;
111+
},
112112

113-
getStr(ptr) {
114-
var ret = UTF8ToString(ptr);
115-
#if SYSCALL_DEBUG
116-
dbg(` (str: "${ret}")`);
113+
$syscallGetVarargP__internal: true,
114+
#if MEMORY64
115+
$syscallGetVarargP: function() {
116+
#if ASSERTIONS
117+
assert(SYSCALLS.varargs != undefined);
117118
#endif
118-
return ret;
119-
},
120-
#if SYSCALLS_REQUIRE_FILESYSTEM
121-
// Just like `FS.getStream` but will throw EBADF if stream is undefined.
122-
getStreamFromFD(fd) {
123-
var stream = FS.getStreamChecked(fd);
119+
var ret = {{{ makeGetValue('SYSCALLS.varargs', 0, '*') }}};
120+
SYSCALLS.varargs += {{{ POINTER_SIZE }}};
124121
#if SYSCALL_DEBUG
125-
dbg(` (stream: "${stream.path}")`);
122+
dbg(` (raw: "${ret}")`);
126123
#endif
127-
return stream;
128-
},
129-
#endif // SYSCALLS_REQUIRE_FILESYSTEM
124+
return ret;
130125
},
126+
#else
127+
$syscallGetVarargP: '$syscallGetVarargI',
128+
#endif
131129
132130
_mmap_js__i53abi: true,
133131
_mmap_js__deps: ['$SYSCALLS',
@@ -198,6 +196,10 @@ var SyscallsLibrary = {
198196
199197
return 0;
200198
},
199+
200+
#if SYSCALLS_REQUIRE_FILESYSTEM
201+
__syscall_ioctl__deps: ['$syscallGetVarargP'],
202+
#endif
201203
__syscall_ioctl: (fd, op, varargs) => {
202204
#if SYSCALLS_REQUIRE_FILESYSTEM == 0
203205
#if SYSCALL_DEBUG
@@ -218,7 +220,7 @@ var SyscallsLibrary = {
218220
if (!stream.tty) return -{{{ cDefs.ENOTTY }}};
219221
if (stream.tty.ops.ioctl_tcgets) {
220222
var termios = stream.tty.ops.ioctl_tcgets(stream);
221-
var argp = SYSCALLS.getp();
223+
var argp = syscallGetVarargP();
222224
{{{ makeSetValue('argp', C_STRUCTS.termios.c_iflag, 'termios.c_iflag || 0', 'i32') }}};
223225
{{{ makeSetValue('argp', C_STRUCTS.termios.c_oflag, 'termios.c_oflag || 0', 'i32') }}};
224226
{{{ makeSetValue('argp', C_STRUCTS.termios.c_cflag, 'termios.c_cflag || 0', 'i32') }}};
@@ -244,7 +246,7 @@ var SyscallsLibrary = {
244246
case {{{ cDefs.TCSETSF }}}: {
245247
if (!stream.tty) return -{{{ cDefs.ENOTTY }}};
246248
if (stream.tty.ops.ioctl_tcsets) {
247-
var argp = SYSCALLS.getp();
249+
var argp = syscallGetVarargP();
248250
var c_iflag = {{{ makeGetValue('argp', C_STRUCTS.termios.c_iflag, 'i32') }}};
249251
var c_oflag = {{{ makeGetValue('argp', C_STRUCTS.termios.c_oflag, 'i32') }}};
250252
var c_cflag = {{{ makeGetValue('argp', C_STRUCTS.termios.c_cflag, 'i32') }}};
@@ -259,7 +261,7 @@ var SyscallsLibrary = {
259261
}
260262
case {{{ cDefs.TIOCGPGRP }}}: {
261263
if (!stream.tty) return -{{{ cDefs.ENOTTY }}};
262-
var argp = SYSCALLS.getp();
264+
var argp = syscallGetVarargP();
263265
{{{ makeSetValue('argp', 0, 0, 'i32') }}};
264266
return 0;
265267
}
@@ -268,7 +270,7 @@ var SyscallsLibrary = {
268270
return -{{{ cDefs.EINVAL }}}; // not supported
269271
}
270272
case {{{ cDefs.FIONREAD }}}: {
271-
var argp = SYSCALLS.getp();
273+
var argp = syscallGetVarargP();
272274
return FS.ioctl(stream, op, argp);
273275
}
274276
case {{{ cDefs.TIOCGWINSZ }}}: {
@@ -277,7 +279,7 @@ var SyscallsLibrary = {
277279
if (!stream.tty) return -{{{ cDefs.ENOTTY }}};
278280
if (stream.tty.ops.ioctl_tiocgwinsz) {
279281
var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty);
280-
var argp = SYSCALLS.getp();
282+
var argp = syscallGetVarargP();
281283
{{{ makeSetValue('argp', 0, 'winsize[0]', 'i16') }}};
282284
{{{ makeSetValue('argp', 2, 'winsize[1]', 'i16') }}};
283285
}
@@ -742,6 +744,9 @@ var SyscallsLibrary = {
742744
FS.llseek(stream, idx * struct_size, {{{ cDefs.SEEK_SET }}});
743745
return pos;
744746
},
747+
#if SYSCALLS_REQUIRE_FILESYSTEM
748+
__syscall_fcntl64__deps: ['$syscallGetVarargP', '$syscallGetVarargI'],
749+
#endif
745750
__syscall_fcntl64: (fd, cmd, varargs) => {
746751
#if SYSCALLS_REQUIRE_FILESYSTEM == 0
747752
#if SYSCALL_DEBUG
@@ -752,7 +757,7 @@ var SyscallsLibrary = {
752757
var stream = SYSCALLS.getStreamFromFD(fd);
753758
switch (cmd) {
754759
case {{{ cDefs.F_DUPFD }}}: {
755-
var arg = SYSCALLS.get();
760+
var arg = syscallGetVarargI();
756761
if (arg < 0) {
757762
return -{{{ cDefs.EINVAL }}};
758763
}
@@ -769,12 +774,12 @@ var SyscallsLibrary = {
769774
case {{{ cDefs.F_GETFL }}}:
770775
return stream.flags;
771776
case {{{ cDefs.F_SETFL }}}: {
772-
var arg = SYSCALLS.get();
777+
var arg = syscallGetVarargI();
773778
stream.flags |= arg;
774779
return 0;
775780
}
776781
case {{{ cDefs.F_GETLK }}}: {
777-
var arg = SYSCALLS.getp();
782+
var arg = syscallGetVarargP();
778783
var offset = {{{ C_STRUCTS.flock.l_type }}};
779784
// We're always unlocked.
780785
{{{ makeSetValue('arg', 'offset', cDefs.F_UNLCK, 'i16') }}};
@@ -825,10 +830,11 @@ var SyscallsLibrary = {
825830
__syscall_fadvise64: (fd, offset, len, advice) => {
826831
return 0; // your advice is important to us (but we can't use it)
827832
},
833+
__syscall_openat__deps: ['$syscallGetVarargI'],
828834
__syscall_openat: (dirfd, path, flags, varargs) => {
829835
path = SYSCALLS.getStr(path);
830836
path = SYSCALLS.calculateAt(dirfd, path);
831-
var mode = varargs ? SYSCALLS.get() : 0;
837+
var mode = varargs ? syscallGetVarargI() : 0;
832838
return FS.open(path, flags, mode).fd;
833839
},
834840
__syscall_mkdirat: (dirfd, path, mode) => {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
55910
1+
55598
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
31746
1+
31481
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
54797
1+
54485

0 commit comments

Comments
 (0)