[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