[pypy-commit] lang-js default: re-added string builtins

stepahn noreply at buildbot.pypy.org
Fri Dec 28 11:33:01 CET 2012


Author: Stephan <stephan at stzal.com>
Branch: 
Changeset: r163:c07abfdf6f1a
Date: 2011-12-21 13:53 +0100
http://bitbucket.org/pypy/lang-js/changeset/c07abfdf6f1a/

Log:	re-added string builtins

diff --git a/js/builtins.py b/js/builtins.py
--- a/js/builtins.py
+++ b/js/builtins.py
@@ -103,139 +103,6 @@
             #n = NAN
         #return W_FloatNumber(n)
 
-#class W_FromCharCode(W_NewBuiltin):
-    #length = 1
-    #def Call(self, args=[], this=None):
-        #temp = []
-        #for arg in args:
-            #i = arg.ToInt32() % 65536 # XXX should be uint16
-            #temp.append(chr(i))
-        #return W_String(''.join(temp))
-
-#class W_CharCodeAt(W_NewBuiltin):
-    #def Call(self, args=[], this=None):
-        #string = this.ToString()
-        #if len(args)>=1:
-            #pos = args[0].ToInt32()
-            #if pos < 0 or pos > len(string) - 1:
-                #return W_FloatNumber(NAN)
-        #else:
-            #return W_FloatNumber(NAN)
-        #char = string[pos]
-        #return W_IntNumber(ord(char))
-
-#class W_Concat(W_NewBuiltin):
-    #def Call(self, args=[], this=None):
-        #string = this.ToString()
-        #others = [obj.ToString() for obj in args]
-        #string += ''.join(others)
-        #return W_String(string)
-
-#class W_IndexOf(W_NewBuiltin):
-    #length = 1
-    #def Call(self, args=[], this=None):
-        #string = this.ToString()
-        #if len(args) < 1:
-            #return W_IntNumber(-1)
-        #substr = args[0].ToString()
-        #size = len(string)
-        #subsize = len(substr)
-        #if len(args) < 2:
-            #pos = 0
-        #else:
-            #pos = args[1].ToInteger()
-        #pos = int(min(max(pos, 0), size))
-        #assert pos >= 0
-        #return W_IntNumber(string.find(substr, pos))
-
-#class W_LastIndexOf(W_NewBuiltin):
-    #length = 1
-    #def Call(self, args=[], this=None):
-        #string = this.ToString()
-        #if len(args) < 1:
-            #return W_IntNumber(-1)
-        #substr = args[0].ToString()
-        #if len(args) < 2:
-            #pos = INFINITY
-        #else:
-            #val = args[1].ToNumber()
-            #if isnan(val):
-                #pos = INFINITY
-            #else:
-                #pos = args[1].ToInteger()
-        #size = len(string)
-        #pos = int(min(max(pos, 0), size))
-        #subsize = len(substr)
-        #endpos = pos+subsize
-        #assert endpos >= 0
-        #return W_IntNumber(string.rfind(substr, 0, endpos))
-
-#class W_Substring(W_NewBuiltin):
-    #length = 2
-    #def Call(self, args=[], this=None):
-        #string = this.ToString()
-        #size = len(string)
-        #if len(args) < 1:
-            #start = 0
-        #else:
-            #start = args[0].ToInteger()
-        #if len(args) < 2:
-            #end = size
-        #else:
-            #end = args[1].ToInteger()
-        #tmp1 = min(max(start, 0), size)
-        #tmp2 = min(max(end, 0), size)
-        #start = min(tmp1, tmp2)
-        #end = max(tmp1, tmp2)
-        #return W_String(string[start:end])
-
-#class W_Split(W_NewBuiltin):
-    #length = 2
-    #def Call(self, args=[], this=None):
-        #string = this.ToString()
-
-        #if len(args) < 1 or args[0] is w_Undefined:
-            #return create_array([W_String(string)])
-        #else:
-            #separator = args[0].ToString()
-
-        #if len(args) >= 2:
-            #limit = args[1].ToUInt32()
-            #raise ThrowException(W_String("limit not implemented"))
-            ## array = string.split(separator, limit)
-        #else:
-            #array = string.split(separator)
-
-        #w_array = create_array()
-        #i = 0
-        #while i < len(array):
-            #w_str = W_String(array[i])
-            #w_array.Put(str(i), w_str)
-            #i += 1
-
-        #return w_array
-
-#class W_ToLowerCase(W_NewBuiltin):
-    #length = 0
-    #def Call(self, args=[], this=None):
-        #string = this.ToString()
-        #return W_String(string.lower())
-
-#class W_ToUpperCase(W_NewBuiltin):
-    #length = 0
-    #def Call(self, args=[], this=None):
-        #string = this.ToString()
-        #return W_String(string.upper())
-
-#class W_ToString(W_NewBuiltin):
-    #def Call(self, args=[], this=None):
-        #assert isinstance(this, W_PrimitiveObject)
-        #return W_String("[object %s]"%this.Class)
-
-#class W_ValueOf(W_NewBuiltin):
-    #length = 0
-    #def Call(self, args=[], this=None):
-        #return this
 
 #class W_HasOwnProperty(W_NewBuiltin):
     #def Call(self, args=[], this=None):
