Skip to content

Commit fad0dea

Browse files
committed
Change inspect from recursive to a queue
We would previously cause a stack overflow if we parsed a file that was too deeply nested when we were calling inspect. Instead, we now use a queue of commands to do it linearly so we don't.
1 parent 096d01c commit fad0dea

File tree

17 files changed

+253
-197
lines changed

17 files changed

+253
-197
lines changed

.github/workflows/main.yml

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,23 @@ jobs:
3838
env:
3939
LANG: "C"
4040

41-
# typecheck:
42-
# runs-on: ubuntu-latest
43-
# env:
44-
# BUNDLE_GEMFILE: gemfiles/typecheck/Gemfile
45-
# steps:
46-
# - uses: actions/checkout@v4
47-
# - name: Set up Ruby
48-
# uses: ruby/setup-ruby@v1
49-
# with:
50-
# ruby-version: "3.3"
51-
# bundler-cache: true
52-
# - name: Check Sorbet
53-
# run: bundle exec rake typecheck:tapioca typecheck:sorbet
54-
# - name: Check Steep
55-
# run: bundle exec rake typecheck:steep
56-
# - name: Check field kinds
57-
# run: rm lib/prism/node.rb && CHECK_FIELD_KIND=true bundle exec rake
41+
typecheck:
42+
runs-on: ubuntu-latest
43+
env:
44+
BUNDLE_GEMFILE: gemfiles/typecheck/Gemfile
45+
steps:
46+
- uses: actions/checkout@v4
47+
- name: Set up Ruby
48+
uses: ruby/setup-ruby@v1
49+
with:
50+
ruby-version: "3.3"
51+
bundler-cache: true
52+
# - name: Check Sorbet
53+
# run: bundle exec rake typecheck:tapioca typecheck:sorbet
54+
- name: Check Steep
55+
run: bundle exec rake typecheck:steep
56+
- name: Check field kinds
57+
run: rm lib/prism/node.rb && CHECK_FIELD_KIND=true bundle exec rake
5858

5959
build:
6060
strategy:

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ out.svg
4545
/lib/prism/dispatcher.rb
4646
/lib/prism/dot_visitor.rb
4747
/lib/prism/dsl.rb
48+
/lib/prism/inspect_visitor.rb
4849
/lib/prism/mutation_compiler.rb
4950
/lib/prism/node.rb
5051
/lib/prism/reflection.rb

docs/configuration.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ A lot of code in prism's repository is templated from a single configuration fil
1414
* `lib/prism/dispatcher.rb` - for defining the dispatch visitors for the nodes in Ruby
1515
* `lib/prism/dot_visitor.rb` - for defining the dot visitor for the nodes in Ruby
1616
* `lib/prism/dsl.rb` - for defining the DSL for the nodes in Ruby
17+
* `lib/prism/inspect_visitor.rb` - for defining the `#inspect` methods on nodes in Ruby
1718
* `lib/prism/mutation_compiler.rb` - for defining the mutation compiler for the nodes in Ruby
1819
* `lib/prism/node.rb` - for defining the nodes in Ruby
1920
* `lib/prism/reflection.rb` - for defining the reflection API in Ruby

