Author: Stephan <[email protected]>
Branch: 
Changeset: r266:453ffccebe27
Date: 2012-06-25 11:05 +0200
http://bitbucket.org/pypy/lang-js/changeset/453ffccebe27/

Log:    translate wip

diff --git a/js/astbuilder.py b/js/astbuilder.py
--- a/js/astbuilder.py
+++ b/js/astbuilder.py
@@ -17,7 +17,7 @@
         self.next_index = 0
 
     def add_symbol(self, identifyer):
-        assert isinstance(identifyer, unicode)
+        #assert isinstance(identifyer, unicode)
         if identifyer not in self.symbols:
             self.symbols[identifyer] = self.next_index
             self.next_index += 1
@@ -38,9 +38,9 @@
         return idx
 
     def add_parameter(self, identifyer):
-        assert isinstance(identifyer, unicode)
+        #assert isinstance(identifyer, unicode)
         f = unicode(identifyer)
-        assert isinstance(f, unicode)
+        #assert isinstance(f, unicode)
         idx = self.add_symbol(f)
         self.parameters.append(f)
         return idx
@@ -111,7 +111,6 @@
         self.funclists = []
         self.scopes = []
         self.sourcename = ""
-        RPythonVisitor.__init__(self)
         self.depth = -1
 
     def enter_scope(self):
@@ -123,21 +122,21 @@
 
     def declare_symbol(self, symbol):
         s = unicode(symbol)
-        assert isinstance(s, unicode)
+        #assert isinstance(s, unicode)
         idx = self.scopes[-1].add_symbol(s)
         #print 'symbol "%s"@%d in scope %d' % (symbol, idx, self.depth,)
         return idx
 
     def declare_variable(self, symbol):
         s = unicode(symbol)
-        assert isinstance(s, unicode)
+        #assert isinstance(s, unicode)
         idx = self.scopes[-1].add_variable(s)
         #print 'var declaration "%s"@%d in scope %d' % (symbol, idx, 
self.depth,)
         return idx
 
     def declare_function(self, symbol, funcobj):
         s = unicode(symbol)
-        assert isinstance(s, unicode)
+        #assert isinstance(s, unicode)
         self.funclists[-1][s] = funcobj
         idx = self.scopes[-1].add_function(s)
         #print 'func declaration "%s"@%d in scope %d' % (symbol, idx, 
self.depth,)
@@ -335,7 +334,7 @@
         if l.symbol == "IDENTIFIERNAME":
             identifier = l.additional_info
             i = unicode(identifier)
-            assert isinstance(i, unicode)
+            #assert isinstance(i, unicode)
             index = self.declare_symbol(i)
             lpos = self.get_pos(l)
             left = operations.Identifier(lpos, i, index)
@@ -348,7 +347,7 @@
         pos = self.get_pos(node)
         name = node.additional_info
         n = unicode(name)
-        assert isinstance(n, unicode)
+        #assert isinstance(n, unicode)
         index = self.declare_symbol(n)
         #if self.scopes.is_local(name):
             #local = self.scopes.get_local(name)
@@ -414,7 +413,7 @@
         funcindex = -1
         if declaration:
             f = unicode(funcname)
-            assert isinstance(f, unicode)
+            #assert isinstance(f, unicode)
             funcindex = self.declare_symbol(f)
 
         funcobj = operations.FunctionStatement(pos, funcname, funcindex, 
functionbody, scope)
@@ -493,7 +492,7 @@
         elif self.is_identifier(left):
             identifier = left.get_literal()
             i = unicode(identifier)
-            assert isinstance(i, unicode)
+            #assert isinstance(i, unicode)
             index = self.declare_symbol(i)
             return operations.AssignmentOperation(pos, left, identifier, 
index, right, operation)
         elif self.is_member(left):
@@ -705,7 +704,7 @@
     return tree
 
 def parse_to_ast(code):
-    assert isinstance(code, unicode)
+    #assert isinstance(code, unicode)
     from js.jsparser import parse, ParseError
     parse_tree = parse(str(code))
     ast = parse_tree_to_ast(parse_tree)