@@ -522,20 +389,6 @@
             #Value = W_String('')
         #return Value.ToObject()
 
-def create_array(elements=[]):
-    # TODO do not get array prototype from global context?
-    #proto = ctx.get_global().Get('Array').Get('prototype')
-    #from js.builtins import get_builtin_prototype
-    #proto = get_builtin_prototype('Array')
-    #assert isinstance(proto, W_PrimitiveObject)
-    array = W__Array()
-    #i = 0
-    while i < len(elements):
-        array.Put(str(i), elements[i])
-        i += 1
-
-    return array
-
 #class W_ArrayObject(W_NativeObject):
     #def __init__(self, Class, Prototype):
         #W_NativeObject.__init__(self, Class, Prototype, None )
@@ -728,6 +581,10 @@
     w_String = W_StringConstructor(ctx)
     w_Global.Put('String', w_String)
 
+    import js.builtins_string as string_builtins
+    # 15.5.3.2
+    put_native_function(w_String, 'fromCharCode', string_builtins.from_char_code)
+
     # 15.5.4
     from js.jsobj import W_StringObject
     w_StringPrototype = W_StringObject('')
@@ -739,31 +596,32 @@
     # 15.5.4.1
     w_StringPrototype.Put('constructor', w_String)
 
-    import js.builtins_string as string_builtins
     # 15.5.4.4
     put_native_function(w_StringPrototype, 'charAt', string_builtins.char_at)
 
+    # 15.5.4.5
+    put_native_function(w_StringPrototype, 'charCodeAt', string_builtins.char_code_at)
 
-    #put_values(w_StrPrototype, {
-        #'constructor': w_String,
-        #'__proto__': w_StrPrototype,
-        #'toString': W_StringValueToString(),
-        #'valueOf': get_value_of('String')(),
-        #'charAt': W_CharAt(),
-        #'charCodeAt': W_CharCodeAt(),
-        #'concat': W_Concat(),
-        #'indexOf': W_IndexOf(),
-        #'lastIndexOf': W_LastIndexOf(),
-        #'substring': W_Substring(),
-        #'split': W_Split(),
-        #'toLowerCase': W_ToLowerCase(),
-        #'toUpperCase': W_ToUpperCase()
-    #})
-    #_register_builtin_prototype('String', w_StrPrototype)
+    # 15.5.4.6
+    put_native_function(w_StringPrototype, 'concat', string_builtins.concat)
 
-    #w_String.Put('prototype', w_StrPrototype, flags=allon)
-    #w_String.Put('fromCharCode', W_FromCharCode())
-    #w_Global.Put('String', w_String)
+    # 15.5.4.7
+    put_native_function(w_StringPrototype, 'indexOf', string_builtins.index_of)
+
+    # 15.5.4.8
+    put_native_function(w_StringPrototype, 'lastIndexOf', string_builtins.last_index_of)
+
+    # 15.5.4.14
+    put_native_function(w_StringPrototype, 'split', string_builtins.split)
+
+    # 15.5.4.15
+    put_native_function(w_StringPrototype, 'substring', string_builtins.substring)
+
+    # 15.5.4.16
+    put_native_function(w_StringPrototype, 'toLowerCase', string_builtins.to_lower_case)
+
+    # 15.5.4.18
+    put_native_function(w_StringPrototype, 'toUpperCase', string_builtins.to_upper_case)
 
     from js.jsobj import W_ArrayConstructor, W__Array
     w_Array = W_ArrayConstructor()
