Разваливается if с goto внутри
Issue #77
new
Тестовый код:
<?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();
?>
подготовка yak + sg обработка goto? :)