From 3fb0e88f044b5ef653bc042dc172f8b9a40e04c2 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Sun, 4 Oct 2026 19:05:47 +0200 Subject: [PATCH] fix(prelude): Pathname#/ is an alias of #+, not a forwarding def CRuby's pathname.rb writes `alias / +`. rbgo's prelude wrote def /(other) self + other end because the parser refused the alias: after `alias`, a `/` opened a regexp instead of naming the division method. That is fixed in go-ruby-parser v0.11.1 (go-ruby-parser/parser#47), which this bumps to. The workaround was not only a reflection difference. Three things diverged, measured against ruby 4.0.5: Pathname.instance_method(:/).original_name ruby :+ before :/ instance_method(:/) == instance_method(:+) ruby true before false with #+ redefined, `Pathname.new("/a") / "b"` ruby # before "HIJACKED" The third is BEHAVIOUR: an alias keeps the body it was made from, while a forwarding def follows whatever #+ later becomes. All three now match. Measured: library/pathname/divide_spec.rb goes 0 -> 1, which is MRI's own ceiling for it, and the spec is one example whose title is "is an alias of Pathname#+" -- the corpus naming exactly this. The pathname library specs go 38 -> 39 overall with no file down. That suite is under library/, which the ratchet does not sweep (only language/ and core/), so the gain is real but ungated; nothing in language/ or core/ moves. The prelude was the only site with this shape: a scan for an operator-named def whose body just forwards to another operator found one, this one. Closes nothing; enabled by go-ruby-parser/parser#47, which was itself found by a README-claims test sweeping CI's Ruby 3.2 stdlib. Co-Authored-By: Claude Opus 5 --- go.mod | 2 +- go.sum | 2 + internal/vm/prelude.rb | 16 +- internal/vm/prelude_frozen_gen.go | 437 +++++++++++----------- internal/vm/wave61_pathname_alias_test.go | 63 ++++ 5 files changed, 290 insertions(+), 230 deletions(-) create mode 100644 internal/vm/wave61_pathname_alias_test.go diff --git a/go.mod b/go.mod index 1be0b6ef..0db7a983 100644 --- a/go.mod +++ b/go.mod @@ -129,7 +129,7 @@ require ( github.com/go-ruby-pagy/pagy v0.0.0-20260717071719-997d15eee011 github.com/go-ruby-paper-trail/paper-trail v0.0.0-20260717071745-42a249656e5a github.com/go-ruby-parquet/parquet v0.0.0-20260923211642-bc75bcb9031e - github.com/go-ruby-parser/parser v0.11.0 + github.com/go-ruby-parser/parser v0.11.1 github.com/go-ruby-pathname/pathname v0.0.0-20260916100446-0824484b665f github.com/go-ruby-pg/pg v0.0.0-20260916100523-3831ec811a67 github.com/go-ruby-prawn/prawn v0.0.0-20260927145511-370d5985305c diff --git a/go.sum b/go.sum index 31ec6d11..a17cd47b 100644 --- a/go.sum +++ b/go.sum @@ -537,6 +537,8 @@ github.com/go-ruby-parser/parser v0.10.0 h1:uYxEAIL6V5K0bA5BrCzLgE2BFU8u4EkAEx22 github.com/go-ruby-parser/parser v0.10.0/go.mod h1:NRbX4dYcQ6CgcaSaMmu1dh95QuKGq+RdenUoWU73214= github.com/go-ruby-parser/parser v0.11.0 h1:LKLRluN9Da9AkeBZ9Ta4+R9x33rVGUR7YhuVKZA2XHk= github.com/go-ruby-parser/parser v0.11.0/go.mod h1:NRbX4dYcQ6CgcaSaMmu1dh95QuKGq+RdenUoWU73214= +github.com/go-ruby-parser/parser v0.11.1 h1:8gov5+nyKxY9NUTJI5sVvammrNOdJ32aylrASdjP2js= +github.com/go-ruby-parser/parser v0.11.1/go.mod h1:NRbX4dYcQ6CgcaSaMmu1dh95QuKGq+RdenUoWU73214= github.com/go-ruby-pathname/pathname v0.0.0-20260916100446-0824484b665f h1:9pt89wlAp12vbCNGFYmbSqp/PJTHRwUx1yNDXW5hWRI= github.com/go-ruby-pathname/pathname v0.0.0-20260916100446-0824484b665f/go.mod h1:IvW5q5Kyl5l3hrYwiHylOEmk5hpGSo7XqcmUXBHF5H0= github.com/go-ruby-pg/pg v0.0.0-20260916100523-3831ec811a67 h1:X9MKhEAV60oYoL94tqb11lfLw3yW097mVqfjDdy5PK0= diff --git a/internal/vm/prelude.rb b/internal/vm/prelude.rb index af0c4bbc..649c62bb 100644 --- a/internal/vm/prelude.rb +++ b/internal/vm/prelude.rb @@ -1987,9 +1987,19 @@ def +(other) Pathname.new(Pathname.__lex_plus(@path, other.to_s)) end - def /(other) - self + other - end + # `alias / +`, not a forwarding def. The difference is observable three ways: + # #original_name answers :+, instance_method(:/) == instance_method(:+), and a + # redefinition of #+ does NOT follow -- the alias keeps the body it was made + # from, as ruby does: + # + # class Pathname; def +(o); "HIJACKED"; end; end + # Pathname.new("/a") / "b" ruby # forwarding def "HIJACKED" + # + # It was a forwarding def because the parser refused `alias / +`: after + # `alias`, a `/` opened a regexp. Fixed in go-ruby-parser v0.11.1, which this + # bumps to, and which CRuby's own pathname.rb line 358 needs for the same + # reason. + alias / + def join(*args) result = self diff --git a/internal/vm/prelude_frozen_gen.go b/internal/vm/prelude_frozen_gen.go index 2d30c5b1..152fdb3e 100644 --- a/internal/vm/prelude_frozen_gen.go +++ b/internal/vm/prelude_frozen_gen.go @@ -19,7 +19,7 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 10}, {PC: 2, Line: 116}, {PC: 4, Line: 998}, {PC: 6, Line: 1013}, {PC: 8, Line: 1024}, {PC: 10, Line: 1037}, {PC: 12, Line: 1041}, {PC: 14, Line: 1050}, {PC: 16, Line: 1059}, {PC: 18, Line: 1092}, {PC: 20, Line: 1107}, {PC: 22, Line: 1479}, {PC: 24, Line: 1699}, {PC: 26, Line: 1778}, {PC: 28, Line: 1809}, {PC: 30, Line: 1829}, {PC: 32, Line: 1869}, {PC: 34, Line: 1882}, {PC: 36, Line: 1922}, {PC: 38, Line: 2093}, {PC: 40, Line: 2129}, {PC: 42, Line: 2193}, {PC: 44, Line: 2301}, {PC: 46, Line: 2401}, {PC: 48, Line: 2457}, {PC: 50, Line: 2582}, {PC: 52, Line: 2640}}, + Lines: []bytecode.LineEntry{{PC: 0, Line: 10}, {PC: 2, Line: 116}, {PC: 4, Line: 998}, {PC: 6, Line: 1013}, {PC: 8, Line: 1024}, {PC: 10, Line: 1037}, {PC: 12, Line: 1041}, {PC: 14, Line: 1050}, {PC: 16, Line: 1059}, {PC: 18, Line: 1092}, {PC: 20, Line: 1107}, {PC: 22, Line: 1479}, {PC: 24, Line: 1699}, {PC: 26, Line: 1778}, {PC: 28, Line: 1809}, {PC: 30, Line: 1829}, {PC: 32, Line: 1869}, {PC: 34, Line: 1882}, {PC: 36, Line: 1922}, {PC: 38, Line: 2103}, {PC: 40, Line: 2139}, {PC: 42, Line: 2203}, {PC: 44, Line: 2311}, {PC: 46, Line: 2411}, {PC: 48, Line: 2467}, {PC: 50, Line: 2592}, {PC: 52, Line: 2650}}, FirstLine: 1, Children: []*bytecode.ISeq{ &bytecode.ISeq{ @@ -5982,7 +5982,7 @@ func embeddedPrelude() *bytecode.ISeq { }, &bytecode.ISeq{ Name: "", - Insns: []bytecode.Instr{{Op: 5}, {Op: 33}, {Op: 30, A: 1, B: 1, Flags: 2}, {Op: 9}, {Op: 1}, {Op: 41, A: 2}, {Op: 9}, {Op: 44, A: 3}, {Op: 9}, {Op: 44, A: 4, B: 1}, {Op: 9}, {Op: 78, A: 5, B: 4}, {Op: 9}, {Op: 44, A: 6, B: 2}, {Op: 9}, {Op: 44, A: 7, B: 3}, {Op: 9}, {Op: 44, A: 8, B: 4}, {Op: 9}, {Op: 44, A: 9, B: 5}, {Op: 9}, {Op: 78, A: 10, B: 9}, {Op: 9}, {Op: 44, A: 11, B: 6}, {Op: 9}, {Op: 44, A: 12, B: 7}, {Op: 9}, {Op: 44, A: 13, B: 8}, {Op: 9}, {Op: 44, A: 14, B: 9}, {Op: 9}, {Op: 44, A: 15, B: 10}, {Op: 9}, {Op: 44, A: 16, B: 11}, {Op: 9}, {Op: 44, A: 17, B: 12}, {Op: 9}, {Op: 44, A: 18, B: 13}, {Op: 9}, {Op: 44, A: 19, B: 14}, {Op: 9}, {Op: 44, A: 20, B: 15}, {Op: 9}, {Op: 78, A: 21, B: 20}, {Op: 9}, {Op: 44, A: 22, B: 16}, {Op: 9}, {Op: 44, A: 23, B: 17}, {Op: 9}, {Op: 44, A: 24, B: 18}, {Op: 9}, {Op: 44, A: 25, B: 19}, {Op: 9}, {Op: 44, A: 26, B: 20}, {Op: 9}, {Op: 44, A: 27, B: 21}, {Op: 9}, {Op: 44, A: 28, B: 22}, {Op: 9}, {Op: 44, A: 29, B: 23}, {Op: 9}, {Op: 44, A: 30, B: 24}, {Op: 9}, {Op: 44, A: 31, B: 25}, {Op: 9}, {Op: 44, A: 32, B: 26}, {Op: 9}, {Op: 44, A: 33, B: 27}, {Op: 9}, {Op: 44, A: 34, B: 28}, {Op: 9}, {Op: 44, A: 35, B: 29}, {Op: 9}, {Op: 44, A: 36, B: 30}, {Op: 53}}, + Insns: []bytecode.Instr{{Op: 5}, {Op: 33}, {Op: 30, A: 1, B: 1, Flags: 2}, {Op: 9}, {Op: 1}, {Op: 41, A: 2}, {Op: 9}, {Op: 44, A: 3}, {Op: 9}, {Op: 44, A: 4, B: 1}, {Op: 9}, {Op: 78, A: 5, B: 4}, {Op: 9}, {Op: 44, A: 6, B: 2}, {Op: 9}, {Op: 44, A: 7, B: 3}, {Op: 9}, {Op: 44, A: 8, B: 4}, {Op: 9}, {Op: 44, A: 9, B: 5}, {Op: 9}, {Op: 78, A: 10, B: 9}, {Op: 9}, {Op: 44, A: 11, B: 6}, {Op: 9}, {Op: 44, A: 12, B: 7}, {Op: 9}, {Op: 44, A: 13, B: 8}, {Op: 9}, {Op: 44, A: 14, B: 9}, {Op: 9}, {Op: 44, A: 15, B: 10}, {Op: 9}, {Op: 44, A: 16, B: 11}, {Op: 9}, {Op: 78, A: 17, B: 16}, {Op: 9}, {Op: 44, A: 18, B: 12}, {Op: 9}, {Op: 44, A: 19, B: 13}, {Op: 9}, {Op: 44, A: 20, B: 14}, {Op: 9}, {Op: 78, A: 21, B: 20}, {Op: 9}, {Op: 44, A: 22, B: 15}, {Op: 9}, {Op: 44, A: 23, B: 16}, {Op: 9}, {Op: 44, A: 24, B: 17}, {Op: 9}, {Op: 44, A: 25, B: 18}, {Op: 9}, {Op: 44, A: 26, B: 19}, {Op: 9}, {Op: 44, A: 27, B: 20}, {Op: 9}, {Op: 44, A: 28, B: 21}, {Op: 9}, {Op: 44, A: 29, B: 22}, {Op: 9}, {Op: 44, A: 30, B: 23}, {Op: 9}, {Op: 44, A: 31, B: 24}, {Op: 9}, {Op: 44, A: 32, B: 25}, {Op: 9}, {Op: 44, A: 33, B: 26}, {Op: 9}, {Op: 44, A: 34, B: 27}, {Op: 9}, {Op: 44, A: 35, B: 28}, {Op: 9}, {Op: 44, A: 36, B: 29}, {Op: 53}}, Consts: []object.Value{ object.FString("/", ""), }, @@ -5993,7 +5993,7 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 1923}, {PC: 4, Line: 1924}, {PC: 7, Line: 1926}, {PC: 9, Line: 1932}, {PC: 11, Line: 1935}, {PC: 13, Line: 1937}, {PC: 15, Line: 1941}, {PC: 17, Line: 1945}, {PC: 19, Line: 1950}, {PC: 21, Line: 1953}, {PC: 23, Line: 1955}, {PC: 25, Line: 1960}, {PC: 27, Line: 1970}, {PC: 29, Line: 1974}, {PC: 31, Line: 1978}, {PC: 33, Line: 1985}, {PC: 35, Line: 1990}, {PC: 37, Line: 1994}, {PC: 39, Line: 2002}, {PC: 41, Line: 2006}, {PC: 43, Line: 2009}, {PC: 45, Line: 2011}, {PC: 47, Line: 2015}, {PC: 49, Line: 2019}, {PC: 51, Line: 2026}, {PC: 53, Line: 2032}, {PC: 55, Line: 2039}, {PC: 57, Line: 2043}, {PC: 59, Line: 2051}, {PC: 61, Line: 2060}, {PC: 63, Line: 2064}, {PC: 65, Line: 2068}, {PC: 67, Line: 2072}, {PC: 69, Line: 2076}, {PC: 71, Line: 2080}, {PC: 73, Line: 2084}}, + Lines: []bytecode.LineEntry{{PC: 0, Line: 1923}, {PC: 4, Line: 1924}, {PC: 7, Line: 1926}, {PC: 9, Line: 1932}, {PC: 11, Line: 1935}, {PC: 13, Line: 1937}, {PC: 15, Line: 1941}, {PC: 17, Line: 1945}, {PC: 19, Line: 1950}, {PC: 21, Line: 1953}, {PC: 23, Line: 1955}, {PC: 25, Line: 1960}, {PC: 27, Line: 1970}, {PC: 29, Line: 1974}, {PC: 31, Line: 1978}, {PC: 33, Line: 1985}, {PC: 35, Line: 2002}, {PC: 37, Line: 2004}, {PC: 39, Line: 2012}, {PC: 41, Line: 2016}, {PC: 43, Line: 2019}, {PC: 45, Line: 2021}, {PC: 47, Line: 2025}, {PC: 49, Line: 2029}, {PC: 51, Line: 2036}, {PC: 53, Line: 2042}, {PC: 55, Line: 2049}, {PC: 57, Line: 2053}, {PC: 59, Line: 2061}, {PC: 61, Line: 2070}, {PC: 63, Line: 2074}, {PC: 65, Line: 2078}, {PC: 67, Line: 2082}, {PC: 69, Line: 2086}, {PC: 71, Line: 2090}, {PC: 73, Line: 2094}}, FirstLine: 1922, Children: []*bytecode.ISeq{ &bytecode.ISeq{ @@ -6180,21 +6180,6 @@ func embeddedPrelude() *bytecode.ISeq { FirstLine: 1985, Super: "", }, - &bytecode.ISeq{ - Name: "/", - Insns: []bytecode.Instr{{Op: 5}, {Op: 11}, {Op: 13}, {Op: 53}}, - Params: []string{"other"}, - NumRequired: 1, - SplatIndex: -1, - PostCount: 0, - KwRestSlot: -1, - BlockSlot: -1, - NumLocals: 1, - Locals: []string{"other"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 109}}, - FirstLine: 1990, - Super: "", - }, &bytecode.ISeq{ Name: "join", Insns: []bytecode.Instr{{Op: 5}, {Op: 12, A: 1}, {Op: 9}, {Op: 11}, {Op: 30, C: 1, Flags: 1}, {Op: 9}, {Op: 11, A: 1}, {Op: 53}}, @@ -6207,8 +6192,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"args", "result"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 109}, {PC: 3, Line: 1996}, {PC: 6, Line: 1997}}, - FirstLine: 1994, + Lines: []bytecode.LineEntry{{PC: 0, Line: 109}, {PC: 3, Line: 2006}, {PC: 6, Line: 2007}}, + FirstLine: 2004, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in join", @@ -6221,8 +6206,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"a"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 1996}}, - FirstLine: 1996, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2006}}, + FirstLine: 2006, Super: "", }, }, @@ -6243,8 +6228,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"suffix"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2002}, {PC: 5, Line: 2003}}, - FirstLine: 2002, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2012}, {PC: 5, Line: 2013}}, + FirstLine: 2012, Super: "", }, &bytecode.ISeq{ @@ -6257,8 +6242,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2007}}, - FirstLine: 2006, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2017}}, + FirstLine: 2016, Super: "", }, &bytecode.ISeq{ @@ -6271,8 +6256,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2012}}, - FirstLine: 2011, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2022}}, + FirstLine: 2021, Super: "", }, &bytecode.ISeq{ @@ -6285,8 +6270,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2016}}, - FirstLine: 2015, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2026}}, + FirstLine: 2025, Super: "", }, &bytecode.ISeq{ @@ -6302,8 +6287,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2020}, {PC: 10, Line: 2021}}, - FirstLine: 2019, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2030}, {PC: 10, Line: 2031}}, + FirstLine: 2029, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in each_filename", @@ -6316,8 +6301,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"f"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2021}}, - FirstLine: 2021, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2031}}, + FirstLine: 2031, Super: "", }, }, @@ -6336,8 +6321,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2027}, {PC: 10, Line: 2028}, {PC: 15, Line: 109}}, - FirstLine: 2026, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2037}, {PC: 10, Line: 2038}, {PC: 15, Line: 109}}, + FirstLine: 2036, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in ascend", @@ -6351,8 +6336,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"p"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2028}}, - FirstLine: 2028, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2038}}, + FirstLine: 2038, Super: "", }, }, @@ -6371,8 +6356,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2033}, {PC: 10, Line: 2034}, {PC: 15, Line: 109}}, - FirstLine: 2032, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2043}, {PC: 10, Line: 2044}, {PC: 15, Line: 109}}, + FirstLine: 2042, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in descend", @@ -6386,8 +6371,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"p"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2034}}, - FirstLine: 2034, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2044}}, + FirstLine: 2044, Super: "", }, }, @@ -6403,8 +6388,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2040}}, - FirstLine: 2039, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2050}}, + FirstLine: 2049, Super: "", }, &bytecode.ISeq{ @@ -6419,8 +6404,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"repl"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2044}}, - FirstLine: 2043, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2054}}, + FirstLine: 2053, Super: "", }, &bytecode.ISeq{ @@ -6435,8 +6420,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"base_directory"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2052}, {PC: 12, Line: 2053}}, - FirstLine: 2051, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2062}, {PC: 12, Line: 2063}}, + FirstLine: 2061, Super: "", }, &bytecode.ISeq{ @@ -6451,8 +6436,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"args", "opts"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2061}}, - FirstLine: 2060, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2071}}, + FirstLine: 2070, Super: "", }, &bytecode.ISeq{ @@ -6467,8 +6452,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 3, Locals: []string{"content", "args", "opts"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2065}}, - FirstLine: 2064, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2075}}, + FirstLine: 2074, Super: "", }, &bytecode.ISeq{ @@ -6483,8 +6468,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: 1, NumLocals: 2, Locals: []string{"args", "block"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2069}}, - FirstLine: 2068, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2079}}, + FirstLine: 2078, Super: "", }, &bytecode.ISeq{ @@ -6497,8 +6482,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2073}}, - FirstLine: 2072, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2083}}, + FirstLine: 2082, Super: "", }, &bytecode.ISeq{ @@ -6511,8 +6496,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2077}}, - FirstLine: 2076, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2087}}, + FirstLine: 2086, Super: "", }, &bytecode.ISeq{ @@ -6525,8 +6510,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2081}}, - FirstLine: 2080, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2091}}, + FirstLine: 2090, Super: "", }, &bytecode.ISeq{ @@ -6541,8 +6526,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: 1, NumLocals: 2, Locals: []string{"args", "block"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2085}}, - FirstLine: 2084, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2095}}, + FirstLine: 2094, Super: "", }, }, @@ -6558,8 +6543,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2095}, {PC: 2, Line: 2106}}, - FirstLine: 2093, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2105}, {PC: 2, Line: 2116}}, + FirstLine: 2103, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "", @@ -6571,8 +6556,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2098}}, - FirstLine: 2095, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2108}}, + FirstLine: 2105, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "instance", @@ -6584,8 +6569,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2099}}, - FirstLine: 2098, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2109}}, + FirstLine: 2108, Super: "", }, }, @@ -6607,8 +6592,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"klass"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2107}, {PC: 4, Line: 2108}}, - FirstLine: 2106, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2117}, {PC: 4, Line: 2118}}, + FirstLine: 2116, Super: "", }, }, @@ -6630,8 +6615,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2131}, {PC: 5, Line: 2132}, {PC: 10, Line: 2138}, {PC: 12, Line: 2151}, {PC: 14, Line: 2158}, {PC: 16, Line: 2167}, {PC: 18, Line: 2171}, {PC: 21, Line: 2175}}, - FirstLine: 2129, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2141}, {PC: 5, Line: 2142}, {PC: 10, Line: 2148}, {PC: 12, Line: 2161}, {PC: 14, Line: 2168}, {PC: 16, Line: 2177}, {PC: 18, Line: 2181}, {PC: 21, Line: 2185}}, + FirstLine: 2139, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "initialize", @@ -6652,8 +6637,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 3, Locals: []string{"str", "trim_mode", "eoutvar"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2138}, {PC: 2, Line: 259}, {PC: 13, Line: 2140}, {PC: 16, Line: 2141}, {PC: 19, Line: 2145}}, - FirstLine: 2138, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2148}, {PC: 2, Line: 259}, {PC: 13, Line: 2150}, {PC: 16, Line: 2151}, {PC: 19, Line: 2155}}, + FirstLine: 2148, Super: "", }, &bytecode.ISeq{ @@ -6671,8 +6656,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"b"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2151}, {PC: 6, Line: 2152}}, - FirstLine: 2151, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2161}, {PC: 6, Line: 2162}}, + FirstLine: 2161, Super: "", }, &bytecode.ISeq{ @@ -6687,8 +6672,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"hash", "b"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2159}, {PC: 4, Line: 2160}, {PC: 7, Line: 2163}}, - FirstLine: 2158, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2169}, {PC: 4, Line: 2170}, {PC: 7, Line: 2173}}, + FirstLine: 2168, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in result_with_hash", @@ -6702,8 +6687,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"key", "value"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2161}}, - FirstLine: 2160, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2171}}, + FirstLine: 2170, Super: "", }, }, @@ -6721,8 +6706,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"b"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2167}, {PC: 6, Line: 2168}}, - FirstLine: 2167, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2177}, {PC: 6, Line: 2178}}, + FirstLine: 2177, Super: "", }, &bytecode.ISeq{ @@ -6734,8 +6719,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2176}}, - FirstLine: 2175, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2186}}, + FirstLine: 2185, Super: "", }, }, @@ -6751,8 +6736,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2194}, {PC: 2, Line: 2263}}, - FirstLine: 2193, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2204}, {PC: 2, Line: 2273}}, + FirstLine: 2203, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "", @@ -6764,8 +6749,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2197}, {PC: 2, Line: 2204}, {PC: 4, Line: 2211}, {PC: 6, Line: 2220}, {PC: 8, Line: 2233}}, - FirstLine: 2194, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2207}, {PC: 2, Line: 2214}, {PC: 4, Line: 2221}, {PC: 6, Line: 2230}, {PC: 8, Line: 2243}}, + FirstLine: 2204, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "", @@ -6780,8 +6765,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2198}, {PC: 4, Line: 2199}}, - FirstLine: 2197, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2208}, {PC: 4, Line: 2209}}, + FirstLine: 2207, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "initialize", @@ -6795,8 +6780,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"v"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2200}}, - FirstLine: 2199, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2210}}, + FirstLine: 2209, Super: "", }, }, @@ -6814,8 +6799,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"v"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2205}}, - FirstLine: 2204, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2215}}, + FirstLine: 2214, Super: "", }, &bytecode.ISeq{ @@ -6842,8 +6827,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"s"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2212}}, - FirstLine: 2211, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2222}}, + FirstLine: 2221, Super: "", }, &bytecode.ISeq{ @@ -6868,8 +6853,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"name", "value"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2221}, {PC: 14, Line: 2222}, {PC: 22, Line: 1}, {PC: 32, Line: 2223}, {PC: 40, Line: 1}, {PC: 57, Line: 2225}, {PC: 61, Line: 1}}, - FirstLine: 2220, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2231}, {PC: 14, Line: 2232}, {PC: 22, Line: 1}, {PC: 32, Line: 2233}, {PC: 40, Line: 1}, {PC: 57, Line: 2235}, {PC: 61, Line: 1}}, + FirstLine: 2230, Super: "", }, &bytecode.ISeq{ @@ -6887,8 +6872,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 5, Locals: []string{"base", "splats", "merged", "add", "out"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2234}, {PC: 3, Line: 2235}, {PC: 7, Line: 2247}, {PC: 10, Line: 2248}, {PC: 13, Line: 2250}, {PC: 17, Line: 2251}, {PC: 22, Line: 2254}}, - FirstLine: 2233, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2244}, {PC: 3, Line: 2245}, {PC: 7, Line: 2257}, {PC: 10, Line: 2258}, {PC: 13, Line: 2260}, {PC: 17, Line: 2261}, {PC: 22, Line: 2264}}, + FirstLine: 2243, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in render_attributes", @@ -6907,8 +6892,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 7, Locals: []string{"k", "v", "existing", "val", "", "", ""}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2236}, {PC: 4, Line: 2237}, {PC: 8, Line: 2238}, {PC: 13, Line: 2239}, {PC: 24, Line: 2240}, {PC: 42, Line: 2242}, {PC: 50, Line: 2244}}, - FirstLine: 2235, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2246}, {PC: 4, Line: 2247}, {PC: 8, Line: 2248}, {PC: 13, Line: 2249}, {PC: 24, Line: 2250}, {PC: 42, Line: 2252}, {PC: 50, Line: 2254}}, + FirstLine: 2245, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block (2 levels) in render_attributes", @@ -6924,8 +6909,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"x"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2240}}, - FirstLine: 2240, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2250}}, + FirstLine: 2250, Super: "", }, }, @@ -6943,8 +6928,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"k", "v"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2247}}, - FirstLine: 2247, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2257}}, + FirstLine: 2257, Super: "", }, &bytecode.ISeq{ @@ -6959,8 +6944,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"h"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2248}}, - FirstLine: 2248, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2258}}, + FirstLine: 2258, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block (2 levels) in render_attributes", @@ -6974,8 +6959,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"k", "v"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2248}}, - FirstLine: 2248, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2258}}, + FirstLine: 2258, Super: "", }, }, @@ -6993,8 +6978,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"k"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2252}}, - FirstLine: 2251, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2262}}, + FirstLine: 2261, Super: "", }, }, @@ -7016,8 +7001,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2264}, {PC: 4, Line: 2268}, {PC: 6, Line: 2277}}, - FirstLine: 2263, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2274}, {PC: 4, Line: 2278}, {PC: 6, Line: 2287}}, + FirstLine: 2273, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "initialize", @@ -7031,8 +7016,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: 1, NumLocals: 2, Locals: []string{"template", "block"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2268}, {PC: 2, Line: 259}, {PC: 5, Line: 2269}, {PC: 18, Line: 2270}}, - FirstLine: 2268, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2278}, {PC: 2, Line: 259}, {PC: 5, Line: 2279}, {PC: 18, Line: 2280}}, + FirstLine: 2278, Super: "", }, &bytecode.ISeq{ @@ -7051,8 +7036,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 3, Locals: []string{"_scope", "locals", "b"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2277}, {PC: 11, Line: 2278}, {PC: 14, Line: 2279}, {PC: 17, Line: 2280}}, - FirstLine: 2277, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2287}, {PC: 11, Line: 2288}, {PC: 14, Line: 2289}, {PC: 17, Line: 2290}}, + FirstLine: 2287, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in render", @@ -7066,8 +7051,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"k", "v"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2279}}, - FirstLine: 2279, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2289}}, + FirstLine: 2289, Super: "", }, }, @@ -7089,8 +7074,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2302}, {PC: 2, Line: 2315}, {PC: 4, Line: 2355}}, - FirstLine: 2301, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2312}, {PC: 2, Line: 2325}, {PC: 4, Line: 2365}}, + FirstLine: 2311, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "", @@ -7102,8 +7087,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2305}}, - FirstLine: 2302, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2315}}, + FirstLine: 2312, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "escape_html", @@ -7129,8 +7114,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"s"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2306}}, - FirstLine: 2305, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2316}}, + FirstLine: 2315, Super: "", }, }, @@ -7166,8 +7151,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2316}, {PC: 22, Line: 2320}}, - FirstLine: 2315, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2326}, {PC: 22, Line: 2330}}, + FirstLine: 2325, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "render", @@ -7184,8 +7169,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 3, Locals: []string{"h", "pairs", "out"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2321}, {PC: 3, Line: 2322}, {PC: 6, Line: 2337}, {PC: 10, Line: 2338}, {PC: 15, Line: 2348}}, - FirstLine: 2320, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2331}, {PC: 3, Line: 2332}, {PC: 6, Line: 2347}, {PC: 10, Line: 2348}, {PC: 15, Line: 2358}}, + FirstLine: 2330, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in render", @@ -7206,8 +7191,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 7, Locals: []string{"k", "v", "existing", "merged", "", "", ""}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2323}, {PC: 4, Line: 2324}, {PC: 14, Line: 2325}, {PC: 21, Line: 2327}, {PC: 26, Line: 2328}, {PC: 42, Line: 2329}, {PC: 54, Line: 2331}, {PC: 59, Line: 2332}, {PC: 72, Line: 2334}}, - FirstLine: 2322, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2333}, {PC: 4, Line: 2334}, {PC: 14, Line: 2335}, {PC: 21, Line: 2337}, {PC: 26, Line: 2338}, {PC: 42, Line: 2339}, {PC: 54, Line: 2341}, {PC: 59, Line: 2342}, {PC: 72, Line: 2344}}, + FirstLine: 2332, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block (2 levels) in render", @@ -7226,8 +7211,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 3, Locals: []string{"dk", "dv", ""}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2325}}, - FirstLine: 2325, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2335}}, + FirstLine: 2335, Super: "", }, }, @@ -7253,8 +7238,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"k", "v"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2339}, {PC: 5, Line: 2340}, {PC: 9, Line: 2341}, {PC: 32, Line: 2343}, {PC: 40, Line: 2345}, {PC: 45, Line: 1}}, - FirstLine: 2338, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2349}, {PC: 5, Line: 2350}, {PC: 9, Line: 2351}, {PC: 32, Line: 2353}, {PC: 40, Line: 2355}, {PC: 45, Line: 1}}, + FirstLine: 2348, Super: "", }, }, @@ -7276,8 +7261,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2356}, {PC: 4, Line: 2360}, {PC: 6, Line: 2368}}, - FirstLine: 2355, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2366}, {PC: 4, Line: 2370}, {PC: 6, Line: 2378}}, + FirstLine: 2365, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "initialize", @@ -7291,8 +7276,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: 1, NumLocals: 2, Locals: []string{"template", "block"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2360}, {PC: 2, Line: 259}, {PC: 5, Line: 2361}, {PC: 18, Line: 2362}}, - FirstLine: 2360, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2370}, {PC: 2, Line: 259}, {PC: 5, Line: 2371}, {PC: 18, Line: 2372}}, + FirstLine: 2370, Super: "", }, &bytecode.ISeq{ @@ -7311,8 +7296,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 3, Locals: []string{"_scope", "locals", "b"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2368}, {PC: 11, Line: 2369}, {PC: 14, Line: 2370}, {PC: 17, Line: 2371}}, - FirstLine: 2368, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2378}, {PC: 11, Line: 2379}, {PC: 14, Line: 2380}, {PC: 17, Line: 2381}}, + FirstLine: 2378, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in render", @@ -7326,8 +7311,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"k", "v"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2370}}, - FirstLine: 2370, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2380}}, + FirstLine: 2380, Super: "", }, }, @@ -7360,8 +7345,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2402}, {PC: 2, Line: 2423}, {PC: 4, Line: 2426}, {PC: 6, Line: 2429}, {PC: 8, Line: 2432}, {PC: 10, Line: 2435}, {PC: 12, Line: 2438}, {PC: 14, Line: 2442}}, - FirstLine: 2401, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2412}, {PC: 2, Line: 2433}, {PC: 4, Line: 2436}, {PC: 6, Line: 2439}, {PC: 8, Line: 2442}, {PC: 10, Line: 2445}, {PC: 12, Line: 2448}, {PC: 14, Line: 2452}}, + FirstLine: 2411, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "", @@ -7376,8 +7361,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2403}, {PC: 4, Line: 2404}, {PC: 6, Line: 2411}, {PC: 8, Line: 2412}, {PC: 10, Line: 2413}, {PC: 12, Line: 2416}, {PC: 14, Line: 2417}}, - FirstLine: 2402, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2413}, {PC: 4, Line: 2414}, {PC: 6, Line: 2421}, {PC: 8, Line: 2422}, {PC: 10, Line: 2423}, {PC: 12, Line: 2426}, {PC: 14, Line: 2427}}, + FirstLine: 2412, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "initialize", @@ -7395,8 +7380,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"args"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2405}, {PC: 3, Line: 2409}}, - FirstLine: 2404, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2415}, {PC: 3, Line: 2419}}, + FirstLine: 2414, Super: "", }, &bytecode.ISeq{ @@ -7411,8 +7396,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2411}}, - FirstLine: 2411, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2421}}, + FirstLine: 2421, Super: "", }, &bytecode.ISeq{ @@ -7426,7 +7411,7 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 0, Lines: []bytecode.LineEntry{{PC: 0, Line: 109}}, - FirstLine: 2412, + FirstLine: 2422, Super: "", }, &bytecode.ISeq{ @@ -7443,8 +7428,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2414}}, - FirstLine: 2413, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2424}}, + FirstLine: 2423, Super: "", }, &bytecode.ISeq{ @@ -7462,8 +7447,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"argv", ""}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2418}, {PC: 9, Line: 2419}}, - FirstLine: 2417, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2428}, {PC: 9, Line: 2429}}, + FirstLine: 2427, Super: "", }, }, @@ -7479,8 +7464,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2424}}, - FirstLine: 2423, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2434}}, + FirstLine: 2433, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "reason", @@ -7494,8 +7479,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2424}}, - FirstLine: 2424, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2434}}, + FirstLine: 2434, Super: "", }, }, @@ -7511,8 +7496,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2427}}, - FirstLine: 2426, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2437}}, + FirstLine: 2436, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "reason", @@ -7526,8 +7511,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2427}}, - FirstLine: 2427, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2437}}, + FirstLine: 2437, Super: "", }, }, @@ -7543,8 +7528,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2430}}, - FirstLine: 2429, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2440}}, + FirstLine: 2439, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "reason", @@ -7558,8 +7543,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2430}}, - FirstLine: 2430, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2440}}, + FirstLine: 2440, Super: "", }, }, @@ -7575,8 +7560,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2433}}, - FirstLine: 2432, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2443}}, + FirstLine: 2442, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "reason", @@ -7590,8 +7575,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2433}}, - FirstLine: 2433, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2443}}, + FirstLine: 2443, Super: "", }, }, @@ -7607,8 +7592,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2436}}, - FirstLine: 2435, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2446}}, + FirstLine: 2445, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "reason", @@ -7622,8 +7607,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2436}}, - FirstLine: 2436, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2446}}, + FirstLine: 2446, Super: "", }, }, @@ -7639,8 +7624,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2439}}, - FirstLine: 2438, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2449}}, + FirstLine: 2448, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "reason", @@ -7654,8 +7639,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2439}}, - FirstLine: 2439, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2449}}, + FirstLine: 2449, Super: "", }, }, @@ -7677,8 +7662,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2458}, {PC: 4, Line: 2460}, {PC: 6, Line: 2481}, {PC: 8, Line: 2512}, {PC: 10, Line: 2518}, {PC: 12, Line: 2527}, {PC: 14, Line: 2542}, {PC: 16, Line: 2549}, {PC: 18, Line: 2553}, {PC: 20, Line: 2560}, {PC: 22, Line: 2562}, {PC: 24, Line: 2566}, {PC: 26, Line: 2570}}, - FirstLine: 2457, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2468}, {PC: 4, Line: 2470}, {PC: 6, Line: 2491}, {PC: 8, Line: 2522}, {PC: 10, Line: 2528}, {PC: 12, Line: 2537}, {PC: 14, Line: 2552}, {PC: 16, Line: 2559}, {PC: 18, Line: 2563}, {PC: 20, Line: 2570}, {PC: 22, Line: 2572}, {PC: 24, Line: 2576}, {PC: 26, Line: 2580}}, + FirstLine: 2467, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "counter", @@ -7694,8 +7679,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2461}}, - FirstLine: 2460, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2471}}, + FirstLine: 2470, Super: "", }, &bytecode.ISeq{ @@ -7720,8 +7705,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 9, Locals: []string{"basename", "tmpdir", "mode", "opts", "prefix", "suffix", "dir", "fopts", ""}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2481}, {PC: 7, Line: 259}, {PC: 15, Line: 2482}, {PC: 19, Line: 2483}, {PC: 36, Line: 2484}, {PC: 44, Line: 259}, {PC: 47, Line: 2486}, {PC: 50, Line: 2494}, {PC: 62, Line: 2495}, {PC: 65, Line: 2496}, {PC: 68, Line: 2497}, {PC: 76, Line: 2498}, {PC: 92, Line: 2499}, {PC: 94, Line: 2500}, {PC: 95, Line: 109}, {PC: 98, Line: 2503}, {PC: 101, Line: 2504}, {PC: 105, Line: 2503}, {PC: 108, Line: 2504}}, - FirstLine: 2481, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2491}, {PC: 7, Line: 259}, {PC: 15, Line: 2492}, {PC: 19, Line: 2493}, {PC: 36, Line: 2494}, {PC: 44, Line: 259}, {PC: 47, Line: 2496}, {PC: 50, Line: 2504}, {PC: 62, Line: 2505}, {PC: 65, Line: 2506}, {PC: 68, Line: 2507}, {PC: 76, Line: 2508}, {PC: 92, Line: 2509}, {PC: 94, Line: 2510}, {PC: 95, Line: 109}, {PC: 98, Line: 2513}, {PC: 101, Line: 2514}, {PC: 105, Line: 2513}, {PC: 108, Line: 2514}}, + FirstLine: 2491, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in initialize", @@ -7741,8 +7726,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"name", "candidate"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2487}, {PC: 42, Line: 2488}, {PC: 48, Line: 2489}, {PC: 53, Line: 2490}, {PC: 56, Line: 2491}}, - FirstLine: 2486, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2497}, {PC: 42, Line: 2498}, {PC: 48, Line: 2499}, {PC: 53, Line: 2500}, {PC: 56, Line: 2501}}, + FirstLine: 2496, Super: "", }, &bytecode.ISeq{ @@ -7760,8 +7745,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 3, Locals: []string{"k", "v", ""}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2496}}, - FirstLine: 2496, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2506}}, + FirstLine: 2506, Super: "", }, }, @@ -7780,8 +7765,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2513}, {PC: 16, Line: 2514}, {PC: 19, Line: 2515}}, - FirstLine: 2512, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2523}, {PC: 16, Line: 2524}, {PC: 19, Line: 2525}}, + FirstLine: 2522, Super: "", }, &bytecode.ISeq{ @@ -7796,8 +7781,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: 1, NumLocals: 2, Locals: []string{"args", "block"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2519}}, - FirstLine: 2518, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2529}}, + FirstLine: 2528, Super: "", }, &bytecode.ISeq{ @@ -7815,8 +7800,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 5, Locals: []string{"basename", "tmpdir", "opts", "fwd", "t"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2527}, {PC: 7, Line: 259}, {PC: 10, Line: 2528}, {PC: 13, Line: 2529}, {PC: 16, Line: 2530}, {PC: 32, Line: 2531}, {PC: 34, Line: 2532}, {PC: 35, Line: 2533}, {PC: 39, Line: 2535}, {PC: 42, Line: 2536}, {PC: 46, Line: 2535}, {PC: 49, Line: 2536}, {PC: 56, Line: 2539}}, - FirstLine: 2527, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2537}, {PC: 7, Line: 259}, {PC: 10, Line: 2538}, {PC: 13, Line: 2539}, {PC: 16, Line: 2540}, {PC: 32, Line: 2541}, {PC: 34, Line: 2542}, {PC: 35, Line: 2543}, {PC: 39, Line: 2545}, {PC: 42, Line: 2546}, {PC: 46, Line: 2545}, {PC: 49, Line: 2546}, {PC: 56, Line: 2549}}, + FirstLine: 2537, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "block in create", @@ -7833,8 +7818,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 3, Locals: []string{"k", "v", ""}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2529}}, - FirstLine: 2529, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2539}}, + FirstLine: 2539, Super: "", }, }, @@ -7852,8 +7837,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"unlink_now"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2542}, {PC: 5, Line: 2543}, {PC: 17, Line: 2544}, {PC: 20, Line: 2545}, {PC: 27, Line: 259}}, - FirstLine: 2542, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2552}, {PC: 5, Line: 2553}, {PC: 17, Line: 2554}, {PC: 20, Line: 2555}, {PC: 27, Line: 259}}, + FirstLine: 2552, Super: "", }, &bytecode.ISeq{ @@ -7866,8 +7851,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2550}}, - FirstLine: 2549, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2560}}, + FirstLine: 2559, Super: "", }, &bytecode.ISeq{ @@ -7880,8 +7865,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2554}, {PC: 8, Line: 2555}, {PC: 14, Line: 259}}, - FirstLine: 2553, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2564}, {PC: 8, Line: 2565}, {PC: 14, Line: 259}}, + FirstLine: 2563, Super: "", }, &bytecode.ISeq{ @@ -7899,8 +7884,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"mode"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2563}}, - FirstLine: 2562, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2573}}, + FirstLine: 2572, Super: "", }, &bytecode.ISeq{ @@ -7915,8 +7900,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"name", "include_private"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2566}, {PC: 5, Line: 2567}}, - FirstLine: 2566, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2576}, {PC: 5, Line: 2577}}, + FirstLine: 2576, Super: "", }, &bytecode.ISeq{ @@ -7931,8 +7916,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: 2, NumLocals: 3, Locals: []string{"name", "args", "block"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2571}, {PC: 8, Line: 2572}, {PC: 19, Line: 2574}}, - FirstLine: 2570, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2581}, {PC: 8, Line: 2582}, {PC: 19, Line: 2584}}, + FirstLine: 2580, Super: "", }, }, @@ -7954,8 +7939,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2583}, {PC: 11, Line: 109}, {PC: 14, Line: 2623}, {PC: 16, Line: 2627}, {PC: 17, Line: 109}}, - FirstLine: 2582, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2593}, {PC: 11, Line: 109}, {PC: 14, Line: 2633}, {PC: 16, Line: 2637}, {PC: 17, Line: 109}}, + FirstLine: 2592, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "", @@ -7967,8 +7952,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2593}, {PC: 2, Line: 2605}, {PC: 4, Line: 2616}}, - FirstLine: 2590, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2603}, {PC: 2, Line: 2615}, {PC: 4, Line: 2626}}, + FirstLine: 2600, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "[]", @@ -7990,8 +7975,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 1, Locals: []string{"category"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2594}, {PC: 5, Line: 2595}, {PC: 22, Line: 2597}, {PC: 27, Line: 2598}, {PC: 43, Line: 2600}}, - FirstLine: 2593, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2604}, {PC: 5, Line: 2605}, {PC: 22, Line: 2607}, {PC: 27, Line: 2608}, {PC: 43, Line: 2610}}, + FirstLine: 2603, Super: "", }, &bytecode.ISeq{ @@ -8014,8 +7999,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 3, Locals: []string{"category", "flag", ""}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2606}, {PC: 5, Line: 2607}, {PC: 22, Line: 2609}, {PC: 27, Line: 2610}, {PC: 43, Line: 2612}}, - FirstLine: 2605, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2616}, {PC: 5, Line: 2617}, {PC: 22, Line: 2619}, {PC: 27, Line: 2620}, {PC: 43, Line: 2622}}, + FirstLine: 2615, Super: "", }, &bytecode.ISeq{ @@ -8028,8 +8013,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2617}}, - FirstLine: 2616, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2627}}, + FirstLine: 2626, Super: "", }, }, @@ -8049,8 +8034,8 @@ func embeddedPrelude() *bytecode.ISeq { BlockSlot: -1, NumLocals: 2, Locals: []string{"message", "category"}, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2623}, {PC: 2, Line: 259}, {PC: 5, Line: 2624}, {PC: 9, Line: 259}}, - FirstLine: 2623, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2633}, {PC: 2, Line: 259}, {PC: 5, Line: 2634}, {PC: 9, Line: 259}}, + FirstLine: 2633, Super: "", }, }, @@ -8066,8 +8051,8 @@ func embeddedPrelude() *bytecode.ISeq { KwRestSlot: -1, BlockSlot: -1, NumLocals: 0, - Lines: []bytecode.LineEntry{{PC: 0, Line: 2641}}, - FirstLine: 2640, + Lines: []bytecode.LineEntry{{PC: 0, Line: 2651}}, + FirstLine: 2650, Children: []*bytecode.ISeq{ &bytecode.ISeq{ Name: "!~", @@ -8082,7 +8067,7 @@ func embeddedPrelude() *bytecode.ISeq { NumLocals: 1, Locals: []string{"other"}, Lines: []bytecode.LineEntry{{PC: 0, Line: 109}}, - FirstLine: 2641, + FirstLine: 2651, Super: "", }, }, diff --git a/internal/vm/wave61_pathname_alias_test.go b/internal/vm/wave61_pathname_alias_test.go new file mode 100644 index 00000000..945091c8 --- /dev/null +++ b/internal/vm/wave61_pathname_alias_test.go @@ -0,0 +1,63 @@ +// Copyright (c) the go-embedded-ruby/ruby authors +// +// SPDX-License-Identifier: BSD-3-Clause + +package vm + +import "testing" + +// TestPathnameSlashIsAnAliasOfPlus: CRuby's pathname.rb writes `alias / +`. +// rbgo's prelude wrote a forwarding `def /(other); self + other; end` instead, +// because the parser refused the alias -- after `alias`, a `/` opened a regexp +// (fixed in go-ruby-parser v0.11.1, which this requires). +// +// The workaround was not only a reflection difference. Three things diverged, +// all measured against ruby 4.0.5: +// +// Pathname.instance_method(:/).original_name ruby :+ before :/ +// instance_method(:/) == instance_method(:+) ruby true before false +// after `def +` is redefined, `a / "b"` ruby /a/b before HIJACKED +// +// The third is behaviour: an alias keeps the body it was made from, while a +// forwarding def follows whatever #+ becomes. +func TestPathnameSlashIsAnAliasOfPlus(t *testing.T) { + src := `require "pathname" +im = ->(n) { Pathname.instance_method(n) } +p im.(:/).original_name +p im.(:/) == im.(:+) +p im.(:/).owner +a = Pathname.new("/a") +p (a / "b").to_s +class Pathname + def +(other); "HIJACKED"; end +end +p (a / "b") +p (a + "b") +` + const want = ":+\ntrue\nPathname\n\"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/a/b\"\n#\n\"HIJACKED\"\n" + if got := eval(t, src); got != want { + t.Errorf("got %q\nwant %q", got, want) + } +} + +// TestAliasOfAnOperatorParsesInThePrelude is the narrower guard: the prelude is +// compiled at VM construction, so a parser that refused `alias / +` would fail +// every test in this package rather than this one. It is here to NAME the +// dependency, so a parser downgrade reports the cause instead of a wall of +// failures. +func TestAliasOfAnOperatorParsesInThePrelude(t *testing.T) { + src := `class Probe + def +(o); [:plus, o]; end + alias / + + def %(o); [:mod, o]; end + undef % +end +p Probe.new / 1 +p Probe.instance_method(:/).original_name +p Probe.new.respond_to?(:%) +` + const want = "[:plus, 1]\n:+\nfalse\n" + if got := eval(t, src); got != want { + t.Errorf("got %q\nwant %q", got, want) + } +}