parser 2.3.0.3 → 2.3.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 32b8e79e47ae5063bd6a4451c47b337f43d5a2a2
4
- data.tar.gz: c8d08375dca4b4089fa0dade5d77f13284498852
3
+ metadata.gz: 1cb171255b96bf71809258731c221082841d8af1
4
+ data.tar.gz: 2ef132309fc78e96f665e60bdbfecb389f4bda6d
5
5
  SHA512:
6
- metadata.gz: 039b018cd53937074f6a0eb1b366c5d83c0de6ed104a3ca63597b265c695f010e2ae85fdee74bc9c00418510e386e9fc7e2ff44dd9dc9ead2ddef5cc3ef0ec1e
7
- data.tar.gz: 4b8b8b3497d1034e4662aa8ad3cf85c57cd65cb73e038bf7737c63db832d719714aa2bafd2fef5dcdb85d2ee4342ef3c4c8ceb5d26f3abc5cfed67e4c6902aff
6
+ metadata.gz: 9f374c086ac8fff2fb0dfc2d0cfb9badc4e6da09b9612992c51e3207bdeff35491ccd7edb13e07b0f7dfe31bd9129df31bf4a4d550f58d9534bc9fdf55c6b064
7
+ data.tar.gz: f1821293d14bf5716f5c9e3d8f9af4d6eb7f84f05f3fed3552521770b33add9fd639502c6949c9c04a61775b275d208a199e3261b01c5b1082cf624c37968532
@@ -4,7 +4,6 @@ rvm:
4
4
  - 1.9.2
5
5
  - 1.9.3
6
6
  - 2.0.0
7
- - 2.1.8
8
7
  - 2.2.4
9
8
  - 2.3.0
10
9
  - ruby-head
@@ -1,6 +1,9 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ v2.3.0.4 (2016-02-09)
5
+ ---------------------
6
+
4
7
  v2.3.0.3 (2016-02-06)
5
8
  ---------------------
6
9
 
@@ -14,7 +17,7 @@ Bugs fixed:
14
17
  * Add :csend to Parser::Meta::NODE_TYPES (Markus Schirp)
15
18
  * lexer/dedenter: "\<\<x\n y\\n z\nx": don't dedent after escaped newline. (whitequark)
16
19
 
17
- v2.3.0.3 (2016-01-16)
20
+ v2.3.0.4 (2016-01-16)
18
21
  ---------------------
19
22
 
20
23
  v2.3.0.1 (2016-01-14)
@@ -19,7 +19,7 @@
19
19
  # they're pointing to ("current"), plus one. `@ts` contains the index
20
20
  # of the corresponding character. The code for extracting matched token is:
21
21
  #
22
- # @source[@ts...@te]
22
+ # @source_buffer.slice(@ts...@te)
23
23
  #
24
24
  # * If your input is `foooooooobar` and the rule is:
25
25
  #
@@ -109,8 +109,6 @@ class Parser::Lexer
109
109
  @tokens = nil
110
110
  @comments = nil
111
111
 
112
- @has_encode = ''.respond_to?(:encode)
113
-
114
112
  reset
115
113
  end
116
114
 
@@ -128,10 +126,7 @@ class Parser::Lexer
128
126
 
129
127
  @force_utf32 = false # Set to true by some tests
130
128
 
131
- @source = nil # source string
132
129
  @source_pts = nil # @source as a codepoint array
133
- @encoding = nil # target encoding for output strings
134
- @need_encode = nil
135
130
 
136
131
  @p = 0 # stream position (saved manually in #advance)
137
132
  @ts = nil # token start
@@ -186,33 +181,12 @@ class Parser::Lexer
186
181
  @source_buffer = source_buffer
187
182
 
188
183
  if @source_buffer
189
- @source = @source_buffer.source
190
- @need_encode = false
191
-
192
- @encoding = @source.encoding if @has_encode
184
+ source = @source_buffer.source
193
185
 
194
- if @has_encode && @source.encoding == Encoding::UTF_8
195
- @source_pts = @source.unpack('U*')
186
+ if source.respond_to?(:encode) && source.encoding == Encoding::UTF_8
187
+ @source_pts = source.unpack('U*')
196
188
  else
197
- @source_pts = @source.unpack('C*')
198
- end
199
-
200
- if @has_encode &&
201
- (@source_pts.size > 1_000_000 || @force_utf32) &&
202
- @encoding != Encoding::UTF_32LE
203
- # A heuristic: if the buffer is larger than 1M, then
204
- # store it in UTF-32 and convert the tokens as they're
205
- # going out. If it's smaller, the conversion overhead
206
- # dominates runtime and this stops being beneficial.
207
- #
208
- # This is not really a good heuristic, as the result
209
- # heavily depends on token/character ratio. If it's low,
210
- # say the gem consists mostly of long identifiers and
211
- # symbols, then storing the source in UTF-8 would be faster.
212
- #
213
- # Patches accepted.
214
- @source = @source.encode(Encoding::UTF_32LE)
215
- @need_encode = true
189
+ @source_pts = source.unpack('C*')
216
190
  end
