chiark / gitweb /
Move more regexps to state vars to spend less time in regexp compilation at runtime
authorJeff Ober <jober@ziprecruiter.com>
Fri, 17 Jan 2020 15:25:50 +0000 (10:25 -0500)
committerJeff Ober <jober@ziprecruiter.com>
Fri, 17 Jan 2020 15:25:50 +0000 (10:25 -0500)
lib/TOML/Tiny/Tokenizer.pm

index 012838f51d93daa68abc9461b88b3ebea71d6369..0e2b584a598860a2dc4803b29c3baf0d90da5013 100644 (file)
@@ -51,9 +51,15 @@ sub next_token {
 
   my $token;
 
-  state $key = qr/(?&Key) $TOML/x;
-  state $table = qr/\G \[ [\x20 \x09]* ($key) [\x20 \x09]* \] [\x20 \x09]* (?= (:? \x23 .* )? (?: \x0D? \x0A) | $ )/x;
+  state $key         = qr/(?&Key) $TOML/x;
+  state $key_set     = qr/\G ($key) [\x20 \x09]* (?= =)/x;
+  state $table       = qr/\G \[ [\x20 \x09]* ($key) [\x20 \x09]* \] [\x20 \x09]* (?= (:? \x23 .* )? (?: \x0D? \x0A) | $ )/x;
   state $array_table = qr/\G \[\[ [\x20 \x09]* ($key) [\x20 \x09]* \]\] [\x20 \x09]* (?= (:? \x23 .* )? (?: \x0D? \x0A) | $ )/x;
+  state $bool        = qr/\G ((?&Boolean)) $TOML/x;
+  state $string      = qr/\G ((?&String)) $TOML/x;
+  state $datetime    = qr/\G ((?&DateTime)) $TOML/x;
+  state $float       = qr/\G ((?&Float)) $TOML/x;
+  state $integer     = qr/\G ((?&Integer)) $TOML/x;
 
   while ($self->{position} < $self->{last_position} && !$token) {
     my $prev = $self->prev_token_type;
@@ -104,27 +110,27 @@ sub next_token {
         $token = $self->_make_token('comma', $1);
       }
 
-      when (/\G ($key) [\x20 \x09]* (?= =)/xgc) {
+      when (/$key_set/xgc) {
         $token = $self->_make_token('key', $1);
       }
 
-      when (/\G ((?&Boolean)) $TOML/xgc) {
+      when (/$bool/xgc) {
         $token = $self->_make_token('bool', $1);
       }
 
-      when (/\G ((?&String)) $TOML/xgc) {
+      when (/$string/xgc) {
         $token = $self->_make_token('string', $1);
       }
 
-      when (/\G ((?&DateTime)) $TOML/xgc) {
+      when (/$datetime/xgc) {
         $token = $self->_make_token('datetime', $1);
       }
 
-      when (/\G ((?&Float)) $TOML/xgc) {
+      when (/$float/xgc) {
         $token = $self->_make_token('float', $1);
       }
 
-      when (/\G ((?&Integer)) $TOML/xgc) {
+      when (/$integer/xgc) {
         $token = $self->_make_token('integer', $1);
       }