regcomp.sym: longj field is a boolean
authorKarl Williamson <khw@cpan.org>
Mon, 12 Nov 2018 04:48:53 +0000 (21:48 -0700)
committerKarl Williamson <khw@cpan.org>
Fri, 16 Nov 2018 16:21:35 +0000 (09:21 -0700)
The comments could lead one to thinking one could specify any of the
argument fields that nodes can have.  But in fact, the value is a
boolean, 0 meaning to use the normal offset field of all regnodes; and 1
meaning to use the ARG field that some regnodes have.  If a regnode had
more than just the one argument field, the one that corresponds to that
would be used.

This commit enforces that, and changes regcomp.sym to not use  '2',
which is misleading.

It clarifies the comments about this and what '.' means in the flags
field

pod/perldebguts.pod
regcomp.sym
regen/regcomp.pl
regnodes.h

index 94b83fe..080daac 100644 (file)
@@ -737,8 +737,8 @@ will be lost.
  BRANCHJ          off 1 1    BRANCH with long offset.
 
  # Special Case Regops
- IFMATCH          off 1 2    Succeeds if the following matches.
- UNLESSM          off 1 2    Fails if the following matches.
+ IFMATCH          off 1 1    Succeeds if the following matches.
+ UNLESSM          off 1 1    Fails if the following matches.
  SUSPEND          off 1 1    "Independent" sub-RE.
  IFTHEN           off 1 1    Switch, should be preceded by switcher.
  GROUPP           num 1      Whether the group matched.
index f275c7b..6305bfb 100644 (file)
 # Note that the order in this file is important.
 #
 # Format for first section: 
-# NAME \s+ TYPE, arg-description [num-args] [flags] [longjump-len] ; DESCRIPTION
-#   flag <S> means is REGNODE_SIMPLE; flag <V> means is REGNODE_VARIES
+# NAME \s+ TYPE, arg-description [num-args] [flags] [longjump] ; DESCRIPTION
+#   flag <S> means is REGNODE_SIMPLE; flag <V> means is REGNODE_VARIES; <.> is
+#   a placeholder
+#   longjump is 1 if the (first) argument holds the next offset.
 #
 #
 # run perl regen.pl after editing this file
@@ -162,8 +164,8 @@ LONGJMP     LONGJMP,    off 1 . 1 ; Jump far away.
 BRANCHJ     BRANCHJ,    off 1 V 1 ; BRANCH with long offset.
 
 #*Special Case Regops
-IFMATCH     BRANCHJ,    off 1 . 2 ; Succeeds if the following matches.
-UNLESSM     BRANCHJ,    off 1 . 2 ; Fails if the following matches.
+IFMATCH     BRANCHJ,    off 1 . 1 ; Succeeds if the following matches.
+UNLESSM     BRANCHJ,    off 1 . 1 ; Fails if the following matches.
 SUSPEND     BRANCHJ,    off 1 V 1 ; "Independent" sub-RE.
 IFTHEN      BRANCHJ,    off 1 V 1 ; Switch, should be preceded by switcher.
 GROUPP      GROUPP,     num 1     ; Whether the group matched.
index ffb7d7a..cb98613 100644 (file)
@@ -54,7 +54,7 @@ use strict;
 # code          Op      what code is associated with this node (???)
 # args          Op      what type of args the node has (which regnode struct)
 # flags         Op      (???)
-# longj         Op      Whether this node is a longjump
+# longj         Op      Boolean as to if this node is a longjump
 # comment       Both    Comment about node, if any
 # pod_comment   Both    Special comments for pod output (preceding lines in def)
 
@@ -89,6 +89,11 @@ sub register_node {
     $node->{id}= 0 + @all;
     push @all, $node;
     $all{ $node->{name} }= $node;
+
+    if ($node->{longj} && $node->{longj} != 1) {
+        die "longj field must be in [01] if present in ", Dumper($node);
+    }
+
 }
 
 # Parse and add an opcode definition to the global state.
index 849d2ec..f94b16b 100644 (file)
@@ -479,8 +479,8 @@ static const char reg_off_by_arg[] = {
        0,      /* NREFFA       */
        1,      /* LONGJMP      */
        1,      /* BRANCHJ      */
-       2,      /* IFMATCH      */
-       2,      /* UNLESSM      */
+       1,      /* IFMATCH      */
+       1,      /* UNLESSM      */
        1,      /* SUSPEND      */
        1,      /* IFTHEN       */
        0,      /* GROUPP       */