217
191
 
218
192
  if @source_pts[0] == 0xfeff
@@ -220,7 +194,6 @@ class Parser::Lexer
220
194
  @p = 1
221
195
  end
222
196
  else
223
- @source = nil
224
197
  @source_pts = nil
225
198
  end
226
199
  end
@@ -327,24 +300,24 @@ class Parser::Lexer
327
300
  versions.include?(@version)
328
301
  end
329
302
 
303
+ def stack_pop
304
+ @top -= 1
305
+ @stack[@top]
306
+ end
307
+
330
308
  if "".respond_to?(:encode)
331
309
  def encode_escape(ord)
332
- ord.chr.force_encoding(@encoding)
310
+ ord.chr.force_encoding(source_buffer.source.encoding)
333
311
  end
334
312
 
335
- def tok(s = @ts, e = @te)
336
- source = @source[s...e]
337
- return source unless @need_encode
338
- source.encode(@encoding)
339
- end
340
313
  else
341
314
  def encode_escape(ord)
342
315
  ord.chr
343
316
  end
317
+ end
344
318
 
345
- def tok(s = @ts, e = @te)
346
- @source[s...e]
347
- end
319
+ def tok(s = @ts, e = @te)
320
+ @source_buffer.slice(s...e)
348
321
  end
349
322
 
350
323
  def range(s = @ts, e = @te)
@@ -707,13 +680,13 @@ class Parser::Lexer
707
680
 
708
681
  maybe_escaped_char = (
709
682
  '\\' c_any %unescape_char
710
- | ( c_any - [\\] ) % { @escape = @source[p - 1].chr }
683
+ | ( c_any - [\\] ) % { @escape = @source_buffer.slice(p - 1).chr }
711
684
  );
712
685
 
713
686
  maybe_escaped_ctrl_char = ( # why?!
714
687
  '\\' c_any %unescape_char %slash_c_char
715
688
  | '?' % { @escape = "\x7f" }
716
- | ( c_any - [\\?] ) % { @escape = @source[p - 1].chr } %slash_c_char
689
+ | ( c_any - [\\?] ) % { @escape = @source_buffer.slice(p - 1).chr } %slash_c_char
717
690
  );
718
691
 
719
692
  escape = (
@@ -840,8 +813,7 @@ class Parser::Lexer
840
813
 
841
814
  # tLABEL_END is only possible in non-cond context on >= 2.2
842
815
  if @version >= 22 && !@cond.active?
843
- lookahead = @source[@te...@te+2]
844
- lookahead = lookahead.encode(@encoding) if @need_encode
816
+ lookahead = @source_buffer.slice(@te...@te+2)
845
817
  end
846
818
 
847
819
  current_literal = literal
@@ -863,7 +835,7 @@ class Parser::Lexer
863
835
  action extend_string_escaped {
864
836
  current_literal = literal
865
837
  # Get the first character after the backslash.
866
- escaped_char = @source[@escape_s].chr
838
+ escaped_char = @source_buffer.slice(@escape_s).chr
867
839
 
868
840
  if current_literal.munge_escape? escaped_char
869
841
  # If this particular literal uses this character as an opening
@@ -1022,7 +994,7 @@ class Parser::Lexer
1022
994
  end
1023
995
 
1024
996
  fhold;
1025
- fret;
997
+ fnext *stack_pop;
1026
998
  fbreak;
1027
999
  end
1028
1000
  end
@@ -1241,7 +1213,7 @@ class Parser::Lexer
1241
1213
  emit(:tGVAR)
1242
1214
  end
1243
1215
 
1244
- fret; fbreak;
1216
+ fnext *stack_pop; fbreak;
1245
1217
  };
1246
1218
 
1247
1219
  class_var_v
@@ -1251,7 +1223,7 @@ class Parser::Lexer
1251
1223
  end
1252
1224
 
1253
1225
  emit(:tCVAR)
1254
- fret; fbreak;
1226
+ fnext *stack_pop; fbreak;
1255
1227
  };
1256
1228
 
1257
1229
  instance_var_v
@@ -1261,7 +1233,7 @@ class Parser::Lexer
1261
1233
  end
1262
1234
 
1263
1235
  emit(:tIVAR)
1264
- fret; fbreak;
1236
+ fnext *stack_pop; fbreak;
1265
1237
  };
1266
1238
  *|;
1267
1239
 
@@ -1637,7 +1609,7 @@ class Parser::Lexer
1637
1609
  # %<string>
