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