- 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