add back PHP_4 code for disassembler
git-svn-id: svn://svn.lighttpd.net/xcache/trunk@1321 c26eb9a1-5813-0410-bd6c-c2e55f420ca73.1
parent
b166cbc63e
commit
02eb6beda4
|
@ -1,14 +1,13 @@
|
|||
3.1.0 2013-??-??
|
||||
ChangeLog
|
||||
========
|
||||
* drop support for PHP_4 in source code
|
||||
* disassembler: fixes crash with nested sandbox
|
||||
* disassembler, Decompiler: improves support for PHP_5_4
|
||||
* adds support for PHP_5_5
|
||||
* compatible with fcntl fork
|
||||
* support for __FILE__ __DIR__ handling after files moved/hardlinked (without xcache.experimental)
|
||||
|
||||
3.0.3 2013-16-18
|
||||
3.0.3 2013-16.18
|
||||
========
|
||||
* clean files in release (fix htdocs config)
|
||||
|
||||
|
|
|
@ -1,24 +1,24 @@
|
|||
$(XCACHE_INCLUDES_I) includes.lo $(builddir)/includes.lo: $(srcdir)/mod_cacher/xc_cache.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h
|
||||
mod_assembler/xc_assembler.lo $(builddir)/mod_assembler/xc_assembler.lo:
|
||||
mod_cacher/xc_cacher.lo $(builddir)/mod_cacher/xc_cacher.lo: $(srcdir)/mod_cacher/xc_cache.h $(srcdir)/mod_cacher/xc_cacher.h $(srcdir)/util/xc_align.h $(srcdir)/util/xc_stack.h $(srcdir)/util/xc_trace.h $(srcdir)/util/xc_vector.h $(srcdir)/xcache_globals.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_allocator.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_extension.h $(srcdir)/xcache/xc_ini.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_sandbox.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h $(XCACHE_PROC_H)
|
||||
mod_cacher/xc_cacher.lo $(builddir)/mod_cacher/xc_cacher.lo: $(srcdir)/mod_cacher/xc_cache.h $(srcdir)/mod_cacher/xc_cacher.h $(srcdir)/util/xc_align.h $(srcdir)/util/xc_stack.h $(srcdir)/util/xc_trace.h $(srcdir)/util/xc_vector.h $(srcdir)/xcache_globals.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_extension.h $(srcdir)/xcache/xc_ini.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_sandbox.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h
|
||||
mod_coverager/xc_coverager.lo $(builddir)/mod_coverager/xc_coverager.lo: $(srcdir)/mod_coverager/xc_coverager.h $(srcdir)/util/xc_stack.h $(srcdir)/util/xc_trace.h $(srcdir)/xcache_globals.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_extension.h $(srcdir)/xcache/xc_ini.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h
|
||||
mod_decoder/xc_decoder.lo $(builddir)/mod_decoder/xc_decoder.lo:
|
||||
mod_disassembler/xc_disassembler.lo $(builddir)/mod_disassembler/xc_disassembler.lo: $(srcdir)/mod_cacher/xc_cache.h $(srcdir)/mod_disassembler/xc_disassembler.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_allocator.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_ini.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_sandbox.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h $(XCACHE_PROC_H)
|
||||
mod_disassembler/xc_disassembler.lo $(builddir)/mod_disassembler/xc_disassembler.lo: $(srcdir)/mod_disassembler/xc_disassembler.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_ini.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_sandbox.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h
|
||||
mod_encoder/xc_encoder.lo $(builddir)/mod_encoder/xc_encoder.lo:
|
||||
mod_optimizer/xc_optimizer.lo $(builddir)/mod_optimizer/xc_optimizer.lo: $(srcdir)/mod_cacher/xc_cache.h $(srcdir)/mod_optimizer/xc_optimizer.h $(srcdir)/util/xc_stack.h $(srcdir)/util/xc_trace.h $(srcdir)/xcache_globals.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_allocator.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_const_string.h $(srcdir)/xcache/xc_extension.h $(srcdir)/xcache/xc_ini.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_opcode_spec.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h $(XCACHE_PROC_H)
|
||||
mod_optimizer/xc_optimizer.lo $(builddir)/mod_optimizer/xc_optimizer.lo: $(srcdir)/mod_optimizer/xc_optimizer.h $(srcdir)/util/xc_stack.h $(srcdir)/util/xc_trace.h $(srcdir)/xcache_globals.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_const_string.h $(srcdir)/xcache/xc_extension.h $(srcdir)/xcache/xc_ini.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_opcode_spec.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h
|
||||
util/xc_stack.lo $(builddir)/util/xc_stack.lo: $(srcdir)/util/xc_stack.h $(srcdir)/util/xc_trace.h
|
||||
util/xc_trace.lo $(builddir)/util/xc_trace.lo: $(srcdir)/util/xc_trace.h
|
||||
xcache.lo $(builddir)/xcache.lo: $(srcdir)/mod_cacher/xc_cache.h $(srcdir)/util/xc_foreachcoresig.h $(srcdir)/util/xc_stack.h $(srcdir)/xcache_globals.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_allocator.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_const_string.h $(srcdir)/xcache/xc_extension.h $(srcdir)/xcache/xc_ini.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_opcode_spec.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h $(XCACHE_PROC_H)
|
||||
xcache.lo $(builddir)/xcache.lo: $(srcdir)/util/xc_foreachcoresig.h $(srcdir)/util/xc_stack.h $(srcdir)/xcache_globals.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_const_string.h $(srcdir)/xcache/xc_extension.h $(srcdir)/xcache/xc_ini.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_opcode_spec.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h
|
||||
xcache/xc_allocator_bestfit.lo $(builddir)/xcache/xc_allocator_bestfit.lo: $(srcdir)/util/xc_align.h $(srcdir)/util/xc_trace.h $(srcdir)/xcache/xc_allocator.h $(srcdir)/xcache/xc_shm.h
|
||||
xcache/xc_allocator.lo $(builddir)/xcache/xc_allocator.lo: $(srcdir)/xcache/xc_allocator.h $(srcdir)/xcache/xc_shm.h
|
||||
xcache/xc_compatibility.lo $(builddir)/xcache/xc_compatibility.lo: $(srcdir)/xcache/xc_compatibility.h
|
||||
xcache/xc_const_string.lo $(builddir)/xcache/xc_const_string.lo: $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_const_string.h $(srcdir)/xcache/xc_const_string_opcodes_php5.0.h $(srcdir)/xcache/xc_const_string_opcodes_php5.1.h $(srcdir)/xcache/xc_const_string_opcodes_php5.3.h $(srcdir)/xcache/xc_const_string_opcodes_php5.4.h $(srcdir)/xcache/xc_const_string_opcodes_php5.5.h $(srcdir)/xcache/xc_const_string_opcodes_php6.x.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_shm.h
|
||||
xcache/xc_const_string.lo $(builddir)/xcache/xc_const_string.lo: $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_const_string.h $(srcdir)/xcache/xc_const_string_opcodes_php4.x.h $(srcdir)/xcache/xc_const_string_opcodes_php5.0.h $(srcdir)/xcache/xc_const_string_opcodes_php5.1.h $(srcdir)/xcache/xc_const_string_opcodes_php5.3.h $(srcdir)/xcache/xc_const_string_opcodes_php5.4.h $(srcdir)/xcache/xc_const_string_opcodes_php5.5.h $(srcdir)/xcache/xc_const_string_opcodes_php6.x.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_shm.h
|
||||
xcache/xc_extension.lo $(builddir)/xcache/xc_extension.lo: $(srcdir)/util/xc_stack.h $(srcdir)/util/xc_trace.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_extension.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_shm.h
|
||||
xcache/xc_ini.lo $(builddir)/xcache/xc_ini.lo: $(srcdir)/xcache/xc_ini.h
|
||||
xcache/xc_lock.lo $(builddir)/xcache/xc_lock.lo: $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_shm.h
|
||||
xcache/xc_malloc.lo $(builddir)/xcache/xc_malloc.lo: $(srcdir)/util/xc_align.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_allocator.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_shm.h
|
||||
xcache/xc_opcode_spec.lo $(builddir)/xcache/xc_opcode_spec.lo: $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_const_string.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_opcode_spec_def.h $(srcdir)/xcache/xc_opcode_spec.h $(srcdir)/xcache/xc_shm.h
|
||||
xcache/xc_processor.lo $(builddir)/xcache/xc_processor.lo: $(srcdir)/mod_cacher/xc_cache.h $(srcdir)/util/xc_align.h $(srcdir)/util/xc_stack.h $(srcdir)/xcache_globals.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_allocator.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_const_string.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h $(XCACHE_PROC_C) $(XCACHE_PROC_H)
|
||||
xcache/xc_processor.lo $(builddir)/xcache/xc_processor.lo:
|
||||
xcache/xc_sandbox.lo $(builddir)/xcache/xc_sandbox.lo: $(srcdir)/util/xc_stack.h $(srcdir)/xcache_globals.h $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_sandbox.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h
|
||||
xcache/xc_shm.lo $(builddir)/xcache/xc_shm.lo: $(srcdir)/xcache/xc_shm.h
|
||||
xcache/xc_shm_mmap.lo $(builddir)/xcache/xc_shm_mmap.lo: $(srcdir)/xcache.h $(srcdir)/xcache/xc_compatibility.h $(srcdir)/xcache/xc_lock.h $(srcdir)/xcache/xc_shm.h $(srcdir)/xcache/xc_utils.h
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
# copy this file as prepare.cfg before modifying
|
||||
PHP4_x_DIR=
|
||||
PHP5_0_DIR=
|
||||
PHP5_1_DIR=
|
||||
PHP5_3_DIR=
|
||||
|
|
|
@ -17,6 +17,7 @@ clean_xc_const_string:
|
|||
|
||||
.PHONY: xc_const_string
|
||||
xc_const_string: \
|
||||
xcache/xc_const_string_opcodes_php4.x.h \
|
||||
xcache/xc_const_string_opcodes_php5.0.h \
|
||||
xcache/xc_const_string_opcodes_php5.1.h \
|
||||
xcache/xc_const_string_opcodes_php5.3.h \
|
||||
|
@ -33,6 +34,15 @@ xcache/xc_opcode_spec_def.h: ${EA_DIR}/opcodes.c
|
|||
mv "$@".tmp "$@"
|
||||
endif
|
||||
|
||||
ifeq (${PHP4_x_DIR},)
|
||||
xcache/xc_const_string_opcodes_php4.x.h: dummy
|
||||
@echo "Skipped $@: PHP_4_x_DIR not set"
|
||||
else
|
||||
xcache/xc_const_string_opcodes_php4.x.h: ${PHP4_x_DIR}/Zend/zend_compile.h
|
||||
$(AWK) -f ./devel/gen_const_string_opcodes.awk < "$<" > "$@.tmp"
|
||||
mv "$@.tmp" "$@"
|
||||
endif
|
||||
|
||||
ifeq (${PHP5_0_DIR},)
|
||||
xcache/xc_const_string_opcodes_php5.0.h: dummy
|
||||
@echo "Skipped $@: PHP_5_0_DIR not set"
|
||||
|
|
|
@ -145,7 +145,7 @@ class Decompiler_Object // {{{
|
|||
// }}}
|
||||
class Decompiler_Value extends Decompiler_Object // {{{
|
||||
{
|
||||
public $value;
|
||||
var $value;
|
||||
|
||||
function Decompiler_Value($value = null)
|
||||
{
|
||||
|
@ -174,7 +174,7 @@ class Decompiler_Value extends Decompiler_Object // {{{
|
|||
// }}}
|
||||
class Decompiler_Code extends Decompiler_Object // {{{
|
||||
{
|
||||
public $src;
|
||||
var $src;
|
||||
|
||||
function Decompiler_Code($src)
|
||||
{
|
||||
|
@ -192,10 +192,10 @@ class Decompiler_Code extends Decompiler_Object // {{{
|
|||
// }}}
|
||||
class Decompiler_Binop extends Decompiler_Code // {{{
|
||||
{
|
||||
public $opc;
|
||||
public $op1;
|
||||
public $op2;
|
||||
public $parent;
|
||||
var $opc;
|
||||
var $op1;
|
||||
var $op2;
|
||||
var $parent;
|
||||
|
||||
function Decompiler_Binop($parent, $op1, $opc, $op2)
|
||||
{
|
||||
|
@ -233,9 +233,9 @@ class Decompiler_Binop extends Decompiler_Code // {{{
|
|||
// }}}
|
||||
class Decompiler_TriOp extends Decompiler_Code // {{{
|
||||
{
|
||||
public $condition;
|
||||
public $trueValue;
|
||||
public $falseValue;
|
||||
var $condition;
|
||||
var $trueValue;
|
||||
var $falseValue;
|
||||
|
||||
function Decompiler_TriOp($condition, $trueValue, $falseValue)
|
||||
{
|
||||
|
@ -261,8 +261,8 @@ class Decompiler_TriOp extends Decompiler_Code // {{{
|
|||
// }}}
|
||||
class Decompiler_Fetch extends Decompiler_Code // {{{
|
||||
{
|
||||
public $src;
|
||||
public $fetchType;
|
||||
var $src;
|
||||
var $fetchType;
|
||||
|
||||
function Decompiler_Fetch($src, $type, $globalSrc)
|
||||
{
|
||||
|
@ -294,7 +294,7 @@ class Decompiler_Fetch extends Decompiler_Code // {{{
|
|||
// }}}
|
||||
class Decompiler_Box // {{{
|
||||
{
|
||||
public $obj;
|
||||
var $obj;
|
||||
|
||||
function Decompiler_Box(&$obj)
|
||||
{
|
||||
|
@ -309,10 +309,10 @@ class Decompiler_Box // {{{
|
|||
// }}}
|
||||
class Decompiler_Dim extends Decompiler_Value // {{{
|
||||
{
|
||||
public $offsets = array();
|
||||
public $isLast = false;
|
||||
public $isObject = false;
|
||||
public $assign = null;
|
||||
var $offsets = array();
|
||||
var $isLast = false;
|
||||
var $isObject = false;
|
||||
var $assign = null;
|
||||
|
||||
function toCode($indent)
|
||||
{
|
||||
|
@ -341,9 +341,9 @@ class Decompiler_DimBox extends Decompiler_Box // {{{
|
|||
// }}}
|
||||
class Decompiler_List extends Decompiler_Code // {{{
|
||||
{
|
||||
public $src;
|
||||
public $dims = array();
|
||||
public $everLocked = false;
|
||||
var $src;
|
||||
var $dims = array();
|
||||
var $everLocked = false;
|
||||
|
||||
function toCode($indent)
|
||||
{
|
||||
|
@ -499,7 +499,7 @@ class Decompiler_ConstArray extends Decompiler_Array // {{{
|
|||
// }}}
|
||||
class Decompiler_ForeachBox extends Decompiler_Box // {{{
|
||||
{
|
||||
public $iskey;
|
||||
var $iskey;
|
||||
|
||||
function toCode($indent)
|
||||
{
|
||||
|
@ -510,12 +510,12 @@ class Decompiler_ForeachBox extends Decompiler_Box // {{{
|
|||
|
||||
class Decompiler
|
||||
{
|
||||
public $namespace;
|
||||
public $namespaceDecided;
|
||||
public $activeFile;
|
||||
public $activeClass;
|
||||
public $activeMethod;
|
||||
public $activeFunction;
|
||||
var $namespace;
|
||||
var $namespaceDecided;
|
||||
var $activeFile;
|
||||
var $activeClass;
|
||||
var $activeMethod;
|
||||
var $activeFunction;
|
||||
|
||||
function Decompiler()
|
||||
{
|
||||
|
@ -1374,7 +1374,7 @@ class Decompiler
|
|||
// */
|
||||
}
|
||||
unset($op);
|
||||
if ($op_array['try_catch_array']) {
|
||||
if (isset($op_array['try_catch_array'])) {
|
||||
foreach ($op_array['try_catch_array'] as $try_catch_element) {
|
||||
$catch_op = $try_catch_element['catch_op'];
|
||||
$try_op = $try_catch_element['try_op'];
|
||||
|
@ -1492,7 +1492,7 @@ class Decompiler
|
|||
array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope']));
|
||||
$EX['object'] = (int) $res['var'];
|
||||
$EX['called_scope'] = null;
|
||||
$EX['fbc'] = 'new ' . $this->stripNamespace($this->getOpVal($op1, $EX));
|
||||
$EX['fbc'] = 'new ' . $this->stripNamespace(isset($op1['constant']) ? $op1['constant'] : $this->getOpVal($op1, $EX));
|
||||
break;
|
||||
// }}}
|
||||
case XC_THROW: // {{{
|
||||
|
@ -1538,6 +1538,10 @@ class Decompiler
|
|||
}
|
||||
|
||||
if ($op1['op_type'] == XC_IS_CONST) {
|
||||
if (!ZEND_ENGINE_2) {
|
||||
$resvar = $op1['constant'];
|
||||
break;
|
||||
}
|
||||
$resvar = $this->stripNamespace($op1['constant']);
|
||||
}
|
||||
else {
|
||||
|
@ -1554,7 +1558,7 @@ class Decompiler
|
|||
case XC_FETCH_FUNC_ARG:
|
||||
case XC_FETCH_UNSET:
|
||||
case XC_FETCH_IS:
|
||||
$fetchType = defined('ZEND_FETCH_TYPE_MASK') ? ($ext & ZEND_FETCH_TYPE_MASK) : $op2['EA.type'];
|
||||
$fetchType = defined('ZEND_FETCH_TYPE_MASK') ? ($ext & ZEND_FETCH_TYPE_MASK) : $op2[!ZEND_ENGINE_2 ? 'fetch_type' : 'EA.type'];
|
||||
$name = isset($op1['constant']) ? $op1['constant'] : unquoteName($this->getOpVal($op1, $EX), $EX);
|
||||
if ($fetchType == ZEND_FETCH_STATIC_MEMBER) {
|
||||
$class = isset($op2['constant']) ? $op2['constant'] : $this->getOpVal($op2, $EX);
|
||||
|
@ -1600,7 +1604,12 @@ class Decompiler
|
|||
$src = $this->getOpVal($op1, $EX);
|
||||
if (is_a($src, "Decompiler_ForeachBox")) {
|
||||
assert($opc == XC_FETCH_DIM_TMP_VAR);
|
||||
$src = clone $src;
|
||||
if (ZEND_ENGINE_2) {
|
||||
$src = clone($src);
|
||||
}
|
||||
else {
|
||||
$src = new Decompiler_ForeachBox($src->obj);
|
||||
}
|
||||
$src->iskey = $op2['constant'];
|
||||
$resvar = $src;
|
||||
break;
|
||||
|
@ -1641,7 +1650,7 @@ class Decompiler
|
|||
$dim->isObject = true;
|
||||
}
|
||||
else if ($opc == XC_UNSET_DIM_OBJ) {
|
||||
$dim->isObject = $ext == ZEND_UNSET_OBJ;
|
||||
$dim->isObject = ZEND_ENGINE_2 ? $ext == ZEND_UNSET_OBJ : false /* cannot distingue */;
|
||||
}
|
||||
unset($dim);
|
||||
$rvalue = $dimbox;
|
||||
|
@ -1791,8 +1800,7 @@ class Decompiler
|
|||
}
|
||||
}
|
||||
|
||||
/* TODO: use type mask */
|
||||
switch (($ext & ZEND_ISSET_ISEMPTY_MASK)) {
|
||||
switch (((!ZEND_ENGINE_2 ? $op['op2']['var'] /* constant */ : $ext) & ZEND_ISSET_ISEMPTY_MASK)) {
|
||||
case ZEND_ISSET:
|
||||
$rvalue = "isset(" . str($rvalue) . ")";
|
||||
break;
|
||||
|
@ -1844,6 +1852,9 @@ class Decompiler
|
|||
// }}}
|
||||
case XC_INIT_NS_FCALL_BY_NAME:
|
||||
case XC_INIT_FCALL_BY_NAME: // {{{
|
||||
if (!ZEND_ENGINE_2 && ($ext & ZEND_CTOR_CALL)) {
|
||||
break;
|
||||
}
|
||||
array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope']));
|
||||
$EX['object'] = null;
|
||||
$EX['called_scope'] = null;
|
||||
|
@ -2528,28 +2539,34 @@ class Decompiler
|
|||
}
|
||||
// }}}
|
||||
// {{{ properties
|
||||
if (!ZEND_ENGINE_2_4) {
|
||||
if (ZEND_ENGINE_2 && !ZEND_ENGINE_2_4) {
|
||||
$default_static_members = $class[ZEND_ENGINE_2_1 ? 'default_static_members' : 'static_members'];
|
||||
}
|
||||
$member_variables = $class['properties_info'];
|
||||
$member_variables = $class[ZEND_ENGINE_2 ? 'properties_info' : 'default_properties'];
|
||||
if ($member_variables) {
|
||||
echo "\n";
|
||||
foreach ($member_variables as $name => $info) {
|
||||
if (!empty($info['doc_comment'])) {
|
||||
foreach ($member_variables as $name => $dummy) {
|
||||
$info = isset($class['properties_info']) ? $class['properties_info'][$name] : null;
|
||||
if (isset($info) && !empty($info['doc_comment'])) {
|
||||
echo $newindent;
|
||||
echo $info['doc_comment'];
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
echo $newindent;
|
||||
$static = ($info['flags'] & ZEND_ACC_STATIC);
|
||||
if (ZEND_ENGINE_2) {
|
||||
$static = ($info['flags'] & ZEND_ACC_STATIC);
|
||||
|
||||
if ($static) {
|
||||
echo "static ";
|
||||
if ($static) {
|
||||
echo "static ";
|
||||
}
|
||||
}
|
||||
|
||||
$mangleSuffix = '';
|
||||
if (!isset($info)) {
|
||||
if (!ZEND_ENGINE_2) {
|
||||
echo 'var ';
|
||||
}
|
||||
else if (!isset($info)) {
|
||||
echo 'public ';
|
||||
}
|
||||
else {
|
||||
|
@ -2576,6 +2593,9 @@ class Decompiler
|
|||
if (ZEND_ENGINE_2_4) {
|
||||
$value = $class[$static ? 'default_static_members_table' : 'default_properties_table'][$info['offset']];
|
||||
}
|
||||
else if (!ZEND_ENGINE_2) {
|
||||
$value = $class['default_properties'][$name];
|
||||
}
|
||||
else {
|
||||
$key = $info['name'] . $mangleSuffix;
|
||||
if ($static) {
|
||||
|
@ -2728,6 +2748,7 @@ define('ZEND_ENGINE_2_4', PHP_VERSION >= "5.4");
|
|||
define('ZEND_ENGINE_2_3', ZEND_ENGINE_2_4 || PHP_VERSION >= "5.3.");
|
||||
define('ZEND_ENGINE_2_2', ZEND_ENGINE_2_3 || PHP_VERSION >= "5.2.");
|
||||
define('ZEND_ENGINE_2_1', ZEND_ENGINE_2_2 || PHP_VERSION >= "5.1.");
|
||||
define('ZEND_ENGINE_2', ZEND_ENGINE_2_1 || PHP_VERSION >= "5.0.");
|
||||
|
||||
define('ZEND_ACC_STATIC', 0x01);
|
||||
define('ZEND_ACC_ABSTRACT', 0x02);
|
||||
|
@ -2879,24 +2900,48 @@ if (preg_match_all('!XC_[A-Z_]+!', file_get_contents(__FILE__), $ms)) {
|
|||
}
|
||||
//*/
|
||||
foreach (array (
|
||||
'XC_ADD_INTERFACE' => -1,
|
||||
'XC_ASSIGN_DIM' => -1,
|
||||
'XC_ASSIGN_OBJ' => -1,
|
||||
'XC_CATCH' => -1,
|
||||
'XC_CLONE' => -1,
|
||||
'XC_DECLARE_CLASS' => -1,
|
||||
'XC_DECLARE_CONST' => -1,
|
||||
'XC_DECLARE_FUNCTION' => -1,
|
||||
'XC_DECLARE_FUNCTION_OR_CLASS' => -1,
|
||||
'XC_DECLARE_INHERITED_CLASS' => -1,
|
||||
'XC_DECLARE_INHERITED_CLASS_DELAYED' => -1,
|
||||
'XC_DECLARE_LAMBDA_FUNCTION' => -1,
|
||||
'XC_DO_FCALL_BY_FUNC' => -1,
|
||||
'XC_FETCH_CLASS' => -1,
|
||||
'XC_GOTO' => -1,
|
||||
'XC_HANDLE_EXCEPTION' => -1,
|
||||
'XC_INIT_CTOR_CALL' => -1,
|
||||
'XC_INIT_FCALL_BY_FUNC' => -1,
|
||||
'XC_INIT_METHOD_CALL' => -1,
|
||||
'XC_INIT_NS_FCALL_BY_NAME' => -1,
|
||||
'XC_INIT_STATIC_METHOD_CALL' => -1,
|
||||
'XC_INSTANCEOF' => -1,
|
||||
'XC_ISSET_ISEMPTY' => -1,
|
||||
'XC_ISSET_ISEMPTY_DIM_OBJ' => -1,
|
||||
'XC_ISSET_ISEMPTY_PROP_OBJ' => -1,
|
||||
'XC_ISSET_ISEMPTY_VAR' => -1,
|
||||
'XC_JMP_NO_CTOR' => -1,
|
||||
'XC_JMP_SET' => -1,
|
||||
'XC_JMP_SET_VAR' => -1,
|
||||
'XC_OP_DATA' => -1,
|
||||
'XC_POST_DEC_OBJ' => -1,
|
||||
'XC_POST_INC_OBJ' => -1,
|
||||
'XC_PRE_DEC_OBJ' => -1,
|
||||
'XC_PRE_INC_OBJ' => -1,
|
||||
'XC_QM_ASSIGN_VAR' => -1,
|
||||
'XC_RAISE_ABSTRACT_ERROR' => -1,
|
||||
'XC_THROW' => -1,
|
||||
'XC_UNSET_DIM' => -1,
|
||||
'XC_UNSET_DIM_OBJ' => -1,
|
||||
'XC_UNSET_OBJ' => -1,
|
||||
'XC_USER_OPCODE' => -1,
|
||||
'XC_VERIFY_ABSTRACT_CLASS' => -1,
|
||||
) as $k => $v) {
|
||||
if (!defined($k)) {
|
||||
define($k, $v);
|
||||
|
|
|
@ -43,7 +43,7 @@ typedef struct {
|
|||
ulong h;
|
||||
zend_uint methodinfo_cnt;
|
||||
xc_op_array_info_t *methodinfos;
|
||||
zend_class_entry *class_entry;
|
||||
xc_cest_t cest;
|
||||
#ifndef ZEND_COMPILE_DELAYED_BINDING
|
||||
int oplineno;
|
||||
#endif
|
||||
|
@ -189,8 +189,10 @@ zend_bool xc_is_ro(const void *p);
|
|||
zend_bool xc_is_shm(const void *p);
|
||||
/* {{{ xc_gc_op_array_t */
|
||||
typedef struct {
|
||||
#ifdef ZEND_ENGINE_2
|
||||
zend_uint num_args;
|
||||
zend_arg_info *arg_info;
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2_4
|
||||
zend_literal *literals;
|
||||
#endif
|
||||
|
|
|
@ -762,6 +762,11 @@ static zend_op_array *xc_entry_install(xc_entry_php_t *entry_php TSRMLS_DC) /* {
|
|||
zend_uint i;
|
||||
xc_entry_data_php_t *p = entry_php->php;
|
||||
zend_op_array *old_active_op_array = CG(active_op_array);
|
||||
#ifndef ZEND_ENGINE_2
|
||||
ALLOCA_FLAG(use_heap)
|
||||
/* new ptr which is stored inside CG(class_table) */
|
||||
xc_cest_t **new_cest_ptrs = (xc_cest_t **)xc_do_alloca(sizeof(xc_cest_t*) * p->classinfo_cnt, use_heap);
|
||||
#endif
|
||||
|
||||
CG(active_op_array) = p->op_array;
|
||||
|
||||
|
@ -784,11 +789,21 @@ static zend_op_array *xc_entry_install(xc_entry_php_t *entry_php TSRMLS_DC) /* {
|
|||
/* install class */
|
||||
for (i = 0; i < p->classinfo_cnt; i ++) {
|
||||
xc_classinfo_t *ci = &p->classinfos[i];
|
||||
#ifndef ZEND_ENGINE_2
|
||||
zend_class_entry *ce = CestToCePtr(ci->cest);
|
||||
/* fix pointer to the be which inside class_table */
|
||||
if (ce->parent) {
|
||||
zend_uint class_idx = (/* class_num */ (int) (long) ce->parent) - 1;
|
||||
assert(class_idx < i);
|
||||
ci->cest.parent = new_cest_ptrs[class_idx];
|
||||
}
|
||||
new_cest_ptrs[i] =
|
||||
#endif
|
||||
#ifdef ZEND_COMPILE_DELAYED_BINDING
|
||||
xc_install_class(entry_php->entry.name.str.val, ci->class_entry, -1,
|
||||
xc_install_class(entry_php->entry.name.str.val, &ci->cest, -1,
|
||||
UNISW(0, ci->type), ci->key, ci->key_size, ci->h TSRMLS_CC);
|
||||
#else
|
||||
xc_install_class(entry_php->entry.name.str.val, ci->class_entry, ci->oplineno,
|
||||
xc_install_class(entry_php->entry.name.str.val, &ci->cest, ci->oplineno,
|
||||
UNISW(0, ci->type), ci->key, ci->key_size, ci->h TSRMLS_CC);
|
||||
#endif
|
||||
}
|
||||
|
@ -810,6 +825,14 @@ static zend_op_array *xc_entry_install(xc_entry_php_t *entry_php TSRMLS_DC) /* {
|
|||
CG(zend_lineno) = 0;
|
||||
#endif
|
||||
|
||||
i = 1;
|
||||
#ifndef ZEND_ENGINE_2_2
|
||||
zend_hash_add(&EG(included_files), entry_php->entry.name.str.val, entry_php->entry.name.str.len+1, (void *)&i, sizeof(int), NULL);
|
||||
#endif
|
||||
|
||||
#ifndef ZEND_ENGINE_2
|
||||
xc_free_alloca(new_cest_ptrs, use_heap);
|
||||
#endif
|
||||
CG(active_op_array) = old_active_op_array;
|
||||
return p->op_array;
|
||||
}
|
||||
|
@ -995,7 +1018,12 @@ static int xc_stat(const char *filepath, struct stat *statbuf TSRMLS_DC) /* {{{
|
|||
|
||||
wrapper = php_stream_locate_url_wrapper(filepath, &path_for_open, 0 TSRMLS_CC);
|
||||
if (wrapper && wrapper->wops->url_stat
|
||||
&& wrapper->wops->url_stat(wrapper, path_for_open, PHP_STREAM_URL_STAT_QUIET, &ssb, NULL TSRMLS_CC) == SUCCESS) {
|
||||
#ifdef ZEND_ENGINE_2
|
||||
&& wrapper->wops->url_stat(wrapper, path_for_open, PHP_STREAM_URL_STAT_QUIET, &ssb, NULL TSRMLS_CC) == SUCCESS
|
||||
#else
|
||||
&& wrapper->wops->url_stat(wrapper, path_for_open, &ssb TSRMLS_CC) == SUCCESS
|
||||
#endif
|
||||
) {
|
||||
*statbuf = ssb.sb;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
@ -1273,12 +1301,12 @@ static void xc_cache_early_binding_class_cb(zend_op *opline, int oplineno, void
|
|||
char *class_name;
|
||||
zend_uint i;
|
||||
int class_len;
|
||||
zend_class_entry *class_entry;
|
||||
xc_cest_t cest;
|
||||
xc_entry_data_php_t *php = (xc_entry_data_php_t *) data;
|
||||
|
||||
class_name = Z_OP_CONSTANT(opline->op1).value.str.val;
|
||||
class_len = Z_OP_CONSTANT(opline->op1).value.str.len;
|
||||
if (zend_hash_find(CG(class_table), class_name, class_len, (void **) &class_entry) == FAILURE) {
|
||||
if (zend_hash_find(CG(class_table), class_name, class_len, (void **) &cest) == FAILURE) {
|
||||
assert(0);
|
||||
}
|
||||
TRACE("got ZEND_DECLARE_INHERITED_CLASS: %s", class_name + 1);
|
||||
|
@ -1721,13 +1749,15 @@ static void xc_compile_php(xc_compiler_t *compiler, zend_file_handle *h, int typ
|
|||
} while(0)
|
||||
|
||||
#ifdef HAVE_XCACHE_CONSTANT
|
||||
b = EG(zend_constants)->pListHead; COPY_H(xc_constinfo_t, constinfos, constinfo_cnt, constant, zend_constant);
|
||||
b = EG(zend_constants)->pListHead; COPY_H(xc_constinfo_t, constinfos, constinfo_cnt, constant, zend_constant);
|
||||
#endif
|
||||
b = CG(function_table)->pListHead; COPY_H(xc_funcinfo_t, funcinfos, funcinfo_cnt, func, zend_function);
|
||||
b = CG(class_table)->pListHead; COPY_H(xc_classinfo_t, classinfos, classinfo_cnt, class_entry, zend_class_entry *);
|
||||
b = CG(function_table)->pListHead; COPY_H(xc_funcinfo_t, funcinfos, funcinfo_cnt, func, zend_function);
|
||||
b = CG(class_table)->pListHead; COPY_H(xc_classinfo_t, classinfos, classinfo_cnt, cest, xc_cest_t);
|
||||
|
||||
#undef COPY_H
|
||||
|
||||
/* for ZE1, cest need to be fixed inside store */
|
||||
|
||||
#ifdef ZEND_ENGINE_2_1
|
||||
/* scan for acatived auto globals */
|
||||
i = 0;
|
||||
|
@ -1764,7 +1794,8 @@ static void xc_compile_php(xc_compiler_t *compiler, zend_file_handle *h, int typ
|
|||
|
||||
for (i = 0; i < compiler->new_php.classinfo_cnt; i ++) {
|
||||
xc_classinfo_t *classinfo = &compiler->new_php.classinfos[i];
|
||||
classinfo->methodinfo_cnt = classinfo->class_entry->function_table.nTableSize;
|
||||
zend_class_entry *ce = CestToCePtr(classinfo->cest);
|
||||
classinfo->methodinfo_cnt = ce->function_table.nTableSize;
|
||||
if (classinfo->methodinfo_cnt) {
|
||||
int j;
|
||||
|
||||
|
@ -1773,7 +1804,7 @@ static void xc_compile_php(xc_compiler_t *compiler, zend_file_handle *h, int typ
|
|||
goto err_alloc;
|
||||
}
|
||||
|
||||
for (j = 0, b = classinfo->class_entry->function_table.pListHead; b; j ++, b = b->pListNext) {
|
||||
for (j = 0, b = ce->function_table.pListHead; b; j ++, b = b->pListNext) {
|
||||
xc_collect_op_array_info(compiler, &const_usage, &classinfo->methodinfos[j], (zend_op_array *) b->pData TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
|
@ -1973,7 +2004,11 @@ static zend_op_array *xc_compile_file_sandboxed(void *data TSRMLS_DC) /* {{{ */
|
|||
sandboxed_compiler->stored_php = stored_php;
|
||||
/* discard newly compiled result, restore from stored one */
|
||||
if (compiler->new_php.op_array) {
|
||||
#ifdef ZEND_ENGINE_2
|
||||
destroy_op_array(compiler->new_php.op_array TSRMLS_CC);
|
||||
#else
|
||||
destroy_op_array(compiler->new_php.op_array);
|
||||
#endif
|
||||
efree(compiler->new_php.op_array);
|
||||
compiler->new_php.op_array = NULL;
|
||||
}
|
||||
|
@ -2147,7 +2182,6 @@ static zend_op_array *xc_compile_file(zend_file_handle *h, int type TSRMLS_DC) /
|
|||
if (!XG(cacher)
|
||||
|| !h->filename
|
||||
|| !SG(request_info).path_translated
|
||||
|
||||
) {
|
||||
TRACE("%s", "cacher not enabled");
|
||||
return old_compile_file(h, type TSRMLS_CC);
|
||||
|
@ -2236,8 +2270,9 @@ void xc_gc_add_op_array(xc_gc_op_array_t *gc_op_array TSRMLS_DC) /* {{{ */
|
|||
static void xc_gc_op_array(void *pDest) /* {{{ */
|
||||
{
|
||||
xc_gc_op_array_t *op_array = (xc_gc_op_array_t *) pDest;
|
||||
zend_uint i;
|
||||
#ifdef ZEND_ENGINE_2
|
||||
if (op_array->arg_info) {
|
||||
zend_uint i;
|
||||
for (i = 0; i < op_array->num_args; i++) {
|
||||
efree((char *) ZSTR_V(op_array->arg_info[i].name));
|
||||
if (ZSTR_V(op_array->arg_info[i].class_name)) {
|
||||
|
@ -2246,6 +2281,7 @@ static void xc_gc_op_array(void *pDest) /* {{{ */
|
|||
}
|
||||
efree(op_array->arg_info);
|
||||
}
|
||||
#endif
|
||||
if (op_array->opcodes) {
|
||||
efree(op_array->opcodes);
|
||||
}
|
||||
|
@ -2761,8 +2797,8 @@ static void xc_holds_destroy(TSRMLS_D) /* {{{ */
|
|||
static void xc_request_init(TSRMLS_D) /* {{{ */
|
||||
{
|
||||
if (!XG(internal_table_copied)) {
|
||||
zend_function dummy_func;
|
||||
zend_class_entry *dummy_class_entry;
|
||||
zend_function tmp_func;
|
||||
xc_cest_t tmp_cest;
|
||||
|
||||
#ifdef HAVE_XCACHE_CONSTANT
|
||||
zend_hash_destroy(&XG(internal_constant_table));
|
||||
|
@ -2779,14 +2815,16 @@ static void xc_request_init(TSRMLS_D) /* {{{ */
|
|||
#ifdef HAVE_XCACHE_CONSTANT
|
||||
xc_copy_internal_zend_constants(&XG(internal_constant_table), EG(zend_constants));
|
||||
#endif
|
||||
zend_hash_copy(&XG(internal_function_table), CG(function_table), NULL, &dummy_func, sizeof(dummy_func));
|
||||
zend_hash_copy(&XG(internal_class_table), CG(class_table), NULL, &dummy_class_entry, sizeof(dummy_class_entry));
|
||||
zend_hash_copy(&XG(internal_function_table), CG(function_table), NULL, &tmp_func, sizeof(tmp_func));
|
||||
zend_hash_copy(&XG(internal_class_table), CG(class_table), NULL, &tmp_cest, sizeof(tmp_cest));
|
||||
|
||||
XG(internal_table_copied) = 1;
|
||||
}
|
||||
xc_holds_init(TSRMLS_C);
|
||||
xc_var_namespace_init(TSRMLS_C);
|
||||
#ifdef ZEND_ENGINE_2
|
||||
zend_llist_init(&XG(gc_op_arrays), sizeof(xc_gc_op_array_t), xc_gc_op_array, 0);
|
||||
#endif
|
||||
|
||||
#if PHP_API_VERSION <= 20041225
|
||||
XG(request_time) = time(NULL);
|
||||
|
@ -2807,7 +2845,9 @@ static void xc_request_shutdown(TSRMLS_D) /* {{{ */
|
|||
xc_gc_expires_var(TSRMLS_C);
|
||||
xc_gc_deletes(TSRMLS_C);
|
||||
xc_var_namespace_destroy(TSRMLS_C);
|
||||
#ifdef ZEND_ENGINE_2
|
||||
zend_llist_destroy(&XG(gc_op_arrays));
|
||||
#endif
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -3738,10 +3778,16 @@ static PHP_RINIT_FUNCTION(xcache_cacher) /* {{{ */
|
|||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
/* {{{ static ZEND_MODULE_POST_ZEND_DEACTIVATE_D(xcache_cacher) */
|
||||
/* {{{ static PHP_RSHUTDOWN_FUNCTION(xcache_cacher) */
|
||||
#ifndef ZEND_ENGINE_2
|
||||
static PHP_RSHUTDOWN_FUNCTION(xcache_cacher)
|
||||
#else
|
||||
static ZEND_MODULE_POST_ZEND_DEACTIVATE_D(xcache_cacher)
|
||||
#endif
|
||||
{
|
||||
#ifdef ZEND_ENGINE_2
|
||||
TSRMLS_FETCH();
|
||||
#endif
|
||||
|
||||
xc_request_shutdown(TSRMLS_C);
|
||||
return SUCCESS;
|
||||
|
@ -3754,13 +3800,22 @@ static zend_module_entry xcache_cacher_module_entry = { /* {{{ */
|
|||
PHP_MINIT(xcache_cacher),
|
||||
PHP_MSHUTDOWN(xcache_cacher),
|
||||
PHP_RINIT(xcache_cacher),
|
||||
#ifndef ZEND_ENGINE_2
|
||||
PHP_RSHUTDOWN(xcache_cacher),
|
||||
#else
|
||||
NULL,
|
||||
#endif
|
||||
PHP_MINFO(xcache_cacher),
|
||||
XCACHE_VERSION,
|
||||
#ifdef PHP_GINIT
|
||||
NO_MODULE_GLOBALS,
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2
|
||||
ZEND_MODULE_POST_ZEND_DEACTIVATE_N(xcache_cacher),
|
||||
#else
|
||||
NULL,
|
||||
NULL,
|
||||
#endif
|
||||
STANDARD_MODULE_PROPERTIES_EX
|
||||
};
|
||||
/* }}} */
|
||||
|
|
|
@ -702,7 +702,12 @@ static zend_module_entry xcache_coverager_module_entry = { /* {{{ */
|
|||
#ifdef PHP_GINIT
|
||||
NO_MODULE_GLOBALS,
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2
|
||||
NULL,
|
||||
#else
|
||||
NULL,
|
||||
NULL,
|
||||
#endif
|
||||
STANDARD_MODULE_PROPERTIES_EX
|
||||
};
|
||||
/* }}} */
|
||||
|
|
|
@ -75,7 +75,7 @@ static void xc_dasm(zval *output, zend_op_array *op_array TSRMLS_DC) /* {{{ */
|
|||
|
||||
ALLOC_INIT_ZVAL(zv);
|
||||
array_init(zv);
|
||||
xc_dasm_zend_class_entry(&dasm, zv, *(zend_class_entry **)b->pData TSRMLS_CC);
|
||||
xc_dasm_zend_class_entry(&dasm, zv, CestToCePtr(*(xc_cest_t *)b->pData) TSRMLS_CC);
|
||||
|
||||
keysize = BUCKET_KEY_SIZE(b) + 2;
|
||||
if (keysize > bufsize) {
|
||||
|
@ -150,7 +150,11 @@ zend_op_array *xc_dasm_sandboxed(void *data TSRMLS_DC) /* {{{ */
|
|||
xc_dasm(sandboxed_dasm->output, op_array TSRMLS_CC);
|
||||
|
||||
/* free */
|
||||
#ifdef ZEND_ENGINE_2
|
||||
destroy_op_array(op_array TSRMLS_CC);
|
||||
#else
|
||||
destroy_op_array(op_array);
|
||||
#endif
|
||||
efree(op_array);
|
||||
|
||||
return NULL;
|
||||
|
@ -246,7 +250,12 @@ static zend_module_entry xcache_disassembler_module_entry = { /* {{{ */
|
|||
#ifdef PHP_GINIT
|
||||
NO_MODULE_GLOBALS,
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2
|
||||
NULL,
|
||||
#else
|
||||
NULL,
|
||||
NULL,
|
||||
#endif
|
||||
STANDARD_MODULE_PROPERTIES_EX
|
||||
};
|
||||
/* }}} */
|
||||
|
|
|
@ -44,7 +44,9 @@ typedef struct _bb_t {
|
|||
int size;
|
||||
|
||||
bbid_t fall;
|
||||
#ifdef ZEND_ENGINE_2
|
||||
bbid_t catch;
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
bbid_t finally;
|
||||
#endif
|
||||
|
@ -312,7 +314,9 @@ static bb_t *bb_new_ex(zend_op *opcodes, int count) /* {{{ */
|
|||
bb_t *bb = (bb_t *) ecalloc(sizeof(bb_t), 1);
|
||||
|
||||
bb->fall = BBID_INVALID;
|
||||
#ifdef ZEND_ENGINE_2
|
||||
bb->catch = BBID_INVALID;
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
bb->finally = BBID_INVALID;
|
||||
#endif
|
||||
|
@ -346,12 +350,12 @@ static void bb_print(bb_t *bb, zend_op_array *op_array) /* {{{ */
|
|||
int line = bb->opcodes - op_array->opcodes;
|
||||
op_flowinfo_t fi;
|
||||
zend_op *last = bb->opcodes + bb->count - 1;
|
||||
bbid_t catchbbid = bb->catch;
|
||||
bbid_t catchbbid = ZESW(BBID_INVALID, bb->catch);
|
||||
bbid_t finallybbid;
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
finallybbid = bb->finally;
|
||||
#else
|
||||
finallybbid = BBID_INVALID;
|
||||
#else
|
||||
finallybbid = bb->finally;
|
||||
#endif
|
||||
|
||||
op_get_flowinfo(&fi, last);
|
||||
|
@ -423,7 +427,9 @@ static int bbs_build_from(bbs_t *bbs, zend_op_array *op_array, int count) /* {{{
|
|||
typedef struct {
|
||||
zend_bool isbbhead;
|
||||
bbid_t bbid;
|
||||
#ifdef ZEND_ENGINE_2
|
||||
bbid_t catchbbid;
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
bbid_t finallybbid;
|
||||
#endif
|
||||
|
@ -450,6 +456,7 @@ static int bbs_build_from(bbs_t *bbs, zend_op_array *op_array, int count) /* {{{
|
|||
}
|
||||
}
|
||||
}
|
||||
#ifdef ZEND_ENGINE_2
|
||||
/* mark try start */
|
||||
for (i = 0; i < op_array->last_try_catch; i ++) {
|
||||
oplineinfos[op_array->try_catch_array[i].try_op].isbbhead = 1;
|
||||
|
@ -458,6 +465,7 @@ static int bbs_build_from(bbs_t *bbs, zend_op_array *op_array, int count) /* {{{
|
|||
oplineinfos[op_array->try_catch_array[i].finally_op].isbbhead = 1;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
/* }}} */
|
||||
/* {{{ fill op lines with newly allocated id */
|
||||
for (i = 0; i < count; i ++) {
|
||||
|
@ -473,6 +481,7 @@ static int bbs_build_from(bbs_t *bbs, zend_op_array *op_array, int count) /* {{{
|
|||
TRACE("bbids[%d] = %d", i, id);
|
||||
}
|
||||
/* }}} */
|
||||
#ifdef ZEND_ENGINE_2
|
||||
/* {{{ fill op lines with catch id */
|
||||
for (i = 0; i < count; i ++) {
|
||||
oplineinfos[i].catchbbid = BBID_INVALID;
|
||||
|
@ -501,6 +510,7 @@ static int bbs_build_from(bbs_t *bbs, zend_op_array *op_array, int count) /* {{{
|
|||
}
|
||||
#endif
|
||||
/* }}} */
|
||||
#endif
|
||||
/* {{{ create basic blocks */
|
||||
start = 0;
|
||||
id = 0;
|
||||
|
@ -512,7 +522,9 @@ static int bbs_build_from(bbs_t *bbs, zend_op_array *op_array, int count) /* {{{
|
|||
|
||||
opline = op_array->opcodes + start;
|
||||
bb = bbs_new_bb_ex(bbs, opline, i - start);
|
||||
#ifdef ZEND_ENGINE_2
|
||||
bb->catch = oplineinfos[start].catchbbid;
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
bb->finally = oplineinfos[start].finallybbid;
|
||||
#endif
|
||||
|
@ -553,7 +565,10 @@ static int bbs_build_from(bbs_t *bbs, zend_op_array *op_array, int count) /* {{{
|
|||
static void bbs_restore_opnum(bbs_t *bbs, zend_op_array *op_array) /* {{{ */
|
||||
{
|
||||
int bbid;
|
||||
#ifdef ZEND_ENGINE_2
|
||||
bbid_t lasttrybbid;
|
||||
bbid_t lastcatchbbid;
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
bbid_t lastfinallybbid;
|
||||
#endif
|
||||
|
@ -579,29 +594,31 @@ static void bbs_restore_opnum(bbs_t *bbs, zend_op_array *op_array) /* {{{ */
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef ZEND_ENGINE_2
|
||||
lasttrybbid = BBID_INVALID;
|
||||
lastcatchbbid = BBID_INVALID;
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
# ifdef ZEND_ENGINE_2_5
|
||||
lastfinallybbid = BBID_INVALID;
|
||||
#endif
|
||||
# endif
|
||||
op_array->last_try_catch = 0;
|
||||
for (bbid = 0; bbid < bbs_count(bbs); bbid ++) {
|
||||
bb_t *bb = bbs_get(bbs, bbid);
|
||||
|
||||
if (lastcatchbbid != bb->catch
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
# ifdef ZEND_ENGINE_2_5
|
||||
|| lastfinallybbid != bb->finally
|
||||
#endif
|
||||
# endif
|
||||
) {
|
||||
if (bb->catch != BBID_INVALID
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
# ifdef ZEND_ENGINE_2_5
|
||||
&& bb->finally != BBID_INVALID
|
||||
#endif
|
||||
# endif
|
||||
) {
|
||||
zend_uint try_op = bbs_get(bbs, bbid)->opnum;
|
||||
zend_uint catch_op = bbs_get(bbs, bb->catch)->opnum;
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
# ifdef ZEND_ENGINE_2_5
|
||||
zend_uint finally_op = bbs_get(bbs, bb->finally)->opnum;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
zend_bool already_in_try_catch = 0;
|
||||
int j;
|
||||
|
@ -610,9 +627,9 @@ static void bbs_restore_opnum(bbs_t *bbs, zend_op_array *op_array) /* {{{ */
|
|||
zend_try_catch_element *element = &op_array->try_catch_array[j];
|
||||
if (try_op >= element->try_op && try_op < element->catch_op
|
||||
&& catch_op == element->catch_op
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
# ifdef ZEND_ENGINE_2_5
|
||||
&& finally_op == element->finally_op
|
||||
#endif
|
||||
# endif
|
||||
) {
|
||||
already_in_try_catch = 1;
|
||||
break;
|
||||
|
@ -624,18 +641,19 @@ static void bbs_restore_opnum(bbs_t *bbs, zend_op_array *op_array) /* {{{ */
|
|||
op_array->try_catch_array = erealloc(op_array->try_catch_array, sizeof(zend_try_catch_element) * op_array->last_try_catch);
|
||||
op_array->try_catch_array[try_catch_offset].try_op = try_op;
|
||||
op_array->try_catch_array[try_catch_offset].catch_op = catch_op;
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
# ifdef ZEND_ENGINE_2_5
|
||||
op_array->try_catch_array[try_catch_offset].finally_op = finally_op;
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
}
|
||||
lastcatchbbid = bb->catch;
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
# ifdef ZEND_ENGINE_2_5
|
||||
lastfinallybbid = bb->finally;
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
}
|
||||
/* it is impossible to have last bb catched */
|
||||
#endif /* ZEND_ENGINE_2 */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -766,7 +784,12 @@ static zend_module_entry xcache_optimizer_module_entry = { /* {{{ */
|
|||
#ifdef PHP_GINIT
|
||||
NO_MODULE_GLOBALS,
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2
|
||||
NULL,
|
||||
#else
|
||||
NULL,
|
||||
NULL,
|
||||
#endif
|
||||
STANDARD_MODULE_PROPERTIES_EX
|
||||
};
|
||||
/* }}} */
|
||||
|
|
|
@ -247,8 +247,8 @@ static zend_ulong xc_get_class_num(xc_processor_t *processor, zend_class_entry *
|
|||
return processor->cache_class_index + 1;
|
||||
}
|
||||
for (i = 0; i < php->classinfo_cnt; i ++) {
|
||||
ceptr = php->classinfos[i].class_entry;
|
||||
if (ceptr == ce) {
|
||||
ceptr = CestToCePtr(php->classinfos[i].cest);
|
||||
if (ZCEP_REFCOUNT_PTR(ceptr) == ZCEP_REFCOUNT_PTR(ce)) {
|
||||
processor->cache_ce = ceptr;
|
||||
processor->cache_class_index = i;
|
||||
return i + 1;
|
||||
|
@ -260,13 +260,16 @@ static zend_ulong xc_get_class_num(xc_processor_t *processor, zend_class_entry *
|
|||
define(`xc_get_class_num', `xc_get_class_numNOTDEFINED')
|
||||
/* }}} */
|
||||
/* {{{ xc_get_class */
|
||||
#ifdef ZEND_ENGINE_2
|
||||
static zend_class_entry *xc_get_class(xc_processor_t *processor, zend_ulong class_num) {
|
||||
/* must be parent or currrent class */
|
||||
assert(class_num <= processor->active_class_index + 1);
|
||||
return processor->php_dst->classinfos[class_num - 1].class_entry;
|
||||
return CestToCePtr(processor->php_dst->classinfos[class_num - 1].cest);
|
||||
}
|
||||
#endif
|
||||
define(`xc_get_class', `xc_get_classNOTDEFINED')
|
||||
/* }}} */
|
||||
#ifdef ZEND_ENGINE_2
|
||||
/* fix method on store */
|
||||
static void xc_fix_method(xc_processor_t *processor, zend_op_array *dst TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
|
@ -341,6 +344,7 @@ static void xc_fix_method(xc_processor_t *processor, zend_op_array *dst TSRMLS_D
|
|||
}
|
||||
}
|
||||
/* }}} */
|
||||
#endif
|
||||
/* {{{ call op_array ctor handler */
|
||||
extern zend_bool xc_have_op_array_ctor;
|
||||
static void xc_zend_extension_op_array_ctor_handler(zend_extension *extension, zend_op_array *op_array TSRMLS_DC)
|
||||
|
|
|
@ -11,7 +11,9 @@ DECL_STRUCT_P_FUNC(`zend_constant')
|
|||
DECL_STRUCT_P_FUNC(`zend_function')
|
||||
DECL_STRUCT_P_FUNC(`xc_entry_var_t')
|
||||
DECL_STRUCT_P_FUNC(`xc_entry_php_t')
|
||||
#ifdef ZEND_ENGINE_2
|
||||
DECL_STRUCT_P_FUNC(`zend_property_info')
|
||||
#endif
|
||||
/* }}} */
|
||||
dnl ====================================================
|
||||
#ifdef IS_CV
|
||||
|
@ -31,6 +33,18 @@ DEF_STRUCT_P_FUNC(`zend_uint', , `dnl {{{
|
|||
DONE_SIZE(sizeof(src[0]))
|
||||
')
|
||||
dnl }}}
|
||||
#ifndef ZEND_ENGINE_2
|
||||
DEF_STRUCT_P_FUNC(`int', , `dnl {{{
|
||||
IFCOPY(`*dst = *src;')
|
||||
IFDPRINT(`
|
||||
INDENT()
|
||||
fprintf(stderr, "%d\n", src[0]);
|
||||
')
|
||||
DONE_SIZE(sizeof(src[0]))
|
||||
')
|
||||
dnl }}}
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2
|
||||
DEF_STRUCT_P_FUNC(`zend_try_catch_element', , `dnl {{{
|
||||
PROCESS(zend_uint, try_op)
|
||||
PROCESS(zend_uint, catch_op)
|
||||
|
@ -40,6 +54,7 @@ DEF_STRUCT_P_FUNC(`zend_try_catch_element', , `dnl {{{
|
|||
#endif
|
||||
')
|
||||
dnl }}}
|
||||
#endif
|
||||
DEF_STRUCT_P_FUNC(`zend_brk_cont_element', , `dnl {{{
|
||||
#ifdef ZEND_ENGINE_2_2
|
||||
PROCESS(int, start)
|
||||
|
@ -51,7 +66,9 @@ DEF_STRUCT_P_FUNC(`zend_brk_cont_element', , `dnl {{{
|
|||
dnl }}}
|
||||
DEF_HASH_TABLE_FUNC(`HashTable_zval_ptr', `zval_ptr')
|
||||
DEF_HASH_TABLE_FUNC(`HashTable_zend_function', `zend_function')
|
||||
#ifdef ZEND_ENGINE_2
|
||||
DEF_HASH_TABLE_FUNC(`HashTable_zend_property_info', `zend_property_info')
|
||||
#endif
|
||||
DEF_STRUCT_P_FUNC(`zval', , `dnl {{{
|
||||
IFDASM(`do {
|
||||
zval_dtor(dst);
|
||||
|
@ -115,6 +132,10 @@ proc_unicode:
|
|||
case IS_OBJECT:
|
||||
IFNOTMEMCPY(`IFCOPY(`memcpy(dst, src, sizeof(src[0]));')')
|
||||
dnl STRUCT(value.obj)
|
||||
#ifndef ZEND_ENGINE_2
|
||||
STRUCT_P(zend_class_entry, value.obj.ce)
|
||||
STRUCT_P(HashTable, value.obj.properties, HashTable_zval_ptr)
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -132,8 +153,10 @@ dnl }}}
|
|||
|
||||
#ifdef ZEND_ENGINE_2_3
|
||||
PROCESS(zend_uint, refcount__gc)
|
||||
#else
|
||||
#elif defined(ZEND_ENGINE_2)
|
||||
PROCESS(zend_uint, refcount)
|
||||
#else
|
||||
PROCESS(zend_ushort, refcount)
|
||||
#endif
|
||||
')dnl IFDASM
|
||||
')
|
||||
|
@ -184,7 +207,7 @@ DEF_STRUCT_P_FUNC(`zval_ptr', , `dnl {{{
|
|||
IFCOPY(`
|
||||
dnl fprintf(stderr, "copy from %p to %p\n", src[0], dst[0]);
|
||||
')
|
||||
IFDPRINT(`INDENT()`'fprintf(stderr, "[%p] ", src[0]);')
|
||||
IFDPRINT(`INDENT()`'fprintf(stderr, "[%p] ", (void *) src[0]);')
|
||||
STRUCT_P_EX(zval, dst[0], src[0], `[0]', `', ` ')
|
||||
FIXPOINTER_EX(zval, dst[0])
|
||||
} while (0);
|
||||
|
@ -204,6 +227,7 @@ DEF_STRUCT_P_FUNC(`zval_ptr_nullable', , `dnl {{{
|
|||
DONE_SIZE(sizeof(zval_ptr_nullable))
|
||||
')
|
||||
dnl }}}
|
||||
#ifdef ZEND_ENGINE_2
|
||||
DEF_STRUCT_P_FUNC(`zend_arg_info', , `dnl {{{
|
||||
PROCESS(zend_uint, name_len)
|
||||
PROC_ZSTRING_L(, name, name_len)
|
||||
|
@ -222,6 +246,7 @@ DEF_STRUCT_P_FUNC(`zend_arg_info', , `dnl {{{
|
|||
#endif
|
||||
')
|
||||
dnl }}}
|
||||
#endif
|
||||
#ifdef HAVE_XCACHE_CONSTANT
|
||||
DEF_STRUCT_P_FUNC(`zend_constant', , `dnl {{{
|
||||
STRUCT(zval, value)
|
||||
|
@ -255,6 +280,7 @@ DEF_STRUCT_P_FUNC(`zend_function', , `dnl {{{
|
|||
DONE_SIZE(sizeof(src[0]))
|
||||
')
|
||||
dnl }}}
|
||||
#ifdef ZEND_ENGINE_2
|
||||
DEF_STRUCT_P_FUNC(`zend_property_info', , `dnl {{{
|
||||
PROCESS(zend_uint, flags)
|
||||
PROCESS(int, name_length)
|
||||
|
@ -273,6 +299,7 @@ DEF_STRUCT_P_FUNC(`zend_property_info', , `dnl {{{
|
|||
#endif
|
||||
')
|
||||
dnl }}}
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2_4
|
||||
DEF_STRUCT_P_FUNC(`zend_trait_method_reference', , `dnl {{{
|
||||
PROCESS(unsigned int, mname_len)
|
||||
|
@ -335,14 +362,31 @@ DEF_STRUCT_P_FUNC(`zend_class_entry', , `dnl {{{
|
|||
PROCESS(char, type)
|
||||
PROCESS(zend_uint, name_length)
|
||||
PROC_ZSTRING_L(, name, name_length)
|
||||
PROC_CLASS_ENTRY_P(parent)
|
||||
IFRESTORE(`
|
||||
#ifndef ZEND_ENGINE_2
|
||||
/* just copy parent and resolve on install_class */
|
||||
COPY(parent)
|
||||
#else
|
||||
PROC_CLASS_ENTRY_P(parent)
|
||||
#endif
|
||||
', `
|
||||
PROC_CLASS_ENTRY_P(parent)
|
||||
')
|
||||
#ifdef ZEND_ENGINE_2
|
||||
PROCESS(int, refcount)
|
||||
#else
|
||||
STRUCT_P(int, refcount)
|
||||
#endif
|
||||
#ifndef ZEND_ENGINE_2_4
|
||||
PROCESS(zend_bool, constants_updated)
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2
|
||||
PROCESS(zend_uint, ce_flags)
|
||||
#endif
|
||||
|
||||
#ifdef ZEND_ENGINE_2
|
||||
STRUCT(HashTable, properties_info, HashTable_zend_property_info)
|
||||
#endif
|
||||
|
||||
#ifdef ZEND_ENGINE_2_4
|
||||
STRUCT_ARRAY(int, default_properties_count, zval_ptr_nullable, default_properties_table)
|
||||
|
@ -359,11 +403,12 @@ DEF_STRUCT_P_FUNC(`zend_class_entry', , `dnl {{{
|
|||
STRUCT(HashTable, default_static_members, HashTable_zval_ptr)
|
||||
IFCOPY(`dst->static_members = &dst->default_static_members;')
|
||||
DONE(static_members)
|
||||
# else
|
||||
# elif defined(ZEND_ENGINE_2)
|
||||
STRUCT_P(HashTable, static_members, HashTable_zval_ptr)
|
||||
# endif
|
||||
#endif /* ZEND_ENGINE_2_4 */
|
||||
|
||||
#ifdef ZEND_ENGINE_2
|
||||
STRUCT(HashTable, constants_table, HashTable_zval_ptr)
|
||||
|
||||
#ifdef ZEND_ENGINE_2_2
|
||||
|
@ -448,6 +493,11 @@ DEF_STRUCT_P_FUNC(`zend_class_entry', , `dnl {{{
|
|||
/* # NOT DONE */
|
||||
COPY(module)
|
||||
# endif
|
||||
#else /* ZEND_ENGINE_2 */
|
||||
COPY(handle_function_call)
|
||||
COPY(handle_property_get)
|
||||
COPY(handle_property_set)
|
||||
#endif
|
||||
dnl must do after SETNULL(constructor) and dst->parent
|
||||
STRUCT(HashTable, function_table, HashTable_zend_function)
|
||||
IFRESTORE(`dst->function_table.pDestructor = ZEND_FUNCTION_DTOR;')
|
||||
|
@ -554,6 +604,9 @@ DEF_STRUCT_P_FUNC(`znode', , `dnl {{{
|
|||
case IS_UNUSED:
|
||||
IFDASM(`PROCESS(zend_uint, u.var)')
|
||||
PROCESS(zend_uint, u.opline_num)
|
||||
#ifndef ZEND_ENGINE_2
|
||||
PROCESS(zend_uint, u.fetch_type)
|
||||
#endif
|
||||
PROCESS(zend_uint, u.EA.type)
|
||||
break;
|
||||
')
|
||||
|
@ -606,14 +659,15 @@ DEF_STRUCT_P_FUNC(`zend_op', , `dnl {{{
|
|||
UNION_znode_op_literal(op2)
|
||||
#endif
|
||||
popdef(`UNION_znode_op_literal')
|
||||
#ifdef ZEND_ENGINE_2
|
||||
switch (src->opcode) {
|
||||
#ifdef ZEND_GOTO
|
||||
# ifdef ZEND_GOTO
|
||||
case ZEND_GOTO:
|
||||
#endif
|
||||
# endif
|
||||
case ZEND_JMP:
|
||||
#ifdef ZEND_FAST_CALL
|
||||
# ifdef ZEND_FAST_CALL
|
||||
case ZEND_FAST_CALL:
|
||||
#endif
|
||||
# endif
|
||||
assert(Z_OP(src->op1).jmp_addr >= processor->active_op_array_src->opcodes && Z_OP(src->op1).jmp_addr - processor->active_op_array_src->opcodes < processor->active_op_array_src->last);
|
||||
Z_OP(dst->op1).jmp_addr = processor->active_op_array_dst->opcodes + (Z_OP(src->op1).jmp_addr - processor->active_op_array_src->opcodes);
|
||||
assert(Z_OP(dst->op1).jmp_addr >= processor->active_op_array_dst->opcodes && Z_OP(dst->op1).jmp_addr - processor->active_op_array_dst->opcodes < processor->active_op_array_dst->last);
|
||||
|
@ -623,12 +677,12 @@ DEF_STRUCT_P_FUNC(`zend_op', , `dnl {{{
|
|||
case ZEND_JMPNZ:
|
||||
case ZEND_JMPZ_EX:
|
||||
case ZEND_JMPNZ_EX:
|
||||
#ifdef ZEND_JMP_SET
|
||||
# ifdef ZEND_JMP_SET
|
||||
case ZEND_JMP_SET:
|
||||
#endif
|
||||
#ifdef ZEND_JMP_SET_VAR
|
||||
# endif
|
||||
# ifdef ZEND_JMP_SET_VAR
|
||||
case ZEND_JMP_SET_VAR:
|
||||
#endif
|
||||
# endif
|
||||
assert(Z_OP(src->op2).jmp_addr >= processor->active_op_array_src->opcodes && Z_OP(src->op2).jmp_addr - processor->active_op_array_src->opcodes < processor->active_op_array_src->last);
|
||||
Z_OP(dst->op2).jmp_addr = processor->active_op_array_dst->opcodes + (Z_OP(src->op2).jmp_addr - processor->active_op_array_src->opcodes);
|
||||
assert(Z_OP(dst->op2).jmp_addr >= processor->active_op_array_dst->opcodes && Z_OP(dst->op2).jmp_addr - processor->active_op_array_dst->opcodes < processor->active_op_array_dst->last);
|
||||
|
@ -637,8 +691,11 @@ DEF_STRUCT_P_FUNC(`zend_op', , `dnl {{{
|
|||
default:
|
||||
break;
|
||||
}
|
||||
# endif
|
||||
')
|
||||
#ifdef ZEND_ENGINE_2
|
||||
PROCESS(opcode_handler_t, handler)
|
||||
#endif
|
||||
')
|
||||
dnl }}}
|
||||
#ifdef ZEND_ENGINE_2_4
|
||||
|
@ -685,8 +742,10 @@ DEF_STRUCT_P_FUNC(`zend_op_array', , `dnl {{{
|
|||
#endif
|
||||
/* deep */
|
||||
STRUCT_P(HashTable, static_variables, HashTable_zval_ptr)
|
||||
#ifdef ZEND_ENGINE_2
|
||||
STRUCT_ARRAY(zend_uint, num_args, zend_arg_info, arg_info)
|
||||
gc_arg_info = 1;
|
||||
#endif
|
||||
dst->filename = processor->entry_php_src->filepath;
|
||||
#ifdef ZEND_ENGINE_2_4
|
||||
if (src->literals) {
|
||||
|
@ -730,7 +789,9 @@ DEF_STRUCT_P_FUNC(`zend_op_array', , `dnl {{{
|
|||
#ifdef ZEND_FAST_CALL
|
||||
case ZEND_FAST_CALL:
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2
|
||||
Z_OP(opline->op1).jmp_addr = &dst->opcodes[Z_OP(opline->op1).jmp_addr - src->opcodes];
|
||||
#endif
|
||||
break;
|
||||
|
||||
case ZEND_JMPZ:
|
||||
|
@ -743,7 +804,9 @@ DEF_STRUCT_P_FUNC(`zend_op_array', , `dnl {{{
|
|||
#ifdef ZEND_JMP_SET_VAR
|
||||
case ZEND_JMP_SET_VAR:
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2
|
||||
Z_OP(opline->op2).jmp_addr = &dst->opcodes[Z_OP(opline->op2).jmp_addr - src->opcodes];
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -757,8 +820,10 @@ DEF_STRUCT_P_FUNC(`zend_op_array', , `dnl {{{
|
|||
#endif
|
||||
) {
|
||||
xc_gc_op_array_t gc_op_array;
|
||||
#ifdef ZEND_ENGINE_2
|
||||
gc_op_array.num_args = gc_arg_info ? dst->num_args : 0;
|
||||
gc_op_array.arg_info = gc_arg_info ? dst->arg_info : NULL;
|
||||
#endif
|
||||
gc_op_array.opcodes = gc_opcodes ? dst->opcodes : NULL;
|
||||
#ifdef ZEND_ENGINE_2_4
|
||||
gc_op_array.literals = gc_literals ? dst->literals : NULL;
|
||||
|
@ -775,6 +840,7 @@ DEF_STRUCT_P_FUNC(`zend_op_array', , `dnl {{{
|
|||
/* Common elements */
|
||||
PROCESS(zend_uchar, type)
|
||||
PROC_ZSTRING(, function_name)
|
||||
#ifdef ZEND_ENGINE_2
|
||||
PROCESS(zend_uint, fn_flags)
|
||||
STRUCT_ARRAY(zend_uint, num_args, zend_arg_info, arg_info)
|
||||
PROCESS(zend_uint, num_args)
|
||||
|
@ -782,6 +848,26 @@ DEF_STRUCT_P_FUNC(`zend_op_array', , `dnl {{{
|
|||
# ifndef ZEND_ENGINE_2_4
|
||||
PROCESS(zend_bool, pass_rest_by_reference)
|
||||
# endif
|
||||
#else
|
||||
if (src->arg_types) {
|
||||
ALLOC(dst->arg_types, zend_uchar, src->arg_types[0] + 1)
|
||||
IFCOPY(`memcpy(dst->arg_types, src->arg_types, sizeof(src->arg_types[0]) * (src->arg_types[0]+1));')
|
||||
IFDASM(`do {
|
||||
int i;
|
||||
zval *zv;
|
||||
ALLOC_INIT_ZVAL(zv);
|
||||
array_init(zv);
|
||||
for (i = 0; i < src->arg_types[0]; i ++) {
|
||||
add_next_index_long(zv, src->arg_types[i + 1]);
|
||||
}
|
||||
add_assoc_zval_ex(dst, ZEND_STRS("arg_types"), zv);
|
||||
} while (0);')
|
||||
DONE(arg_types)
|
||||
}
|
||||
else {
|
||||
COPYNULL(arg_types)
|
||||
}
|
||||
#endif
|
||||
#ifndef ZEND_ENGINE_2_4
|
||||
PROCESS(unsigned char, return_reference)
|
||||
#endif
|
||||
|
@ -832,9 +918,14 @@ DEF_STRUCT_P_FUNC(`zend_op_array', , `dnl {{{
|
|||
#ifndef ZEND_ENGINE_2_4
|
||||
PROCESS(zend_uint, current_brk_cont)
|
||||
#endif
|
||||
#ifndef ZEND_ENGINE_2
|
||||
PROCESS(zend_bool, uses_globals)
|
||||
#endif
|
||||
|
||||
#ifdef ZEND_ENGINE_2
|
||||
STRUCT_ARRAY(int, last_try_catch, zend_try_catch_element, try_catch_array)
|
||||
PROCESS(int, last_try_catch)
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2_5
|
||||
PROCESS(zend_bool, has_finally_block)
|
||||
#endif
|
||||
|
@ -865,10 +956,12 @@ DEF_STRUCT_P_FUNC(`zend_op_array', , `dnl {{{
|
|||
PROC_STRING(script_encoding)
|
||||
')
|
||||
#endif
|
||||
#ifdef ZEND_ENGINE_2
|
||||
PROCESS(zend_uint, line_start)
|
||||
PROCESS(zend_uint, line_end)
|
||||
PROCESS(int, doc_comment_len)
|
||||
PROC_ZSTRING_L(, doc_comment, doc_comment_len)
|
||||
#endif
|
||||
#ifdef ZEND_COMPILE_DELAYED_BINDING
|
||||