summaryrefslogtreecommitdiff
path: root/Zend/zend_builtin_functions.c
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2014-04-24 21:14:57 +0800
committerXinchen Hui <laruence@gmail.com>2014-04-24 21:14:57 +0800
commite86b287c83894dd869fc94ff710b7f54aceb0970 (patch)
tree8855c0a90c76f49bd17ba001c6adb13787fd56cd /Zend/zend_builtin_functions.c
parent9fe853130951cff085907c0ac136edd31ec52288 (diff)
parent65e2ed6e50d210adb50de47ef7ac3b75af069f62 (diff)
downloadphp-git-e86b287c83894dd869fc94ff710b7f54aceb0970.tar.gz
Merge branch 'refactoring2' of github.com:zendtech/php into refactoring2
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r--Zend/zend_builtin_functions.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 22076104f0..1d066deb41 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -1991,6 +1991,7 @@ void debug_print_backtrace_args(zval *arg_array TSRMLS_DC)
ZEND_FUNCTION(debug_print_backtrace)
{
zend_execute_data *ptr, *skip;
+ zend_object *object;
int lineno, frameno = 0;
const char *function_name;
const char *filename;
@@ -2010,6 +2011,7 @@ ZEND_FUNCTION(debug_print_backtrace)
ptr = EG(current_execute_data);
/* skip debug_backtrace() */
+ object = ptr->object;
ptr = ptr->prev_execute_data;
while (ptr && (limit == 0 || frameno < limit)) {
@@ -2037,11 +2039,18 @@ ZEND_FUNCTION(debug_print_backtrace)
lineno = 0;
}
+ /* $this may be passed into regular internal functions */
+ if (object &&
+ ptr->function_state.function->type == ZEND_INTERNAL_FUNCTION &&
+ !ptr->function_state.function->common.scope) {
+ object = NULL;
+ }
+
function_name = (ptr->function_state.function->common.scope &&
ptr->function_state.function->common.scope->trait_aliases) ?
zend_resolve_method_name(
- ptr->object ?
- zend_get_class_entry(ptr->object TSRMLS_CC) :
+ object ?
+ zend_get_class_entry(object TSRMLS_CC) :
ptr->function_state.function->common.scope,
ptr->function_state.function)->val :
(ptr->function_state.function->common.function_name ?
@@ -2049,11 +2058,11 @@ ZEND_FUNCTION(debug_print_backtrace)
NULL);
if (function_name) {
- if (ptr->object) {
+ if (object) {
if (ptr->function_state.function->common.scope) {
class_name = ptr->function_state.function->common.scope->name;
} else {
- class_name = zend_get_object_classname(ptr->object TSRMLS_CC);
+ class_name = zend_get_object_classname(object TSRMLS_CC);
}
call_type = "->";
@@ -2141,6 +2150,7 @@ ZEND_FUNCTION(debug_print_backtrace)
}
}
include_filename = filename;
+ object = skip->object;
ptr = skip->prev_execute_data;
++indent;
}
@@ -2151,6 +2161,7 @@ ZEND_FUNCTION(debug_print_backtrace)
ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int options, int limit TSRMLS_DC)
{
zend_execute_data *ptr, *skip;
+ zend_object *object = Z_OBJ(EG(This));
int lineno, frameno = 0;
const char *function_name;
const char *filename;
@@ -2162,11 +2173,13 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
/* skip "new Exception()" */
if (ptr && (skip_last == 0) && ptr->opline && (ptr->opline->opcode == ZEND_NEW)) {
+ object = ptr->object;
ptr = ptr->prev_execute_data;
}
/* skip debug_backtrace() */
if (skip_last-- && ptr) {
+ object = ptr->object;
ptr = ptr->prev_execute_data;
}
@@ -2217,11 +2230,18 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
filename = NULL;
}
+ /* $this may be passed into regular internal functions */
+ if (object &&
+ ptr->function_state.function->type == ZEND_INTERNAL_FUNCTION &&
+ !ptr->function_state.function->common.scope) {
+ object = NULL;
+ }
+
function_name = (ptr->function_state.function->common.scope &&
ptr->function_state.function->common.scope->trait_aliases) ?
zend_resolve_method_name(
- ptr->object ?
- zend_get_class_entry(ptr->object TSRMLS_CC) :
+ object ?
+ zend_get_class_entry(object TSRMLS_CC) :
ptr->function_state.function->common.scope,
ptr->function_state.function)->val :
(ptr->function_state.function->common.function_name ?
@@ -2231,19 +2251,19 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
if (function_name) {
add_assoc_string_ex(&stack_frame, "function", sizeof("function")-1, (char*)function_name);
- if (ptr->object) {
+ if (object) {
if (ptr->function_state.function->common.scope) {
add_assoc_str_ex(&stack_frame, "class", sizeof("class")-1, STR_COPY(ptr->function_state.function->common.scope->name));
} else {
- class_name = zend_get_object_classname(ptr->object TSRMLS_CC);
+ class_name = zend_get_object_classname(object TSRMLS_CC);
add_assoc_str_ex(&stack_frame, "class", sizeof("class")-1, STR_COPY(class_name));
}
if ((options & DEBUG_BACKTRACE_PROVIDE_OBJECT) != 0) {
- zval object;
- ZVAL_OBJ(&object, ptr->object);
- add_assoc_zval_ex(&stack_frame, "object", sizeof("object")-1, &object);
- Z_ADDREF(object);
+ zval zv;
+ ZVAL_OBJ(&zv, object);
+ add_assoc_zval_ex(&stack_frame, "object", sizeof("object")-1, &zv);
+ Z_ADDREF(zv);
}
add_assoc_string_ex(&stack_frame, "type", sizeof("type")-1, "->");
@@ -2314,6 +2334,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
include_filename = filename;
+ object = skip->object;
ptr = skip->prev_execute_data;
}
}