]> granicus.if.org Git - php/commitdiff
Implement a TBD: JMP to the end of foreach
authorMarcus Boerger <helly@php.net>
Sun, 17 Aug 2003 12:17:34 +0000 (12:17 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 17 Aug 2003 12:17:34 +0000 (12:17 +0000)
Zend/zend_compile.c
Zend/zend_execute.c

index 7c1d495fa72025085a8619d954db4b09ae06d70c..b66137e88480ebbcd396ea504707804cd36f882d 100644 (file)
@@ -2974,7 +2974,7 @@ void zend_do_foreach_begin(znode *foreach_token, znode *array, znode *open_brack
        zend_stack_push(&CG(foreach_copy_stack), (void *) &opline->result, sizeof(znode));
 
        /* save the location of the beginning of the loop (array fetching) */
-       foreach_token->u.opline_num = get_next_op_number(CG(active_op_array));
+       opline->op2.u.opline_num = foreach_token->u.opline_num = get_next_op_number(CG(active_op_array));
 
        opline = get_next_op(CG(active_op_array) TSRMLS_CC);
        opline->opcode = ZEND_FE_FETCH;
index 80f064e968e6f708220adcd11198c317ed715528..0b46c0dfcd502d691bfb6e8f70bb21218e58e9b4 100644 (file)
@@ -3508,16 +3508,22 @@ int zend_fe_reset_handler(ZEND_OPCODE_HANDLER_ARGS)
                        array_ptr->refcount++;
                }
        }
-       PZVAL_LOCK(array_ptr);
-       EX_T(EX(opline)->result.u.var).var.ptr = array_ptr;
-       EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr;   
 
        if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
                /* probably redundant */
                zend_hash_internal_pointer_reset(fe_ht);
        } else {
-               /* JMP to the end of foreach - TBD */
+               zend_error(E_WARNING, "Invalid argument supplied for foreach()");
+               
+               EX(opline) = op_array->opcodes+EX(opline)->op1.u.opline_num;
+               EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num;
+               return 0;
        }
+
+       PZVAL_LOCK(array_ptr);
+       EX_T(EX(opline)->result.u.var).var.ptr = array_ptr;
+       EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr;   
+
        NEXT_OPCODE();
 }