refactor memory allocation in places that might happen before malloc is ready
This commit is contained in:
Родитель
efe2a0bf1e
Коммит
da616fdacf
|
@ -271,7 +271,7 @@ function JSify(data, functionsOnly) {
|
||||||
print('STATIC_BASE = ' + Runtime.GLOBAL_BASE + ';\n');
|
print('STATIC_BASE = ' + Runtime.GLOBAL_BASE + ';\n');
|
||||||
print('STATICTOP = STATIC_BASE + ' + Runtime.alignMemory(Variables.nextIndexedOffset) + ';\n');
|
print('STATICTOP = STATIC_BASE + ' + Runtime.alignMemory(Variables.nextIndexedOffset) + ';\n');
|
||||||
} else {
|
} else {
|
||||||
print('gb = parentModule["_malloc"]({{{ STATIC_BUMP }}});\n');
|
print('gb = getMemory({{{ STATIC_BUMP }}});\n');
|
||||||
print('// STATICTOP = STATIC_BASE + ' + Runtime.alignMemory(Variables.nextIndexedOffset) + ';\n'); // comment as metadata only
|
print('// STATICTOP = STATIC_BASE + ' + Runtime.alignMemory(Variables.nextIndexedOffset) + ';\n'); // comment as metadata only
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -433,6 +433,13 @@ function allocate(slab, types, allocator, ptr) {
|
||||||
}
|
}
|
||||||
Module['allocate'] = allocate;
|
Module['allocate'] = allocate;
|
||||||
|
|
||||||
|
// Allocate memory during any stage of startup - static memory early on, dynamic memory later, malloc when ready
|
||||||
|
function getMemory(size) {
|
||||||
|
if (!staticSealed) return Runtime.staticAlloc(size);
|
||||||
|
if (typeof _sbrk !== 'undefined' && !_sbrk.called) return Runtime.dynamicAlloc(size);
|
||||||
|
return _malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
function Pointer_stringify(ptr, /* optional */ length) {
|
function Pointer_stringify(ptr, /* optional */ length) {
|
||||||
if (length === 0 || !ptr) return '';
|
if (length === 0 || !ptr) return '';
|
||||||
// TODO: use TextDecoder
|
// TODO: use TextDecoder
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
var gb = 0;
|
var gb = 0;
|
||||||
// Each module has its own stack
|
// Each module has its own stack
|
||||||
var STACKTOP = parentModule['_malloc'](TOTAL_STACK);
|
var STACKTOP = getMemory(TOTAL_STACK);
|
||||||
assert(STACKTOP % 8 == 0);
|
assert(STACKTOP % 8 == 0);
|
||||||
var STACK_MAX = STACKTOP + TOTAL_STACK;
|
var STACK_MAX = STACKTOP + TOTAL_STACK;
|
||||||
Module.cleanups.push(function() {
|
Module.cleanups.push(function() {
|
||||||
|
|
|
@ -1025,13 +1025,13 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
# set up emterpreter stack top (note we must use malloc if in a shared lib, or other enviroment where static memory is sealed)
|
# set up emterpreter stack top (note we must use malloc if in a shared lib, or other enviroment where static memory is sealed)
|
||||||
js = ['''
|
js = ['''
|
||||||
var EMTSTACKTOP = (staticSealed ? _malloc : Runtime.staticAlloc)(%s);
|
var EMTSTACKTOP = getMemory(%s);
|
||||||
var EMT_STACK_MAX = EMTSTACKTOP + %d;
|
var EMT_STACK_MAX = EMTSTACKTOP + %d;
|
||||||
''' % (EMT_STACK_MAX, EMT_STACK_MAX)]
|
''' % (EMT_STACK_MAX, EMT_STACK_MAX)]
|
||||||
|
|
||||||
# write out our bytecode, and runtime relocation logic
|
# write out our bytecode, and runtime relocation logic
|
||||||
js += ['''
|
js += ['''
|
||||||
var eb = (staticSealed ? _malloc : Runtime.staticAlloc)(%s);
|
var eb = getMemory(%s);
|
||||||
assert(eb %% 8 === 0);
|
assert(eb %% 8 === 0);
|
||||||
__ATPRERUN__.push(function() {
|
__ATPRERUN__.push(function() {
|
||||||
''' % len(all_code)]
|
''' % len(all_code)]
|
||||||
|
|
Загрузка…
Ссылка в новой задаче