Skip to content

Commit db53f36

Browse files
committed
#344: Weak References.
1 parent 019e89a commit db53f36

File tree

6 files changed

+120
-1
lines changed

6 files changed

+120
-1
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.develnext.jphp.core.compiler.jvm;
2+
3+
import org.junit.Assert;
4+
import org.junit.FixMethodOrder;
5+
import org.junit.Test;
6+
import org.junit.runner.RunWith;
7+
import org.junit.runners.JUnit4;
8+
import org.junit.runners.MethodSorters;
9+
import php.runtime.Memory;
10+
import php.runtime.exceptions.support.ErrorException;
11+
12+
@RunWith(JUnit4.class)
13+
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
14+
public class GCTest extends JvmCompilerCase {
15+
16+
@Test
17+
public void testWeakRef(){
18+
check("gc/weak_ref.phpt");
19+
}
20+
21+
@Test
22+
public void testWeakRefClosure(){
23+
check("gc/weak_ref_closure.phpt");
24+
}
25+
26+
@Test
27+
public void testWeakRefConstructor(){
28+
check("gc/weak_ref_errors.phpt", true);
29+
}
30+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
Test weeak refs with GC
3+
--FILE--
4+
<?
5+
$t = new stdClass();
6+
$ref = WeakReference::create($t);
7+
8+
var_dump($t);
9+
$t = null;
10+
\php\lang\System::gc();
11+
var_dump($ref->get());
12+
--EXPECTF--
13+
object(stdClass)#%d (0) {
14+
}
15+
NULL
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
Test weeak refs with closure
3+
--FILE--
4+
<?
5+
$y = 0;
6+
$fn = fn($x) => $x + $y;
7+
$ref = WeakReference::create($fn);
8+
9+
var_dump($fn);
10+
$fn = null;
11+
\php\lang\System::gc();
12+
var_dump($ref->get());
13+
--EXPECTF--
14+
object(Closure)#%d (1) {
15+
["uses"]=>
16+
array(1) {
17+
[0]=>
18+
int(0)
19+
}
20+
}
21+
NULL
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
--TEST--
2+
Test weeak refs constructor
3+
--FILE--
4+
<?
5+
$ref = new WeakReference();
6+
--EXPECTF--
7+
8+
Fatal error: Direct instantiation of 'WeakReference' is not allowed, use WeakReference::create instead in %s on line 2, position 8

jphp-runtime/src/php/runtime/ext/CoreExtension.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void onRegister(CompileScope scope) {
8585
registerClass(scope,
8686
CharUtils.class, StrUtils.class, BinUtils.class, NumUtils.class, ItemsUtils.class,
8787
MirrorUtils.class, FsUtils.class, OldBinUtils.class, OldItemsUtils.class, OldNumUtils.class, OldMirrorUtils.class,
88-
RxUtils.class
88+
RxUtils.class, WeakReference.class
8989
);
9090

9191
registerClass(scope,
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package php.runtime.ext.core.classes;
2+
3+
import php.runtime.Memory;
4+
import php.runtime.annotation.Reflection;
5+
import php.runtime.common.HintType;
6+
import php.runtime.env.Environment;
7+
import php.runtime.exceptions.support.ErrorType;
8+
import php.runtime.lang.BaseObject;
9+
import php.runtime.lang.IObject;
10+
import php.runtime.memory.ObjectMemory;
11+
import php.runtime.reflection.ClassEntity;
12+
13+
@Reflection.Final
14+
public class WeakReference extends BaseObject {
15+
private java.lang.ref.WeakReference<IObject> ref;
16+
17+
public WeakReference(Environment env, java.lang.ref.WeakReference<IObject> ref) {
18+
super(env);
19+
this.ref = ref;
20+
}
21+
22+
public WeakReference(Environment env, ClassEntity clazz) {
23+
super(env, clazz);
24+
}
25+
26+
@Reflection.Signature()
27+
public Memory __construct(Environment env, Memory... args) {
28+
env.error(ErrorType.E_ERROR, "Direct instantiation of 'WeakReference' is not allowed, use WeakReference::create instead");
29+
return null;
30+
}
31+
32+
@Reflection.Signature({
33+
@Reflection.Arg(value = "object", type = HintType.OBJECT)
34+
})
35+
public static Memory create(Environment env, Memory... args) {
36+
return new ObjectMemory(
37+
new WeakReference(env, new java.lang.ref.WeakReference<>(args[0].toObject(IObject.class)))
38+
);
39+
}
40+
41+
@Reflection.Signature
42+
public Memory get(Environment env, Memory... args) {
43+
return ObjectMemory.valueOf(ref.get());
44+
}
45+
}

0 commit comments

Comments
 (0)