emscripten-core / emscripten-core/emscripten
Allocate arguments (argv) on stack in a single contiguous chunk
- Dominant language
- C++
- Stars
- 27.6k
- Forks
- 3.6k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 105
Description
It seems that some programs, e.g. OpenBSD's [diff](https://github.com/openbsd/src/blob/master/usr.bin/diff/diff.c#L276) assume that subsequent arguments have larger memory addresses. But stack is supposed to grow downward, right?
I am proposing to compute the total argv UTF8 size, and then encode it as one chunk + insert null-bytes at correct locations. How does one do that?
Indeed, replacing:
```js
Module.HEAP32[argv >> 2] = Module.allocateUTF8OnStack(Module.thisProgram);
for (let i = 1; i < argc; i++)
Module.HEAP32[(argv >> 2) + i] = Module.allocateUTF8OnStack(args[i - 1]);
Module.HEAP32[(argv >> 2) + argc] = 0;
```
by
```js
args = [Module.thisProgram].concat(args);
const lens = args.map(a => Module.lengthBytesUTF8(a));
Module.HEAP32[argv >> 2] = Module.allocateUTF8OnStack(args.join('\0'));
for(let i = 1; i < argc; i++)
Module.HEAP32[(argv >> 2) + i] = Module.HEAP32[(argv >> 2) + i - 1] + lens[i - 1] + 1;
Module.HEAP32[(argv >> 2) + argc] = 0;
```
solves the problem
Contributor guide
Assessment
This issue has not been assessed yet.