diff --git a/js/builtins.py b/js/builtins.py
--- a/js/builtins.py
+++ b/js/builtins.py
@@ -59,82 +59,82 @@
     from js.jsobj import W__Object, W__Function, W_BasicFunction
     from js.functions import JsNativeFunction
 
-    empty_func = JsNativeFunction(function_builtins.empty, u'Empty')
-    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
+    #empty_func = JsNativeFunction(function_builtins.empty, u'Empty')
+    #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.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 = W_ObjectConstructor()
-    object_space.assign_proto(w_Object, object_space.proto_function)
+    ## 15.2 Object Objects
+    ## 15.2.3 Properties of the Object Constructor
+    #from js.jsobj import W_ObjectConstructor
+    #w_Object = W_ObjectConstructor()
+    #object_space.assign_proto(w_Object, object_space.proto_function)
 
-    put_property(w_Object, u'length', _w(1))
+    #put_property(w_Object, u'length', _w(1))
 
-    put_property(global_object, u'Object', w_Object)
+    #put_property(global_object, u'Object', w_Object)
 
-    # 15.2.3.1 Object.prototype
-    put_property(w_Object, u'prototype', w_ObjectPrototype, writable = False, 
configurable = False, enumerable = False)
+    ## 15.2.3.1 Object.prototype
+    #put_property(w_Object, u'prototype', w_ObjectPrototype, writable = False, 
configurable = False, enumerable = False)
 
-    # 14.2.4.1 Object.prototype.constructor
-    put_property(w_ObjectPrototype, u'constructor', w_Object)
+    ## 14.2.4.1 Object.prototype.constructor
+    #put_property(w_ObjectPrototype, u'constructor', w_Object)
 
-    import js.builtins_object as object_builtins
-    # 15.2.4.2 Object.prototype.toString()
-    put_native_function(w_ObjectPrototype, u'toString', 
object_builtins.to_string)
-    put_native_function(w_ObjectPrototype, u'toLocaleString', 
object_builtins.to_string)
+    #import js.builtins_object as object_builtins
+    ## 15.2.4.2 Object.prototype.toString()
+    #put_native_function(w_ObjectPrototype, u'toString', 
object_builtins.to_string)
+    #put_native_function(w_ObjectPrototype, u'toLocaleString', 
object_builtins.to_string)
 
-    # 15.2.4.3 Object.prototype.valueOf()
-    put_native_function(w_ObjectPrototype, u'valueOf', 
object_builtins.value_of)
+    ## 15.2.4.3 Object.prototype.valueOf()
+    #put_native_function(w_ObjectPrototype, u'valueOf', 
object_builtins.value_of)
 
-    # 15.3 Function Objects
-    # 15.3.3 Properties of the Function Constructor
+    ## 15.3 Function Objects
+    ## 15.3.3 Properties of the Function Constructor
 
-    # 15.3.3.1 Function.prototype
-    put_property(w_Function, u'prototype', w_FunctionPrototype, writable = 
False, configurable = False, enumerable = False)
+    ## 15.3.3.1 Function.prototype
+    #put_property(w_Function, u'prototype', w_FunctionPrototype, writable = 
False, configurable = False, enumerable = False)
 
-    # 15.3.3.2 Function.length
-    put_property(w_Function, u'length', _w(1), writable = False, configurable 
= False, enumerable = False)
+    ## 15.3.3.2 Function.length
+    #put_property(w_Function, u'length', _w(1), writable = False, configurable 
= False, enumerable = False)
 
-    # 14.3.4.1 Function.prototype.constructor
-    put_property(w_FunctionPrototype, u'constructor', w_Function)
+    ## 14.3.4.1 Function.prototype.constructor
+    #put_property(w_FunctionPrototype, u'constructor', w_Function)
 
-    import js.builtins_function as function_builtins
+    #import js.builtins_function as function_builtins
 
-    # 15.3.4.2 Function.prototype.toString()
-    put_native_function(w_FunctionPrototype, u'toString', 
function_builtins.to_string)
+    ## 15.3.4.2 Function.prototype.toString()
+    #put_native_function(w_FunctionPrototype, u'toString', 
function_builtins.to_string)
 
