From: "mame (Yusuke Endoh) via ruby-core" Date: 2025-12-17T01:36:30+00:00 Subject: [ruby-core:124269] [Ruby Bug#21783] {Method,UnboundMethod,Proc}#source_location returns columns in bytes and not in characters Issue #21783 has been updated by mame (Yusuke Endoh). Eregon (Benoit Daloze) wrote in #note-20: > FWIW I also consider the concept of `node_id` CRuby-specific, at least currently. Since `Prism::Node#node_id` exists, I don't think it's CRuby-specific anymore. It's true that the part retrieving the `node_id` from a Proc is CRuby-specific, and that design requires some consideration. A simple solution would be for Ruby to provide `Proc#node_id` or `Method#node_id`, but we need to discuss. `source_location` does not uniquely identify a node. For example, code `x` is represented as an AST with three nodes: `ProgramNode`, `StatementsNode`, and `CallNode`. They all have the same `source_location`, so cannot be distinguished. Whether TruffleRuby implements `node_id` is up to you, but I believe this is the consistnt approach in CRuby. > > Since power_assert pinpoints expressions within a block at a finer granularity, rough block's location information isn't particulary useful. > > Then `power_assert` is likely incorrect/broken if there are multiple `assert { ... }` block on a single line. @ktsj said that `assert { condition ? expected == actual : expected == actual }` cannot be distinguished at present. `Proc#source_location` is not helpful to resolve this. I think that what is needed is an API like `RubyVM::AST.node_id_for_tracepoint` to retrieve the `node_id` from a TracePoint. ---------------------------------------- Bug #21783: {Method,UnboundMethod,Proc}#source_location returns columns in bytes and not in characters https://bugs.ruby-lang.org/issues/21783#change-115763 * Author: Eregon (Benoit Daloze) * Status: Open * ruby -v: ruby 4.0.0dev (2025-12-14T07:11:02Z master 711d14992e) +PRISM [x86_64-linux] * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- The documentation says: ``` = Proc.source_location (from ruby core) ------------------------------------------------------------------------ prc.source_location -> [String, Integer, Integer, Integer, Integer] ------------------------------------------------------------------------ Returns the location where the Proc was defined. The returned Array contains: (1) the Ruby source filename (2) the line number where the definition starts (3) the column number where the definition starts (4) the line number where the definition ends (5) the column number where the definitions ends This method will return nil if the Proc was not defined in Ruby (i.e. native). ``` So it talks about column numbers, so it should be a number of characters and not of bytes. But currently it's a number of bytes: ``` $ ruby --parser=prism -ve 'def �t�; end; p method(:�t�).source_location' ruby 4.0.0dev (2025-12-14T07:11:02Z master 711d14992e) +PRISM [x86_64-linux] ["-e", 1, 0, 1, 14] $ ruby --parser=parse.y -ve 'def �t�; end; p method(:�t�).source_location' ruby 4.0.0dev (2025-12-14T07:11:02Z master 711d14992e) [x86_64-linux] ["-e", 1, 0, 1, 14] ``` The last number should be 12 because `"def �t�; end".size` is 12 characters. This is a Ruby-level API so I would never expect "byte columns" here, I think it's clear it should be a number of "editor columns" i.e. a number of characters. -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/