dmitry Fri Mar 10 08:29:22 2006 UTC
Added files:
/ZendEngine2/tests jump01.phpt jump02.phpt jump03.phpt jump04.phpt
jump05.phpt jump06.phpt jump07.phpt jump08.phpt
jump09.phpt jump10.phpt
Modified files:
/php-src NEWS
/ZendEngine2 zend_compile.c zend_compile.h zend_execute_API.c
zend_globals.h zend_language_parser.y
zend_language_scanner.l zend_opcode.c zend_vm_def.h
zend_vm_execute.h zend_vm_opcodes.h
Log:
Implemented "jump label" operator (limited "goto")
http://cvs.php.net/viewcvs.cgi/php-src/NEWS?r1=1.2099&r2=1.2100&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2099 php-src/NEWS:1.2100
--- php-src/NEWS:1.2099 Wed Mar 8 14:42:10 2006
+++ php-src/NEWS Fri Mar 10 08:29:22 2006
@@ -15,6 +15,7 @@
for more details. (Dmitry)
- Removed support for "continue" and "break" operators with non-constant
operands. (Dmitry)
+- Implemented "jump label" operator (limited "goto"). (Dmitry, Sara)
- Changed __toString() behavior to call it in all necessary places
(Marcus, Dmitry)
- Changed "instanceof" and "catch" operators, is_a() and is_subclass_of()
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_compile.c?r1=1.692&r2=1.693&diff_format=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.692 ZendEngine2/zend_compile.c:1.693
--- ZendEngine2/zend_compile.c:1.692 Tue Mar 7 08:43:21 2006
+++ ZendEngine2/zend_compile.c Fri Mar 10 08:29:22 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.c,v 1.692 2006/03/07 08:43:21 dmitry Exp $ */
+/* $Id: zend_compile.c,v 1.693 2006/03/10 08:29:22 dmitry Exp $ */
#include <zend_language_parser.h>
#include "zend.h"
@@ -148,6 +148,8 @@
CG(start_lineno) = 0;
init_compiler_declarables(TSRMLS_C);
zend_hash_apply(CG(auto_globals), (apply_func_t) zend_auto_global_arm TSRMLS_CC);
+ zend_stack_init(&CG(labels_stack));
+ CG(labels) = NULL;
}
@@ -174,6 +176,7 @@
zend_hash_destroy(&CG(script_encodings_table));
zend_hash_destroy(&CG(filenames_table));
zend_llist_destroy(&CG(open_files));
+ zend_stack_destroy(&CG(labels_stack));
}
@@ -1241,6 +1244,9 @@
CG(doc_comment) = NULL;
CG(doc_comment_len) = 0;
}
+
+ zend_stack_push(&CG(labels_stack), (void *) &CG(labels), sizeof(HashTable*));
+ CG(labels) = NULL;
}
void zend_do_handle_exception(TSRMLS_D)
@@ -1266,6 +1272,8 @@
pass_two(CG(active_op_array) TSRMLS_CC);
+ zend_release_labels(TSRMLS_C);
+
if (CG(active_class_entry)) {
zend_check_magic_method_implementation(CG(active_class_entry), (zend_function*)CG(active_op_array), E_COMPILE_ERROR TSRMLS_CC);
} else {
@@ -4315,6 +4323,108 @@
*result = opline->result;
}
+void zend_do_label(znode *label TSRMLS_DC)
+{
+ zend_op_array *oparray = CG(active_op_array);
+ zend_label dest;
+
+ if (!CG(labels)) {
+ ALLOC_HASHTABLE(CG(labels));
+ zend_hash_init(CG(labels), 4, NULL, NULL, 0);
+ }
+
+ dest.brk_cont = oparray->current_brk_cont;
+ dest.opline_num = get_next_op_number(oparray);
+
+ if (zend_u_hash_add(CG(labels), Z_TYPE(label->u.constant), Z_UNIVAL(label->u.constant),
+ Z_UNILEN(label->u.constant) + 1, (void**)&dest, sizeof(zend_label), NULL) == FAILURE) {
+ zend_error(E_COMPILE_ERROR, "Label '%R' already defined", Z_TYPE(label->u.constant), Z_UNIVAL(label->u.constant));
+ }
+
+ /* Done with label now */
+ zval_dtor(&label->u.constant);
+}
+
+void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 TSRMLS_DC)
+{
+ zend_label *dest;
+ long current, distance;
+
+ if (CG(labels) == NULL ||
+ zend_u_hash_find(CG(labels), Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant)+1, (void**)&dest) == FAILURE) {
+
+ if (pass2) {
+ CG(in_compilation) = 1;
+ CG(active_op_array) = op_array;
+ CG(zend_lineno) = opline->lineno;
+ zend_error(E_COMPILE_ERROR, "'jump' to undefined label '%R'", Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant));
+ } else {
+ /* Label is not defined. Delay to pass 2. */
+ INC_BPC(op_array);
+ return;
+ }
+ }
+
+ opline->op1.u.opline_num = dest->opline_num;
+ zval_dtor(&opline->op2.u.constant);
+
+ /* Check that we are not moving into loop or switch */
+ current = opline->extended_value;
+ for (distance = 0; current != dest->brk_cont; distance++) {
+ if (current == -1) {
+ if (pass2) {
+ CG(in_compilation) = 1;
+ CG(active_op_array) = op_array;
+ CG(zend_lineno) = opline->lineno;
+ }
+ zend_error(E_COMPILE_ERROR, "'jump' into loop or switch statement is disallowed");
+ }
+ current = op_array->brk_cont_array[current].parent;
+ }
+
+ if (distance == 0) {
+ /* Nothing to break out of, optimize to ZEND_JMP */
+ opline->opcode = ZEND_JMP;
+ opline->extended_value = 0;
+ SET_UNUSED(opline->op2);
+ } else {
+ /* Set real break distance */
+ ZVAL_LONG(&opline->op2.u.constant, distance);
+ }
+
+ if (pass2) {
+ DEC_BPC(op_array);
+ }
+}
+
+void zend_do_goto(znode *label TSRMLS_DC)
+{
+ zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
+
+ opline->opcode = ZEND_GOTO;
+ opline->extended_value = CG(active_op_array)->current_brk_cont;
+ SET_UNUSED(opline->op1);
+ opline->op2 = *label;
+ zend_resolve_goto_label(CG(active_op_array), opline, 0 TSRMLS_CC);
+}
+
+void zend_release_labels(TSRMLS_D)
+{
+ if (CG(labels)) {
+ zend_hash_destroy(CG(labels));
+ FREE_HASHTABLE(CG(labels));
+ }
+ if (!zend_stack_is_empty(&CG(labels_stack))) {
+ HashTable **pht;
+
+ zend_stack_top(&CG(labels_stack), (void**)&pht);
+ CG(labels) = *pht;
+ zend_stack_del_top(&CG(labels_stack));
+ } else {
+ CG(labels) = NULL;
+ }
+}
+
/*
* Local variables:
* tab-width: 4
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_compile.h?r1=1.336&r2=1.337&diff_format=u
Index: ZendEngine2/zend_compile.h
diff -u ZendEngine2/zend_compile.h:1.336 ZendEngine2/zend_compile.h:1.337
--- ZendEngine2/zend_compile.h:1.336 Tue Mar 7 08:43:21 2006
+++ ZendEngine2/zend_compile.h Fri Mar 10 08:29:22 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.h,v 1.336 2006/03/07 08:43:21 dmitry Exp $ */
+/* $Id: zend_compile.h,v 1.337 2006/03/10 08:29:22 dmitry Exp $ */
#ifndef ZEND_COMPILE_H
#define ZEND_COMPILE_H
@@ -94,6 +94,10 @@
int parent;
} zend_brk_cont_element;
+typedef struct _zend_label {
+ int brk_cont;
+ zend_uint opline_num;
+} zend_label;
typedef struct _zend_try_catch_element {
zend_uint try_op;
@@ -513,6 +517,11 @@
void zend_do_normalization(znode *result, znode *str TSRMLS_DC);
+void zend_do_label(znode *label TSRMLS_DC);
+void zend_do_goto(znode *label TSRMLS_DC);
+void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 TSRMLS_DC);
+void zend_release_labels(TSRMLS_D);
+
#define INITIAL_OP_ARRAY_SIZE 64
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_execute_API.c?r1=1.366&r2=1.367&diff_format=u
Index: ZendEngine2/zend_execute_API.c
diff -u ZendEngine2/zend_execute_API.c:1.366 ZendEngine2/zend_execute_API.c:1.367
--- ZendEngine2/zend_execute_API.c:1.366 Fri Mar 3 23:20:29 2006
+++ ZendEngine2/zend_execute_API.c Fri Mar 10 08:29:22 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_execute_API.c,v 1.366 2006/03/03 23:20:29 helly Exp $ */
+/* $Id: zend_execute_API.c,v 1.367 2006/03/10 08:29:22 dmitry Exp $ */
#include <stdio.h>
#include <signal.h>
@@ -1293,6 +1293,11 @@
opline->op2.u.constant.refcount = 2;
}
switch (opline->opcode) {
+ case ZEND_GOTO:
+ if (Z_TYPE(opline->op2.u.constant) != IS_LONG) {
+ zend_resolve_goto_label(CG(active_op_array), opline, 1 TSRMLS_CC);
+ }
+ /* break omitted intentionally */
case ZEND_JMP:
opline->op1.u.jmp_addr = &CG(active_op_array)->opcodes[opline->op1.u.opline_num];
break;
@@ -1307,6 +1312,8 @@
opline++;
}
+ zend_release_labels(TSRMLS_C);
+
EG(return_value_ptr_ptr) = &local_retval;
EG(active_op_array) = CG(active_op_array);
zend_execute(CG(active_op_array) TSRMLS_CC);
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_globals.h?r1=1.148&r2=1.149&diff_format=u
Index: ZendEngine2/zend_globals.h
diff -u ZendEngine2/zend_globals.h:1.148 ZendEngine2/zend_globals.h:1.149
--- ZendEngine2/zend_globals.h:1.148 Tue Mar 7 08:43:21 2006
+++ ZendEngine2/zend_globals.h Fri Mar 10 08:29:22 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_globals.h,v 1.148 2006/03/07 08:43:21 dmitry Exp $ */
+/* $Id: zend_globals.h,v 1.149 2006/03/10 08:29:22 dmitry Exp $ */
#ifndef ZEND_GLOBALS_H
#define ZEND_GLOBALS_H
@@ -136,6 +136,9 @@
HashTable script_encodings_table;
char *script_encoding;
+ HashTable *labels;
+ zend_stack labels_stack;
+
#ifdef ZTS
HashTable **static_members;
int last_static_member;
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_language_parser.y?r1=1.171&r2=1.172&diff_format=u
Index: ZendEngine2/zend_language_parser.y
diff -u ZendEngine2/zend_language_parser.y:1.171 ZendEngine2/zend_language_parser.y:1.172
--- ZendEngine2/zend_language_parser.y:1.171 Tue Mar 7 08:43:21 2006
+++ ZendEngine2/zend_language_parser.y Fri Mar 10 08:29:22 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_language_parser.y,v 1.171 2006/03/07 08:43:21 dmitry Exp $ */
+/* $Id: zend_language_parser.y,v 1.172 2006/03/10 08:29:22 dmitry Exp $ */
/*
* LALR shift/reduce conflicts and how they are resolved:
@@ -107,6 +107,7 @@
%token T_DEFAULT
%token T_BREAK
%token T_CONTINUE
+%token T_GOTO
%token T_FUNCTION
%token T_CONST
%token T_RETURN
@@ -184,6 +185,7 @@
statement:
unticked_statement { zend_do_ticks(TSRMLS_C); }
+ | T_STRING ':' { zend_do_label(&$1 TSRMLS_CC); }
;
unticked_statement:
@@ -233,6 +235,7 @@
'{' inner_statement_list '}' { zend_do_end_catch(&$1 TSRMLS_CC); }
additional_catches { zend_do_mark_last_catch(&$7, &$18 TSRMLS_CC); }
| T_THROW expr ';' { zend_do_throw(&$2 TSRMLS_CC); }
+ | T_GOTO T_STRING ';' { zend_do_goto(&$2 TSRMLS_CC); }
;
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_language_scanner.l?r1=1.148&r2=1.149&diff_format=u
Index: ZendEngine2/zend_language_scanner.l
diff -u ZendEngine2/zend_language_scanner.l:1.148 ZendEngine2/zend_language_scanner.l:1.149
--- ZendEngine2/zend_language_scanner.l:1.148 Sun Feb 26 11:57:14 2006
+++ ZendEngine2/zend_language_scanner.l Fri Mar 10 08:29:22 2006
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_language_scanner.l,v 1.148 2006/02/26 11:57:14 dmitry Exp $ */
+/* $Id: zend_language_scanner.l,v 1.149 2006/03/10 08:29:22 dmitry Exp $ */
#define yyleng SCNG(yy_leng)
#define yytext SCNG(yy_text)
@@ -821,6 +821,7 @@
CG(active_op_array) = original_active_op_array;
if (compilation_successful) {
pass_two(op_array TSRMLS_CC);
+ zend_release_labels(TSRMLS_C);
} else {
efree(op_array);
retval = NULL;
@@ -963,6 +964,7 @@
zend_do_handle_exception(TSRMLS_C);
CG(active_op_array) = original_active_op_array;
pass_two(op_array TSRMLS_CC);
+ zend_release_labels(TSRMLS_C);
retval = op_array;
}
zend_restore_lexical_state(&original_lex_state TSRMLS_CC);
@@ -1520,6 +1522,10 @@
return T_CONTINUE;
}
+<ST_IN_SCRIPTING>"jump" {
+ return T_GOTO;
+}
+
<ST_IN_SCRIPTING>"echo" {
return T_ECHO;
}
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_opcode.c?r1=1.118&r2=1.119&diff_format=u
Index: ZendEngine2/zend_opcode.c
diff -u ZendEngine2/zend_opcode.c:1.118 ZendEngine2/zend_opcode.c:1.119
--- ZendEngine2/zend_opcode.c:1.118 Tue Feb 21 20:12:41 2006
+++ ZendEngine2/zend_opcode.c Fri Mar 10 08:29:22 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_opcode.c,v 1.118 2006/02/21 20:12:41 dmitry Exp $ */
+/* $Id: zend_opcode.c,v 1.119 2006/03/10 08:29:22 dmitry Exp $ */
#include <stdio.h>
@@ -375,6 +375,11 @@
opline->op2.u.constant.refcount = 2;
}
switch (opline->opcode) {
+ case ZEND_GOTO:
+ if (Z_TYPE(opline->op2.u.constant) != IS_LONG) {
+ zend_resolve_goto_label(op_array, opline, 1 TSRMLS_CC);
+ }
+ /* break omitted intentionally */
case ZEND_JMP:
opline->op1.u.jmp_addr = &op_array->opcodes[opline->op1.u.opline_num];
break;
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_vm_def.h?r1=1.101&r2=1.102&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.101 ZendEngine2/zend_vm_def.h:1.102
--- ZendEngine2/zend_vm_def.h:1.101 Wed Mar 1 16:14:37 2006
+++ ZendEngine2/zend_vm_def.h Fri Mar 10 08:29:22 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_vm_def.h,v 1.101 2006/03/01 16:14:37 helly Exp $ */
+/* $Id: zend_vm_def.h,v 1.102 2006/03/10 08:29:22 dmitry Exp $ */
/* If you change this file, please regenerate the zend_vm_execute.h and
* zend_vm_opcodes.h files by running:
@@ -2395,6 +2395,27 @@
ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
}
+ZEND_VM_HANDLER(69, ZEND_GOTO, ANY, CONST)
+{
+ zend_op *opline = EX(opline);
+ zend_brk_cont_element *el;
+
+ el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->extended_value,
+ EX(op_array), EX(Ts) TSRMLS_CC);
+
+ zend_op *brk_opline = EX(op_array)->opcodes + el->brk;
+
+ switch (brk_opline->opcode) {
+ case ZEND_SWITCH_FREE:
+ zend_switch_free(brk_opline, EX(Ts) TSRMLS_CC);
+ break;
+ case ZEND_FREE:
+ zendi_zval_dtor(EX_T(brk_opline->op1.u.var).tmp_var);
+ break;
+ }
+ ZEND_VM_JMP(opline->op1.u.jmp_addr);
+}
+
ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
{
zend_op *opline = EX(opline);
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_vm_execute.h?r1=1.105&r2=1.106&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.105 ZendEngine2/zend_vm_execute.h:1.106
--- ZendEngine2/zend_vm_execute.h:1.105 Fri Mar 3 16:47:55 2006
+++ ZendEngine2/zend_vm_execute.h Fri Mar 10 08:29:22 2006
@@ -800,6 +800,27 @@
ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
}
+static int ZEND_GOTO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zend_op *opline = EX(opline);
+ zend_brk_cont_element *el;
+
+ el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->extended_value,
+ EX(op_array), EX(Ts) TSRMLS_CC);
+
+ zend_op *brk_opline = EX(op_array)->opcodes + el->brk;
+
+ switch (brk_opline->opcode) {
+ case ZEND_SWITCH_FREE:
+ zend_switch_free(brk_opline, EX(Ts) TSRMLS_CC);
+ break;
+ case ZEND_FREE:
+ zendi_zval_dtor(EX_T(brk_opline->op1.u.var).tmp_var);
+ break;
+ }
+ ZEND_VM_JMP(opline->op1.u.jmp_addr);
+}
+
static int ZEND_FETCH_CLASS_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
@@ -28577,27 +28598,27 @@
ZEND_NEW_SPEC_HANDLER,
ZEND_NEW_SPEC_HANDLER,
ZEND_NEW_SPEC_HANDLER,
+ ZEND_GOTO_SPEC_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_GOTO_SPEC_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_GOTO_SPEC_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_GOTO_SPEC_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_GOTO_SPEC_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_vm_opcodes.h?r1=1.66&r2=1.67&diff_format=u
Index: ZendEngine2/zend_vm_opcodes.h
diff -u ZendEngine2/zend_vm_opcodes.h:1.66 ZendEngine2/zend_vm_opcodes.h:1.67
--- ZendEngine2/zend_vm_opcodes.h:1.66 Wed Jan 4 23:52:07 2006
+++ ZendEngine2/zend_vm_opcodes.h Fri Mar 10 08:29:22 2006
@@ -87,6 +87,7 @@
#define ZEND_SEND_VAR 66
#define ZEND_SEND_REF 67
#define ZEND_NEW 68
+#define ZEND_GOTO 69
#define ZEND_FREE 70
#define ZEND_INIT_ARRAY 71
#define ZEND_ADD_ARRAY_ELEMENT 72
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/jump01.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/jump01.phpt
+++ ZendEngine2/tests/jump01.phpt
--TEST--
jump 01: jump backward
--FILE--
<?php
$n = 1;
L1:
echo "$n: ok\n";
$n++;
if ($n <= 3) jump L1;
?>
--EXPECT--
1: ok
2: ok
3: ok
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/jump02.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/jump02.phpt
+++ ZendEngine2/tests/jump02.phpt
--TEST--
jump 02: jump forward
--FILE--
<?php
$n = 1;
L1:
if ($n > 3) jump L2;
echo "$n: ok\n";
$n++;
jump L1;
L2:
?>
--EXPECT--
1: ok
2: ok
3: ok
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/jump03.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/jump03.phpt
+++ ZendEngine2/tests/jump03.phpt
--TEST--
jump 03: jump inside control structures
--FILE--
<?php
do {
if (1) {
echo "1: ok\n";
jump L1;
} else {
echo "bug\n";
L1:
echo "2: ok\n";
}
} while (0);
?>
--EXPECT--
1: ok
2: ok
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/jump04.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/jump04.phpt
+++ ZendEngine2/tests/jump04.phpt
--TEST--
jump 04: jump from loop (backward)
--FILE--
<?php
$s = "X";
echo "1: ok\n";
L1: if ($s != "X") {
echo "4: ok\n";
} else {
echo "2: ok\n";
while ($s != "XXX") {
echo "3: ok\n";
$s .= "X";
jump L1;
echo "bug\n";
}
echo "bug\n";
}
?>
--EXPECT--
1: ok
2: ok
3: ok
4: ok
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/jump05.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/jump05.phpt
+++ ZendEngine2/tests/jump05.phpt
--TEST--
jump 05: jump from loop (forward)
--FILE--
<?php
$ar = array("1","2","3");
foreach ($ar as $val) {
switch ($val) {
case "1":
echo "1: ok\n";
break;
case "2":
echo "2: ok\n";
jump L1;
case "3":
echo "bug\n";
break;
}
}
echo "bug\n";
L1:
echo "3: ok\n";
?>
--EXPECT--
1: ok
2: ok
3: ok
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/jump06.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/jump06.phpt
+++ ZendEngine2/tests/jump06.phpt
--TEST--
jump 06: jump to undefined label
--FILE--
<?php
jump L1;
?>
--EXPECTF--
Fatal error: 'jump' to undefined label 'L1' in %sjump06.php on line 2
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/jump07.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/jump07.phpt
+++ ZendEngine2/tests/jump07.phpt
--TEST--
jump 07: jump into loop (backward)
--FILE--
<?php
while (0) {
L1: echo "bug\n";
}
jump L1;
?>
--EXPECTF--
Fatal error: 'jump' into loop or switch statement is disallowed in %sjump07.php on line 5
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/jump08.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/jump08.phpt
+++ ZendEngine2/tests/jump08.phpt
--TEST--
jump 08: jump into loop (forward)
--FILE--
<?php
jump L1;
while (0) {
L1: echo "bug\n";
}
?>
--EXPECTF--
Fatal error: 'jump' into loop or switch statement is disallowed in %sjump08.php on line 2
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/jump09.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/jump09.phpt
+++ ZendEngine2/tests/jump09.phpt
--TEST--
jump 09: jump into switch (backward)
--FILE--
<?php
switch (0) {
case 1:
L1: echo "bug\n";
break;
}
jump L1;
?>
--EXPECTF--
Fatal error: 'jump' into loop or switch statement is disallowed in %sjump09.php on line 7
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/jump10.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/jump10.phpt
+++ ZendEngine2/tests/jump10.phpt
--TEST--
jump 10: jump into switch (forward)
--FILE--
<?php
jump L1;
switch (0) {
case 1:
L1: echo "bug\n";
break;
}
?>
--EXPECTF--
Fatal error: 'jump' into loop or switch statement is disallowed in %sjump10.php on line 2