diff --git a/js/builtins_string.py b/js/builtins_string.py
--- a/js/builtins_string.py
+++ b/js/builtins_string.py
@@ -1,3 +1,14 @@
+from js.jsobj import _w
+
+# 15.5.3.2
+def from_char_code(this, *args):
+    temp = []
+    for arg in args:
+        i = arg.ToInt32() % 65536 # XXX should be uint16
+        temp.append(chr(i))
+    return ''.join(temp)
+
+# 15.5.4.4
 def char_at(this, *args):
     string = this.ToString()
     if len(args)>=1:
@@ -7,3 +18,123 @@
     else:
         return ''
     return string[pos]
+
+#15.5.4.5
+def char_code_at(this, *args):
+    string = this.ToString()
+    if len(args)>=1:
+        pos = args[0].ToInt32()
+        if pos < 0 or pos > len(string) - 1:
+            return NAN
+    else:
+        return NAN
+    char = string[pos]
+    return ord(char)
+
+#15.5.4.6
+def concat(this, *args):
+    string = this.ToString()
+    others = [obj.ToString() for obj in args]
+    string += ''.join(others)
+    return string
+
+# 15.5.4.7
+def index_of(this, *args):
+    string = this.ToString()
+    if len(args) < 1:
+        return -1
+    substr = args[0].ToString()
+    size = len(string)
+    subsize = len(substr)
+    if len(args) < 2:
+        pos = 0
+    else:
+        pos = args[1].ToInteger()
+    pos = int(min(max(pos, 0), size))
+    assert pos >= 0
+    return string.find(substr, pos)
+
+# 15.5.4.8
+def last_index_of(this, *args):
+    string = this.ToString()
+    if len(args) < 1:
+        return -1
+    substr = args[0].ToString()
+    if len(args) < 2:
+        pos = INFINITY
+    else:
+        val = args[1].ToNumber()
+        if isnan(val):
+            pos = INFINITY
+        else:
+            pos = args[1].ToInteger()
+    size = len(string)
+    pos = int(min(max(pos, 0), size))
+    subsize = len(substr)
+    endpos = pos+subsize
+    assert endpos >= 0
+    return string.rfind(substr, 0, endpos)
+
+# 15.5.4.14
+def split(this, *args):
+    string = this.ToString()
+
+    if len(args) < 1 or args[0] is w_Undefined:
+        return _create_array([_w(string)])
+    else:
+        separator = args[0].ToString()
+
+    if len(args) >= 2:
+        limit = args[1].ToUInt32()
+        raise ThrowException(W_String("limit not implemented"))
+        # array = string.split(separator, limit)
+    else:
+        array = string.split(separator)
+
+    w_array = _create_array()
+    i = 0
+    while i < len(array):
+        w_str = W_String(array[i])
+        w_array.Put(str(i), w_str)
+        i += 1
+
+    return w_array
+
+# 15.5.4.15
+def substring(this, *args):
+    string = this.ToString()
+    size = len(string)
+    if len(args) < 1:
+        start = 0
+    else:
+        start = args[0].ToInteger()
+    if len(args) < 2:
+        end = size
+    else:
+        end = args[1].ToInteger()
+    tmp1 = min(max(start, 0), size)
+    tmp2 = min(max(end, 0), size)
+    start = min(tmp1, tmp2)
+    end = max(tmp1, tmp2)
+    return string[start:end]
+
+# 15.5.4.16
+def to_lower_case(this, *args):
+    string = this.ToString()
+    return string.lower()
+
+# 15.5.4.18
+def to_upper_case(this, *args):
+    string = this.ToString()
+    return string.upper()
+
+def _create_array(elements=[]):
+    from js.jsobj import W__Array
+    array = W__Array()
+    i = 0
+    while i < len(elements):
+        array.Put(str(i), elements[i])
+        i += 1
+
+    return array
+


More information about the pypy-commit mailing list