gemfiles/typecheck/Gemfile.lock

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ GEM
5151
rb-fsevent (0.11.2)
5252
rb-inotify (0.10.1)
5353
ffi (~> 1.0)
54-
rbi (0.1.11)
55-
prism (>= 0.18.0, < 0.27)
54+
rbi (0.1.12)
55+
prism (>= 0.18.0, < 0.28)
5656
sorbet-runtime (>= 0.5.9204)
5757
rbs (3.4.4)
5858
abbrev
@@ -61,15 +61,15 @@ GEM
6161
sexp_processor (~> 4.16)
6262
securerandom (0.3.1)
6363
sexp_processor (4.17.1)
64-
sorbet (0.5.11352)
65-
sorbet-static (= 0.5.11352)
66-
sorbet-runtime (0.5.11352)
67-
sorbet-static (0.5.11352-aarch64-linux)
68-
sorbet-static (0.5.11352-universal-darwin)
69-
sorbet-static (0.5.11352-x86_64-linux)
70-
sorbet-static-and-runtime (0.5.11352)
71-
sorbet (= 0.5.11352)
72-
sorbet-runtime (= 0.5.11352)
64+
sorbet (0.5.11353)
65+
sorbet-static (= 0.5.11353)
66+
sorbet-runtime (0.5.11353)
67+
sorbet-static (0.5.11353-aarch64-linux)
68+
sorbet-static (0.5.11353-universal-darwin)
69+
sorbet-static (0.5.11353-x86_64-linux)
70+
sorbet-static-and-runtime (0.5.11353)
71+
sorbet (= 0.5.11353)
72+
sorbet-runtime (= 0.5.11353)
7373
spoom (1.3.0)
7474
erubi (>= 1.10.0)
7575
prism (>= 0.19.0)

lib/prism.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ module Prism
1818
autoload :Dispatcher, "prism/dispatcher"
1919
autoload :DotVisitor, "prism/dot_visitor"
2020
autoload :DSL, "prism/dsl"
21+
autoload :InspectVisitor, "prism/inspect_visitor"
2122
autoload :LexCompat, "prism/lex_compat"
2223
autoload :LexRipper, "prism/lex_compat"
2324
autoload :MutationCompiler, "prism/mutation_compiler"
24-
autoload :NodeInspector, "prism/node_inspector"
2525
autoload :Pack, "prism/pack"
2626
autoload :Pattern, "prism/pattern"
2727
autoload :Reflection, "prism/reflection"

lib/prism/node_inspector.rb

Lines changed: 0 additions & 68 deletions
This file was deleted.