-    # 15.3.4.3 Function.prototype.apply
-    put_native_function(w_FunctionPrototype, u'apply', function_builtins.apply)
+    ## 15.3.4.3 Function.prototype.apply
+    #put_native_function(w_FunctionPrototype, u'apply', 
function_builtins.apply)
 
-    # 15.3.4.4 Function.prototype.call
-    put_intimate_function(w_FunctionPrototype, u'call', function_builtins.call)
+    ## 15.3.4.4 Function.prototype.call
+    #put_intimate_function(w_FunctionPrototype, u'call', 
function_builtins.call)
 
-    import js.builtins_boolean
-    js.builtins_boolean.setup(global_object)
+    #import js.builtins_boolean
+    #js.builtins_boolean.setup(global_object)
 
-    import js.builtins_number
-    js.builtins_number.setup(global_object)
+    #import js.builtins_number
+    #js.builtins_number.setup(global_object)
 
-    import js.builtins_string
-    js.builtins_string.setup(global_object)
+    #import js.builtins_string
+    #js.builtins_string.setup(global_object)
 
-    import js.builtins_array
-    js.builtins_array.setup(global_object)
+    #import js.builtins_array
+    #js.builtins_array.setup(global_object)
 
-    #Math
-    import js.builtins_math
-    js.builtins_math.setup(global_object)
+    ##Math
+    #import js.builtins_math
+    #js.builtins_math.setup(global_object)
 
-    import js.builtins_date
-    js.builtins_date.setup(global_object)
+    #import js.builtins_date
+    #js.builtins_date.setup(global_object)
 
-    import js.builtins_global
-    js.builtins_global.setup(global_object)
+    #import js.builtins_global
+    #js.builtins_global.setup(global_object)
 
 def get_arg(args, index, default = w_Undefined):
     if len(args) > index:
diff --git a/js/environment_record.py b/js/environment_record.py
--- a/js/environment_record.py
+++ b/js/environment_record.py
@@ -55,7 +55,7 @@
 
     # 10.2.1.1.3
     def set_mutable_binding(self, identifier, value, strict):
-        assert isinstance(identifier, unicode)
+        #assert isinstance(identifier, unicode)
         assert self.has_binding(identifier)
         if not self._is_mutable_binding(identifier):
             from js.execution import JsTypeError
@@ -81,7 +81,7 @@
             return False
         if self._is_deletable_binding(identifier) is False:
             return False
-        del(self.delete_binding[identifier])
+        del(self.deletable_bindings[identifier])
         del(self.mutable_bindings[identifier])
         del(self.bindings[identifier])
         return False
@@ -125,7 +125,7 @@
 
     # 10.2.1.2.3
     def set_mutable_binding(self, n, v, s):
-        assert isinstance(n, unicode)
+        #assert isinstance(n, unicode)
         bindings = self.binding_object
         bindings.put(n, v, s)
 
diff --git a/js/execution.py b/js/execution.py
--- a/js/execution.py
+++ b/js/execution.py
@@ -38,29 +38,30 @@
         self.value = value
 
     def _msg(self):
-        return self.value
+        s = self.value.to_string()
+        return s
 
 class JsTypeError(JsException):
     def __init__(self, value):
-        assert isinstance(value, unicode)
+        #assert isinstance(value, unicode)
         self.value = value
 
     def _msg(self):
-        return u'TypeError: %s' % (self.value)
+        return u'TypeError: %s' #% (self.value)
 
 class JsReferenceError(JsException):
     def __init__(self, identifier):
         self.identifier = identifier
 
     def _msg(self):
-        return u'ReferenceError: %s is not defined' % (self.identifier)
+        return u'ReferenceError: %s is not defined' #% (self.identifier)
 
 class JsRangeError(JsException):
     def __init__(self, value = None):
         self.value = value
 
     def _msg(self):
-        return u'RangeError: %s' %(self.value)
+        return u'RangeError: %s' #%(self.value)
 
 class JsSyntaxError(JsException):
     def __init__(self, msg = u'', src = u'', line = 0, column = 0):
@@ -72,6 +73,6 @@
     def _msg(self):
         error_src = self.src.encode('unicode_escape')
         if self.error_msg:
