Module: Rigor::Inference::Builtins
- Defined in:
- lib/rigor/inference/builtins/array_catalog.rb,
lib/rigor/inference/builtins/method_catalog.rb,
lib/rigor/inference/builtins/string_catalog.rb,
lib/rigor/inference/builtins/numeric_catalog.rb
Defined Under Namespace
Modules: NumericCatalog Classes: MethodCatalog
Constant Summary collapse
- ARRAY_CATALOG =
‘Array` catalog. Singleton — load once, consult during dispatch.
Array has more mutation surface than String: every method that logically reshapes the array tends to call ‘rb_ary_modify` or an internal helper (`ary_replace`, `ary_resize`, `ary_pop`, `ary_push_internal`, …) that the classifier does not yet recognise. The blocklist captures the methods we have specifically observed flowing as `:leaf` despite mutating.
MethodCatalog.new( path: File.( "../../../../data/builtins/ruby_core/array.yml", __dir__ ), mutating_selectors: { "Array" => Set[ # Mutators classified `:leaf` by the C-body heuristic :<<, :push, :replace, :clear, :concat, :insert, :"[]=", :unshift, :prepend, :pop, :shift, :delete_at, :slice!, :compact!, :flatten!, :uniq!, :sort!, :reverse!, :rotate!, :keep_if, :delete_if, :select!, :filter!, :reject!, :collect!, :map!, :assoc, :rassoc, :fill, :delete, :transpose, # Methods that yield (block-dependent) — classifier # may mark them leaf when the block call is gated: :each, :each_with_index, :each_index, :each_slice, :each_cons, :each_with_object, # Identity/comparison methods that take a block too :max, :min, :max_by, :min_by, :minmax, :minmax_by, :sort_by, :group_by, :partition, :all?, :any?, :none?, :one?, :find, :detect, :find_all, :find_index, :reduce, :inject, :flat_map, :collect_concat, :zip, :product, :combination, :permutation, :chunk_while, :slice_when, :tally ] } )
- STRING_CATALOG =
‘String` and `Symbol` catalog. Singleton — load once, consult during dispatch.
The blocklist below is the curated set of catalog ‘:leaf` entries the C-body classifier mis-attributes (the body of `rb_str_replace` calls `str_modifiable` / `str_discard` which the regex-based classifier does not recognise as mutation primitives). Adding to the blocklist is the corrective surface for false positives until the classifier learns the helper functions.
MethodCatalog.new( path: File.( "../../../../data/builtins/ruby_core/string.yml", __dir__ ), mutating_selectors: { "String" => Set[ :replace, :initialize, :initialize_copy, :clear, :<<, :concat, :insert, :prepend, :force_encoding, :encode, :scrub, :unicode_normalize, :"[]=", :upto, :each_byte, :each_char, :each_codepoint, :each_grapheme_cluster, :each_line, :bytesplice ], "Symbol" => Set[ # Symbol is immutable in Ruby; the classifier mis-flags # `inspect` because `rb_sym_inspect` builds a temporary # mutable buffer. Allow it. ] } )