mirror of https://github.com/svaarala/duktape.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.1 KiB
53 lines
1.1 KiB
/*
|
|
* Test that finalizers are executed correctly if they are skipped by
|
|
* one GC round.
|
|
*/
|
|
|
|
/*---
|
|
{
|
|
"custom": true
|
|
}
|
|
---*/
|
|
|
|
/*===
|
|
gc before creating garbage
|
|
gc without finalizers
|
|
gc with finalizers
|
|
finalizer for temp called
|
|
done
|
|
===*/
|
|
|
|
function createGarbage() {
|
|
var temp = function tempFunc() {};
|
|
Duktape.fin(temp, function (v) {
|
|
print('finalizer for temp called');
|
|
});
|
|
|
|
// Once we return, 'temp' exists only in a reference loop by itself
|
|
// and won't be collected by refcounting.
|
|
}
|
|
|
|
try {
|
|
// Forced GC to ensure GC is "in sync"
|
|
print('gc before creating garbage');
|
|
Duktape.gc(4);
|
|
|
|
createGarbage();
|
|
|
|
// Mark-and-sweep without finalizers. (1 << 2) = 4 is a flag from
|
|
// duk_heap.h (this is a fragile dependency):
|
|
//
|
|
// #define DUK_MS_FLAG_NO_FINALIZERS (1 << 2) /* don't run finalizers (which may have arbitrary side effects) */
|
|
|
|
print('gc without finalizers');
|
|
Duktape.gc(4);
|
|
|
|
// Mark-and-sweep with finalizers, should run the pending finalizers.
|
|
|
|
print('gc with finalizers');
|
|
Duktape.gc();
|
|
} catch (e) {
|
|
print(e.stack || e);
|
|
}
|
|
|
|
print('done');
|
|
|