handle spl_object_hash collisions
authorArnaud Le Blanc <arnaud.lb@gmail.com>
Wed, 17 Nov 2010 20:47:21 +0000 (21:47 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Sat, 20 Nov 2010 09:22:12 +0000 (10:22 +0100)
lib/Twig/NodeVisitor/SafeAnalysis.php

index 7adfe11..3c5b456 100644 (file)
@@ -2,21 +2,36 @@
 
 class Twig_NodeVisitor_SafeAnalysis implements Twig_NodeVisitorInterface
 {
-    protected $data;
-
-    public function __construct()
-    {
-        $this->data = array();
-    }
+    protected $data = array();
 
     public function getSafe(Twig_NodeInterface $node)
     {
-        return isset($this->data[spl_object_hash($node)]) ? $this->data[spl_object_hash($node)] : null;
+        $hash = spl_object_hash($node);
+        if (isset($this->data[$hash])) {
+            foreach($this->data[$hash] as $bucket) {
+                if ($bucket['key'] === $node) {
+                    return $bucket['value'];
+                }
+            }
+        }
+        return null;
     }
 
     protected function setSafe(Twig_NodeInterface $node, array $safe)
     {
-        $this->data[spl_object_hash($node)] = $safe;
+        $hash = spl_object_hash($node);
+        if (isset($this->data[$hash])) {
+            foreach($this->data[$hash] as &$bucket) {
+                if ($bucket['key'] === $node) {
+                    $bucket['value'] = $safe;
+                    return;
+                }
+            }
+        }
+        $this->data[$hash][] = array(
+            'key' => $node,
+            'value' => $safe,
+        );
     }
 
     public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)