- Add ownedTmpVars array to track temporary variables in nullsafe operations - Register object temporary variables when creating nullsafe access chains - Track intermediate temporary variables during nullsafe traversal - Add cleanup logic to release C++ temporaries at PHP statement boundaries - Generate unset calls for tracked temporaries in reverse order - Create comprehensive test case for nullsafe receiver temporary lifetime - Verify weak reference target release after nullsafe statement completionmaster
parent
1456305ade
commit
ea08344c92
2 changed files with 63 additions and 0 deletions
@ -0,0 +1,55 @@ |
||||
--TEST-- |
||||
Nullsafe receiver temporaries release weak targets after the statement |
||||
--FILE-- |
||||
<?php |
||||
|
||||
final class NullsafeWeakReceiver |
||||
{ |
||||
public string $value = 'probe'; |
||||
|
||||
public function label(): string |
||||
{ |
||||
return $this->value; |
||||
} |
||||
} |
||||
|
||||
function methodReceiver(): array |
||||
{ |
||||
$target = new NullsafeWeakReceiver(); |
||||
$weak = WeakReference::create($target); |
||||
$observed = $weak->get()?->label(); |
||||
unset($target); |
||||
gc_collect_cycles(); |
||||
return [$observed, $weak->get() === null]; |
||||
} |
||||
|
||||
function propertyReceiver(): array |
||||
{ |
||||
$target = new NullsafeWeakReceiver(); |
||||
$weak = WeakReference::create($target); |
||||
$observed = $weak->get()?->value; |
||||
unset($target); |
||||
gc_collect_cycles(); |
||||
return [$observed, $weak->get() === null]; |
||||
} |
||||
|
||||
function main(): void |
||||
{ |
||||
var_dump(methodReceiver()); |
||||
var_dump(propertyReceiver()); |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
array(2) { |
||||
[0]=> |
||||
string(5) "probe" |
||||
[1]=> |
||||
bool(true) |
||||
} |
||||
array(2) { |
||||
[0]=> |
||||
string(5) "probe" |
||||
[1]=> |
||||
bool(true) |
||||
} |
||||
Loading…
Reference in new issue