[pypy-commit] lang-js default: wip

stepahn noreply at buildbot.pypy.org
Fri Dec 28 11:34:50 CET 2012


Author: Stephan <stephan at stzal.com>
Branch: 
Changeset: r268:46fc449b38b2
Date: 2012-06-29 20:36 +0200
http://bitbucket.org/pypy/lang-js/changeset/46fc449b38b2/

Log:	wip

diff --git a/js/builtins.py b/js/builtins.py
--- a/js/builtins.py
+++ b/js/builtins.py
@@ -12,9 +12,8 @@
 
 from pypy.rlib import jit
 
-def new_native_function(function, name = None, params = []):
+def new_native_function(function, name = u'', params = []):
     from js.functions import JsNativeFunction
-    from js.jsobj import W__Function
     from js.object_space import object_space
 
     jsfunc = JsNativeFunction(function, name)
@@ -59,82 +58,84 @@
     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 = object_space.new_func(empty_func)
+    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)
 
-    #put_property(w_Object, u'length', _w(1))
+    # 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(global_object, u'Object', w_Object)
+    put_property(w_Object, u'length', _w(1))
 
-    ## 15.2.3.1 Object.prototype
-    #put_property(w_Object, u'prototype', w_ObjectPrototype, writable = False, configurable = False, enumerable = False)
+    put_property(global_object, u'Object', w_Object)
 
-    ## 14.2.4.1 Object.prototype.constructor
-    #put_property(w_ObjectPrototype, u'constructor', w_Object)
+    # 15.2.3.1 Object.prototype
+    put_property(w_Object, u'prototype', w_ObjectPrototype, writable = False, configurable = False, enumerable = False)
 
-    #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)
+    # 14.2.4.1 Object.prototype.constructor
+    put_property(w_ObjectPrototype, u'constructor', w_Object)
 
-    ## 15.2.4.3 Object.prototype.valueOf()
-    #put_native_function(w_ObjectPrototype, u'valueOf', object_builtins.value_of)
+    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.3 Function Objects
-    ## 15.3.3 Properties of the Function Constructor
+    # 15.2.4.3 Object.prototype.valueOf()
+    put_native_function(w_ObjectPrototype, u'valueOf', object_builtins.value_of)
 
-    ## 15.3.3.1 Function.prototype
-    #put_property(w_Function, u'prototype', w_FunctionPrototype, writable = False, configurable = False, enumerable = False)
+    # 15.3 Function Objects
+    # 15.3.3 Properties of the Function Constructor
 
-    ## 15.3.3.2 Function.length
-    #put_property(w_Function, u'length', _w(1), 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)
 
-    ## 14.3.4.1 Function.prototype.constructor
-    #put_property(w_FunctionPrototype, u'constructor', w_Function)
+    # 15.3.3.2 Function.length
+    put_property(w_Function, u'length', _w(1), writable = False, configurable = False, enumerable = False)
 
-    #import js.builtins_function as function_builtins
+    # 14.3.4.1 Function.prototype.constructor
+    put_property(w_FunctionPrototype, u'constructor', w_Function)
 
-    ## 15.3.4.2 Function.prototype.toString()
-    #put_native_function(w_FunctionPrototype, u'toString', function_builtins.to_string)
+    import js.builtins_function as function_builtins
 
-    ## 15.3.4.3 Function.prototype.apply
-    #put_native_function(w_FunctionPrototype, u'apply', function_builtins.apply)
+    # 15.3.4.2 Function.prototype.toString()
+    put_native_function(w_FunctionPrototype, u'toString', function_builtins.to_string)
 
-    ## 15.3.4.4 Function.prototype.call
-    #put_intimate_function(w_FunctionPrototype, u'call', function_builtins.call)
+    # 15.3.4.3 Function.prototype.apply
+    put_intimate_function(w_FunctionPrototype, u'apply', function_builtins.js_apply)
+    return
 
-    #import js.builtins_boolean
-    #js.builtins_boolean.setup(global_object)
+    # 15.3.4.4 Function.prototype.call
+    put_intimate_function(w_FunctionPrototype, u'call', function_builtins.js_call)
 
