Author: Stephan <[email protected]>
Branch:
Changeset: r136:70b501f778aa
Date: 2011-10-06 16:16 +0200
http://bitbucket.org/pypy/lang-js/changeset/70b501f778aa/
Log: encapsulate property acces in W_PrimitiveObject
diff --git a/js/interpreter.py b/js/interpreter.py
--- a/js/interpreter.py
+++ b/js/interpreter.py
@@ -807,7 +807,8 @@
'__proto__': w_FncPrototype,
'length' : W_IntNumber(1),
})
- w_Number.propdict['prototype'].flags |= READ_ONLY
+ f = w_Number._get_property_flags('prototype') | READ_ONLY
+ w_Number._set_property_flags('prototype', f)
w_Number.Put(ctx, 'MAX_VALUE', W_FloatNumber(1.7976931348623157e308),
flags = READ_ONLY | DONT_DELETE)
w_Number.Put(ctx, 'MIN_VALUE', W_FloatNumber(0), flags = READ_ONLY |
DONT_DELETE)
w_Number.Put(ctx, 'NaN', W_FloatNumber(NAN), flags = READ_ONLY |
DONT_DELETE)
diff --git a/js/jsobj.py b/js/jsobj.py
--- a/js/jsobj.py
+++ b/js/jsobj.py
@@ -146,13 +146,12 @@
return True
class W_PrimitiveObject(W_Root):
- def __init__(self, ctx=None, Prototype=None, Class='Object',
- Value=w_Undefined, callfunc=None):
- self.propdict = {}
+ def __init__(self, ctx=None, Prototype=None, Class='Object',
Value=w_Undefined, callfunc=None):
+ self._propdict = {}
self.Prototype = Prototype
if Prototype is None:
Prototype = w_Undefined
- self.propdict['prototype'] = Property('prototype', Prototype, flags =
DONT_ENUM | DONT_DELETE)
+ self._set_property('prototype', Prototype, DONT_ENUM | DONT_DELETE)
self.Class = Class
self.callfunc = callfunc
if callfunc is not None:
@@ -161,6 +160,46 @@
self.Scope = None
self.Value = Value
+ def _set_property(self, name, value, flags):
+ p = self._propdict.get(name, None)
+ if p is None:
+ p = Property(name, value, flags)
+ self._propdict[name] = p
+ else:
+ p.value = value
+ p.falgs = flags
+
+ def _set_property_value(self, name, value):
+ self._get_property(name).value = value
+
+ def _set_property_flags(self, name, flags):
+ self._get_property(name).flags = flags
+
+ def _get_property_value(self, name):
+ p = self._get_property(name)
+ if p is None:
+ raise KeyError
+ return p.value
+
+
+ def _get_property_flags(self, name):
+ p = self._get_property(name)
+ if p is None:
+ raise KeyError
+ return p.flags
+
+ def _get_property(self, name):
+ return self._propdict.get(name, None)
+
+ def _has_property(self, name):
+ return name in self._propdict
+
+ def _delete_property(self, name):
+ del self._propdict[name]
+
+ def _get_property_keys(self):
+ return self._propdict.keys()
+
#@jit.unroll_safe
def Call(self, ctx, args=[], this=None):
if self.callfunc is None: # XXX Not sure if I should raise it here
@@ -206,40 +245,39 @@
def Get(self, ctx, P):
try:
- return self.propdict[P].value
+ return self._get_property_value(P)
except KeyError:
if self.Prototype is None:
return w_Undefined
return self.Prototype.Get(ctx, P) # go down the prototype chain
def CanPut(self, P):
- property = self.propdict.get(P, None)
- if property is not None:
- if property.flags & RO: return False
+ if self._has_property(P):
+ if self._get_property_flags(P) & READ_ONLY: return False
return True
if self.Prototype is None: return True
return self.Prototype.CanPut(P)
def Put(self, ctx, P, V, flags = 0):
- property = self.propdict.get(P, None)
- if property is not None:
- property.value = V
- property.flags |= flags
+ if self._has_property(P):
+ self._set_property_value(P, V)
+ f = self._get_property_flags(P) | flags
+ self._set_property_flags(P, f)
return
if not self.CanPut(P): return
- self.propdict[P] = Property(P, V, flags = flags)
+ self._set_property(P, V, flags)
def HasProperty(self, P):
- if P in self.propdict: return True
+ if self._has_property(P): return True
if self.Prototype is None: return False
return self.Prototype.HasProperty(P)
def Delete(self, P):
- if P in self.propdict:
- if self.propdict[P].flags & DONT_DELETE:
+ if self._has_property(P):
+ if self._get_property_flags(P) & DONT_DELETE:
return False
- del self.propdict[P]
+ self._delete_property(P)
return True
return True
@@ -343,13 +381,13 @@
def tolist(self):
l = []
for i in range(self.length):
- l.append(self.propdict[str(i)].value)
+ l.append(self._get_property_value(str(i)))
return l
class W_Arguments(W_ListObject):
def __init__(self, callee, args):
W_PrimitiveObject.__init__(self, Class='Arguments')
- del self.propdict["prototype"]
+ self._delete_property('prototype')
# XXX None can be dangerous here
self.Put(None, 'callee', callee)
self.Put(None, 'length', W_IntNumber(len(args)))
@@ -361,14 +399,13 @@
"""The object used on function calls to hold arguments and this"""
def __init__(self):
W_PrimitiveObject.__init__(self, Class='Activation')
- del self.propdict["prototype"]
+ self._delete_property('prototype')
def __repr__(self):
return str(self.propdict)
class W_Array(W_ListObject):
- def __init__(self, ctx=None, Prototype=None, Class='Array',
- Value=w_Undefined, callfunc=None):
+ def __init__(self, ctx=None, Prototype=None, Class='Array',
Value=w_Undefined, callfunc=None):
W_ListObject.__init__(self, ctx, Prototype, Class, Value, callfunc)
self.Put(ctx, 'length', W_IntNumber(0), flags = DONT_DELETE)
self.length = r_uint(0)
@@ -378,20 +415,20 @@
i = newlength
while i < self.length:
key = str(i)
- if key in self.propdict:
- del self.propdict[key]
+ if key in self._get_property_keys():
+ self._delete_property(key)
i += 1
self.length = newlength
- self.propdict['length'].value = W_FloatNumber(newlength)
+ self._set_property_value('length', W_FloatNumber(newlength))
def Put(self, ctx, P, V, flags = 0):
if not self.CanPut(P): return
- if not P in self.propdict:
- self.propdict[P] = Property(P, V, flags = flags)
+ if not self._has_property(P):
+ self._set_property(P,V,flags)
else:
if P != 'length':
- self.propdict[P].value = V
+ self._set_property_value(P, V)
else:
length = V.ToUInt32(ctx)
if length != V.ToNumber(ctx):
diff --git a/js/opcodes.py b/js/opcodes.py
--- a/js/opcodes.py
+++ b/js/opcodes.py
@@ -594,7 +594,12 @@
_stack_change = 0
def eval(self, ctx):
obj = ctx.pop().ToObject(ctx)
- props = [prop.value for prop in obj.propdict.values() if not
prop.flags & jsobj.DONT_ENUM]
+ props = []
+
+ for prop in obj._get_property_keys():
+ if not obj._get_property_flags(prop) & jsobj.DONT_ENUM:
+ props.append(obj._get_property_value(prop))
+
ctx.append(W_Iterator(props))
class JUMP_IF_ITERATOR_EMPTY(BaseJump):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit