Skip to content

Commit 4259db4

Browse files
authored
Merge pull request #640 from aycabta/optimize-hot-spot
Speeding up RDoc by 85% in CRuby documents generation
2 parents 4b690c5 + 2b96a8b commit 4259db4

15 files changed

+153
-108
lines changed

lib/rdoc/markup/to_html.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def accept_paragraph paragraph
186186
@res << "\n<p>"
187187
text = paragraph.text @hard_break
188188
text = text.gsub(/\r?\n/, ' ')
189-
@res << wrap(to_html(text))
189+
@res << to_html(text)
190190
@res << "</p>\n"
191191
end
192192

lib/rdoc/markup/to_html_snippet.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def accept_paragraph paragraph
7171

7272
text = paragraph.text @hard_break
7373

74-
@res << "#{para}#{wrap to_html text}\n"
74+
@res << "#{para}#{to_html text}\n"
7575

7676
add_paragraph
7777
end

lib/rdoc/parser/ripper_state_lex.rb

Lines changed: 39 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def on_nl(tok, data)
5050
@continue = false
5151
@lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
5252
end
53-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
53+
data << Token.new(lineno, column, __method__, tok, @lex_state)
5454
end
5555

5656
def on_ignored_nl(tok, data)
@@ -61,7 +61,7 @@ def on_ignored_nl(tok, data)
6161
@continue = false
6262
@lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
6363
end
64-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
64+
data << Token.new(lineno, column, __method__, tok, @lex_state)
6565
end
6666

6767
def on_op(tok, data)
@@ -103,7 +103,7 @@ def on_op(tok, data)
103103
@lex_state = EXPR_BEG
104104
end
105105
end
106-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
106+
data << Token.new(lineno, column, __method__, tok, @lex_state)
107107
end
108108

109109
def on_kw(tok, data)
@@ -132,54 +132,54 @@ def on_kw(tok, data)
132132
@lex_state = EXPR_END
133133
end
134134
end
135-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
135+
data << Token.new(lineno, column, __method__, tok, @lex_state)
136136
end
137137

138138
def on_tstring_beg(tok, data)
139139
@lex_state = EXPR_BEG
140-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
140+
data << Token.new(lineno, column, __method__, tok, @lex_state)
141141
end
142142

143143
def on_tstring_end(tok, data)
144144
@lex_state = EXPR_END | EXPR_ENDARG
145-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
145+
data << Token.new(lineno, column, __method__, tok, @lex_state)
146146
end
147147

148148
def on_CHAR(tok, data)
149149
@lex_state = EXPR_END
150-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
150+
data << Token.new(lineno, column, __method__, tok, @lex_state)
151151
end
152152

153153
def on_period(tok, data)
154154
@lex_state = EXPR_DOT
155-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
155+
data << Token.new(lineno, column, __method__, tok, @lex_state)
156156
end
157157

158158
def on_int(tok, data)
159159
@lex_state = EXPR_END | EXPR_ENDARG
160-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
160+
data << Token.new(lineno, column, __method__, tok, @lex_state)
161161
end
162162

163163
def on_float(tok, data)
164164
@lex_state = EXPR_END | EXPR_ENDARG
165-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
165+
data << Token.new(lineno, column, __method__, tok, @lex_state)
166166
end
167167

168168
def on_rational(tok, data)
169169
@lex_state = EXPR_END | EXPR_ENDARG
170-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
170+
data << Token.new(lineno, column, __method__, tok, @lex_state)
171171
end
172172

173173
def on_imaginary(tok, data)
174174
@lex_state = EXPR_END | EXPR_ENDARG
175-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
175+
data << Token.new(lineno, column, __method__, tok, @lex_state)
176176
end
177177

178178
def on_symbeg(tok, data)
179179
@lex_state = EXPR_FNAME
180180
@continue = true
181181
@in_fname = true
182-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
182+
data << Token.new(lineno, column, __method__, tok, @lex_state)
183183
end
184184

185185
private def on_variables(event, tok, data)
@@ -198,7 +198,7 @@ def on_symbeg(tok, data)
198198
else
199199
@lex_state = EXPR_CMDARG
200200
end
201-
@callback.call(Token.new(lineno, column, event, tok, @lex_state))
201+
data << Token.new(lineno, column, event, tok, @lex_state)
202202
end
203203

204204
def on_ident(tok, data)
@@ -227,32 +227,32 @@ def on_backref(tok, data)
227227

228228
def on_lparen(tok, data)
229229
@lex_state = EXPR_LABEL | EXPR_BEG
230-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
230+
data << Token.new(lineno, column, __method__, tok, @lex_state)
231231
end
232232