-            return u'SyntaxError: "%s" in "%s" at line:%d, column:%d' 
%(self.error_msg, error_src, self.line, self.column)
+            return u'SyntaxError: "%s" in "%s" at line:%d, column:%d' 
#%(self.error_msg, error_src, self.line, self.column)
         else:
-            return u'SyntaxError: in "%s" at line:%d, column:%d' %(error_src, 
self.line, self.column)
+            return u'SyntaxError: in "%s" at line:%d, column:%d' #%(error_src, 
self.line, self.column)
diff --git a/js/functions.py b/js/functions.py
--- a/js/functions.py
+++ b/js/functions.py
@@ -56,13 +56,15 @@
 
     def run(self, ctx):
         from js.completion import ReturnCompletion
-        from js.jsobj import W_Root
+        #from js.jsobj import W_Root
 
-        args = ctx.argv()
-        this = ctx.this_binding()
-        res = self._function_(this, args)
-        w_res = _w(res)
+        #args = ctx.argv()
+        #this = ctx.this_binding()
+        #res = self._function_(this, args)
+        ##w_res = _w(res)
         #w_res = res
+        from js.jsobj import w_Undefined, W_Root
+        w_res = w_Undefined
         assert isinstance(w_res, W_Root)
         compl = ReturnCompletion(value = w_res)
         return compl
diff --git a/js/jsobj.py b/js/jsobj.py
--- a/js/jsobj.py
+++ b/js/jsobj.py
@@ -4,6 +4,15 @@
 from pypy.rlib.rfloat import isnan, isinf, NAN, formatd, INFINITY
 from js.execution import JsTypeError, JsRangeError, ReturnException
 
+def is_array_index(p):
+    try:
+        return unicode(str(r_uint32(abs(int(p))))) == p
+    except ValueError:
+        return False
+
+def isunicode(s):
+    return unicode(s) is s
+
 class W_Root(object):
     _type_ = ''
 
@@ -277,11 +286,10 @@
     _extensible_ = True
 
     def __init__(self):
-        W_Root.__init__(self)
         self._properties_ = {}
         self._prototype_ = w_Null
         desc = proto_desc
-        W_BasicObject.define_own_property(self, u'__proto__', desc)
+        #W_BasicObject.define_own_property(self, u'__proto__', desc)
 
     def __str__(self):
         return "%s: %s" % (object.__repr__(self), self.klass())
@@ -300,7 +308,8 @@
 
     # 8.12.3
     def get(self, p):
-        assert isinstance(p, unicode)
+        #assert isinstance(p, unicode)
+        assert isunicode(p)
         desc = self.get_property(p)
 
         if desc is None:
@@ -318,7 +327,8 @@
 
     # 8.12.1
     def get_own_property(self, p):
-        assert isinstance(p, unicode)
+        #assert isinstance(p, unicode)
+        assert isunicode(p)
         if p not in self._properties_:
             return None
 
@@ -338,7 +348,8 @@
 
     # 8.12.2
     def get_property(self, p):
-        assert isinstance(p, unicode)
+        #assert isinstance(p, unicode)
+        assert isunicode(p)
 
         prop = self.get_own_property(p)
         if prop is not None:
@@ -352,7 +363,9 @@
 
     # 8.12.5
     def put(self, p, v, throw = False):
-        assert isinstance(p, unicode)
+        #assert isinstance(p, unicode)
+        assert isunicode(p)
+
         if self.can_put(p) is False:
             if throw is True:
                 raise JsTypeError(u'')
@@ -407,7 +420,9 @@
 
     # 8.12.6
     def has_property(self, p):
-        assert isinstance(p, unicode)
+        #assert isinstance(p, unicode)
+        assert isunicode(p)
+
         desc = self.get_property(p)
         if desc is None:
             return False
@@ -589,7 +604,6 @@
 
 class W__PrimitiveObject(W_BasicObject):
     def __init__(self, primitive_value):
-        W_BasicObject.__init__(self)
         self.set_primitive_value(primitive_value)
 
     def PrimitiveValue(self):
