@@ -214,7 +214,7 @@ func (fj *flattenJSON) readObject(pathNode SegmentsTreeTracker) error {
214214 }
215215
216216 var val []byte
217- isQNumber := false
217+ isNumber := false
218218 switch ch {
219219 case '"' :
220220 if fj .skipping > 0 || ! memberIsUsed {
@@ -233,7 +233,10 @@ func (fj *flattenJSON) readObject(pathNode SegmentsTreeTracker) error {
233233 val , err = fj .readLiteral (nullBytes )
234234 isLeaf = true
235235 case '-' , '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
236- val , isQNumber , err = fj .readNumber ()
236+ val , err = fj .readNumber ()
237+ if err == nil {
238+ isNumber = true
239+ }
237240 isLeaf = true
238241 case '[' :
239242 if ! pathNode .IsSegmentUsed (memberName ) {
@@ -296,7 +299,7 @@ func (fj *flattenJSON) readObject(pathNode SegmentsTreeTracker) error {
296299 }
297300 if val != nil {
298301 if memberIsUsed {
299- fj .storeObjectMemberField (pathNode .PathForSegment (memberName ), arrayTrail , val , isQNumber )
302+ fj .storeObjectMemberField (pathNode .PathForSegment (memberName ), arrayTrail , val , isNumber )
300303 fieldsCount --
301304 }
302305 }
@@ -340,7 +343,7 @@ func (fj *flattenJSON) readArray(pathName []byte, pathNode SegmentsTreeTracker)
340343 for {
341344 ch := fj .ch ()
342345 var val []byte // resets on each loop
343- isQNumber := false
346+ isNumber := false
344347 switch state {
345348 case fjInArrayState :
346349 // bypass space before element value. A bit klunky but allows for immense simplification
@@ -365,7 +368,10 @@ func (fj *flattenJSON) readArray(pathName []byte, pathNode SegmentsTreeTracker)
365368 val , err = fj .readLiteral (nullBytes )
366369 isLeaf = true
367370 case '-' , '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
368- val , isQNumber , err = fj .readNumber ()
371+ val , err = fj .readNumber ()
372+ if err == nil {
373+ isNumber = true
374+ }
369375 isLeaf = true
370376 case '{' :
371377 if fj .skipping == 0 {
@@ -398,7 +404,7 @@ func (fj *flattenJSON) readArray(pathName []byte, pathNode SegmentsTreeTracker)
398404 if val != nil {
399405 if fj .skipping == 0 {
400406 fj .stepOneArrayElement ()
401- fj .storeArrayElementField (pathName , val , isQNumber )
407+ fj .storeArrayElementField (pathName , val , isNumber )
402408 }
403409 }
404410 state = fjAfterValueState
@@ -427,13 +433,10 @@ func (fj *flattenJSON) readArray(pathName []byte, pathNode SegmentsTreeTracker)
427433 * these higher-level funcs are going to advance the pointer after each invocation
428434 */
429435
430- func (fj * flattenJSON ) readNumber () ([]byte , bool , error ) {
436+ func (fj * flattenJSON ) readNumber () ([]byte , error ) {
431437 // points at the first character in the number
432438 numStart := fj .eventIndex
433439 state := fjNumberStartState
434- isQNumber := false
435- fracStart := 0
436- expStart := 0
437440 for {
438441 ch := fj .ch ()
439442 switch state {
@@ -450,38 +453,33 @@ func (fj *flattenJSON) readNumber() ([]byte, bool, error) {
450453 // no-op
451454 case '.' :
452455 state = fjNumberFracState
453- fracStart = fj .eventIndex + 1
454456 case 'e' , 'E' :
455457 state = fjNumberAfterEState
456- expStart = fj .eventIndex + 1
457458 case ',' , ']' , '}' , ' ' , '\t' , '\n' , '\r' :
458459 fj .eventIndex --
459- return fj .event [numStart : fj .eventIndex + 1 ], true , nil
460+ return fj .event [numStart : fj .eventIndex + 1 ], nil
460461 default :
461- return nil , false , fj .error (fmt .Sprintf ("illegal char '%c' in number" , ch ))
462+ return nil , fj .error (fmt .Sprintf ("illegal char '%c' in number" , ch ))
462463 }
463464 case fjNumberFracState :
464465 switch ch {
465466 case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
466467 // no-op
467468 case ',' , ']' , '}' , ' ' , '\t' , '\n' , '\r' :
468- fractionalDigits := (expStart - 1 ) - fracStart
469- isQNumber = fractionalDigits <= MaxFractionalDigits
470469 fj .eventIndex --
471470 bytes := fj .event [numStart : fj .eventIndex + 1 ]
472- return bytes , isQNumber , nil
471+ return bytes , nil
473472 case 'e' , 'E' :
474473 state = fjNumberAfterEState
475- expStart = fj .eventIndex + 1
476474 default :
477- return nil , false , fj .error (fmt .Sprintf ("illegal char '%c' in number" , ch ))
475+ return nil , fj .error (fmt .Sprintf ("illegal char '%c' in number" , ch ))
478476 }
479477 case fjNumberAfterEState :
480478 switch ch {
481479 case '-' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
482480 // no-op
483481 default :
484- return nil , false , fj .error (fmt .Sprintf ("illegal char '%c' after 'e' in number" , ch ))
482+ return nil , fj .error (fmt .Sprintf ("illegal char '%c' after 'e' in number" , ch ))
485483 }
486484 state = fjNumberExpState
487485
@@ -490,27 +488,14 @@ func (fj *flattenJSON) readNumber() ([]byte, bool, error) {
490488 case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
491489 // no-op
492490 case ',' , ']' , '}' , ' ' , '\t' , '\n' , '\r' :
493- fractionalDigits := 0
494- if fracStart != 0 {
495- fractionalDigits = (expStart - 1 ) - fracStart
496- if fractionalDigits > MaxFractionalDigits {
497- if expStart != 0 {
498- exp , err := strconv .ParseInt (string (fj .event [expStart :fj .eventIndex ]), 10 , 32 )
499- if err == nil {
500- fractionalDigits -= int (exp )
501- }
502- }
503- }
504- }
505- isQNumber = fractionalDigits <= MaxFractionalDigits
506491 fj .eventIndex --
507- return fj .event [numStart : fj .eventIndex + 1 ], isQNumber , nil
492+ return fj .event [numStart : fj .eventIndex + 1 ], nil
508493 default :
509- return nil , false , fj .error (fmt .Sprintf ("illegal char '%c' in exponent" , ch ))
494+ return nil , fj .error (fmt .Sprintf ("illegal char '%c' in exponent" , ch ))
510495 }
511496 }
512497 if fj .step () != nil {
513- return nil , false , fj .error ("event truncated in number" )
498+ return nil , fj .error ("event truncated in number" )
514499 }
515500 }
516501}
@@ -811,6 +796,8 @@ func (fj *flattenJSON) readHexUTF16(from int) ([]byte, int, error) {
811796 if hexDigitCount == 4 {
812797 hexString := string (fj .event [from - 3 : from + 1 ])
813798 r , _ := strconv .ParseUint (hexString , 16 , 16 )
799+ // parsing 4 hex digits can't overflow a uint16
800+ //nolint:gosec
814801 codepoints = append (codepoints , uint16 (r ))
815802 state = fjStartEscapeState
816803 }
@@ -831,14 +818,14 @@ func (fj *flattenJSON) readHexUTF16(from int) ([]byte, int, error) {
831818// its own snapshot of the array-trail data, because it'll be different for each array element
832819// NOTE: The profiler says this is the most expensive function in the whole matchesForJSONEvent universe, presumably
833820// because of the necessity to construct a new arrayTrail for each element.
834- func (fj * flattenJSON ) storeArrayElementField (path []byte , val []byte , isQNumber bool ) {
835- f := Field {Path : path , ArrayTrail : make ([]ArrayPos , len (fj .arrayTrail )), Val : val , IsQNumber : isQNumber }
821+ func (fj * flattenJSON ) storeArrayElementField (path []byte , val []byte , isNumber bool ) {
822+ f := Field {Path : path , ArrayTrail : make ([]ArrayPos , len (fj .arrayTrail )), Val : val , IsNumber : isNumber }
836823 copy (f .ArrayTrail , fj .arrayTrail )
837824 fj .fields = append (fj .fields , f )
838825}
839826
840- func (fj * flattenJSON ) storeObjectMemberField (path []byte , arrayTrail []ArrayPos , val []byte , isQNumber bool ) {
841- fj .fields = append (fj .fields , Field {Path : path , ArrayTrail : arrayTrail , Val : val , IsQNumber : isQNumber })
827+ func (fj * flattenJSON ) storeObjectMemberField (path []byte , arrayTrail []ArrayPos , val []byte , isNumber bool ) {
828+ fj .fields = append (fj .fields , Field {Path : path , ArrayTrail : arrayTrail , Val : val , IsNumber : isNumber })
842829}
843830
844831func (fj * flattenJSON ) enterArray () {
0 commit comments