-    #import js.builtins_number
-    #js.builtins_number.setup(global_object)
+    import js.builtins_boolean
+    js.builtins_boolean.setup(global_object)
 
-    #import js.builtins_string
-    #js.builtins_string.setup(global_object)
+    import js.builtins_number
+    js.builtins_number.setup(global_object)
 
-    #import js.builtins_array
-    #js.builtins_array.setup(global_object)
+    import js.builtins_string
+    js.builtins_string.setup(global_object)
 
-    ##Math
-    #import js.builtins_math
-    #js.builtins_math.setup(global_object)
+    import js.builtins_array
+    js.builtins_array.setup(global_object)
 
-    #import js.builtins_date
-    #js.builtins_date.setup(global_object)
+    #Math
+    import js.builtins_math
+    js.builtins_math.setup(global_object)
 
-    #import js.builtins_global
-    #js.builtins_global.setup(global_object)
+    import js.builtins_date
+    js.builtins_date.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/builtins_function.py b/js/builtins_function.py
--- a/js/builtins_function.py
+++ b/js/builtins_function.py
@@ -9,13 +9,13 @@
     if not isinstance(this, W_BasicFunction):
         raise JsTypeError(u'')
 
-    return this._to_string_()
+    return _w(this._to_string_())
 
 def empty(this, args):
     return w_Undefined
 
 # 15.3.4.4 Function.prototype.call
-def call(ctx):
+def js_call(ctx):
     func = ctx.this_binding()
     args = ctx.argv()
 
@@ -30,7 +30,7 @@
     return compl
 
 # 15.3.4.3 Function.prototype.apply (thisArg, argArray)
-def apply(ctx):
+def js_apply(ctx):
     func = ctx.this_binding()
     args = ctx.argv()
 
@@ -39,7 +39,8 @@
 
     if isnull_or_undefined(arg_array):
         res = func.Call(args = [], this = this_arg, calling_context = ctx)
-        return _w(res)
+        compl = NormalCompletion(value = _w(res))
+        return compl
 
     from js.jsobj import W_BasicObject
     if not isinstance(arg_array, W_BasicObject):
@@ -50,7 +51,7 @@
     arg_list = []
     index = 0
     while index < n:
-        index_name = unicode(index)
+        index_name = unicode(str(index))
         next_arg = arg_array.get(index_name)
         arg_list.append(next_arg)
         index += 1
diff --git a/js/builtins_global.py b/js/builtins_global.py
--- a/js/builtins_global.py
+++ b/js/builtins_global.py
@@ -228,7 +228,6 @@
 
 def inspect(this, args):
     pass
-    #import pdb; pdb.set_trace();
 
 def version(this, args):
     return '1.0'
diff --git a/js/console.py b/js/console.py
--- a/js/console.py
+++ b/js/console.py
@@ -3,7 +3,7 @@
 import os, sys
 from js.interpreter import load_source, Interpreter, load_file
 from js.jsparser import parse, ParseError
-from js.jsobj import W_NewBuiltin, W_String, ThrowException, w_Undefined
+from js.jsobj import W_NewBuiltin, W_String, JsThrowException, w_Undefined
 from pypy.rlib.streamio import open_file_as_stream
 
 def printmessage(msg):
@@ -41,7 +41,7 @@
                 program = load_file(filename)
             except EnvironmentError, e:
                 msg = W_String(u"Can't open %s: %s" % (filename, e))
-                raise ThrowException(msg)
+                raise JsThrowException(msg)
             self.interpreter.run(program)
         return w_Undefined
 
diff --git a/js/execution.py b/js/execution.py
--- a/js/execution.py
+++ b/js/execution.py
@@ -47,21 +47,21 @@
         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):
diff --git a/js/functions.py b/js/functions.py
--- a/js/functions.py
+++ b/js/functions.py
@@ -6,9 +6,6 @@
     configurable_bindings = False
     strict = False
 
-    def __init__(self):
-        pass
-
     def run(self, ctx):
         raise NotImplementedError
 
@@ -46,8 +43,7 @@
         return False
 
 class JsNativeFunction(JsBaseFunction):
