Skip to content

Commit b5fc9b2

Browse files
committed
reduce initial WASM memory and auto-grow it
Fixes #117
1 parent 13cd3d3 commit b5fc9b2

File tree

2 files changed

+25
-28
lines changed

2 files changed

+25
-28
lines changed

build.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ em++ \
1919
-s EXPORT_NAME=createHarfBuzz \
2020
-s EXPORTED_FUNCTIONS=@hb.symbols \
2121
-s EXPORTED_RUNTIME_METHODS='["addFunction", "removeFunction", "wasmMemory", "wasmExports"]' \
22-
-s INITIAL_MEMORY=65MB \
22+
-s INITIAL_MEMORY=256KB \
23+
-s ALLOW_MEMORY_GROWTH \
2324
-s ALLOW_TABLE_GROWTH \
2425
-lexports.js \
2526
-o hb.js \

hbjs.js

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@ function hbjs(Module) {
22
'use strict';
33

44
var exports = Module.wasmExports;
5-
var heapu8 = Module.HEAPU8;
6-
var heapu32 = Module.HEAPU32;
7-
var heapi32 = Module.HEAP32;
8-
var heapf32 = Module.HEAPF32;
95
var utf8Decoder = new TextDecoder("utf8");
106
let addFunction = Module.addFunction;
117
let removeFunction = Module.removeFunction;
@@ -56,7 +52,7 @@ function hbjs(Module) {
5652
**/
5753
function createBlob(blob) {
5854
var blobPtr = exports.malloc(blob.byteLength);
59-
heapu8.set(new Uint8Array(blob), blobPtr);
55+
Module.HEAPU8.set(new Uint8Array(blob), blobPtr);
6056
var ptr = exports.hb_blob_create(blobPtr, blob.byteLength, HB_MEMORY_MODE_WRITABLE, blobPtr, freeFuncPtr);
6157
return {
6258
ptr: ptr,
@@ -76,8 +72,8 @@ function hbjs(Module) {
7672
const setCount = exports.hb_set_get_population(setPtr);
7773
const arrayPtr = exports.malloc(setCount << 2);
7874
const arrayOffset = arrayPtr >> 2;
79-
const array = heapu32.subarray(arrayOffset, arrayOffset + setCount);
80-
heapu32.set(array, arrayOffset);
75+
const array = Module.HEAPU32.subarray(arrayOffset, arrayOffset + setCount);
76+
Module.HEAPU32.set(array, arrayOffset);
8177
exports.hb_set_next_many(setPtr, HB_SET_VALUE_INVALID, arrayPtr, setCount);
8278
return array;
8379
}
@@ -103,7 +99,7 @@ function hbjs(Module) {
10399
var length = exports.hb_blob_get_length(blob);
104100
if (!length) { return; }
105101
var blobptr = exports.hb_blob_get_data(blob, null);
106-
var table_string = heapu8.subarray(blobptr, blobptr+length);
102+
var table_string = Module.HEAPU8.subarray(blobptr, blobptr+length);
107103
return table_string;
108104
},
109105
/**
@@ -112,14 +108,14 @@ function hbjs(Module) {
112108
getAxisInfos: function() {
113109
var axis = exports.malloc(64 * 32);
114110
var c = exports.malloc(4);
115-
heapu32[c / 4] = 64;
111+
Module.HEAPU32[c / 4] = 64;
116112
exports.hb_ot_var_get_axis_infos(ptr, 0, c, axis);
117113
var result = {};
118-
Array.from({ length: heapu32[c / 4] }).forEach(function (_, i) {
119-
result[_hb_untag(heapu32[axis / 4 + i * 8 + 1])] = {
120-
min: heapf32[axis / 4 + i * 8 + 4],
121-
default: heapf32[axis / 4 + i * 8 + 5],
122-
max: heapf32[axis / 4 + i * 8 + 6]
114+
Array.from({ length: Module.HEAPU32[c / 4] }).forEach(function (_, i) {
115+
result[_hb_untag(Module.HEAPU32[axis / 4 + i * 8 + 1])] = {
116+
min: Module.HEAPF32[axis / 4 + i * 8 + 4],
117+
default: Module.HEAPF32[axis / 4 + i * 8 + 5],
118+
max: Module.HEAPF32[axis / 4 + i * 8 + 6]
123119
};
124120
});
125121
exports.free(c);
@@ -214,7 +210,7 @@ function hbjs(Module) {
214210
nameBuffer,
215211
nameBufferSize
216212
);
217-
var array = heapu8.subarray(nameBuffer, nameBuffer + nameBufferSize);
213+
var array = Module.HEAPU8.subarray(nameBuffer, nameBuffer + nameBufferSize);
218214
return utf8Decoder.decode(array.slice(0, array.indexOf(0)));
219215
}
220216

@@ -251,8 +247,8 @@ function hbjs(Module) {
251247
var entries = Object.entries(variations);
252248
var vars = exports.malloc(8 * entries.length);
253249
entries.forEach(function (entry, i) {
254-
heapu32[vars / 4 + i * 2 + 0] = hb_tag(entry[0]);
255-
heapf32[vars / 4 + i * 2 + 1] = entry[1];
250+
Module.HEAPU32[vars / 4 + i * 2 + 0] = hb_tag(entry[0]);
251+
Module.HEAPF32[vars / 4 + i * 2 + 1] = entry[1];
256252
});
257253
exports.hb_font_set_variations(ptr, vars, entries.length);
258254
exports.free(vars);
@@ -284,9 +280,9 @@ function hbjs(Module) {
284280
for (let i = 0; i < text.length; ++i) {
285281
const char = text.charCodeAt(i);
286282
if (char > 127) throw new Error('Expected ASCII text');
287-
heapu8[ptr + i] = char;
283+
Module.HEAPU8[ptr + i] = char;
288284
}
289-
heapu8[ptr + text.length] = 0;
285+
Module.HEAPU8[ptr + text.length] = 0;
290286
return {
291287
ptr: ptr,
292288
length: text.length,
@@ -408,8 +404,8 @@ function hbjs(Module) {
408404
var infosPtr = exports.hb_buffer_get_glyph_infos(ptr, 0);
409405
var infosPtr32 = infosPtr / 4;
410406
var positionsPtr32 = exports.hb_buffer_get_glyph_positions(ptr, 0) / 4;
411-
var infos = heapu32.subarray(infosPtr32, infosPtr32 + 5 * length);
412-
var positions = heapi32.subarray(positionsPtr32, positionsPtr32 + 5 * length);
407+
var infos = Module.HEAPU32.subarray(infosPtr32, infosPtr32 + 5 * length);
408+
var positions = Module.HEAP32.subarray(positionsPtr32, positionsPtr32 + 5 * length);
413409
for (var i = 0; i < length; ++i) {
414410
result.push({
415411
g: infos[i * 5 + 0],
@@ -486,7 +482,7 @@ function hbjs(Module) {
486482
var traceBufPtr = exports.malloc(traceBufLen);
487483

488484
var traceFunc = function (bufferPtr, fontPtr, messagePtr, user_data) {
489-
var message = utf8Decoder.decode(heapu8.subarray(messagePtr, heapu8.indexOf(0, messagePtr)));
485+
var message = utf8Decoder.decode(Module.HEAPU8.subarray(messagePtr, Module.HEAPU8.indexOf(0, messagePtr)));
490486
if (message.startsWith("start table GSUB"))
491487
currentPhase = GSUB_PHASE;
492488
else if (message.startsWith("start table GPOS"))
@@ -514,7 +510,7 @@ function hbjs(Module) {
514510

515511
trace.push({
516512
m: message,
517-
t: JSON.parse(utf8Decoder.decode(heapu8.subarray(traceBufPtr, heapu8.indexOf(0, traceBufPtr)))),
513+
t: JSON.parse(utf8Decoder.decode(Module.HEAPU8.subarray(traceBufPtr, Module.HEAPU8.indexOf(0, traceBufPtr)))),
518514
glyphs: exports.hb_buffer_get_content_type(bufferPtr) == HB_BUFFER_CONTENT_TYPE_GLYPHS,
519515
});
520516

@@ -534,17 +530,17 @@ function hbjs(Module) {
534530
var versionPtr = exports.malloc(12);
535531
exports.hb_version(versionPtr, versionPtr + 4, versionPtr + 8);
536532
var version = {
537-
major: heapu32[versionPtr / 4],
538-
minor: heapu32[(versionPtr + 4) / 4],
539-
micro: heapu32[(versionPtr + 8) / 4],
533+
major: Module.HEAPU32[versionPtr / 4],
534+
minor: Module.HEAPU32[(versionPtr + 4) / 4],
535+
micro: Module.HEAPU32[(versionPtr + 8) / 4],
540536
};
541537
exports.free(versionPtr);
542538
return version;
543539
}
544540

545541
function version_string() {
546542
var versionPtr = exports.hb_version_string();
547-
var version = utf8Decoder.decode(heapu8.subarray(versionPtr, heapu8.indexOf(0, versionPtr)));
543+
var version = utf8Decoder.decode(Module.HEAPU8.subarray(versionPtr, Module.HEAPU8.indexOf(0, versionPtr)));
548544
return version;
549545
}
550546

0 commit comments

Comments
 (0)