Skip to content

Commit ddc9eae

Browse files
committed
Fix some memory leaks
Call removeFunction() for functions added by addFunction(), as well as calling hb_draw_funcs_destroy() when destroying the font.
1 parent f9d58ca commit ddc9eae

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed

build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ em++ \
1818
-s MODULARIZE \
1919
-s EXPORT_NAME=createHarfBuzz \
2020
21-
-s EXPORTED_RUNTIME_METHODS='["addFunction", "wasmMemory", "wasmExports"]' \
21+
-s EXPORTED_RUNTIME_METHODS='["addFunction", "removeFunction", "wasmMemory", "wasmExports"]' \
2222
-s INITIAL_MEMORY=65MB \
2323
-s ALLOW_TABLE_GROWTH \
2424
-lexports.js \

hb.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ _hb_font_set_scale
3030
_hb_font_set_variations
3131
_hb_font_draw_glyph
3232
_hb_draw_funcs_create
33+
_hb_draw_funcs_destroy
3334
_hb_draw_funcs_set_move_to_func
3435
_hb_draw_funcs_set_line_to_func
3536
_hb_draw_funcs_set_quadratic_to_func

hbjs.js

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ function hbjs(Module) {
88
var heapf32 = Module.HEAPF32;
99
var utf8Decoder = new TextDecoder("utf8");
1010
let addFunction = Module.addFunction;
11+
let removeFunction = Module.removeFunction;
1112

1213
var freeFuncPtr = addFunction(function (ptr) { exports.free(ptr); }, 'vi');
1314

@@ -177,6 +178,11 @@ function hbjs(Module) {
177178
function createFont(face) {
178179
var ptr = exports.hb_font_create(face.ptr);
179180
var drawFuncsPtr = null;
181+
var moveToPtr = null;
182+
var lineToPtr = null;
183+
var cubicToPtr = null;
184+
var quadToPtr = null;
185+
var closePathPtr = null;
180186

181187
/**
182188
* Return a glyph as an SVG path string.
@@ -200,11 +206,11 @@ function hbjs(Module) {
200206
pathBuffer += 'Z';
201207
}
202208

203-
var moveToPtr = addFunction(moveTo, 'viiiffi');
204-
var lineToPtr = addFunction(lineTo, 'viiiffi');
205-
var cubicToPtr = addFunction(cubicTo, 'viiiffffffi');
206-
var quadToPtr = addFunction(quadTo, 'viiiffffi');
207-
var closePathPtr = addFunction(closePath, 'viiii');
209+
moveToPtr = addFunction(moveTo, 'viiiffi');
210+
lineToPtr = addFunction(lineTo, 'viiiffi');
211+
cubicToPtr = addFunction(cubicTo, 'viiiffffffi');
212+
quadToPtr = addFunction(quadTo, 'viiiffffi');
213+
closePathPtr = addFunction(closePath, 'viiii');
208214
drawFuncsPtr = exports.hb_draw_funcs_create();
209215
exports.hb_draw_funcs_set_move_to_func(drawFuncsPtr, moveToPtr, 0, 0);
210216
exports.hb_draw_funcs_set_line_to_func(drawFuncsPtr, lineToPtr, 0, 0);
@@ -275,7 +281,18 @@ function hbjs(Module) {
275281
/**
276282
* Free the object.
277283
*/
278-
destroy: function () { exports.hb_font_destroy(ptr); }
284+
destroy: function () {
285+
exports.hb_font_destroy(ptr);
286+
if (drawFuncsPtr) {
287+
exports.hb_draw_funcs_destroy(drawFuncsPtr);
288+
drawFuncsPtr = null;
289+
removeFunction(moveToPtr);
290+
removeFunction(lineToPtr);
291+
removeFunction(cubicToPtr);
292+
removeFunction(quadToPtr);
293+
removeFunction(closePathPtr);
294+
}
295+
}
279296
};
280297
}
281298

@@ -529,6 +546,7 @@ function hbjs(Module) {
529546
exports.hb_buffer_set_message_func(buffer.ptr, traceFuncPtr, 0, 0);
530547
shape(font, buffer, features, 0);
531548
exports.free(traceBufPtr);
549+
removeFunction(traceFuncPtr);
532550

533551
return trace;
534552
}

0 commit comments

Comments
 (0)