@@ -861,7 +875,6 @@
 
     def __init__(self, function_body, formal_parameter_list=[], scope=None, 
strict=False):
         from js.object_space import object_space
-        W_BasicFunction.__init__(self)
         self._function_ = function_body
         self._scope_ = scope
         self._params_ = formal_parameter_list
@@ -936,7 +949,6 @@
     _class_ = 'Arguments'
 
     def __init__(self, func, names, args, env, strict = False):
-        W__Object.__init__(self)
         self.strict = strict
         _len = len(args)
         put_property(self, u'length', _w(_len), writable = True, enumerable = 
False, configurable = True)
@@ -977,7 +989,6 @@
 # 15.4.2
 class W_ArrayConstructor(W_BasicFunction):
     def __init__(self):
-        W_BasicFunction.__init__(self)
         put_property(self, u'length', _w(1), writable = False, enumerable = 
False, configurable = False)
 
     def is_callable(self):
@@ -1017,7 +1028,6 @@
     _type_ = 'boolean'
 
     def __init__(self, boolval):
-        W_Primitive.__init__(self)
         self._boolval_ = bool(boolval)
 
     def __str__(self):
@@ -1040,12 +1050,19 @@
     def to_boolean(self):
         return self._boolval_
 
+def _isspace(s):
+    whitespace = {u' ':None, u'\n':None, u'\t':None, u'\r':None}
+    for i in xrange(len(s)):
+        if s[i] not in whitespace:
+            return False
+    return True
+
 class W_String(W_Primitive):
     _type_ = 'string'
 
     def __init__(self, strval):
-        assert isinstance(strval, unicode)
-        W_Primitive.__init__(self)
+        #assert isinstance(strval, unicode)
+        assert isunicode(strval)
         self._strval_ = strval
 
     def __eq__(self, other):
@@ -1070,11 +1087,11 @@
 
     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):
+
+        if _isspace(u_strval):
             return 0.0
 
         strval = str(u_strval)
@@ -1124,7 +1141,6 @@
     """ Number known to be an integer
     """
     def __init__(self, intval):
-        W_Number.__init__(self)
         self._intval_ = intmask(intval)
 
     def __str__(self):