233233
def on_rparen(tok, data)
234234
@lex_state = EXPR_ENDFN
235-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
235+
data << Token.new(lineno, column, __method__, tok, @lex_state)
236236
end
237237

238238
def on_lbrace(tok, data)
239239
@lex_state = EXPR_LABEL | EXPR_BEG
240-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
240+
data << Token.new(lineno, column, __method__, tok, @lex_state)
241241
end
242242

243243
def on_rbrace(tok, data)
244244
@lex_state = EXPR_ENDARG
245-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
245+
data << Token.new(lineno, column, __method__, tok, @lex_state)
246246
end
247247

248248
def on_lbracket(tok, data)
249249
@lex_state = EXPR_LABEL | EXPR_BEG
250-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
250+
data << Token.new(lineno, column, __method__, tok, @lex_state)
251251
end
252252

253253
def on_rbracket(tok, data)
254254
@lex_state = EXPR_ENDARG
255-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
255+
data << Token.new(lineno, column, __method__, tok, @lex_state)
256256
end
257257

258258
def on_const(tok, data)
@@ -264,41 +264,43 @@ def on_const(tok, data)
264264
else
265265
@lex_state = EXPR_CMDARG
266266
end
267-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
267+
data << Token.new(lineno, column, __method__, tok, @lex_state)
268268
end
269269

270270
def on_sp(tok, data)
271-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
271+
data << Token.new(lineno, column, __method__, tok, @lex_state)
272272
end
273273

274274
def on_comma(tok, data)
275275
@lex_state = EXPR_BEG | EXPR_LABEL if (EXPR_ARG_ANY & @lex_state) != 0
276-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
276+
data << Token.new(lineno, column, __method__, tok, @lex_state)
277277
end
278278

279279
def on_comment(tok, data)
280280
@lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
281-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
281+
data << Token.new(lineno, column, __method__, tok, @lex_state)
282282
end
283283

284284
def on_ignored_sp(tok, data)
285285
@lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
286-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
286+
data << Token.new(lineno, column, __method__, tok, @lex_state)
287+
end
288+
289+
def on_heredoc_beg(tok, data)
290+
data << Token.new(lineno, column, __method__, tok, @lex_state)
291+
@lex_state = EXPR_END
292+
data
287293
end
288294

289295
def on_heredoc_end(tok, data)
290-
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
296+
data << Token.new(lineno, column, __method__, tok, @lex_state)
291297
@lex_state = EXPR_BEG
298+
data
292299
end
293300

294301
def on_default(event, tok, data)
295302
reset
296-
@callback.call(Token.new(lineno, column, event, tok, @lex_state))
297-
end
298-
299-
def each(&block)
300-
@callback = block
301-
parse
303+
data << Token.new(lineno, column, event, tok, @lex_state)
302304
end
303305
end unless RIPPER_HAS_LEX_STATE
304306

@@ -308,21 +310,17 @@ def initialize(code)
308310
end
309311

310312
def on_default(event, tok, data)
311-
@callback.call(Token.new(lineno, column, event, tok, state))
312-
end
313-
314-
def each(&block)
315-
@callback = block
316-
parse
313+
data << Token.new(lineno, column, event, tok, state)
317314
end
318315
end if RIPPER_HAS_LEX_STATE
319316

320317
def get_squashed_tk
321318
if @buf.empty?
322-
tk = @inner_lex_enumerator.next
319+
tk = @tokens.shift
323320
else
324321
tk = @buf.shift
325322
end
323+
return nil if tk.nil?
326324
case tk[:kind]
327325
when :on_symbeg then
328326
tk = get_symbol_tk(tk)
@@ -472,7 +470,7 @@ def get_squashed_tk
472470
string = ''
473471
start_tk = nil
474472
prev_tk = nil
475-
until heredoc_end?(heredoc_name, indent, tk = @inner_lex_enumerator.next) do
473+
until heredoc_end?(heredoc_name, indent, tk = @tokens.shift) do
476474
start_tk = tk unless start_tk
477475
if (prev_tk.nil? or "\n" == prev_tk[:text][-1]) and 0 != tk[:char_no]
478476
string = string + (' ' * tk[:char_no])
@@ -570,11 +568,7 @@ def initialize(code)
570568
@buf = []
571569
@heredoc_queue = []
572570
@inner_lex = InnerStateLex.new(code)
573-
@inner_lex_enumerator = Enumerator.new do |y|
574-
@inner_lex.each do |tk|
575-
y << tk
576-
end
577-
end
571+
@tokens = @inner_lex.parse([])
578572
end
579573

580574
def self.parse(code)

0 commit comments

Comments
 (0)