@@ -626,32 +626,18 @@ func trace(args ...interface{}) func() {
626
626
func yaml_parser_fetch_more_tokens (parser * yaml_parser_t ) bool {
627
627
// While we need more tokens to fetch, do it.
628
628
for {
629
- // Check if we really need to fetch more tokens.
630
- need_more_tokens := false
631
-
632
- if parser .tokens_head == len (parser .tokens ) {
633
- // Queue is empty.
634
- need_more_tokens = true
635
- } else {
636
- // Check if any potential simple key may occupy the head position.
637
- for i := len (parser .simple_keys ) - 1 ; i >= 0 ; i -- {
638
- simple_key := & parser .simple_keys [i ]
639
- if simple_key .token_number < parser .tokens_parsed {
640
- break
641
- }
642
- if valid , ok := yaml_simple_key_is_valid (parser , simple_key ); ! ok {
643
- return false
644
- } else if valid && simple_key .token_number == parser .tokens_parsed {
645
- need_more_tokens = true
646
- break
647
- }
629
+ if parser .tokens_head != len (parser .tokens ) {
630
+ // If queue is non-empty, check if any potential simple key may
631
+ // occupy the head position.
632
+ head_tok_idx , ok := parser .simple_keys_by_tok [parser .tokens_parsed ]
633
+ if ! ok {
634
+ break
635
+ } else if valid , ok := yaml_simple_key_is_valid (parser , & parser .simple_keys [head_tok_idx ]); ! ok {
636
+ return false
637
+ } else if ! valid {
638
+ break
648
639
}
649
640
}
650
-
651
- // We are finished.
652
- if ! need_more_tokens {
653
- break
654
- }
655
641
// Fetch the next token.
656
642
if ! yaml_parser_fetch_next_token (parser ) {
657
643
return false
@@ -883,6 +869,7 @@ func yaml_parser_save_simple_key(parser *yaml_parser_t) bool {
883
869
return false
884
870
}
885
871
parser .simple_keys [len (parser .simple_keys )- 1 ] = simple_key
872
+ parser .simple_keys_by_tok [simple_key .token_number ] = len (parser .simple_keys ) - 1
886
873
}
887
874
return true
888
875
}
@@ -897,9 +884,10 @@ func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool {
897
884
"while scanning a simple key" , parser .simple_keys [i ].mark ,
898
885
"could not find expected ':'" )
899
886
}
887
+ // Remove the key from the stack.
888
+ parser .simple_keys [i ].possible = false
889
+ delete (parser .simple_keys_by_tok , parser .simple_keys [i ].token_number )
900
890
}
901
- // Remove the key from the stack.
902
- parser .simple_keys [i ].possible = false
903
891
return true
904
892
}
905
893
@@ -930,7 +918,9 @@ func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
930
918
func yaml_parser_decrease_flow_level (parser * yaml_parser_t ) bool {
931
919
if parser .flow_level > 0 {
932
920
parser .flow_level --
933
- parser .simple_keys = parser .simple_keys [:len (parser .simple_keys )- 1 ]
921
+ last := len (parser .simple_keys ) - 1
922
+ delete (parser .simple_keys_by_tok , parser .simple_keys [last ].token_number )
923
+ parser .simple_keys = parser .simple_keys [:last ]
934
924
}
935
925
return true
936
926
}
@@ -1007,6 +997,8 @@ func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool {
1007
997
// Initialize the simple key stack.
1008
998
parser .simple_keys = append (parser .simple_keys , yaml_simple_key_t {})
1009
999
1000
+ parser .simple_keys_by_tok = make (map [int ]int )
1001
+
1010
1002
// A simple key is allowed at the beginning of the stream.
1011
1003
parser .simple_key_allowed = true
1012
1004
@@ -1310,6 +1302,7 @@ func yaml_parser_fetch_value(parser *yaml_parser_t) bool {
1310
1302
1311
1303
// Remove the simple key.
1312
1304
simple_key .possible = false
1305
+ delete (parser .simple_keys_by_tok , simple_key .token_number )
1313
1306
1314
1307
// A simple key cannot follow another simple key.
1315
1308
parser .simple_key_allowed = false
0 commit comments