-    def __init__(self, function, name = None):
-        JsBaseFunction.__init__(self)
+    def __init__(self, function, name = u''):
         self._name_ = name
         self._function_ = function
 
@@ -56,16 +52,11 @@
 
     def run(self, ctx):
         from js.completion import ReturnCompletion
-        #from js.jsobj import W_Root
 
-        #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)
+        args = ctx.argv()
+        this = ctx.this_binding()
+        res = self._function_(this, args)
+        w_res = _w(res)
         compl = ReturnCompletion(value = w_res)
         return compl
 
@@ -77,12 +68,18 @@
             return u'function () { [native code] }'
 
 class JsIntimateFunction(JsNativeFunction):
+    def __init__(self, function, name = u''):
+        self._name_ = name
+        self._intimate_function_ = function
+
     def run(self, ctx):
-        return self._function_(ctx)
+        from js.completion import Completion
+        compl = self._intimate_function_(ctx)
+        assert isinstance(compl, Completion)
+        return compl
 
 class JsExecutableCode(JsBaseFunction):
     def __init__(self, js_code):
-        JsBaseFunction.__init__(self)
         from js.jscode import JsCode
         assert isinstance(js_code, JsCode)
         self._js_code_ = js_code
@@ -124,12 +121,9 @@
             return u'function () { }'
 
 class JsGlobalCode(JsExecutableCode):
-    def __init__(self, js_code):
-        return JsExecutableCode.__init__(self, js_code)
+    pass
 
 class JsEvalCode(JsExecutableCode):
-    def __init__(self, js_code):
-        return JsExecutableCode.__init__(self, js_code)
     def is_eval_code(self):
         return True
 
diff --git a/js/interpreter.py b/js/interpreter.py
--- a/js/interpreter.py
+++ b/js/interpreter.py
@@ -17,15 +17,16 @@
     """Creates a js interpreter"""
     def __init__(self):
         from js.jsobj import W_GlobalObject
+        from js.object_space import object_space
+        from js.builtins import setup_builtins
+
         self.global_object = W_GlobalObject()
-        from js.builtins import setup_builtins
+        object_space.global_object = self.global_object
+
         setup_builtins(self.global_object)
-        self.setup_interpreter_builtins()
-        from js.object_space import object_space
-        object_space.global_object = self.global_object
+        #self.setup_interpreter_builtins()
         object_space.assign_proto(self.global_object)
 
-
     def setup_interpreter_builtins(self):
         global_object = self.global_object
         from js.builtins import put_native_function
diff --git a/js/jscode.py b/js/jscode.py
--- a/js/jscode.py
+++ b/js/jscode.py
@@ -2,7 +2,7 @@
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rlib.jit import JitDriver, purefunction
 
-from js.execution import JsTypeError, ReturnException, ThrowException, JsReferenceError
+from js.execution import JsTypeError, ReturnException, JsThrowException, JsReferenceError
 from js.opcodes import opcodes, LABEL, BaseJump
 from js.jsobj import W_Root, W_String, _w, w_Null, w_Undefined
 
@@ -109,12 +109,12 @@
 
     def emit_break(self):
         if not self.endlooplabel:
-            raise ThrowException(W_String(u"Break outside loop"))
+            raise JsThrowException(W_String(u"Break outside loop"))
         self.emit('JUMP', self.endlooplabel[-1])
 
     def emit_continue(self):
         if not self.startlooplabel:
-            raise ThrowException(W_String(u"Continue outside loop"))
+            raise JsThrowException(W_String(u"Continue outside loop"))
         self.emit('JUMP', self.updatelooplabel[-1])
 
     def continue_at_label(self, label):
diff --git a/js/jsobj.py b/js/jsobj.py
--- a/js/jsobj.py
+++ b/js/jsobj.py
@@ -10,9 +10,6 @@
     except ValueError:
         return False
 
-def isunicode(s):
-    return unicode(s) is s
-
 class W_Root(object):
     _type_ = ''
 
@@ -309,7 +306,7 @@
     # 8.12.3
     def get(self, p):
         #assert isinstance(p, unicode)
-        assert isunicode(p)
+        assert p is not None and isinstance(p, unicode)
         desc = self.get_property(p)
 
         if desc is None:
