Node ids are small non-negative integers (-1 for synthetic instructions), so a LEB128 stores them in 1-2 bytes instead of a 4-byte int. On Shopify's monolith, this reduces the boot heap memsize by 40MB.peterzhu2118 (Peter Zhu)
Applied in changeset commit:git|0b7838e23b8f9b01765dafd5e675da6113f5b566. ---------- Fix IO reading without GVL during GC compaction [Bug #22467] If we perform IO read without the GVL during GC compaction and the string we are writing...peterzhu2118 (Peter Zhu)
[Bug #22467] If we perform IO read without the GVL during GC compaction and the string we are writing to is embedded, then it can get mprotect'd by the read barrier in the GC, which can cause the IO read operation to fail.peterzhu2118 (Peter Zhu)
The node id lived in each iseq_insn_info_entry, which prevented add_insn_info from merging adjacent entries that only differ in node_id. Since most neighboring instructions come from different AST nodes, this significantly increases memo...peterzhu2118 (Peter Zhu)
Compared to the default of 225, this gives noticeable performance improvements. For the following benchmark: objs = [] 2_000_000.times { objs << Object.new } We can see this branch is about 10% faster: Benchmark 1: branch...peterzhu2118 (Peter Zhu)
Applied in changeset commit:git|054385feb134d19b2130238a76004c204f96293b. ---------- Fix ifunc block handler leak from method_missing [Bug #22436] The check_funcall_exec function incorrectly restored the pending block handler which ca...peterzhu2118 (Peter Zhu)
[Bug #22436] The check_funcall_exec function incorrectly restored the pending block handler which causes it to leak. For example, the following code crashes: o = Object.new def o.method_missing(*) = nil # Array#zip calls o.e...peterzhu2118 (Peter Zhu)