1638
1610
  '%' ( any - [A-Za-z] )
1639
1611
  => {
1640
- type, delimiter = @source[@ts].chr, tok[-1].chr
1612
+ type, delimiter = @source_buffer.slice(@ts).chr, tok[-1].chr
1641
1613
  fgoto *push_literal(type, delimiter, @ts);
1642
1614
  };
1643
1615
 
@@ -1732,7 +1704,7 @@ class Parser::Lexer
1732
1704
  '?' c_space_nl
1733
1705
  => {
1734
1706
  escape = { " " => '\s', "\r" => '\r', "\n" => '\n', "\t" => '\t',
1735
- "\v" => '\v', "\f" => '\f' }[@source[@ts + 1]]
1707
+ "\v" => '\v', "\f" => '\f' }[@source_buffer.slice(@ts + 1)]
1736
1708
  diagnostic :warning, :invalid_escape_use, { :escape => escape }, range
1737
1709
 
1738
1710
  p = @ts - 1
@@ -1805,7 +1777,7 @@ class Parser::Lexer
1805
1777
  if version?(18)
1806
1778
  ident = tok(@ts, @te - 2)
1807
1779
 
1808
- emit((@source[@ts] =~ /[A-Z]/) ? :tCONSTANT : :tIDENTIFIER,
1780
+ emit((@source_buffer.slice(@ts) =~ /[A-Z]/) ? :tCONSTANT : :tIDENTIFIER,
1809
1781
  ident, @ts, @te - 2)
1810
1782
  fhold; # continue as a symbol
1811
1783
 
@@ -242,7 +242,7 @@ module Parser
242
242
  # Prime the buffer with lexer encoding; otherwise,
243
243
  # concatenation will produce varying results.
244
244
  if defined?(Encoding)
245
- @buffer.force_encoding(@lexer.encoding)
245
+ @buffer.force_encoding(@lexer.source_buffer.source.encoding)
246
246
  end
247
247
 
248
248
  @buffer_s = nil
@@ -107,9 +107,12 @@ module Parser
107
107
  @lines = nil
108
108
  @line_begins = nil
109
109
 
110
+ # UTF-32-reencoded source for O(1) slicing
111
+ @slice_source = nil
112
+
110
113
  # Cache for fast lookup
111
- @line_for_position = {}
112
- @col_for_position = {}
114
+ @line_for_position = {}
115
+ @column_for_position = {}
113
116
  end
114
117
 
115
118
  ##
@@ -178,6 +181,21 @@ module Parser
178
181
  end
179
182
 
180
183
  @source = input.gsub("\r\n".freeze, "\n".freeze).freeze
184
+
185
+ if defined?(Encoding) &&
186
+ !@source.ascii_only? &&
187
+ @source.encoding != Encoding::UTF_32LE &&
188
+ @source.encoding != Encoding::BINARY
189
+ @slice_source = @source.encode(Encoding::UTF_32LE)
190
+ end
191
+ end
192
+
193
+ def slice(range)
194
+ if @slice_source.nil?
195
+ @source[range]
196
+ else
197
+ @slice_source[range].encode(@source.encoding)
198
+ end
181
199
  end
182
200
 
183
201
  ##
@@ -214,7 +232,7 @@ module Parser
214
232
  # @api private
215
233
  #
216
234
  def column_for_position(position)
217
- @col_for_position[position] ||= begin
235
+ @column_for_position[position] ||= begin
218
236
  _, line_begin = line_for(position)
219
237
  position - line_begin
220
238
  end
@@ -126,7 +126,7 @@ module Parser
126
126
  # @return [String] all source code covered by this range.
127
127
  #
128
128
  def source
129
- @source_buffer.source[self.begin_pos...self.end_pos]
129
+ @source_buffer.slice(self.begin_pos...self.end_pos)
130
130
  end
131
131
 
132
132
  ##
@@ -1,3 +1,3 @@
1
1
  module Parser
2
- VERSION = '2.3.0.3'
2
+ VERSION = '2.3.0.4'
3
3
  end
@@ -5330,6 +5330,16 @@ class TestParser < Minitest::Test
5330
5330
  ALL_VERSIONS - %w(1.8))
5331
5331
  end
5332
5332
 
5333
+ def test_parser_bug_272
5334
+ assert_parses(
5335
+ s(:block,
5336
+ s(:send, nil, :a,
5337
+ s(:ivar, :@b)),
5338
+ s(:args,
5339
+ s(:arg, :c)), nil),
5340
+ %q{a @b do |c|;end})
5341
+ end
5342
+
5333
5343
  def test_bug_lambda_leakage
5334
5344
  assert_parses(
5335
5345
  s(:begin,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0.3
4
+ version: 2.3.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - whitequark
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-06 00:00:00.000000000 Z
11
+ date: 2016-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ast