Разваливается if с goto внутри

Issue #77 new
xdasm-admin created an issue

Тестовый код:

<?php
TOKENIZER_TOP:
        if ($context === 0x00 && $currentChar === '/' && $currentWord === '/**') {
            $MACRO_TOKEN_SET_TYPE('ANNOTATION_COMMENTSTART');
            $MACRO_TOKEN_APPEND_WORD();
            $MACRO_TOKEN_ADVANCE();
            $context |= $CONTEXT_DOCBLOCK;
            $context |= $CONTEXT_ASTERISK;
            if ($MACRO_STREAM_ADVANCE_WORD() === false) {
                goto TOKENIZER_END;
            }
            goto TOKENIZER_TOP;
        }
        if ($MACRO_HAS_CONTEXT($CONTEXT_CLASS)) {
            if (in_array($currentChar, [' ', '(', "\n", "\r"])) {
                $context &= ~$CONTEXT_CLASS;
                $MACRO_TOKEN_ADVANCE();
            } else {
                $MACRO_TOKEN_APPEND_CHAR();
                if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
                    goto TOKENIZER_END;
                }
                goto TOKENIZER_TOP;
            }
        }

TOKENIZER_END:

Результат:

<?php


/*
0  3   IS_IDENTICAL              #0=       $context             0                       ;0  <<23,50
1  3   JMPZ_EX                   #0=       #0:$currentWord === "/**" ?4                     ;0  >>4
2  3   IS_IDENTICAL              #1=       $currentChar         "/"                     ;0
3  3   BOOL                      #0=       #1:$currentChar === "/" ?0                   ;0
4  3   JMPZ_EX                   #0=       #0:$currentWord === "/**" ?7                     ;0  >>7 <<1
5  3   IS_IDENTICAL              #2=       $currentWord         "/**"                   ;0
6  3   BOOL                      #0=       #2:$currentWord === "/**" ?0                     ;0
7  3   JMPZ                      ?0        #0:$currentWord === "/**" ?25                    ;0  >>25    <<4
8  4   INIT_FCALL_BY_NAME        ?0        ?0                   $MACRO_TOKEN_SET_TYPE   ;0
9  4   SEND_VAL                  ?0        "ANNOTATION_COMMENTSTART" ?1                     ;61
10 4   DO_FCALL_BY_NAME                    ?0                   ?0                      ;1
11 5   INIT_FCALL_BY_NAME        ?0        ?0                   $MACRO_TOKEN_APPEND_WORD    ;0
12 5   DO_FCALL_BY_NAME                    ?0                   ?0                      ;0
13 6   INIT_FCALL_BY_NAME        ?0        ?0                   $MACRO_TOKEN_ADVANCE    ;0
14 6   DO_FCALL_BY_NAME                    ?0                   ?0                      ;0
15 7   ASSIGN_BW_OR                        $context             $CONTEXT_DOCBLOCK       ;0
16 8   ASSIGN_BW_OR                        $context             $CONTEXT_ASTERISK       ;0
17 9   INIT_FCALL_BY_NAME        ?0        ?0                   $MACRO_STREAM_ADVANCE_WORD  ;0
18 9   DO_FCALL_BY_NAME          $8=       ?0                   ?0                      ;0
19 9   IS_IDENTICAL              #9=       $8:$MACRO_STREAM_ADVANCE_WORD() false                ;0
20 9   JMPZ                      ?0        #9:$MACRO_STREAM_ADVANCE_WORD() === false ?23                    ;0  >>23
21 10  JMP                       ?0        ?52                  ?10099368               ;0  >>52
22 11  JMP                       ?0        ?23                  ?0                      ;0  >>23
23 12  JMP                       ?0        ?0                   ?6                      ;0  >>0 <<20,22
24 13  JMP                       ?0        ?25                  ?0                      ;0  >>25
25 14  INIT_FCALL_BY_NAME        ?0        ?0                   $MACRO_HAS_CONTEXT      ;0  <<7,24
26 14  SEND_VAR                  ?0        $CONTEXT_CLASS       ?1                      ;61
27 14  DO_FCALL_BY_NAME          $10=      ?0                   ?0                      ;1
28 14  JMPZ                      ?0        $10:$MACRO_HAS_CONTEXT($CONTEXT_CLASS) ?52                   ;0  >>52
29 15  SEND_VAR                  ?0        $currentChar         ?1                      ;60
30 15  INIT_ARRAY                #11=      " "                  ?0                      ;0
31 15  ADD_ARRAY_ELEMENT         #11=      "("                  ?0                      ;0
32 15  ADD_ARRAY_ELEMENT         #11=      "\n"                 ?0                      ;0
33 15  ADD_ARRAY_ELEMENT         #11=      "\r"                 ?0                      ;0
34 15  SEND_VAL                  ?0        #11:array(" ", "(", "\n", "\r") ?2                   ;60
35 15  DO_FCALL                  $12=      "in_array"           ?0                      ;2
36 15  JMPZ                      ?0        $12:in_array($currentChar, array(" ", "(", "\n", "\r")) ?42                  ;0  >>42
37 16  BW_NOT                    #13=      $CONTEXT_CLASS       ?0                      ;0
38 16  ASSIGN_BW_AND                       $context             #13:~$CONTEXT_CLASS     ;0
39 17  INIT_FCALL_BY_NAME        ?0        ?0                   $MACRO_TOKEN_ADVANCE    ;0
40 17  DO_FCALL_BY_NAME                    ?0                   ?0                      ;0
41 18  JMP                       ?0        ?51                  ?0                      ;0  >>51
42 19  INIT_FCALL_BY_NAME        ?0        ?0                   $MACRO_TOKEN_APPEND_CHAR    ;0  <<36
43 19  DO_FCALL_BY_NAME                    ?0                   ?0                      ;0
44 20  INIT_FCALL_BY_NAME        ?0        ?0                   $MACRO_STREAM_ADVANCE_CHAR  ;0
45 20  DO_FCALL_BY_NAME          $17=      ?0                   ?0                      ;0
46 20  IS_IDENTICAL              #18=      $17:$MACRO_STREAM_ADVANCE_CHAR() false                   ;0
47 20  JMPZ                      ?0        #18:$MACRO_STREAM_ADVANCE_CHAR() === false ?50                   ;0  >>50
48 21  JMP                       ?0        ?52                  ?10099560               ;0  >>52
49 22  JMP                       ?0        ?50                  ?0                      ;0  >>50
50 23  JMP                       ?0        ?0                   ?14                     ;0  >>0 <<47,49
51 25  JMP                       ?0        ?52                  ?0                      ;0  >>52    <<41
*/
$MACRO_TOKEN_SET_TYPE("ANNOTATION_COMMENTSTART");
$MACRO_TOKEN_APPEND_WORD();
$MACRO_TOKEN_ADVANCE();
$context |= $CONTEXT_DOCBLOCK;
$context |= $CONTEXT_ASTERISK;
$context &= ~$CONTEXT_CLASS;
$MACRO_TOKEN_ADVANCE();
$MACRO_TOKEN_APPEND_CHAR();

?>

Comments (1)

  1. Log in to comment