diff --git a/src/Core/JVM/ConstantPool.php b/src/Core/JVM/ConstantPool.php index 58f98e98..493f26a8 100644 --- a/src/Core/JVM/ConstantPool.php +++ b/src/Core/JVM/ConstantPool.php @@ -19,6 +19,7 @@ use PHPJava\Kernel\Structures\_NameAndType; use PHPJava\Kernel\Structures\_String; use PHPJava\Kernel\Structures\_Utf8; +use PHPJava\Kernel\Structures\FreezableInterface; use PHPJava\Kernel\Structures\StructureInterface; class ConstantPool implements \ArrayAccess, \Countable, \IteratorAggregate @@ -110,6 +111,9 @@ public function offsetExists($offset) */ public function offsetGet($offset) { + if ($this->entries[$offset] instanceof FreezableInterface) { + $this->entries[$offset]->freeze(); + } return $this->entries[$offset]; } diff --git a/src/Kernel/Structures/FreezableInterface.php b/src/Kernel/Structures/FreezableInterface.php new file mode 100644 index 00000000..43137b53 --- /dev/null +++ b/src/Kernel/Structures/FreezableInterface.php @@ -0,0 +1,8 @@ +stringObject = new \PHPJava\Packages\java\lang\_String($this); } - public function getLength() + public function getLength(): int { return $this->length; } - /** - * @param bool $enable - * @return _Utf8 - */ public function enableWrite(bool $enable): self { - $this->isWritable = $enable; + if (!$this->isFrozen) { + $this->isWritable = $enable; + } return $this; } - public function getString() + public function freeze(): void + { + $this->isFrozen = true; + $this->enableWrite(false); + } + + public function getString(): string { return $this->string; } - public function __toString(): string + public function getStringObject(): \PHPJava\Packages\java\lang\_String { - return $this->getString(); + return $this->stringObject; } public function setStringObject(\PHPJava\Packages\java\lang\_String $stringObject): self { - $this->stringObject = $stringObject; + if ($this->isWritable) { + $this->stringObject = $stringObject; + $this->freeze(); + } return $this; } - public function getStringObject(): \PHPJava\Packages\java\lang\_String + public function __toString(): string { - return $this->stringObject; + return $this->getString(); } } diff --git a/src/Packages/java/lang/_String.php b/src/Packages/java/lang/_String.php index 838062d1..300e4a64 100644 --- a/src/Packages/java/lang/_String.php +++ b/src/Packages/java/lang/_String.php @@ -363,8 +363,7 @@ public function intern(ConstantPool $cp) if ((string) $value === (string) $this->object) { $this->object = $value ->enableWrite(true) - ->setStringObject($this) - ->enableWrite(false); + ->setStringObject($this); break; } }