Author: Stephan <[email protected]>
Branch: 
Changeset: r359:1e753170a6e1
Date: 2013-02-21 14:56 +0100
http://bitbucket.org/pypy/lang-js/changeset/1e753170a6e1/

Log:    optimized declarative binding initialization

diff --git a/js/astbuilder.py b/js/astbuilder.py
--- a/js/astbuilder.py
+++ b/js/astbuilder.py
@@ -320,7 +320,8 @@
         pos = self.get_pos(node)
         body = self.dispatch(node.children[0])
         scope = self.current_scope()
-        return operations.Program(pos, body, scope)
+        final_scope = scope.finalize()
+        return operations.Program(pos, body, final_scope)
 
     def visit_variablestatement(self, node):
         pos = self.get_pos(node)
@@ -362,6 +363,7 @@
             funcname = u''
 
         scope = self.current_scope()
+        final_scope = scope.finalize()
 
         self.exit_scope()
 
@@ -371,7 +373,7 @@
             #assert isinstance(f, unicode)
             funcindex = self.declare_symbol(f)
 
-        funcobj = operations.FunctionStatement(pos, funcname, funcindex, 
functionbody, scope)
+        funcobj = operations.FunctionStatement(pos, funcname, funcindex, 
functionbody, final_scope)
 
         if declaration:
             self.declare_function(funcname, funcobj)
diff --git a/js/jscode.py b/js/jscode.py
--- a/js/jscode.py
+++ b/js/jscode.py
@@ -28,7 +28,7 @@
     pass
 
 from js.symbol_map import SymbolMap
-empty_symbols = SymbolMap()
+empty_symbols = SymbolMap().finalize()
 
 
 class JsCode(object):
@@ -60,9 +60,8 @@
     def symbols(self):
         return self._symbols.get_symbols()
 
-    @jit.unroll_safe
     def params(self):
-        return [p for p in self.parameters]
+        return self._symbols.parameters
 
     @jit.elidable
     def estimated_stack_size(self):
diff --git a/js/symbol_map.py b/js/symbol_map.py
--- a/js/symbol_map.py
+++ b/js/symbol_map.py
@@ -7,7 +7,6 @@
         self.functions = []
         self.variables = []
         self.parameters = []
-        self.next_index = 0
 
     def add_symbol(self, identifyer):
         idx = self.symbols.lookup(identifyer)
@@ -47,3 +46,25 @@
 
     def len(self):
         return self.symbols.len()
+
+    def finalize(self):
+        return FinalSymbolMap(self.symbols, self.functions, self.variables, 
self.parameters)
+
+
+class FinalSymbolMap(object):
+    _immutable_fields_ = ['symbols', 'functions[*]', 'variables[*]', 
'parameters[*]']
+
+    def __init__(self, symbols, functions, variables, parameters):
+        self.symbols = symbols
+        self.functions = functions[:]
+        self.variables = variables[:]
+        self.parameters = parameters[:]
+
+    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()
diff --git a/test/jit_view.py b/test/jit_view.py
--- a/test/jit_view.py
+++ b/test/jit_view.py
@@ -126,6 +126,25 @@
         code = """
         (function () {
             var i = 0;
+            function g(b) {
+                return b + 1;
+            }
+            function f(a) {
+                return g(a);
+            }
+            while(i < 100) {
+                i = f(i);
+            }
+            return i;
+        })();
+        """
+
+        self.run(code, 100)
+
+    def test_double_nested_func_call_in_loop(self):
+        code = """
+        (function () {
+            var i = 0;
             function f(a) {
                 function g(b) {
                     return b + 1;
diff --git a/test/test_jsfunction.py b/test/test_jsfunction.py
--- a/test/test_jsfunction.py
+++ b/test/test_jsfunction.py
@@ -47,10 +47,9 @@
 
     def test_foo3(self):
         symbol_map = SymbolMap()
-        var_idx = symbol_map.add_variable(u'a')
+        var_idx = symbol_map.add_parameter(u'a')
 
         code = JsCode(symbol_map)
-        code.parameters = [u'a']
         code.emit('LOAD_VARIABLE', var_idx, u'a')
         code.emit('RETURN')
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to