Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions javascript/packages/core/lib/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -306,9 +306,12 @@ export class MetaStringWriter {
}

reset() {
// Entries push themselves back on the next root's first write, so the
// list must be truncated or it grows by every past root serialization.
this.disposeMetaStringBytes.forEach((item) => {
item.dynamicWriteStringId = -1;
});
this.disposeMetaStringBytes.length = 0;
this.dynamicNameId = 0;
}
}
Expand Down
17 changes: 17 additions & 0 deletions javascript/test/fory.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,21 @@ describe("fory", () => {
const result = serialize.deserialize(serialize.serialize(input));
expect(result).toEqual(expected ?? input);
}

test("should meta string state not grow across root serializations", () => {
// Meta string owners re-push themselves on every root serialize; if
// reset() does not truncate the dispose list, it grows without bound and
// every reset walks the whole history.
const fory = new Fory({ compatible: false });
const { serialize } = fory.register(
Type.struct({ namespace: "example", typeName: "Item" }, { a: Type.int32() }),
);
serialize({ a: 1 });
const metaStringWriter = (fory as any).writeContext.metaStringWriter;
const baseline = metaStringWriter.disposeMetaStringBytes.length;
for (let i = 0; i < 100; i++) {
serialize({ a: i });
}
expect(metaStringWriter.disposeMetaStringBytes.length).toBe(baseline);
});
});
Loading