summaryrefslogtreecommitdiff
path: root/Zend/zend_compile.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2003-12-14 16:09:07 +0000
committerZeev Suraski <zeev@php.net>2003-12-14 16:09:07 +0000
commit3a42babad6b6d8d39310df94f49b34f03e20e244 (patch)
tree5081b6a9ec9201974a8c97c996aa2c4263cb7265 /Zend/zend_compile.c
parentc1e905dfc12e88597b12cfbe7994a2324656e698 (diff)
downloadphp-git-3a42babad6b6d8d39310df94f49b34f03e20e244.tar.gz
Fix behavior of return-by-reference functions. Remove erroneous warnings,
add E_STRICT warnings in case you return something by reference that you're not supposed to (anything that's not a variable, or a return-value of a function that returned by reference).
Diffstat (limited to 'Zend/zend_compile.c')
-rw-r--r--Zend/zend_compile.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index d121d677d0..9b0cdb93a4 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -739,7 +739,7 @@ void zend_check_writable_variable(znode *variable)
}
}
-zend_bool zend_is_function_or_method_call(znode *variable)
+static inline zend_bool zend_is_function_or_method_call(znode *variable)
{
zend_uint type = variable->u.EA.type;
@@ -1475,10 +1475,6 @@ void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC)
} else {
zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC);
}
-#if 0
- } else if (expr && CG(active_op_array)->return_reference) {
- zend_error(E_COMPILE_ERROR, "Only variables may be returned by reference");
-#endif
}
#ifdef ZTS
@@ -1499,6 +1495,15 @@ void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC)
opline->op1.op_type = IS_CONST;
INIT_ZVAL(opline->op1.u.constant);
}
+
+ if (do_end_vparse) {
+ if (zend_is_function_or_method_call(expr)) {
+ opline->extended_value = ZEND_RETURNS_FUNCTION;
+ } else {
+ opline->extended_value = 0;
+ }
+ }
+
SET_UNUSED(opline->op2);
}