@@ -1152,8 +1168,7 @@
     """
     def __init__(self, floatval):
         assert isinstance(floatval, float)
-        W_Number.__init__(self)
-        self._floatval_ = float(floatval)
+        self._floatval_ = floatval
 
     def __str__(self):
         return 'W_FloatNumber(%s)' % (self._floatval_,)
@@ -1239,7 +1254,6 @@
 
     def __init__(self, length = w_0):
         assert isinstance(length, W_Root)
-        W_BasicObject.__init__(self)
 
         desc = PropertyDescriptor(value = length, writable = True, enumerable 
= False, configurable = False)
         W_BasicObject.define_own_property(self, u'length', desc)
@@ -1310,7 +1324,9 @@
 
         # 4
         elif is_array_index(p):
-            assert isinstance(p, unicode)
+            #assert isinstance(p, unicode)
+            assert isunicode(p)
+
             # a
             index = r_uint32(int(p))
             # b
@@ -1333,12 +1349,6 @@
         # 5
         return W_BasicObject.define_own_property(self, p, desc, throw)
 
-def is_array_index(p):
-    try:
-        return unicode(str(r_uint32(abs(int(p))))) == p
-    except ValueError:
-        return False
-
 from pypy.rlib.objectmodel import specialize
 @specialize.argtype(0)
 def _w(value):
@@ -1350,7 +1360,9 @@
         return W_IntNumber(value)
     elif isinstance(value, float):
         return W_FloatNumber(value)
-    elif isinstance(value, unicode):
+    #elif isinstance(value, unicode):
+        #return W_String(value)
+    elif isunicode(value):
         return W_String(value)
     elif isinstance(value, str):
         return W_String(unicode(value))
diff --git a/js/object_space.py b/js/object_space.py
--- a/js/object_space.py
+++ b/js/object_space.py
@@ -1,6 +1,17 @@
-from js.jsobj import _w, W_BasicObject, W__Object, W_BasicFunction, 
W__Function, W_DateObject, W_BooleanObject, W_StringObject, W_NumericObject, 
W__Array
+from js.jsobj import _w, W_BasicObject, W__Object, W_BasicFunction, 
W__Function, W_DateObject, W_BooleanObject, W_StringObject, W_NumericObject, 
W__Array, w_Null
 
 class ObjectSpace(object):
+    def __init__(self):
+        self.global_context = None
+        self.global_object = None
+        self.proto_function = w_Null
+        self.proto_boolean = w_Null
+        self.proto_number = w_Null
+        self.proto_string = w_Null
+        self.proto_array = w_Null
+        self.proto_date = w_Null
+        self.proto_object = w_Null
+
     def get_global_environment(self):
         return self.global_context.variable_environment()
 
diff --git a/js/opcodes.py b/js/opcodes.py
--- a/js/opcodes.py
+++ b/js/opcodes.py
@@ -94,12 +94,12 @@
 class LOAD_STRINGCONSTANT(Opcode):
     _immutable_fields_ = ['w_stringvalue']
     def __init__(self, value):
-        assert isinstance(value, unicode)
+        #assert isinstance(value, unicode)
         self.strval = value
 
     def eval(self, ctx):
         strval = self.strval
-        assert isinstance(strval, unicode)
+        #assert isinstance(strval, unicode)
         w_string = W_String(strval)
         ctx.stack_append(w_string)
 
@@ -402,7 +402,7 @@
         left = ctx.stack_pop()
         member = ctx.stack_pop()
         name = member.to_string()
-        assert isinstance(name, unicode)
+        #assert isinstance(name, unicode)
 
         value = ctx.stack_pop()
 
diff --git a/js/operations.py b/js/operations.py
--- a/js/operations.py
+++ b/js/operations.py
@@ -312,7 +312,7 @@
     def __init__(self, pos, left, name):
         n = name.get_literal()
         uname = unicode(n)
-        assert isinstance(uname, unicode)
+        #assert isinstance(uname, unicode)
         self.name = uname
         self.left = left
         self.pos = pos
@@ -642,7 +642,7 @@
 
 class String(Expression):
     def __init__(self, pos, strval):
-        assert isinstance(strval, unicode)
+        #assert isinstance(strval, unicode)
         self.pos = pos
         self.strval = self.string_unquote(strval)
 
@@ -651,12 +651,12 @@
 
     def emit(self, bytecode):
         strval = self.strval
-        assert isinstance(strval, unicode)
+        #assert isinstance(strval, unicode)
         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:
@@ -668,7 +668,7 @@
         return unicode(s)
 
 def decode_unicode_escape(string):
-    assert isinstance(string, unicode)
+    #assert isinstance(string, unicode)
     from pypy.rlib.runicode import str_decode_unicode_escape, 
str_decode_raw_unicode_escape
     result, consumed = str_decode_unicode_escape(string, len(string), "strict")
     return result
@@ -680,7 +680,7 @@
     return result
 
 def encode_unicode_utf8(string):
-    assert isinstance(string, unicode)
+    #assert isinstance(string, unicode)
     from pypy.rlib.runicode import unicode_encode_utf_8
     result, consumed = str_decode_utf_8(string, len(string), "strict")
     return result
diff --git a/js/test/test_w_string.py b/js/test/test_w_string.py
new file mode 100644
--- /dev/null
+++ b/js/test/test_w_string.py
@@ -0,0 +1,18 @@
+import py
+
+from js.jsobj import W_String
+
+def test_string_to_number():
+    assert W_String(u'').ToNumber() == 0
+    assert W_String(u' ').ToNumber() == 0
+    assert W_String(u'\t').ToNumber() == 0
+    assert W_String(u'\n').ToNumber() == 0
+    assert W_String(u'\r').ToNumber() == 0
+    assert W_String(u'\r\n').ToNumber() == 0
+
+def test_isspace():
+    from js.jsobj import _isspace
+    assert _isspace(' ') is True
+    assert _isspace('    ') is True
+    assert _isspace('  \t\t\r\n  ') is True
+    assert _isspace('  \t\ts\r\n  ') is False
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to