From b5ecc94497826c1c9893ca2bdc17339fa310e34d Mon Sep 17 00:00:00 2001 From: Xuefer Date: Fri, 22 Apr 2011 09:33:46 +0000 Subject: [PATCH] prepare for use() git-svn-id: svn://svn.lighttpd.net/xcache/trunk@780 c26eb9a1-5813-0410-bd6c-c2e55f420ca7 --- Decompiler.class.php | 28 +++++++++++++++++++++++++--- decompilesample.php | 1 + xcache.c | 26 ++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/Decompiler.class.php b/Decompiler.class.php index ddb6e4b..8a4aee7 100644 --- a/Decompiler.class.php +++ b/Decompiler.class.php @@ -736,6 +736,8 @@ class Decompiler $EX['arg_types_stack'] = array(); $EX['last'] = count($opcodes) - 1; $EX['silence'] = 0; + $EX['recvs'] = array(); + $EX['uses'] = array(); for ($next = 0, $last = $EX['last']; $loop = $this->outputCode($EX, $next, $last, $indent, true); @@ -1139,6 +1141,14 @@ class Decompiler break; } $resvar = "$lvalue = " . str($rvalue, $EX); + if (0) { + if ($op2['op_type'] == XC_IS_VAR) { + $resvar .= ' /* isvar */'; + } + else if ($op2['op_type'] == XC_IS_TMP_VAR) { + $resvar .= ' /* istmp */'; + } + } break; // }}} case XC_ASSIGN_REF: // {{{ @@ -1841,6 +1851,19 @@ class Decompiler } } // }}} + function duses(&$EX, $indent) // {{{ + { + if (!$EX['uses']) { + return; + } + + $uses = array(); + foreach ($EX['uses'] as $name => $value) { + $uses = '$' . $name; + } + echo ' use(', implode(', ', $uses), ')'; + } + // }}} function dfunction($func, $indent = '', $nobody = false) // {{{ { $this->detectNamespace($func['op_array']['function_name']); @@ -1849,15 +1872,13 @@ class Decompiler $EX = array(); $EX['op_array'] = &$func['op_array']; $EX['recvs'] = array(); + $EX['uses'] = array(); } else { ob_start(); $newindent = INDENT . $indent; $EX = &$this->dop_array($func['op_array'], $newindent); $body = ob_get_clean(); - if (!isset($EX['recvs'])) { - $EX['recvs'] = array(); - } } $functionName = $this->stripNamespace($func['op_array']['function_name']); @@ -1867,6 +1888,7 @@ class Decompiler echo 'function ', $functionName, '('; $this->dargs($EX, $indent); echo ")"; + $this->duses($EX, $indent); if ($nobody) { echo ";\n"; } diff --git a/decompilesample.php b/decompilesample.php index c1d88b6..a7eb4dc 100644 --- a/decompilesample.php +++ b/decompilesample.php @@ -362,6 +362,7 @@ $tax = 1; $callback = function ($quantity, $product) use ($tax, &$total) { static $static = array(1); $tax = 'tax'; + $tax = --$tax; $pricePerItem = constant('PRICE_' . strtoupper($product)); $total += $pricePerItem * $quantity * ($tax + 1); }; diff --git a/xcache.c b/xcache.c index afc4c17..0be1f23 100644 --- a/xcache.c +++ b/xcache.c @@ -2874,6 +2874,30 @@ PHP_FUNCTION(xcache_dec) xc_var_inc_dec(-1, INTERNAL_FUNCTION_PARAM_PASSTHRU); } /* }}} */ +/* {{{ proto int xcache_get_refcount(mixed variable) + Get reference count of variable */ +PHP_FUNCTION(xcache_get_refcount) +{ + zval *variable; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &variable) == FAILURE) { + RETURN_NULL(); + } + + RETURN_LONG(Z_REFCOUNT_P(variable)); +} +/* }}} */ +/* {{{ proto bool xcache_get_isref(mixed variable) + check if variable data is marked referenced */ +PHP_FUNCTION(xcache_get_isref) +{ + zval *variable; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &variable) == FAILURE) { + RETURN_NULL(); + } + + RETURN_BOOL(Z_ISREF_P(variable)); +} +/* }}} */ #ifdef HAVE_XCACHE_DPRINT /* {{{ proto bool xcache_dprint(mixed value) Prints variable (or value) internal struct (debug only) */ @@ -3115,6 +3139,8 @@ static zend_function_entry xcache_functions[] = /* {{{ */ PHP_FE(xcache_isset, NULL) PHP_FE(xcache_unset, NULL) PHP_FE(xcache_unset_by_prefix, NULL) + PHP_FE(xcache_get_refcount, NULL) + PHP_FE(xcache_get_isref, NULL) #ifdef HAVE_XCACHE_DPRINT PHP_FE(xcache_dprint, NULL) #endif