Author: Stephan <[email protected]>
Branch:
Changeset: r294:eed924e44c28
Date: 2012-09-04 15:40 +0200
http://bitbucket.org/pypy/lang-js/changeset/eed924e44c28/
Log: static stack size
diff --git a/js/execution_context.py b/js/execution_context.py
--- a/js/execution_context.py
+++ b/js/execution_context.py
@@ -3,11 +3,12 @@
class ExecutionContext(StackMixin):
- def __init__(self):
+ _immutable_fields_ = ['_stack_', '_stack_resize_', '_this_binding_',
'_lexical_environment_', '_variable_environment_']
+ def __init__(self, stack_size=1):
self._lexical_environment_ = None
self._variable_environment_ = None
self._this_binding_ = None
- self._init_stack_()
+ self._init_stack_(size=stack_size, resize=False)
def stack_append(self, value):
self._stack_append(value)
@@ -117,8 +118,11 @@
return ref
class GlobalExecutionContext(ExecutionContext):
- ExecutionContext.__init__(self)
def __init__(self, code, global_object, strict=False):
+ stack_size = code.estimated_stack_size()
+
+ ExecutionContext.__init__(self, stack_size)
+
self._code_ = code
self._strict_ = strict
@@ -132,8 +136,10 @@
class EvalExecutionContext(ExecutionContext):
- ExecutionContext.__init__(self)
def __init__(self, code, calling_context=None):
+ stack_size = code.estimated_stack_size()
+
+ ExecutionContext.__init__(self, stack_size)
self._code_ = code
self._strict_ = code.strict
@@ -153,8 +159,14 @@
class FunctionExecutionContext(ExecutionContext):
- ExecutionContext.__init__(self)
def __init__(self, code, formal_parameters=[], argv=[], this=w_Undefined,
strict=False, scope=None, w_func=None):
+ from js.jsobj import isnull_or_undefined, W_BasicObject
+ from js.object_space import object_space
+
+ stack_size = code.estimated_stack_size()
+
+ ExecutionContext.__init__(self, stack_size)
+
self._code_ = code
self._formal_parameters_ = formal_parameters
self._argument_values_ = argv
diff --git a/js/functions.py b/js/functions.py
--- a/js/functions.py
+++ b/js/functions.py
@@ -87,10 +87,10 @@
from js.jscode import JsCode
assert isinstance(js_code, JsCode)
self._js_code_ = js_code
- #self.stack_size = js_code.estimated_stack_size()
+ self._stack_size_ = js_code.estimated_stack_size()
- #def estimated_stack_size(self):
- #return self.stack_size
+ def estimated_stack_size(self):
+ return self._stack_size_
def get_js_code(self):
from js.jscode import JsCode
diff --git a/js/utils.py b/js/utils.py
--- a/js/utils.py
+++ b/js/utils.py
@@ -1,6 +1,6 @@
# encoding: utf-8
#from pypy.rlib.jit import hint
-#from pypy.rlib import jit, debug
+from pypy.rlib import jit # , debug
class StackMixin(object):
@@ -14,22 +14,25 @@
self._stack_pointer_ = 0
self._stack_resize_ = resize
+ def _stack_pointer(self):
+ return jit.promote(self._stack_pointer_)
+
def _stack_pop(self):
e = self._stack_top()
- i = self._stack_pointer_ - 1
+ i = self._stack_pointer() - 1
assert i >= 0
self._stack_[i] = None
self._stack_pointer_ = i
return e
def _stack_top(self):
- i = self._stack_pointer_ - 1
+ i = self._stack_pointer() - 1
if i < 0:
raise IndexError
return self._stack_[i]
def _stack_append(self, element):
- i = self._stack_pointer_
+ i = self._stack_pointer()
assert i >= 0
if len(self._stack_) <= i and self._stack_resize_ is True:
self._stack_ += [None]
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit