| 
        php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
  [2007-02-08 06:17 UTC] proofek at gmail dot com
 Description:
------------
When I'm manipulating with class methods I get:
Fatal error: Allowed memory size of 524288000 bytes exhausted (tried to allocate 1680829573 bytes)
It happens during restoring original method.
The class is not small but it's not huge either.
Increasing allowed memory size didn't help.
Reproduce code:
---------------
runkit_method_copy('Class1', 'addFile', 'Class2', 'addFile');
(...) doing some stuff, and then
runkit_method_remove('Class2', 'addFile');
runkit_method_copy('Class2', 'addFile', 'Class1', 'addFile');
runkit_method_remove('Class1', 'addFile');
Expected result:
----------------
Run till the very end
Actual result:
--------------
Fatal error: Allowed memory size of 524288000 bytes exhausted (tried to allocate 1680829573 bytes)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             
             | 
    |||||||||||||||||||||||||||
            
                 
                Copyright © 2001-2025 The PHP GroupAll rights reserved.  | 
        Last updated: Tue Nov 04 14:00:01 2025 UTC | 
This occurs due to a bug in php_runkit_function_copy_ctor. There is dupvars initalization for the vars name missing. Patch is following: Index: runkit_functions.c =================================================================== RCS file: /repository/pecl/runkit/runkit_functions.c,v retrieving revision 1.10 diff -u -r1.10 runkit_functions.c --- runkit_functions.c 17 Nov 2007 07:40:47 -0000 1.10 +++ runkit_functions.c 27 Dec 2007 17:22:31 -0000 @@ -136,6 +136,8 @@ while (i > 0) { i--; dupvars[i].name = estrdup(fe->op_array.vars[i].name); + dupvars[i].name_len = fe->op_array.vars[i].name_len; + dupvars[i].hash_value = fe->op_array.vars[i].hash_value; } fe->op_array.vars = dupvars; #endif Index: tests/bug10053.phpt =================================================================== RCS file: tests/bug10053.phpt diff -N tests/bug10053.phpt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/bug10053.phpt 27 Dec 2007 17:22:31 -0000 @@ -0,0 +1,65 @@ +--TEST-- +runkit_method_copy() function +--SKIPIF-- +<?php if(!extension_loaded("runkit") || !RUNKIT_FEATURE_MANIPULATION) print "skip"; ?> +--INI-- +error_reporting=E_ALL +display_errors=on +--FILE-- +<?php +class runkit_one { + private $b = 0; + private $c = 1; + + function runkit_method($naturalNumber) { + $delta = $this->c + $naturalNumber; + $thisIsAStrangeVariableWithAVeryLongNameHopeThisWillShowTheError = $delta * $delta; + $objectVarWithLongName = new stdclass; + $objectVarWithLongName->e = $thisIsAStrangeVariableWithAVeryLongNameHopeThisWillShowTheError; + echo "Runkit Method: $naturalNumber\n"; + var_dump($objectVarWithLongName); + } +} + +class runkit_two { + private $b = 27; + private $c = 99; + +} + +$o = new runkit_one(); +$o->runkit_method(1); + +runkit_method_copy('runkit_two','runkit_method','runkit_one'); + +$o->runkit_method(2); + +$o2 = new runkit_two(); +$o2->runkit_method(3); +runkit_method_remove('runkit_one','runkit_method'); +if (method_exists('runkit_one','runkit_method')) { + echo "Runkit Method still exists in Runkit One!\n"; +} +$o2->runkit_method(4); +?> +--EXPECT-- +Runkit Method: 1 +object(stdClass)#2 (1) { + ["e"]=> + int(4) +} +Runkit Method: 2 +object(stdClass)#2 (1) { + ["e"]=> + int(9) +} +Runkit Method: 3 +object(stdClass)#3 (1) { + ["e"]=> + int(10404) +} +Runkit Method: 4 +object(stdClass)#3 (1) { + ["e"]=> + int(10609) +}