[pypy-commit] lang-js default: moved SymbolMap into separate file

stepahn noreply at buildbot.pypy.org
Fri Feb 15 14:10:01 CET 2013


Author: Stephan <stephan at stzal.com>
Branch: 
Changeset: r351:d1a5abd654d6
Date: 2013-02-15 14:08 +0100
http://bitbucket.org/pypy/lang-js/changeset/d1a5abd654d6/

Log:	moved SymbolMap into separate file

diff --git a/js/astbuilder.py b/js/astbuilder.py
--- a/js/astbuilder.py
+++ b/js/astbuilder.py
@@ -4,59 +4,7 @@
 
 from js import operations
 
-
-class SymbolMap(object):
-    def __init__(self):
-        self.symbols = {}
-        self.functions = []
-        self.variables = []
-        self.parameters = []
-        self.next_index = 0
-
-    def add_symbol(self, identifyer):
-        #assert isinstance(identifyer, unicode)
-        if identifyer not in self.symbols:
-            self.symbols[identifyer] = self.next_index
-            self.next_index += 1
-        idx = self.symbols[identifyer]
-        assert isinstance(idx, int)
-        return idx
-
-    def add_variable(self, identifyer):
-        idx = self.add_symbol(identifyer)
-
-        self.variables.append(identifyer)
-        return idx
-
-    def add_function(self, identifyer):
-        idx = self.add_symbol(identifyer)
-
-        self.functions.append(identifyer)
-        return idx
-
-    def add_parameter(self, identifyer):
-        #assert isinstance(identifyer, unicode)
-        f = unicode(identifyer)
-        #assert isinstance(f, unicode)
-        idx = self.add_symbol(f)
-        self.parameters.append(f)
-        return idx
-
-    def get_index(self, identifyer):
-        return self.symbols[identifyer]
-
-    def get_symbols(self):
-        return self.symbols.keys()
-
-    def get_symbol(self, index):
-        for symbol, idx in self.symbols.items():
-            if idx == index:
-                return symbol
-
-    def len(self):
-        return self.next_index
-
-empty_symbols = SymbolMap()
+from js.symbol_map import SymbolMap
 
 
 class FakeParseError(Exception):
diff --git a/js/jscode.py b/js/jscode.py
--- a/js/jscode.py
+++ b/js/jscode.py
@@ -5,7 +5,6 @@
 from js.exception import JsThrowException
 from js.opcodes import opcodes, LABEL, BaseJump
 from js.jsobj import W_String
-from js.astbuilder import empty_symbols
 
 
 def get_printable_location(pc, debug, jscode):
@@ -28,6 +27,9 @@
 class AlreadyRun(Exception):
     pass
 
+from js.symbol_map import SymbolMap
+empty_symbols = SymbolMap()
+
 
 class JsCode(object):
     _immutable_fields_ = ['compiled_opcodes[*]', '_symbols', 'parameters[*]']
diff --git a/js/object_map.py b/js/object_map.py
--- a/js/object_map.py
+++ b/js/object_map.py
@@ -43,8 +43,9 @@
     def empty(self):
         return True
 
+    @jit.elidable
     def len(self):
-        return self.index
+        return self.index + 1
 
     @jit.elidable
     def add(self, name):
diff --git a/js/symbol_map.py b/js/symbol_map.py
new file mode 100644
--- /dev/null
+++ b/js/symbol_map.py
@@ -0,0 +1,49 @@
+from js.object_map import new_map
+
+
+class SymbolMap(object):
+    def __init__(self):
+        self.symbols = new_map()
+        self.functions = []
+        self.variables = []
+        self.parameters = []
+        self.next_index = 0
+
+    def add_symbol(self, identifyer):
+        idx = self.symbols.lookup(identifyer)
+
+        if idx == self.symbols.NOT_FOUND:
+            self.symbols = self.symbols.add(identifyer)
+            idx = self.symbols.lookup(identifyer)
+
+        assert isinstance(idx, int)
+        return idx
+
+    def add_variable(self, identifyer):
+        idx = self.add_symbol(identifyer)
+
+        self.variables.append(identifyer)
+        return idx
+
+    def add_function(self, identifyer):
+        idx = self.add_symbol(identifyer)
+
+        self.functions.append(identifyer)
+        return idx
+
+    def add_parameter(self, identifyer):
+        #assert isinstance(identifyer, unicode)
+        f = unicode(identifyer)
+        #assert isinstance(f, unicode)
+        idx = self.add_symbol(f)
+        self.parameters.append(f)
+        return idx
+
+    def get_index(self, identifyer):
+        return self.symbols.lookup(identifyer)
+
+    def get_symbols(self):
+        return self.symbols.keys()
+
+    def len(self):
+        return self.symbols.len()


More information about the pypy-commit mailing list