@@ -328,7 +325,7 @@
     # 8.12.1
     def get_own_property(self, p):
         #assert isinstance(p, unicode)
-        assert isunicode(p)
+        assert p is not None and isinstance(p, unicode)
         if p not in self._properties_:
             return None
 
@@ -349,7 +346,7 @@
     # 8.12.2
     def get_property(self, p):
         #assert isinstance(p, unicode)
-        assert isunicode(p)
+        assert p is not None and isinstance(p, unicode)
 
         prop = self.get_own_property(p)
         if prop is not None:
@@ -364,7 +361,7 @@
     # 8.12.5
     def put(self, p, v, throw = False):
         #assert isinstance(p, unicode)
-        assert isunicode(p)
+        assert p is not None and isinstance(p, unicode)
 
         if self.can_put(p) is False:
             if throw is True:
@@ -421,7 +418,7 @@
     # 8.12.6
     def has_property(self, p):
         #assert isinstance(p, unicode)
-        assert isunicode(p)
+        assert p is not None and isinstance(p, unicode)
 
         desc = self.get_property(p)
         if desc is None:
@@ -604,6 +601,7 @@
 
 class W__PrimitiveObject(W_BasicObject):
     def __init__(self, primitive_value):
+        W_BasicObject.__init__(self)
         self.set_primitive_value(primitive_value)
 
     def PrimitiveValue(self):
@@ -874,6 +872,7 @@
 class W__Function(W_BasicFunction):
 
     def __init__(self, function_body, formal_parameter_list=[], scope=None, strict=False):
+        W_BasicFunction.__init__(self)
         from js.object_space import object_space
         self._function_ = function_body
         self._scope_ = scope
@@ -949,6 +948,7 @@
     _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)
@@ -989,6 +989,7 @@
 # 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):
@@ -1062,7 +1063,7 @@
 
     def __init__(self, strval):
         #assert isinstance(strval, unicode)
-        assert isunicode(strval)
+        assert strval is not None and isinstance(strval, unicode)
         self._strval_ = strval
 
     def __eq__(self, other):
@@ -1253,6 +1254,7 @@
     _class_ = 'Array'
 
     def __init__(self, length = w_0):
+        W_BasicObject.__init__(self)
         assert isinstance(length, W_Root)
 
         desc = PropertyDescriptor(value = length, writable = True, enumerable = False, configurable = False)
@@ -1325,7 +1327,7 @@
         # 4
         elif is_array_index(p):
             #assert isinstance(p, unicode)
-            assert isunicode(p)
+            assert p is not None and isinstance(p, unicode)
 
             # a
             index = r_uint32(int(p))
@@ -1352,20 +1354,21 @@
 from pypy.rlib.objectmodel import specialize
 @specialize.argtype(0)
 def _w(value):
-    if isinstance(value, W_Root):
+    if value is None:
+        return w_Null
+    elif isinstance(value, W_Root):
         return value
     elif isinstance(value, bool):
         return newbool(value)
-    elif isinstance(value, int) or isinstance(value, long):
+    elif isinstance(value, int):
         return W_IntNumber(value)
     elif isinstance(value, float):
         return W_FloatNumber(value)
-    #elif isinstance(value, unicode):
-        #return W_String(value)
-    elif isunicode(value):
+    elif isinstance(value, unicode):
         return W_String(value)
     elif isinstance(value, str):
-        return W_String(unicode(value))
+        u_str = unicode(value)
+        return W_String(u_str)
     elif isinstance(value, list):
         from js.object_space import object_space
         a = object_space.new_array()
@@ -1373,9 +1376,7 @@
             put_property(a, unicode(index), _w(item), writable = True, enumerable = True, configurable = True)
         return a
 
-    elif value is None:
-        return w_Null
-    raise TypeError(value)
+    raise TypeError, ("ffffuuu %s" % (value,))
 
 def put_property(obj, name, value, writable = False, configurable = False, enumerable = False, throw = False):
     descriptor = PropertyDescriptor(value = value, writable = writable, configurable = configurable, enumerable = enumerable)


More information about the pypy-commit mailing list