Skip to content

Commit be65f0d

Browse files
authored
Merge pull request #140 from php-java/string/intern-freezable
Add FreezableInterface to manage the _Utf8
2 parents 391a589 + 83bd354 commit be65f0d

4 files changed

Lines changed: 35 additions & 16 deletions

File tree

src/Core/JVM/ConstantPool.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use PHPJava\Kernel\Structures\_NameAndType;
2020
use PHPJava\Kernel\Structures\_String;
2121
use PHPJava\Kernel\Structures\_Utf8;
22+
use PHPJava\Kernel\Structures\FreezableInterface;
2223
use PHPJava\Kernel\Structures\StructureInterface;
2324

2425
class ConstantPool implements \ArrayAccess, \Countable, \IteratorAggregate
@@ -110,6 +111,9 @@ public function offsetExists($offset)
110111
*/
111112
public function offsetGet($offset)
112113
{
114+
if ($this->entries[$offset] instanceof FreezableInterface) {
115+
$this->entries[$offset]->freeze();
116+
}
113117
return $this->entries[$offset];
114118
}
115119

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace PHPJava\Kernel\Structures;
4+
5+
interface FreezableInterface
6+
{
7+
public function freeze(): void;
8+
}

src/Kernel/Structures/_Utf8.php

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
use PHPJava\Exceptions\ReadOnlyException;
66
use PHPJava\Utilities\BinaryTool;
77

8-
class _Utf8 implements StructureInterface
8+
class _Utf8 implements StructureInterface, FreezableInterface
99
{
1010
use \PHPJava\Kernel\Core\BinaryReader;
1111
use \PHPJava\Kernel\Core\ConstantPool;
1212
use \PHPJava\Kernel\Core\DebugTool;
1313

1414
private $length = 0;
1515
private $string = '';
16-
private $isWritable = false;
16+
private $isWritable = null;
17+
private $isFrozen = false;
1718

1819
/**
1920
* @var \PHPJava\Packages\java\lang\_String $stringObject
@@ -29,39 +30,46 @@ public function execute(): void
2930
$this->stringObject = new \PHPJava\Packages\java\lang\_String($this);
3031
}
3132

32-
public function getLength()
33+
public function getLength(): int
3334
{
3435
return $this->length;
3536
}
3637

37-
/**
38-
* @param bool $enable
39-
* @return _Utf8
40-
*/
4138
public function enableWrite(bool $enable): self
4239
{
43-
$this->isWritable = $enable;
40+
if (!$this->isFrozen) {
41+
$this->isWritable = $enable;
42+
}
4443
return $this;
4544
}
4645

47-
public function getString()
46+
public function freeze(): void
47+
{
48+
$this->isFrozen = true;
49+
$this->enableWrite(false);
50+
}
51+
52+
public function getString(): string
4853
{
4954
return $this->string;
5055
}
5156

52-
public function __toString(): string
57+
public function getStringObject(): \PHPJava\Packages\java\lang\_String
5358
{
54-
return $this->getString();
59+
return $this->stringObject;
5560
}
5661

5762
public function setStringObject(\PHPJava\Packages\java\lang\_String $stringObject): self
5863
{
59-
$this->stringObject = $stringObject;
64+
if ($this->isWritable) {
65+
$this->stringObject = $stringObject;
66+
$this->freeze();
67+
}
6068
return $this;
6169
}
6270

63-
public function getStringObject(): \PHPJava\Packages\java\lang\_String
71+
public function __toString(): string
6472
{
65-
return $this->stringObject;
73+
return $this->getString();
6674
}
6775
}

src/Packages/java/lang/_String.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,7 @@ public function intern(ConstantPool $cp)
363363
if ((string) $value === (string) $this->object) {
364364
$this->object = $value
365365
->enableWrite(true)
366-
->setStringObject($this)
367-
->enableWrite(false);
366+
->setStringObject($this);
368367
break;
369368
}
370369
}

0 commit comments

Comments
 (0)