Author: Stephan <[email protected]>
Branch:
Changeset: r265:83a0fa75c418
Date: 2012-06-22 11:42 +0200
http://bitbucket.org/pypy/lang-js/changeset/83a0fa75c418/
Log: added object_space
diff --git a/js/builtins.py b/js/builtins.py
--- a/js/builtins.py
+++ b/js/builtins.py
@@ -18,7 +18,7 @@
from js.object_space import object_space
jsfunc = JsNativeFunction(function, name)
- obj = object_space.new_obj(W__Function, jsfunc, formal_parameter_list =
params)
+ obj = object_space.new_func(jsfunc, formal_parameter_list = params)
return obj
# 15
@@ -33,7 +33,7 @@
from js.object_space import object_space
jsfunc = JsIntimateFunction(func, name)
- w_func = object_space.new_obj(W__Function, jsfunc, formal_parameter_list =
params)
+ w_func = object_space.new_func(jsfunc, formal_parameter_list = params)
put_property(obj, name, w_func, writable = writable, configurable =
configurable, enumerable = enumerable)
# 15
@@ -46,7 +46,7 @@
# 15.2.4 Properties of the Object Prototype Object
from js.jsobj import W_BasicObject
- w_ObjectPrototype = object_space.new_obj_with_proto(W_BasicObject, w_Null)
+ w_ObjectPrototype = W_BasicObject()
object_space.proto_object = w_ObjectPrototype
# 15.3.2
@@ -60,13 +60,19 @@
from js.functions import JsNativeFunction
empty_func = JsNativeFunction(function_builtins.empty, u'Empty')
- w_FunctionPrototype = object_space.new_obj_with_proto(W__Function,
w_ObjectPrototype, empty_func, formal_parameter_list = [])
+ w_FunctionPrototype = W__Function(empty_func, formal_parameter_list = [])
+ object_space.assign_proto(w_FunctionPrototype, object_space.proto_object)
object_space.proto_function = w_FunctionPrototype
+ # 15.3.3
+ object_space.assign_proto(w_Function, object_space.proto_function)
+
# 15.2 Object Objects
# 15.2.3 Properties of the Object Constructor
from js.jsobj import W_ObjectConstructor
- w_Object = object_space.new_obj_with_proto(W_ObjectConstructor,
object_space.proto_function)
+ w_Object = W_ObjectConstructor()
+ object_space.assign_proto(w_Object, object_space.proto_function)
+
put_property(w_Object, u'length', _w(1))
put_property(global_object, u'Object', w_Object)
diff --git a/js/builtins_array.py b/js/builtins_array.py
--- a/js/builtins_array.py
+++ b/js/builtins_array.py
@@ -7,10 +7,12 @@
from js.object_space import object_space
w_Array = W_ArrayConstructor()
+ object_space.assign_proto(w_Array, object_space.proto_function)
put_property(global_object, u'Array', w_Array)
# 15.4.4
- w_ArrayPrototype = object_space.new_obj_with_proto(W__Array,
object_space.proto_object)
+ w_ArrayPrototype = W__Array()
+ object_space.assign_proto(w_ArrayPrototype, object_space.proto_object)
object_space.proto_array = w_ArrayPrototype
# 15.4.3.1
diff --git a/js/builtins_boolean.py b/js/builtins_boolean.py
--- a/js/builtins_boolean.py
+++ b/js/builtins_boolean.py
@@ -9,13 +9,15 @@
# 15.6.2
from js.jsobj import W_BooleanConstructor
w_Boolean = W_BooleanConstructor()
+ object_space.assign_proto(w_Boolean, object_space.proto_function)
put_property(global_object, u'Boolean', w_Boolean)
# 15.6.3
put_property(w_Boolean, u'length', _w(1), writable = False, enumerable =
False, configurable = False)
# 15.6.4
- w_BooleanPrototype = object_space.new_obj_with_proto(W_BooleanObject,
object_space.proto_object, _w(False))
+ w_BooleanPrototype = W_BooleanObject(_w(False))
+ object_space.assign_proto(w_BooleanPrototype, object_space.proto_object)
# 15.6.3.1
object_space.proto_boolean = w_BooleanPrototype
diff --git a/js/builtins_date.py b/js/builtins_date.py
--- a/js/builtins_date.py
+++ b/js/builtins_date.py
@@ -12,7 +12,9 @@
##Date
# 15.9.5
- w_DatePrototype = object_space.new_obj_with_proto(W_DateObject,
object_space.proto_object, w_NAN)
+ w_DatePrototype = W_DateObject(w_NAN)
+ object_space.assign_proto(w_DatePrototype, object_space.proto_object)
+
object_space.proto_date = w_DatePrototype
def putf(name, func):
@@ -81,6 +83,7 @@
# 15.9.3
w_Date = W_DateConstructor()
+ object_space.assign_proto(w_Date, object_space.proto_function)
put_property(global_object, u'Date', w_Date)
put_property(w_Date, u'prototype', w_DatePrototype, writable = False,
enumerable = False, configurable = False)
diff --git a/js/builtins_math.py b/js/builtins_math.py
--- a/js/builtins_math.py
+++ b/js/builtins_math.py
@@ -7,8 +7,10 @@
def setup(global_object):
from js.builtins import put_native_function, put_property
from js.jsobj import W_Math
+ from js.object_space import object_space
# 15.8
w_Math = W_Math()
+ object_space.assign_proto(w_Math)
put_property(global_object, u'Math', w_Math)
put_native_function(w_Math, u'abs', js_abs, params = [u'x'])
diff --git a/js/builtins_number.py b/js/builtins_number.py
--- a/js/builtins_number.py
+++ b/js/builtins_number.py
@@ -4,18 +4,20 @@
def setup(global_object):
from js.builtins import put_property, put_native_function
+ from js.object_space import object_space
# 15.7.2
from js.jsobj import W_NumberConstructor
w_Number = W_NumberConstructor()
+ object_space.assign_proto(w_Number, object_space.proto_function)
put_property(global_object, u'Number', w_Number)
# 15.7.3
put_property(w_Number, u'length', _w(1), writable = False, enumerable =
False, configurable = False)
# 15.7.4
- from js.object_space import object_space
- w_NumberPrototype = object_space.new_obj_with_proto(W_NumericObject,
object_space.proto_object, _w(0))
+ w_NumberPrototype = W_NumericObject(_w(0))
+ object_space.assign_proto(W_NumericObject, object_space.proto_object)
object_space.proto_number = w_NumberPrototype
# 15.7.4.1
diff --git a/js/builtins_string.py b/js/builtins_string.py
--- a/js/builtins_string.py
+++ b/js/builtins_string.py
@@ -5,20 +5,21 @@
def setup(global_object):
from js.builtins import put_native_function, put_property
+ from js.object_space import object_space
#String
# 15.5.1
from js.jsobj import W_StringConstructor
w_String = W_StringConstructor()
+ object_space.assign_proto(w_String, object_space.proto_function)
put_property(w_String, u'length', _w(1), writable = False, enumerable =
False, configurable = False)
-
put_property(global_object, u'String', w_String)
# 15.5.4
from js.jsobj import W_StringObject
- from js.object_space import object_space
- w_StringPrototype = object_space.new_obj_with_proto(W_StringObject,
object_space.proto_object, _w(u''))
+ w_StringPrototype = W_StringObject(_w(u''))
+ object_space.assign_proto(w_StringPrototype, object_space.proto_object)
# 15.5.3.1
object_space.proto_string = w_StringPrototype
@@ -115,10 +116,7 @@
#15.5.4.5
def char_code_at(this, args):
- pos = w_Undefined
-
- if len(args) > 0:
- pos = args[0]
+ pos = get_arg(args, 0)
this.check_object_coercible()
string = this.to_string()
diff --git a/js/interpreter.py b/js/interpreter.py
--- a/js/interpreter.py
+++ b/js/interpreter.py
@@ -21,6 +21,10 @@
from js.builtins import setup_builtins
setup_builtins(self.global_object)
self.setup_interpreter_builtins()
+ from js.object_space import object_space
+ object_space.global_object = self.global_object
+ object_space.assign_proto(self.global_object)
+
def setup_interpreter_builtins(self):
global_object = self.global_object
@@ -72,7 +76,6 @@
ctx = GlobalExecutionContext(c, self.global_object)
object_space.global_context = ctx
- object_space.global_object = self.global_object
result = c.run(ctx)
return result.value
diff --git a/js/jsobj.py b/js/jsobj.py
--- a/js/jsobj.py
+++ b/js/jsobj.py
@@ -661,11 +661,12 @@
proto = self.get(u'prototype')
if isinstance(proto, W_BasicObject):
- obj = object_space.new_obj_with_proto(W__Object, proto)
+ obj = object_space.new_obj()
+ object_space.assign_proto(obj, proto)
else:
# would love to test this
# but I fail to find a case that falls into this
- obj = object_space.new_obj(W__Object)
+ obj = object_space.new_obj()
result = self.Call(args, this=obj)
if isinstance(result, W__Object):
@@ -713,7 +714,7 @@
assert isnull_or_undefined(value)
from js.object_space import object_space
- obj = object_space.new_obj(W__Object)
+ obj = object_space.new_obj()
return obj
# TODO
@@ -758,7 +759,7 @@
scope = object_space.get_global_environment()
strict = func.strict
params = func.params()
- w_func = object_space.new_obj(W__Function, func, formal_parameter_list
= params, scope = scope, strict = strict)
+ w_func = object_space.new_func(func, formal_parameter_list = params,
scope = scope, strict = strict)
return w_func
# TODO
@@ -787,7 +788,7 @@
class W_StringConstructor(W_BasicFunction):
def Call(self, args = [], this = None, calling_context = None):
from js.builtins import get_arg
- arg0 = get_arg(args, 0)
+ arg0 = get_arg(args, 0, _w(u""))
strval = arg0.to_string()
return W_String(strval)
@@ -845,7 +846,7 @@
value = _w(int(time.time() * 1000))
from js.object_space import object_space
- obj = object_space.new_obj(W_DateObject, value)
+ obj = object_space.new_date(value)
return obj
# 15.7.2.1
@@ -872,7 +873,7 @@
# 15.
put_property(self, u'length', _w(_len), writable = False, enumerable =
False, configurable = False)
# 16.
- proto_obj = object_space.new_obj(W__Object)
+ proto_obj = object_space.new_obj()
# 17.
put_property(proto_obj, u'constructor', self, writable = True,
enumerable = False, configurable = True)
# 18.
@@ -941,7 +942,7 @@
put_property(self, u'length', _w(_len), writable = True, enumerable =
False, configurable = True)
from js.object_space import object_space
- _map = object_space.new_obj(W__Object)
+ _map = object_space.new_obj()
mapped_names = []
indx = _len - 1
while indx >= 0:
@@ -991,15 +992,15 @@
length = _len.ToUInt32()
if length != _len.ToNumber():
raise JsRangeError()
- array = object_space.new_obj(W__Array, length)
+ array = object_space.new_array(_w(length))
else:
length = 1
- array = object_space.new_obj(W__Array, length)
+ array = object_space.new_array(_w(length))
array.put(u'0', _len)
return array
else:
- array = object_space.new_obj(W__Array)
+ array = object_space.new_array()
for index, obj in enumerate(args):
array.put(unicode(str(index)), obj)
return array
@@ -1007,13 +1008,240 @@
def Construct(self, args=[]):
return self.Call(args)
+
+# 15.8
+class W_Math(W__Object):
+ _class_ = 'Math'
+
+class W_Boolean(W_Primitive):
+ _type_ = 'boolean'
+
+ def __init__(self, boolval):
+ W_Primitive.__init__(self)
+ self._boolval_ = bool(boolval)
+
+ def __str__(self):
+ return 'W_Bool(%s)' % (str(self._boolval_), )
+
+ def ToObject(self):
+ from js.object_space import object_space
+ return object_space.new_bool(self)
+
+ def to_string(self):
+ if self._boolval_ == True:
+ return u'true'
+ return u'false'
+
+ def ToNumber(self):
+ if self._boolval_ == True:
+ return 1.0
+ return 0.0
+
+ def to_boolean(self):
+ return self._boolval_
+
+class W_String(W_Primitive):
+ _type_ = 'string'
+
+ def __init__(self, strval):
+ assert isinstance(strval, unicode)
+ W_Primitive.__init__(self)
+ self._strval_ = strval
+
+ def __eq__(self, other):
+ other_string = other.to_string()
+ return self.to_string() == other_string
+
+ def __str__(self):
+ return u'W_String("%s")' % (self._strval_)
+
+ def ToObject(self):
+ from js.object_space import object_space
+ return object_space.new_string(self)
+
+ def to_string(self):
+ return self._strval_
+
+ def to_boolean(self):
+ if len(self._strval_) == 0:
+ return False
+ else:
+ return True
+
+ def ToNumber(self):
+ u_strval = self._strval_
+ assert isinstance(u_strval, unicode)
+ import re
+ if u_strval == u'':
+ return 0.0
+ if re.match('^\s*$', u_strval):
+ return 0.0
+
+ strval = str(u_strval)
+
+ try:
+ return float(strval)
+ except ValueError:
+ try:
+ return float(int(strval, 16))
+ except ValueError:
+ try:
+ return float(int(strval, 8))
+ except ValueError:
+ return NAN
+ except OverflowError:
+ return INFINITY
+ except OverflowError:
+ return INFINITY
+ except OverflowError:
+ return INFINITY
+
+class W_Number(W_Primitive):
+ """ Base class for numbers, both known to be floats
+ and those known to be integers
+ """
+ _type_ = 'number'
+
+ # 9.9
+ def ToObject(self):
+ from js.object_space import object_space
+ obj = object_space.new_number(self)
+ return obj
+
+ def to_boolean(self):
+ num = self.ToNumber()
+ if isnan(num):
+ return False
+ return bool(num)
+
+ def __eq__(self, other):
+ if isinstance(other, W_Number):
+ return self.ToNumber() == other.ToNumber()
+ else:
+ return False
+
+class W_IntNumber(W_Number):
+ """ Number known to be an integer
+ """
+ def __init__(self, intval):
+ W_Number.__init__(self)
+ self._intval_ = intmask(intval)
+
+ def __str__(self):
+ return 'W_IntNumber(%s)' % (self._intval_,)
+
+ def ToInteger(self):
+ return self._intval_
+
+ def ToNumber(self):
+ # XXX
+ return float(self._intval_)
+
+ def to_string(self):
+ # XXX incomplete, this doesn't follow the 9.8.1 recommendation
+ return unicode(str(self.ToInteger()))
+
+def r_int32(n):
+ return intmask(rffi.cast(rffi.INT, n))
+
+def r_uint32(n):
+ return intmask(rffi.cast(rffi.UINT, n))
+
+class W_FloatNumber(W_Number):
+ """ Number known to be a float
+ """
+ def __init__(self, floatval):
+ assert isinstance(floatval, float)
+ W_Number.__init__(self)
+ self._floatval_ = float(floatval)
+
+ def __str__(self):
+ return 'W_FloatNumber(%s)' % (self._floatval_,)
+
+ def to_string(self):
+ # XXX incomplete, this doesn't follow the 9.8.1 recommendation
+ if isnan(self._floatval_):
+ return u'NaN'
+ if isinf(self._floatval_):
+ if self._floatval_ > 0:
+ return u'Infinity'
+ else:
+ return u'-Infinity'
+
+ if self._floatval_ == 0:
+ return u'0'
+
+ res = u''
+ try:
+ res = unicode(formatd(self._floatval_, 'g', 10))
+ except OverflowError:
+ raise
+
+ if len(res) > 3 and (res[-3] == '+' or res[-3] == '-') and res[-2] ==
'0':
+ cut = len(res) - 2
+ assert cut >= 0
+ res = res[:cut] + res[-1]
+ return res
+
+ def ToNumber(self):
+ return self._floatval_
+
+ def ToInteger(self):
+ if isnan(self._floatval_):
+ return 0
+
+ if self._floatval_ == 0 or isinf(self._floatval_):
+ return self._floatval_
+
+ return intmask(int(self._floatval_))
+
+
+def isnull_or_undefined(obj):
+ if obj is w_Null or obj is w_Undefined:
+ return True
+ return False
+
+w_True = W_Boolean(True)
+w_False = W_Boolean(False)
+
+def newbool(val):
+ if val:
+ return w_True
+ return w_False
+
+class W_List(W_Root):
+ def __init__(self, values):
+ self.values = values
+
+ def to_list(self):
+ return self.values
+
+ def __str__(self):
+ return 'W_List(%s)' % ( unicode([unicode(v) for v in self.values]) )
+
+class W_Iterator(W_Root):
+ def __init__(self, elements_w):
+ self.elements_w = elements_w
+
+ def next(self):
+ if self.elements_w:
+ return self.elements_w.pop()
+
+ def empty(self):
+ return len(self.elements_w) == 0
+
+ def to_string(self):
+ return u'<Iterator>'
+
+w_0 = W_IntNumber(0)
class W__Array(W_BasicObject):
_class_ = 'Array'
- def __init__(self, length = 0):
+ def __init__(self, length = w_0):
+ assert isinstance(length, W_Root)
W_BasicObject.__init__(self)
- desc = PropertyDescriptor(value = _w(length), writable = True,
enumerable = False, configurable = False)
+ desc = PropertyDescriptor(value = length, writable = True, enumerable
= False, configurable = False)
W_BasicObject.define_own_property(self, u'length', desc)
# 15.4.5.1
@@ -1111,230 +1339,6 @@
except ValueError:
return False
-# 15.8
-class W_Math(W__Object):
- _class_ = 'Math'
-
-class W_Boolean(W_Primitive):
- _type_ = 'boolean'
-
- def __init__(self, boolval):
- W_Primitive.__init__(self)
- self._boolval_ = bool(boolval)
-
- def __str__(self):
- return 'W_Bool(%s)' % (str(self._boolval_), )
-
- def ToObject(self):
- from js.object_space import object_space
- return object_space.new_obj(W_BooleanObject, self)
-
- def to_string(self):
- if self._boolval_ == True:
- return u'true'
- return u'false'
-
- def ToNumber(self):
- if self._boolval_ == True:
- return 1.0
- return 0.0
-
- def to_boolean(self):
- return self._boolval_
-
-class W_String(W_Primitive):
- _type_ = 'string'
-
- def __init__(self, strval):
- assert isinstance(strval, unicode)
- W_Primitive.__init__(self)
- self._strval_ = strval
-
- def __eq__(self, other):
- other_string = other.to_string()
- return self.to_string() == other_string
-
- def __str__(self):
- return u'W_String("%s")' % (self._strval_)
-
- def ToObject(self):
- from js.object_space import object_space
- return object_space.new_obj(W_StringObject, self)
-
- def to_string(self):
- return self._strval_
-
- def to_boolean(self):
- if len(self._strval_) == 0:
- return False
- else:
- return True
-
- def ToNumber(self):
- u_strval = self._strval_
- assert isinstance(u_strval, unicode)
-
- if u_strval == u'':
- return 0.0
- if u_strval.strip(' ') == u'':
- return 0.0
-
- strval = str(u_strval)
-
- try:
- return float(strval)
- except ValueError:
- try:
- return float(int(strval, 16))
- except ValueError:
- try:
- return float(int(strval, 8))
- except ValueError:
- return NAN
- except OverflowError:
- return INFINITY
- except OverflowError:
- return INFINITY
- except OverflowError:
- return INFINITY
-
-class W_Number(W_Primitive):
- """ Base class for numbers, both known to be floats
- and those known to be integers
- """
- _type_ = 'number'
-
- # 9.9
- def ToObject(self):
- from js.object_space import object_space
- obj = object_space.new_obj(W_NumericObject, self)
- return obj
-
- def to_boolean(self):
- num = self.ToNumber()
- if isnan(num):
- return False
- return bool(num)
-
- def __eq__(self, other):
- if isinstance(other, W_Number):
- return self.ToNumber() == other.ToNumber()
- else:
- return False
-
-class W_IntNumber(W_Number):
- """ Number known to be an integer
- """
- def __init__(self, intval):
- W_Number.__init__(self)
- self._intval_ = intmask(intval)
-
- def __str__(self):
- return 'W_IntNumber(%s)' % (self._intval_,)
-
- def ToInteger(self):
- return self._intval_
-
- def ToNumber(self):
- # XXX
- return float(self._intval_)
-
- def to_string(self):
- # XXX incomplete, this doesn't follow the 9.8.1 recommendation
- return unicode(str(self.ToInteger()))
-
-def r_int32(n):
- return intmask(rffi.cast(rffi.INT, n))
-
-def r_uint32(n):
- return intmask(rffi.cast(rffi.UINT, n))
-
-class W_FloatNumber(W_Number):
- """ Number known to be a float
- """
- def __init__(self, floatval):
- assert isinstance(floatval, float)
- W_Number.__init__(self)
- self._floatval_ = float(floatval)
-
- def __str__(self):
- return 'W_FloatNumber(%s)' % (self._floatval_,)
-
- def to_string(self):
- # XXX incomplete, this doesn't follow the 9.8.1 recommendation
- if isnan(self._floatval_):
- return u'NaN'
- if isinf(self._floatval_):
- if self._floatval_ > 0:
- return u'Infinity'
- else:
- return u'-Infinity'
-
- if self._floatval_ == 0:
- return u'0'
-
- res = u''
- try:
- res = unicode(formatd(self._floatval_, 'g', 10))
- except OverflowError:
- raise
-
- if len(res) > 3 and (res[-3] == '+' or res[-3] == '-') and res[-2] ==
'0':
- cut = len(res) - 2
- assert cut >= 0
- res = res[:cut] + res[-1]
- return res
-
- def ToNumber(self):
- return self._floatval_
-
- def ToInteger(self):
- if isnan(self._floatval_):
- return 0
-
- if self._floatval_ == 0 or isinf(self._floatval_):
- return self._floatval_
-
- return intmask(int(self._floatval_))
-
-
-def isnull_or_undefined(obj):
- if obj is w_Null or obj is w_Undefined:
- return True
- return False
-
-w_True = W_Boolean(True)
-w_False = W_Boolean(False)
-
-def newbool(val):
- if val:
- return w_True
- return w_False
-
-class W_List(W_Root):
- def __init__(self, values):
- self.values = values
-
- def to_list(self):
- return self.values
-
- def __str__(self):
- return 'W_List(%s)' % ( unicode([unicode(v) for v in self.values]) )
-
-class W_Iterator(W_Root):
- def __init__(self, elements_w):
- self.elements_w = elements_w
-
- def next(self):
- if self.elements_w:
- return self.elements_w.pop()
-
- def empty(self):
- return len(self.elements_w) == 0
-
- def to_string(self):
- return u'<Iterator>'
-
from pypy.rlib.objectmodel import specialize
@specialize.argtype(0)
def _w(value):
@@ -1352,7 +1356,7 @@
return W_String(unicode(value))
elif isinstance(value, list):
from js.object_space import object_space
- a = object_space.new_obj(W__Array)
+ a = object_space.new_array()
for index, item in enumerate(value):
put_property(a, unicode(index), _w(item), writable = True,
enumerable = True, configurable = True)
return a
diff --git a/js/object_space.py b/js/object_space.py
--- a/js/object_space.py
+++ b/js/object_space.py
@@ -1,34 +1,63 @@
+from js.jsobj import _w, W_BasicObject, W__Object, W_BasicFunction,
W__Function, W_DateObject, W_BooleanObject, W_StringObject, W_NumericObject,
W__Array
+
class ObjectSpace(object):
- def get_global_object(self):
- return self.global_object
-
def get_global_environment(self):
return self.global_context.variable_environment()
- def new_obj_with_proto(self, cls, proto, *args, **kwargs):
- obj = cls(*args, **kwargs)
- obj._prototype_ = proto
+ def assign_proto(self, obj, proto = None):
+ if proto is not None:
+ obj._prototype_ = proto
+ return obj
+
+ if isinstance(obj, W_BasicFunction):
+ obj._prototype_ = self.proto_function
+ elif isinstance(obj, W_BooleanObject):
+ obj._prototype_ = self.proto_boolean
+ elif isinstance(obj, W_NumericObject):
+ obj._prototype_ = self.proto_number
+ elif isinstance(obj, W_StringObject):
+ obj._prototype_ = self.proto_string
+ elif isinstance(obj, W__Array):
+ obj._prototype_ = self.proto_array
+ elif isinstance(obj, W_DateObject):
+ obj._prototype_ = self.proto_date
+ else:
+ obj._prototype_ = self.proto_object
return obj
- def new_obj(self, cls, *args, **kwargs):
- from js.jsobj import W_BasicFunction, W_BooleanObject, W_StringObject,
W_NumericObject, W_DateObject, W__Array
- obj = cls(*args, **kwargs)
+ def new_obj(self):
+ obj = W__Object()
+ self.assign_proto(obj)
+ return obj
- if issubclass(cls, W_BasicFunction):
- obj._prototype_ = self.proto_function
- elif issubclass(cls, W_BooleanObject):
- obj._prototype_ = self.proto_boolean
- elif issubclass(cls, W_StringObject):
- obj._prototype_ = self.proto_string
- elif issubclass(cls, W_NumericObject):
- obj._prototype_ = self.proto_number
- elif issubclass(cls, W_DateObject):
- obj._prototype_ = self.proto_date
- elif issubclass(cls, W__Array):
- obj._prototype_ = self.proto_array
- else:
- obj._prototype_ = self.proto_object
+ def new_func(self, function_body, formal_parameter_list=[], scope=None,
strict=False):
+ obj = W__Function(function_body, formal_parameter_list, scope, strict)
+ self.assign_proto(obj)
+ return obj
+ def new_date(self, value):
+ obj = W_DateObject(value)
+ self.assign_proto(obj)
+ return obj
+
+ def new_array(self, length = _w(0)):
+ obj = W__Array(length)
+ self.assign_proto(obj)
+ return obj
+
+ def new_bool(self, value):
+ obj = W_BooleanObject(value)
+ self.assign_proto(obj)
+ return obj
+
+ def new_string(self, value):
+ obj = W_StringObject(value)
+ self.assign_proto(obj)
+ return obj
+
+ def new_number(self, value):
+ obj = W_NumericObject(value)
+ self.assign_proto(obj)
return obj
object_space = ObjectSpace()
diff --git a/js/opcodes.py b/js/opcodes.py
--- a/js/opcodes.py
+++ b/js/opcodes.py
@@ -142,9 +142,8 @@
self.counter = counter
def eval(self, ctx):
- from js.jsobj import W__Array
from js.object_space import object_space
- array = object_space.new_obj(W__Array)
+ array = object_space.new_array()
list_w = ctx.stack_pop_n(self.counter) # [:] # pop_n returns a
non-resizable list
for index, el in enumerate(list_w):
@@ -179,13 +178,13 @@
# 13.2 Creating Function Objects
def eval(self, ctx):
- from js.jsobj import W__Object
from js.object_space import object_space
+
func = self.funcobj
scope = ctx.lexical_environment()
params = func.params()
strict = func.strict
- w_func = object_space.new_obj(W__Function, func, formal_parameter_list
= params, scope = scope, strict = strict)
+ w_func = object_space.new_func(func, formal_parameter_list = params,
scope = scope, strict = strict)
ctx.stack_append(w_func)
@@ -199,7 +198,7 @@
def eval(self, ctx):
from js.object_space import object_space
- w_obj = object_space.new_obj(W__Object)
+ w_obj = object_space.new_obj()
for _ in range(self.counter):
name = ctx.stack_pop().to_string()
w_elem = ctx.stack_pop()
diff --git a/js/operations.py b/js/operations.py
--- a/js/operations.py
+++ b/js/operations.py
@@ -655,8 +655,8 @@
bytecode.emit('LOAD_STRINGCONSTANT', strval)
def string_unquote(self, string):
- #s = decode_unicode_escape(string)
- s = string
+ s = decode_unicode_escape(string)
+ #s = string
if s.startswith('"'):
assert s.endswith('"')
else:
@@ -664,7 +664,7 @@
assert s.endswith("'")
s = s[:-1]
s = s[1:]
- s = u''.join(s.split(u'\\'))
+ #s = u''.join(s.split(u'\\'))
return unicode(s)
def decode_unicode_escape(string):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit