cvs: 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 /tests jump01.phpt jump02.phpt jump03.phpt jump04.phpt jump05.phpt jump06.phpt jump07.phpt
jump08.phpt jump09.phpt jump10.phpt php-src NEWS

From: Date: Fri, 10 Mar 2006 08:29:22 +0000
Subject: cvs: 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 /tests jump01.phpt jump02.phpt jump03.phpt jump04.phpt jump05.phpt jump06.phpt jump07.phpt
jump08.phpt jump09.phpt jump10.phpt php-src NEWS
Groups: php.zend-engine.cvs 
Request: Send a blank email to [email protected] to get a copy of this message
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

Thread (10 messages)

« previous php.zend-engine.cvs (#4703) next »