prism.gemspec

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,10 @@ Gem::Specification.new do |spec|
7676
"lib/prism/dot_visitor.rb",
7777
"lib/prism/dsl.rb",
7878
"lib/prism/ffi.rb",
79+
"lib/prism/inspect_visitor.rb",
7980
"lib/prism/lex_compat.rb",
8081
"lib/prism/mutation_compiler.rb",
8182
"lib/prism/node_ext.rb",
82-
"lib/prism/node_inspector.rb",
8383
"lib/prism/node.rb",
8484
"lib/prism/pack.rb",
8585
"lib/prism/parse_result.rb",
@@ -101,11 +101,46 @@ Gem::Specification.new do |spec|
101101
"lib/prism/translation/ripper/shim.rb",
102102
"lib/prism/translation/ruby_parser.rb",
103103
"lib/prism/visitor.rb",
104+
"prism.gemspec",
105+
"rbi/prism.rbi",
106+
"rbi/prism/compiler.rbi",
107+
"rbi/prism/desugar_compiler.rbi",
108+
"rbi/prism/inspect_visitor.rbi",
109+
"rbi/prism/mutation_compiler.rbi",
110+
"rbi/prism/node_ext.rbi",
111+
"rbi/prism/node.rbi",
112+
"rbi/prism/parse_result.rbi",
113+
"rbi/prism/reflection.rbi",
114+
"rbi/prism/translation/parser.rbi",
115+
"rbi/prism/translation/parser/compiler.rbi",
116+
"rbi/prism/translation/parser33.rbi",
117+
"rbi/prism/translation/parser34.rbi",
118+
"rbi/prism/translation/ripper.rbi",
119+
"rbi/prism/translation/ripper/ripper_compiler.rbi",
120+
"rbi/prism/translation/ruby_parser.rbi",
121+
"rbi/prism/visitor.rbi",
122+
"sig/prism.rbs",
123+
"sig/prism/compiler.rbs",
124+
"sig/prism/dispatcher.rbs",
125+
"sig/prism/dot_visitor.rbs",
126+
"sig/prism/dsl.rbs",
127+
"sig/prism/inspect_visitor.rbs",
128+
"sig/prism/mutation_compiler.rbs",
129+
"sig/prism/node_ext.rbs",
130+
"sig/prism/node.rbs",
131+
"sig/prism/pack.rbs",
132+
"sig/prism/parse_result.rbs",
133+
"sig/prism/pattern.rbs",
134+
"sig/prism/reflection.rbs",
135+
"sig/prism/serialize.rbs",
136+
"sig/prism/visitor.rbs",
104137
"src/diagnostic.c",
105138
"src/encoding.c",
106139
"src/node.c",
140+
"src/options.c",
107141
"src/pack.c",
108142
"src/prettyprint.c",
143+
"src/prism.c",
109144
"src/regexp.c",
110145
"src/serialize.c",
111146
"src/static_literals.c",
@@ -117,43 +152,10 @@ Gem::Specification.new do |spec|
117152
"src/util/pm_list.c",
118153
"src/util/pm_memchr.c",
119154
"src/util/pm_newline_list.c",
120-
"src/util/pm_string.c",
121155
"src/util/pm_string_list.c",
156+
"src/util/pm_string.c",
122157
"src/util/pm_strncasecmp.c",
123-
"src/util/pm_strpbrk.c",
124-
"src/options.c",
125-
"src/prism.c",
126-
"prism.gemspec",
127-
"sig/prism.rbs",
128-
"sig/prism/compiler.rbs",
129-
"sig/prism/dispatcher.rbs",
130-
"sig/prism/dot_visitor.rbs",
131-
"sig/prism/dsl.rbs",
132-
"sig/prism/mutation_compiler.rbs",
133-
"sig/prism/node.rbs",
134-
"sig/prism/node_ext.rbs",
135-
"sig/prism/pack.rbs",
136-
"sig/prism/parse_result.rbs",
137-
"sig/prism/pattern.rbs",
138-
"sig/prism/reflection.rbs",
139-
"sig/prism/serialize.rbs",
140-
"sig/prism/visitor.rbs",
141-
"rbi/prism.rbi",
142-
"rbi/prism/compiler.rbi",
143-
"rbi/prism/desugar_compiler.rbi",
144-
"rbi/prism/mutation_compiler.rbi",
145-
"rbi/prism/node_ext.rbi",
146-
"rbi/prism/node.rbi",
147-
"rbi/prism/parse_result.rbi",
148-
"rbi/prism/reflection.rbi",
149-
"rbi/prism/translation/parser.rbi",
150-
"rbi/prism/translation/parser/compiler.rbi",
151-
"rbi/prism/translation/parser33.rbi",
152-
"rbi/prism/translation/parser34.rbi",
153-
"rbi/prism/translation/ripper.rbi",
154-
"rbi/prism/translation/ripper/ripper_compiler.rbi",
155-
"rbi/prism/translation/ruby_parser.rbi",
156-
"rbi/prism/visitor.rbi"
158+
"src/util/pm_strpbrk.c"
157159
]
158160

159161
spec.extensions = ["ext/prism/extconf.rb"]

rakelib/typecheck.rake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ namespace :typecheck do
4040
- ./lib/prism/translation/ripper/ripper_compiler.rb
4141
- ./lib/prism/translation/ripper/sexp.rb
4242
- ./lib/prism/translation/ruby_parser.rb
43+
- ./lib/prism/inspect_visitor.rb
4344
# We want to treat all polyfill files as "typed: false"
4445
<% polyfills.each do |file| -%>
4546
- ./<%= file %>

rbi/prism/inspect_visitor.rbi

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# typed: strict
2+
3+
class Prism::InspectVisitor < Prism::Visitor
4+
sig { params(String).void }
5+
def initialize(indent = ""); end
6+
7+
sig { params(Prism::Node).returns(String) }
8+
def self.inspect(node); end
9+
10+
sig { returns(String) }
11+
def compose; end
12+
end

sig/prism/_private/node_inspector.rbs

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)